mirror of
https://github.com/saymrwulf/risc0-curve25519-dalek-source.git
synced 2026-09-04 20:03:40 +00:00
Add impl of Sub and Neg for Edwards points.
This commit is contained in:
parent
6faaef21df
commit
6cec313f16
2 changed files with 33 additions and 5 deletions
|
|
@ -9,7 +9,7 @@
|
|||
|
||||
use traits::Identity;
|
||||
|
||||
use std::ops::Add;
|
||||
use std::ops::{Add, Neg, Sub};
|
||||
|
||||
use edwards;
|
||||
|
||||
|
|
@ -132,6 +132,24 @@ impl<'a, 'b> Add<&'b CachedPoint> for &'a ExtendedPoint {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> Neg for &'a CachedPoint {
|
||||
type Output = CachedPoint;
|
||||
|
||||
fn neg(self) -> CachedPoint {
|
||||
let swapped = self.0.shuffle(Shuffle::BACD);
|
||||
CachedPoint(swapped.blend(&(-self.0), Lanes::D))
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b> Sub<&'b CachedPoint> for &'a ExtendedPoint {
|
||||
type Output = ExtendedPoint;
|
||||
|
||||
/// Implement subtraction by negating the point and adding.
|
||||
fn sub(self, other: &'b CachedPoint) -> ExtendedPoint {
|
||||
self + &(-other)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::*;
|
||||
|
|
@ -143,7 +161,7 @@ mod test {
|
|||
// Test the vector implementation of the parallel readdition formulas
|
||||
let cached_Q = CachedPoint::from(ExtendedPoint::from(Q));
|
||||
let R_vector: edwards::EdwardsPoint = (&ExtendedPoint::from(P) + &cached_Q).into();
|
||||
//et S_vector: edwards::EdwardsPoint = (&ExtendedPoint::from(P) - &cached_Q).into();
|
||||
let S_vector: edwards::EdwardsPoint = (&ExtendedPoint::from(P) - &cached_Q).into();
|
||||
|
||||
println!("Testing point addition:");
|
||||
println!("P = {:?}", P);
|
||||
|
|
@ -152,11 +170,11 @@ mod test {
|
|||
println!("R = P + Q = {:?}", &P + &Q);
|
||||
//println!("R_serial = {:?}", R_serial);
|
||||
println!("R_vector = {:?}", R_vector);
|
||||
//println!("S = P - Q = {:?}", &P - &Q);
|
||||
//println!("S_vector = {:?}", S_vector);
|
||||
println!("S = P - Q = {:?}", &P - &Q);
|
||||
println!("S_vector = {:?}", S_vector);
|
||||
//assert_eq!(R_serial.compress(), (&P + &Q).compress());
|
||||
assert_eq!(R_vector.compress(), (&P + &Q).compress());
|
||||
//assert_eq!(S_vector.compress(), (&P - &Q).compress());
|
||||
assert_eq!(S_vector.compress(), (&P - &Q).compress());
|
||||
println!("OK!\n");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ pub enum Shuffle {
|
|||
AAAA,
|
||||
BBBB,
|
||||
BADC,
|
||||
BACD,
|
||||
ADDA,
|
||||
CBCB,
|
||||
ABDC,
|
||||
|
|
@ -50,6 +51,7 @@ fn shuffle_lanes(x: u64x4, control: Shuffle) -> u64x4 {
|
|||
Shuffle::AAAA => perm(x.into_bits(), 0b00_00_00_00).into_bits(),
|
||||
Shuffle::BBBB => perm(x.into_bits(), 0b01_01_01_01).into_bits(),
|
||||
Shuffle::BADC => perm(x.into_bits(), 0b10_11_00_01).into_bits(),
|
||||
Shuffle::BACD => perm(x.into_bits(), 0b11_10_00_01).into_bits(),
|
||||
Shuffle::ADDA => perm(x.into_bits(), 0b00_11_11_00).into_bits(),
|
||||
Shuffle::CBCB => perm(x.into_bits(), 0b01_10_01_10).into_bits(),
|
||||
Shuffle::ABDC => perm(x.into_bits(), 0b10_11_01_00).into_bits(),
|
||||
|
|
@ -186,6 +188,14 @@ impl F51x4Unreduced {
|
|||
}
|
||||
}
|
||||
|
||||
impl Neg for F51x4Reduced {
|
||||
type Output = F51x4Reduced;
|
||||
|
||||
fn neg(self) -> F51x4Reduced {
|
||||
F51x4Unreduced::from(self).negate_lazy().into()
|
||||
}
|
||||
}
|
||||
|
||||
impl F51x4Reduced {
|
||||
#[inline]
|
||||
pub fn shuffle(&self, control: Shuffle) -> F51x4Reduced {
|
||||
|
|
|
|||
Loading…
Reference in a new issue