1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
// -*- mode: rust; -*- // // This file is part of curve25519-dalek. // Copyright (c) 2016-2019 Isis Lovecruft, Henry de Valence // See LICENSE for licensing information. // // Authors: // - Isis Agora Lovecruft <isis@patternsinthevoid.net> // - Henry de Valence <hdevalence@hdevalence.ca> //! 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. #[cfg(not(any( feature = "u32_backend", feature = "u64_backend", feature = "simd_backend", )))] compile_error!( "no curve25519-dalek backend cargo feature enabled! \ please enable one of: u32_backend, u64_backend, simd_backend" ); pub mod serial; #[cfg(any( all( feature = "simd_backend", any(target_feature = "avx2", target_feature = "avx512ifma") ), all(feature = "nightly", rustdoc) ))] #[cfg_attr( feature = "nightly", doc(cfg(any(all( feature = "simd_backend", any(target_feature = "avx2", target_feature = "avx512ifma") )))) )] pub mod vector;