mirror of
https://github.com/saymrwulf/curve25519-dalek-source.git
synced 2026-09-05 20:30:57 +00:00
Replace scale_by_curve_constants by a Mul<(u32,u32,u32,u32)> impl
This commit is contained in:
parent
6ef9e9dcfb
commit
bab1ebbeb8
2 changed files with 34 additions and 38 deletions
|
|
@ -146,7 +146,7 @@ impl From<ExtendedPoint> for CachedPoint {
|
||||||
x = x.blend(x.diff_sum(), Lanes::AB);
|
x = x.blend(x.diff_sum(), Lanes::AB);
|
||||||
|
|
||||||
// x = (121666*S2 121666*S3 2*121666*Z2 2*121665*T2)
|
// x = (121666*S2 121666*S3 2*121666*Z2 2*121665*T2)
|
||||||
x.scale_by_curve_constants();
|
x = x * (121666, 121666, 2*121666, 2*121665);
|
||||||
|
|
||||||
// x = (121666*S2 121666*S3 2*121666*Z2 -2*121665*T2)
|
// x = (121666*S2 121666*S3 2*121666*Z2 -2*121665*T2)
|
||||||
x = x.blend(-x, Lanes::D);
|
x = x.blend(-x, Lanes::D);
|
||||||
|
|
|
||||||
|
|
@ -320,42 +320,6 @@ impl FieldElement32x4 {
|
||||||
tmp1 + tmp2
|
tmp1 + tmp2
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Let `self` \\(= (A, B, C, D) \\).
|
|
||||||
///
|
|
||||||
/// Compute
|
|
||||||
/// $$( 121666A, 121666B, 2\cdot 121666C, 2\cdot 121665 D).$$
|
|
||||||
pub fn scale_by_curve_constants(&mut self) {
|
|
||||||
let mut b = [u64x4::splat(0); 10];
|
|
||||||
|
|
||||||
let consts = u32x8::new(121666, 0, 121666, 0, 2 * 121666, 0, 2 * 121665, 0);
|
|
||||||
|
|
||||||
unsafe {
|
|
||||||
use core::arch::x86_64::_mm256_mul_epu32;
|
|
||||||
|
|
||||||
let (b0, b1) = unpack_pair(self.0[0]);
|
|
||||||
b[0] = _mm256_mul_epu32(b0.into_bits(), consts.into_bits()).into_bits();
|
|
||||||
b[1] = _mm256_mul_epu32(b1.into_bits(), consts.into_bits()).into_bits();
|
|
||||||
|
|
||||||
let (b2, b3) = unpack_pair(self.0[1]);
|
|
||||||
b[2] = _mm256_mul_epu32(b2.into_bits(), consts.into_bits()).into_bits();
|
|
||||||
b[3] = _mm256_mul_epu32(b3.into_bits(), consts.into_bits()).into_bits();
|
|
||||||
|
|
||||||
let (b4, b5) = unpack_pair(self.0[2]);
|
|
||||||
b[4] = _mm256_mul_epu32(b4.into_bits(), consts.into_bits()).into_bits();
|
|
||||||
b[5] = _mm256_mul_epu32(b5.into_bits(), consts.into_bits()).into_bits();
|
|
||||||
|
|
||||||
let (b6, b7) = unpack_pair(self.0[3]);
|
|
||||||
b[6] = _mm256_mul_epu32(b6.into_bits(), consts.into_bits()).into_bits();
|
|
||||||
b[7] = _mm256_mul_epu32(b7.into_bits(), consts.into_bits()).into_bits();
|
|
||||||
|
|
||||||
let (b8, b9) = unpack_pair(self.0[4]);
|
|
||||||
b[8] = _mm256_mul_epu32(b8.into_bits(), consts.into_bits()).into_bits();
|
|
||||||
b[9] = _mm256_mul_epu32(b9.into_bits(), consts.into_bits()).into_bits();
|
|
||||||
}
|
|
||||||
|
|
||||||
*self = FieldElement32x4::reduce64(b);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn reduce32(&mut self) {
|
pub fn reduce32(&mut self) {
|
||||||
let shifts = i32x8::new(26, 26, 25, 25, 26, 26, 25, 25);
|
let shifts = i32x8::new(26, 26, 25, 25, 26, 26, 25, 25);
|
||||||
let masks = u32x8::new(
|
let masks = u32x8::new(
|
||||||
|
|
@ -616,6 +580,37 @@ impl Add<FieldElement32x4> for FieldElement32x4 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Mul<(u32, u32, u32, u32)> for FieldElement32x4 {
|
||||||
|
type Output = FieldElement32x4;
|
||||||
|
#[inline]
|
||||||
|
fn mul(self, scalars: (u32, u32, u32, u32)) -> FieldElement32x4 {
|
||||||
|
unsafe {
|
||||||
|
use core::arch::x86_64::_mm256_mul_epu32;
|
||||||
|
|
||||||
|
let consts = u32x8::new(scalars.0, 0, scalars.1, 0, scalars.2, 0, scalars.3, 0);
|
||||||
|
|
||||||
|
let (b0, b1) = unpack_pair(self.0[0]);
|
||||||
|
let (b2, b3) = unpack_pair(self.0[1]);
|
||||||
|
let (b4, b5) = unpack_pair(self.0[2]);
|
||||||
|
let (b6, b7) = unpack_pair(self.0[3]);
|
||||||
|
let (b8, b9) = unpack_pair(self.0[4]);
|
||||||
|
|
||||||
|
FieldElement32x4::reduce64([
|
||||||
|
_mm256_mul_epu32(b0.into_bits(), consts.into_bits()).into_bits(),
|
||||||
|
_mm256_mul_epu32(b1.into_bits(), consts.into_bits()).into_bits(),
|
||||||
|
_mm256_mul_epu32(b2.into_bits(), consts.into_bits()).into_bits(),
|
||||||
|
_mm256_mul_epu32(b3.into_bits(), consts.into_bits()).into_bits(),
|
||||||
|
_mm256_mul_epu32(b4.into_bits(), consts.into_bits()).into_bits(),
|
||||||
|
_mm256_mul_epu32(b5.into_bits(), consts.into_bits()).into_bits(),
|
||||||
|
_mm256_mul_epu32(b6.into_bits(), consts.into_bits()).into_bits(),
|
||||||
|
_mm256_mul_epu32(b7.into_bits(), consts.into_bits()).into_bits(),
|
||||||
|
_mm256_mul_epu32(b8.into_bits(), consts.into_bits()).into_bits(),
|
||||||
|
_mm256_mul_epu32(b9.into_bits(), consts.into_bits()).into_bits(),
|
||||||
|
])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'a, 'b> Mul<&'b FieldElement32x4> for &'a FieldElement32x4 {
|
impl<'a, 'b> Mul<&'b FieldElement32x4> for &'a FieldElement32x4 {
|
||||||
type Output = FieldElement32x4;
|
type Output = FieldElement32x4;
|
||||||
fn mul(self, _rhs: &'b FieldElement32x4) -> FieldElement32x4 {
|
fn mul(self, _rhs: &'b FieldElement32x4) -> FieldElement32x4 {
|
||||||
|
|
@ -684,7 +679,8 @@ mod test {
|
||||||
#[test]
|
#[test]
|
||||||
fn scale_by_curve_constants() {
|
fn scale_by_curve_constants() {
|
||||||
let mut x = FieldElement32x4::splat(&FieldElement64::one());
|
let mut x = FieldElement32x4::splat(&FieldElement64::one());
|
||||||
x.scale_by_curve_constants();
|
|
||||||
|
x = x * (121666, 121666, 2*121666, 2*121665);
|
||||||
|
|
||||||
let xs = x.split();
|
let xs = x.split();
|
||||||
assert_eq!(xs[0], FieldElement64([121666, 0, 0, 0, 0]));
|
assert_eq!(xs[0], FieldElement64([121666, 0, 0, 0, 0]));
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue