mirror of
https://github.com/saymrwulf/curve25519-dalek-source.git
synced 2026-09-04 20:24:10 +00:00
Adapt to new types introduced in fiat-crypto 0.2 (#566)
This commit is contained in:
parent
135476c9f5
commit
a3a08b01ab
7 changed files with 2175 additions and 2130 deletions
|
|
@ -59,7 +59,7 @@ zeroize = { version = "1", default-features = false, optional = true }
|
|||
cpufeatures = "0.2.6"
|
||||
|
||||
[target.'cfg(curve25519_dalek_backend = "fiat")'.dependencies]
|
||||
fiat-crypto = { version = "0.1.19", default-features = false }
|
||||
fiat-crypto = { version = "0.2.1", default-features = false }
|
||||
|
||||
[features]
|
||||
default = ["alloc", "precomputed-tables", "zeroize"]
|
||||
|
|
|
|||
|
|
@ -55,73 +55,78 @@ use fiat_crypto::curve25519_32::*;
|
|||
/// The backend-specific type `FieldElement2625` should not be used
|
||||
/// outside of the `curve25519_dalek::field` module.
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct FieldElement2625(pub(crate) [u32; 10]);
|
||||
pub struct FieldElement2625(pub(crate) fiat_25519_tight_field_element);
|
||||
|
||||
impl Debug for FieldElement2625 {
|
||||
fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
|
||||
write!(f, "FieldElement2625({:?})", &self.0[..])
|
||||
write!(f, "FieldElement2625({:?})", &(self.0).0[..])
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "zeroize")]
|
||||
impl Zeroize for FieldElement2625 {
|
||||
fn zeroize(&mut self) {
|
||||
self.0.zeroize();
|
||||
(self.0).0.zeroize();
|
||||
}
|
||||
}
|
||||
|
||||
impl<'b> AddAssign<&'b FieldElement2625> for FieldElement2625 {
|
||||
fn add_assign(&mut self, _rhs: &'b FieldElement2625) {
|
||||
let input = self.0;
|
||||
fiat_25519_add(&mut self.0, &input, &_rhs.0);
|
||||
let input = self.0;
|
||||
fiat_25519_carry(&mut self.0, &input);
|
||||
fn add_assign(&mut self, rhs: &'b FieldElement2625) {
|
||||
let mut result_loose = fiat_25519_loose_field_element([0; 10]);
|
||||
fiat_25519_add(&mut result_loose, &self.0, &rhs.0);
|
||||
fiat_25519_carry(&mut self.0, &result_loose);
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b> Add<&'b FieldElement2625> for &'a FieldElement2625 {
|
||||
type Output = FieldElement2625;
|
||||
fn add(self, _rhs: &'b FieldElement2625) -> FieldElement2625 {
|
||||
let mut output = *self;
|
||||
fiat_25519_add(&mut output.0, &self.0, &_rhs.0);
|
||||
let input = output.0;
|
||||
fiat_25519_carry(&mut output.0, &input);
|
||||
fn add(self, rhs: &'b FieldElement2625) -> FieldElement2625 {
|
||||
let mut result_loose = fiat_25519_loose_field_element([0; 10]);
|
||||
fiat_25519_add(&mut result_loose, &self.0, &rhs.0);
|
||||
let mut output = FieldElement2625::ZERO;
|
||||
fiat_25519_carry(&mut output.0, &result_loose);
|
||||
output
|
||||
}
|
||||
}
|
||||
|
||||
impl<'b> SubAssign<&'b FieldElement2625> for FieldElement2625 {
|
||||
fn sub_assign(&mut self, _rhs: &'b FieldElement2625) {
|
||||
let input = self.0;
|
||||
fiat_25519_sub(&mut self.0, &input, &_rhs.0);
|
||||
let input = self.0;
|
||||
fiat_25519_carry(&mut self.0, &input);
|
||||
fn sub_assign(&mut self, rhs: &'b FieldElement2625) {
|
||||
let mut result_loose = fiat_25519_loose_field_element([0; 10]);
|
||||
fiat_25519_sub(&mut result_loose, &self.0, &rhs.0);
|
||||
fiat_25519_carry(&mut self.0, &result_loose);
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b> Sub<&'b FieldElement2625> for &'a FieldElement2625 {
|
||||
type Output = FieldElement2625;
|
||||
fn sub(self, _rhs: &'b FieldElement2625) -> FieldElement2625 {
|
||||
let mut output = *self;
|
||||
fiat_25519_sub(&mut output.0, &self.0, &_rhs.0);
|
||||
let input = output.0;
|
||||
fiat_25519_carry(&mut output.0, &input);
|
||||
fn sub(self, rhs: &'b FieldElement2625) -> FieldElement2625 {
|
||||
let mut result_loose = fiat_25519_loose_field_element([0; 10]);
|
||||
fiat_25519_sub(&mut result_loose, &self.0, &rhs.0);
|
||||
let mut output = FieldElement2625::ZERO;
|
||||
fiat_25519_carry(&mut output.0, &result_loose);
|
||||
output
|
||||
}
|
||||
}
|
||||
|
||||
impl<'b> MulAssign<&'b FieldElement2625> for FieldElement2625 {
|
||||
fn mul_assign(&mut self, _rhs: &'b FieldElement2625) {
|
||||
let input = self.0;
|
||||
fiat_25519_carry_mul(&mut self.0, &input, &_rhs.0);
|
||||
fn mul_assign(&mut self, rhs: &'b FieldElement2625) {
|
||||
let mut self_loose = fiat_25519_loose_field_element([0; 10]);
|
||||
fiat_25519_relax(&mut self_loose, &self.0);
|
||||
let mut rhs_loose = fiat_25519_loose_field_element([0; 10]);
|
||||
fiat_25519_relax(&mut rhs_loose, &rhs.0);
|
||||
fiat_25519_carry_mul(&mut self.0, &self_loose, &rhs_loose);
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b> Mul<&'b FieldElement2625> for &'a FieldElement2625 {
|
||||
type Output = FieldElement2625;
|
||||
fn mul(self, _rhs: &'b FieldElement2625) -> FieldElement2625 {
|
||||
let mut output = *self;
|
||||
fiat_25519_carry_mul(&mut output.0, &self.0, &_rhs.0);
|
||||
fn mul(self, rhs: &'b FieldElement2625) -> FieldElement2625 {
|
||||
let mut self_loose = fiat_25519_loose_field_element([0; 10]);
|
||||
fiat_25519_relax(&mut self_loose, &self.0);
|
||||
let mut rhs_loose = fiat_25519_loose_field_element([0; 10]);
|
||||
fiat_25519_relax(&mut rhs_loose, &rhs.0);
|
||||
let mut output = FieldElement2625::ZERO;
|
||||
fiat_25519_carry_mul(&mut output.0, &self_loose, &rhs_loose);
|
||||
output
|
||||
}
|
||||
}
|
||||
|
|
@ -129,10 +134,10 @@ impl<'a, 'b> Mul<&'b FieldElement2625> for &'a FieldElement2625 {
|
|||
impl<'a> Neg for &'a FieldElement2625 {
|
||||
type Output = FieldElement2625;
|
||||
fn neg(self) -> FieldElement2625 {
|
||||
let mut output = *self;
|
||||
fiat_25519_opp(&mut output.0, &self.0);
|
||||
let input = output.0;
|
||||
fiat_25519_carry(&mut output.0, &input);
|
||||
let mut output_loose = fiat_25519_loose_field_element([0; 10]);
|
||||
fiat_25519_opp(&mut output_loose, &self.0);
|
||||
let mut output = FieldElement2625::ZERO;
|
||||
fiat_25519_carry(&mut output.0, &output_loose);
|
||||
output
|
||||
}
|
||||
}
|
||||
|
|
@ -143,8 +148,13 @@ impl ConditionallySelectable for FieldElement2625 {
|
|||
b: &FieldElement2625,
|
||||
choice: Choice,
|
||||
) -> FieldElement2625 {
|
||||
let mut output = [0u32; 10];
|
||||
fiat_25519_selectznz(&mut output, choice.unwrap_u8() as fiat_25519_u1, &a.0, &b.0);
|
||||
let mut output = fiat_25519_tight_field_element([0u32; 10]);
|
||||
fiat_25519_selectznz(
|
||||
&mut output.0,
|
||||
choice.unwrap_u8() as fiat_25519_u1,
|
||||
&(a.0).0,
|
||||
&(b.0).0,
|
||||
);
|
||||
FieldElement2625(output)
|
||||
}
|
||||
|
||||
|
|
@ -161,7 +171,7 @@ impl ConditionallySelectable for FieldElement2625 {
|
|||
fiat_25519_cmovznz_u32(&mut output[7], choicebit, self.0[7], other.0[7]);
|
||||
fiat_25519_cmovznz_u32(&mut output[8], choicebit, self.0[8], other.0[8]);
|
||||
fiat_25519_cmovznz_u32(&mut output[9], choicebit, self.0[9], other.0[9]);
|
||||
*self = FieldElement2625(output);
|
||||
*self = FieldElement2625::from_limbs(output);
|
||||
}
|
||||
|
||||
fn conditional_swap(a: &mut FieldElement2625, b: &mut FieldElement2625, choice: Choice) {
|
||||
|
|
@ -179,12 +189,16 @@ impl ConditionallySelectable for FieldElement2625 {
|
|||
}
|
||||
|
||||
impl FieldElement2625 {
|
||||
pub(crate) const fn from_limbs(limbs: [u32; 10]) -> FieldElement2625 {
|
||||
FieldElement2625(fiat_25519_tight_field_element(limbs))
|
||||
}
|
||||
|
||||
/// The scalar \\( 0 \\).
|
||||
pub const ZERO: FieldElement2625 = FieldElement2625([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
|
||||
pub const ZERO: FieldElement2625 = FieldElement2625::from_limbs([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
|
||||
/// The scalar \\( 1 \\).
|
||||
pub const ONE: FieldElement2625 = FieldElement2625([1, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
|
||||
pub const ONE: FieldElement2625 = FieldElement2625::from_limbs([1, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
|
||||
/// The scalar \\( -1 \\).
|
||||
pub const MINUS_ONE: FieldElement2625 = FieldElement2625([
|
||||
pub const MINUS_ONE: FieldElement2625 = FieldElement2625::from_limbs([
|
||||
0x3ffffec, 0x1ffffff, 0x3ffffff, 0x1ffffff, 0x3ffffff, 0x1ffffff, 0x3ffffff, 0x1ffffff,
|
||||
0x3ffffff, 0x1ffffff,
|
||||
]);
|
||||
|
|
@ -220,7 +234,7 @@ impl FieldElement2625 {
|
|||
let mut temp = [0u8; 32];
|
||||
temp.copy_from_slice(data);
|
||||
temp[31] &= 127u8;
|
||||
let mut output = [0u32; 10];
|
||||
let mut output = fiat_25519_tight_field_element([0u32; 10]);
|
||||
fiat_25519_from_bytes(&mut output, &temp);
|
||||
FieldElement2625(output)
|
||||
}
|
||||
|
|
@ -235,20 +249,23 @@ impl FieldElement2625 {
|
|||
|
||||
/// Compute `self^2`.
|
||||
pub fn square(&self) -> FieldElement2625 {
|
||||
let mut output = *self;
|
||||
fiat_25519_carry_square(&mut output.0, &self.0);
|
||||
let mut self_loose = fiat_25519_loose_field_element([0; 10]);
|
||||
fiat_25519_relax(&mut self_loose, &self.0);
|
||||
let mut output = FieldElement2625::ZERO;
|
||||
fiat_25519_carry_square(&mut output.0, &self_loose);
|
||||
output
|
||||
}
|
||||
|
||||
/// Compute `2*self^2`.
|
||||
pub fn square2(&self) -> FieldElement2625 {
|
||||
let mut output = *self;
|
||||
let mut temp = *self;
|
||||
// Void vs return type, measure cost of copying self
|
||||
fiat_25519_carry_square(&mut temp.0, &self.0);
|
||||
fiat_25519_add(&mut output.0, &temp.0, &temp.0);
|
||||
let input = output.0;
|
||||
fiat_25519_carry(&mut output.0, &input);
|
||||
let mut self_loose = fiat_25519_loose_field_element([0; 10]);
|
||||
fiat_25519_relax(&mut self_loose, &self.0);
|
||||
let mut square = fiat_25519_tight_field_element([0; 10]);
|
||||
fiat_25519_carry_square(&mut square, &self_loose);
|
||||
let mut output_loose = fiat_25519_loose_field_element([0; 10]);
|
||||
fiat_25519_add(&mut output_loose, &square, &square);
|
||||
let mut output = FieldElement2625::ZERO;
|
||||
fiat_25519_carry(&mut output.0, &output_loose);
|
||||
output
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,73 +44,78 @@ use fiat_crypto::curve25519_64::*;
|
|||
/// The backend-specific type `FieldElement51` should not be used
|
||||
/// outside of the `curve25519_dalek::field` module.
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct FieldElement51(pub(crate) [u64; 5]);
|
||||
pub struct FieldElement51(pub(crate) fiat_25519_tight_field_element);
|
||||
|
||||
impl Debug for FieldElement51 {
|
||||
fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
|
||||
write!(f, "FieldElement51({:?})", &self.0[..])
|
||||
write!(f, "FieldElement51({:?})", &(self.0).0[..])
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "zeroize")]
|
||||
impl Zeroize for FieldElement51 {
|
||||
fn zeroize(&mut self) {
|
||||
self.0.zeroize();
|
||||
(self.0).0.zeroize();
|
||||
}
|
||||
}
|
||||
|
||||
impl<'b> AddAssign<&'b FieldElement51> for FieldElement51 {
|
||||
fn add_assign(&mut self, _rhs: &'b FieldElement51) {
|
||||
let input = self.0;
|
||||
fiat_25519_add(&mut self.0, &input, &_rhs.0);
|
||||
let input = self.0;
|
||||
fiat_25519_carry(&mut self.0, &input);
|
||||
fn add_assign(&mut self, rhs: &'b FieldElement51) {
|
||||
let mut result_loose = fiat_25519_loose_field_element([0; 5]);
|
||||
fiat_25519_add(&mut result_loose, &self.0, &rhs.0);
|
||||
fiat_25519_carry(&mut self.0, &result_loose);
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b> Add<&'b FieldElement51> for &'a FieldElement51 {
|
||||
type Output = FieldElement51;
|
||||
fn add(self, _rhs: &'b FieldElement51) -> FieldElement51 {
|
||||
let mut output = *self;
|
||||
fiat_25519_add(&mut output.0, &self.0, &_rhs.0);
|
||||
let input = output.0;
|
||||
fiat_25519_carry(&mut output.0, &input);
|
||||
fn add(self, rhs: &'b FieldElement51) -> FieldElement51 {
|
||||
let mut result_loose = fiat_25519_loose_field_element([0; 5]);
|
||||
fiat_25519_add(&mut result_loose, &self.0, &rhs.0);
|
||||
let mut output = FieldElement51::ZERO;
|
||||
fiat_25519_carry(&mut output.0, &result_loose);
|
||||
output
|
||||
}
|
||||
}
|
||||
|
||||
impl<'b> SubAssign<&'b FieldElement51> for FieldElement51 {
|
||||
fn sub_assign(&mut self, _rhs: &'b FieldElement51) {
|
||||
let input = self.0;
|
||||
fiat_25519_sub(&mut self.0, &input, &_rhs.0);
|
||||
let input = self.0;
|
||||
fiat_25519_carry(&mut self.0, &input);
|
||||
fn sub_assign(&mut self, rhs: &'b FieldElement51) {
|
||||
let mut result_loose = fiat_25519_loose_field_element([0; 5]);
|
||||
fiat_25519_sub(&mut result_loose, &self.0, &rhs.0);
|
||||
fiat_25519_carry(&mut self.0, &result_loose);
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b> Sub<&'b FieldElement51> for &'a FieldElement51 {
|
||||
type Output = FieldElement51;
|
||||
fn sub(self, _rhs: &'b FieldElement51) -> FieldElement51 {
|
||||
let mut output = *self;
|
||||
fiat_25519_sub(&mut output.0, &self.0, &_rhs.0);
|
||||
let input = output.0;
|
||||
fiat_25519_carry(&mut output.0, &input);
|
||||
fn sub(self, rhs: &'b FieldElement51) -> FieldElement51 {
|
||||
let mut result_loose = fiat_25519_loose_field_element([0; 5]);
|
||||
fiat_25519_sub(&mut result_loose, &self.0, &rhs.0);
|
||||
let mut output = FieldElement51::ZERO;
|
||||
fiat_25519_carry(&mut output.0, &result_loose);
|
||||
output
|
||||
}
|
||||
}
|
||||
|
||||
impl<'b> MulAssign<&'b FieldElement51> for FieldElement51 {
|
||||
fn mul_assign(&mut self, _rhs: &'b FieldElement51) {
|
||||
let input = self.0;
|
||||
fiat_25519_carry_mul(&mut self.0, &input, &_rhs.0);
|
||||
fn mul_assign(&mut self, rhs: &'b FieldElement51) {
|
||||
let mut self_loose = fiat_25519_loose_field_element([0; 5]);
|
||||
fiat_25519_relax(&mut self_loose, &self.0);
|
||||
let mut rhs_loose = fiat_25519_loose_field_element([0; 5]);
|
||||
fiat_25519_relax(&mut rhs_loose, &rhs.0);
|
||||
fiat_25519_carry_mul(&mut self.0, &self_loose, &rhs_loose);
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b> Mul<&'b FieldElement51> for &'a FieldElement51 {
|
||||
type Output = FieldElement51;
|
||||
fn mul(self, _rhs: &'b FieldElement51) -> FieldElement51 {
|
||||
let mut output = *self;
|
||||
fiat_25519_carry_mul(&mut output.0, &self.0, &_rhs.0);
|
||||
fn mul(self, rhs: &'b FieldElement51) -> FieldElement51 {
|
||||
let mut self_loose = fiat_25519_loose_field_element([0; 5]);
|
||||
fiat_25519_relax(&mut self_loose, &self.0);
|
||||
let mut rhs_loose = fiat_25519_loose_field_element([0; 5]);
|
||||
fiat_25519_relax(&mut rhs_loose, &rhs.0);
|
||||
let mut output = FieldElement51::ZERO;
|
||||
fiat_25519_carry_mul(&mut output.0, &self_loose, &rhs_loose);
|
||||
output
|
||||
}
|
||||
}
|
||||
|
|
@ -118,10 +123,10 @@ impl<'a, 'b> Mul<&'b FieldElement51> for &'a FieldElement51 {
|
|||
impl<'a> Neg for &'a FieldElement51 {
|
||||
type Output = FieldElement51;
|
||||
fn neg(self) -> FieldElement51 {
|
||||
let mut output = *self;
|
||||
fiat_25519_opp(&mut output.0, &self.0);
|
||||
let input = output.0;
|
||||
fiat_25519_carry(&mut output.0, &input);
|
||||
let mut output_loose = fiat_25519_loose_field_element([0; 5]);
|
||||
fiat_25519_opp(&mut output_loose, &self.0);
|
||||
let mut output = FieldElement51::ZERO;
|
||||
fiat_25519_carry(&mut output.0, &output_loose);
|
||||
output
|
||||
}
|
||||
}
|
||||
|
|
@ -132,8 +137,13 @@ impl ConditionallySelectable for FieldElement51 {
|
|||
b: &FieldElement51,
|
||||
choice: Choice,
|
||||
) -> FieldElement51 {
|
||||
let mut output = [0u64; 5];
|
||||
fiat_25519_selectznz(&mut output, choice.unwrap_u8() as fiat_25519_u1, &a.0, &b.0);
|
||||
let mut output = fiat_25519_tight_field_element([0u64; 5]);
|
||||
fiat_25519_selectznz(
|
||||
&mut output.0,
|
||||
choice.unwrap_u8() as fiat_25519_u1,
|
||||
&(a.0).0,
|
||||
&(b.0).0,
|
||||
);
|
||||
FieldElement51(output)
|
||||
}
|
||||
|
||||
|
|
@ -145,25 +155,29 @@ impl ConditionallySelectable for FieldElement51 {
|
|||
u64::conditional_swap(&mut a.0[4], &mut b.0[4], choice);
|
||||
}
|
||||
|
||||
fn conditional_assign(&mut self, _rhs: &FieldElement51, choice: Choice) {
|
||||
fn conditional_assign(&mut self, rhs: &FieldElement51, choice: Choice) {
|
||||
let mut output = [0u64; 5];
|
||||
let choicebit = choice.unwrap_u8() as fiat_25519_u1;
|
||||
fiat_25519_cmovznz_u64(&mut output[0], choicebit, self.0[0], _rhs.0[0]);
|
||||
fiat_25519_cmovznz_u64(&mut output[1], choicebit, self.0[1], _rhs.0[1]);
|
||||
fiat_25519_cmovznz_u64(&mut output[2], choicebit, self.0[2], _rhs.0[2]);
|
||||
fiat_25519_cmovznz_u64(&mut output[3], choicebit, self.0[3], _rhs.0[3]);
|
||||
fiat_25519_cmovznz_u64(&mut output[4], choicebit, self.0[4], _rhs.0[4]);
|
||||
*self = FieldElement51(output);
|
||||
fiat_25519_cmovznz_u64(&mut output[0], choicebit, self.0[0], rhs.0[0]);
|
||||
fiat_25519_cmovznz_u64(&mut output[1], choicebit, self.0[1], rhs.0[1]);
|
||||
fiat_25519_cmovznz_u64(&mut output[2], choicebit, self.0[2], rhs.0[2]);
|
||||
fiat_25519_cmovznz_u64(&mut output[3], choicebit, self.0[3], rhs.0[3]);
|
||||
fiat_25519_cmovznz_u64(&mut output[4], choicebit, self.0[4], rhs.0[4]);
|
||||
*self = FieldElement51::from_limbs(output);
|
||||
}
|
||||
}
|
||||
|
||||
impl FieldElement51 {
|
||||
pub(crate) const fn from_limbs(limbs: [u64; 5]) -> FieldElement51 {
|
||||
FieldElement51(fiat_25519_tight_field_element(limbs))
|
||||
}
|
||||
|
||||
/// The scalar \\( 0 \\).
|
||||
pub const ZERO: FieldElement51 = FieldElement51([0, 0, 0, 0, 0]);
|
||||
pub const ZERO: FieldElement51 = FieldElement51::from_limbs([0, 0, 0, 0, 0]);
|
||||
/// The scalar \\( 1 \\).
|
||||
pub const ONE: FieldElement51 = FieldElement51([1, 0, 0, 0, 0]);
|
||||
pub const ONE: FieldElement51 = FieldElement51::from_limbs([1, 0, 0, 0, 0]);
|
||||
/// The scalar \\( -1 \\).
|
||||
pub const MINUS_ONE: FieldElement51 = FieldElement51([
|
||||
pub const MINUS_ONE: FieldElement51 = FieldElement51::from_limbs([
|
||||
2251799813685228,
|
||||
2251799813685247,
|
||||
2251799813685247,
|
||||
|
|
@ -174,10 +188,11 @@ impl FieldElement51 {
|
|||
/// Given 64-bit input limbs, reduce to enforce the bound 2^(51 + epsilon).
|
||||
#[inline(always)]
|
||||
#[allow(dead_code)] // Need this to not complain about reduce not being used
|
||||
fn reduce(mut limbs: [u64; 5]) -> FieldElement51 {
|
||||
let input = limbs;
|
||||
fiat_25519_carry(&mut limbs, &input);
|
||||
FieldElement51(limbs)
|
||||
fn reduce(limbs: [u64; 5]) -> FieldElement51 {
|
||||
let input = fiat_25519_loose_field_element(limbs);
|
||||
let mut output = fiat_25519_tight_field_element([0; 5]);
|
||||
fiat_25519_carry(&mut output, &input);
|
||||
FieldElement51(output)
|
||||
}
|
||||
|
||||
/// Load a `FieldElement51` from the low 255 bits of a 256-bit
|
||||
|
|
@ -196,7 +211,7 @@ impl FieldElement51 {
|
|||
let mut temp = [0u8; 32];
|
||||
temp.copy_from_slice(bytes);
|
||||
temp[31] &= 127u8;
|
||||
let mut output = [0u64; 5];
|
||||
let mut output = fiat_25519_tight_field_element([0u64; 5]);
|
||||
fiat_25519_from_bytes(&mut output, &temp);
|
||||
FieldElement51(output)
|
||||
}
|
||||
|
|
@ -213,7 +228,8 @@ impl FieldElement51 {
|
|||
pub fn pow2k(&self, mut k: u32) -> FieldElement51 {
|
||||
let mut output = *self;
|
||||
loop {
|
||||
let input = output.0;
|
||||
let mut input = fiat_25519_loose_field_element([0; 5]);
|
||||
fiat_25519_relax(&mut input, &output.0);
|
||||
fiat_25519_carry_square(&mut output.0, &input);
|
||||
k -= 1;
|
||||
if k == 0 {
|
||||
|
|
@ -224,20 +240,23 @@ impl FieldElement51 {
|
|||
|
||||
/// Returns the square of this field element.
|
||||
pub fn square(&self) -> FieldElement51 {
|
||||
let mut output = *self;
|
||||
fiat_25519_carry_square(&mut output.0, &self.0);
|
||||
let mut self_loose = fiat_25519_loose_field_element([0; 5]);
|
||||
fiat_25519_relax(&mut self_loose, &self.0);
|
||||
let mut output = FieldElement51::ZERO;
|
||||
fiat_25519_carry_square(&mut output.0, &self_loose);
|
||||
output
|
||||
}
|
||||
|
||||
/// Returns 2 times the square of this field element.
|
||||
pub fn square2(&self) -> FieldElement51 {
|
||||
let mut output = *self;
|
||||
let mut temp = *self;
|
||||
// Void vs return type, measure cost of copying self
|
||||
fiat_25519_carry_square(&mut temp.0, &self.0);
|
||||
fiat_25519_add(&mut output.0, &temp.0, &temp.0);
|
||||
let input = output.0;
|
||||
fiat_25519_carry(&mut output.0, &input);
|
||||
let mut self_loose = fiat_25519_loose_field_element([0; 5]);
|
||||
fiat_25519_relax(&mut self_loose, &self.0);
|
||||
let mut square = fiat_25519_tight_field_element([0; 5]);
|
||||
fiat_25519_carry_square(&mut square, &self_loose);
|
||||
let mut output_loose = fiat_25519_loose_field_element([0; 5]);
|
||||
fiat_25519_add(&mut output_loose, &square, &square);
|
||||
let mut output = FieldElement51::ZERO;
|
||||
fiat_25519_carry(&mut output.0, &output_loose);
|
||||
output
|
||||
}
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -284,12 +284,16 @@ impl ConditionallySelectable for FieldElement2625 {
|
|||
}
|
||||
|
||||
impl FieldElement2625 {
|
||||
pub(crate) const fn from_limbs(limbs: [u32; 10]) -> FieldElement2625 {
|
||||
FieldElement2625(limbs)
|
||||
}
|
||||
|
||||
/// The scalar \\( 0 \\).
|
||||
pub const ZERO: FieldElement2625 = FieldElement2625([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
|
||||
pub const ZERO: FieldElement2625 = FieldElement2625::from_limbs([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
|
||||
/// The scalar \\( 1 \\).
|
||||
pub const ONE: FieldElement2625 = FieldElement2625([1, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
|
||||
pub const ONE: FieldElement2625 = FieldElement2625::from_limbs([1, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
|
||||
/// The scalar \\( -1 \\).
|
||||
pub const MINUS_ONE: FieldElement2625 = FieldElement2625([
|
||||
pub const MINUS_ONE: FieldElement2625 = FieldElement2625::from_limbs([
|
||||
0x3ffffec, 0x1ffffff, 0x3ffffff, 0x1ffffff, 0x3ffffff, 0x1ffffff, 0x3ffffff, 0x1ffffff,
|
||||
0x3ffffff, 0x1ffffff,
|
||||
]);
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -255,12 +255,16 @@ impl ConditionallySelectable for FieldElement51 {
|
|||
}
|
||||
|
||||
impl FieldElement51 {
|
||||
pub(crate) const fn from_limbs(limbs: [u64; 5]) -> FieldElement51 {
|
||||
FieldElement51(limbs)
|
||||
}
|
||||
|
||||
/// The scalar \\( 0 \\).
|
||||
pub const ZERO: FieldElement51 = FieldElement51([0, 0, 0, 0, 0]);
|
||||
pub const ZERO: FieldElement51 = FieldElement51::from_limbs([0, 0, 0, 0, 0]);
|
||||
/// The scalar \\( 1 \\).
|
||||
pub const ONE: FieldElement51 = FieldElement51([1, 0, 0, 0, 0]);
|
||||
pub const ONE: FieldElement51 = FieldElement51::from_limbs([1, 0, 0, 0, 0]);
|
||||
/// The scalar \\( -1 \\).
|
||||
pub const MINUS_ONE: FieldElement51 = FieldElement51([
|
||||
pub const MINUS_ONE: FieldElement51 = FieldElement51::from_limbs([
|
||||
2251799813685228,
|
||||
2251799813685247,
|
||||
2251799813685247,
|
||||
|
|
|
|||
Loading…
Reference in a new issue