// -*- mode: rust; -*- // // This file is part of curve25519-dalek. // Copyright (c) 2016-2021 isis lovecruft // Copyright (c) 2016-2019 Henry de Valence // See LICENSE for licensing information. // // Authors: // - isis agora lovecruft // - Henry de Valence //! **INTERNALS:** Pluggable implementations for different architectures. //! //! The backend code is split into two parts: a serial backend, //! and a vector backend. //! //! The [`serial`] backend contains 32- and 64-bit implementations of //! field arithmetic and scalar arithmetic, as well as implementations //! of point operations using the mixed-model strategy (passing //! between different curve models depending on the operation). //! //! The [`vector`] backend contains implementations of vectorized //! field arithmetic, used to implement point operations using a novel //! implementation strategy derived from parallel formulas of Hisil, //! Wong, Carter, and Dawson. //! //! Because the two strategies give rise to different curve models, //! it's not possible to reuse exactly the same scalar multiplication //! code (or to write it generically), so both serial and vector //! backends contain matching implementations of scalar multiplication //! algorithms. These are intended to be selected by a `#[cfg]`-based //! type alias. //! //! The [`vector`] backend is selected by the `simd_backend` cargo //! feature; it uses the [`serial`] backend for non-vectorized operations. pub mod serial; #[cfg(any(curve25519_dalek_backend = "simd", docsrs))] pub mod vector;