curve25519_dalek/backend/vector/scalar_mul/
variable_base.rs1#![allow(non_snake_case)]
2
3#[curve25519_dalek_derive::unsafe_target_feature_specialize(
4 "avx2",
5 conditional(
6 "avx512ifma,avx512vl",
7 all(curve25519_dalek_backend = "unstable_avx512", nightly)
8 )
9)]
10pub mod spec {
11
12 #[for_target_feature("avx2")]
13 use crate::backend::vector::avx2::{CachedPoint, ExtendedPoint};
14
15 #[for_target_feature("avx512ifma")]
16 use crate::backend::vector::ifma::{CachedPoint, ExtendedPoint};
17
18 use crate::edwards::EdwardsPoint;
19 use crate::scalar::Scalar;
20 use crate::traits::Identity;
21 use crate::window::LookupTable;
22
23 pub fn mul(point: &EdwardsPoint, scalar: &Scalar) -> EdwardsPoint {
25 let lookup_table = LookupTable::<CachedPoint>::from(point);
27 let scalar_digits = scalar.as_radix_16();
33 let mut Q = ExtendedPoint::identity();
41 for i in (0..64).rev() {
42 Q = Q.mul_by_pow_2(4);
43 Q = &Q + &lookup_table.select(scalar_digits[i]);
44 }
45 Q.into()
46 }
47}