Use existing utility functions

This commit is contained in:
Eirik Ogilvie-Wigley 2018-09-06 10:54:41 -06:00
parent d9ed40e96d
commit 79c7c4a183
1 changed files with 23 additions and 43 deletions

View File

@ -72,6 +72,13 @@ fn adc2(a: u64, b: u64, carry: u64) -> (u64, u64) {
(adc as u64, (adc >> 64) as u64)
}
/// Compute a + b, returning the result and the carry over.
#[inline(always)]
fn overflowing_add(a: u64, b: u64) -> (u64, u64) {
let (sum, overflow) = a.overflowing_add(b);
(sum, overflow as u64)
}
/// Compute a - (b + borrow), returning the result and setting borrow to
/// the borrow value.
#[inline(always)]
@ -262,42 +269,16 @@ impl Fq {
res
}
/// Calculate a + (b * c) + carry, returning the least significant digit
/// and setting carry to the most significant digit.
#[inline(always)]
fn mac_with_carry(a: u64, b: u64, c: u64, carry: &mut u64) -> u64 {
let tmp = (u128::from(a)) + u128::from(b) * u128::from(c) + u128::from(*carry);
*carry = (tmp >> 64) as u64;
tmp as u64
}
/// Calculate a + b + carry, returning the sum and modifying the
/// carry value.
#[inline(always)]
fn adc(a: u64, b: u64, carry: &mut u64) -> u64 {
let tmp = u128::from(a) + u128::from(b) + u128::from(*carry);
*carry = (tmp >> 64) as u64;
tmp as u64
}
/// Squares this element.
pub fn square_assign(&mut self) {
let mut carry = 0;
let r1 = Fq::mac_with_carry(0, self.0[0], self.0[1], &mut carry);
let r2 = Fq::mac_with_carry(0, self.0[0], self.0[2], &mut carry);
let r3 = Fq::mac_with_carry(0, self.0[0], self.0[3], &mut carry);
let r4 = carry;
let mut carry = 0;
let r3 = Fq::mac_with_carry(r3, self.0[1], self.0[2], &mut carry);
let r4 = Fq::mac_with_carry(r4, self.0[1], self.0[3], &mut carry);
let r5 = carry;
let mut carry = 0;
let r5 = Fq::mac_with_carry(r5, self.0[2], self.0[3], &mut carry);
let r6 = carry;
let (r1, carry) = overflowing_mul(self.0[0], self.0[1]);
let (r2, carry) = mac(carry, self.0[0], self.0[2]);
let (r3, r4) = mac(carry, self.0[0], self.0[3]);
let (r3, carry) = mac(r3, self.0[1], self.0[2]);
let (r4, r5) = mac_with_carry(r4, self.0[1], self.0[3], carry);
let (r5, r6) = mac(r5, self.0[2], self.0[3]);
let r7 = r6 >> 63;
let r6 = (r6 << 1) | (r5 >> 63);
@ -307,15 +288,14 @@ impl Fq {
let r2 = (r2 << 1) | (r1 >> 63);
let r1 = r1 << 1;
let mut carry = 0;
let r0 = Fq::mac_with_carry(0, self.0[0], self.0[0], &mut carry);
let r1 = Fq::adc(r1, 0, &mut carry);
let r2 = Fq::mac_with_carry(r2, self.0[1], self.0[1], &mut carry);
let r3 = Fq::adc(r3, 0, &mut carry);
let r4 = Fq::mac_with_carry(r4, self.0[2], self.0[2], &mut carry);
let r5 = Fq::adc(r5, 0, &mut carry);
let r6 = Fq::mac_with_carry(r6, self.0[3], self.0[3], &mut carry);
let r7 = Fq::adc(r7, 0, &mut carry);
let (r0, carry) = overflowing_mul(self.0[0], self.0[0]);
let (r1, carry) = overflowing_add(r1, carry);
let (r2, carry) = mac_with_carry(r2, self.0[1], self.0[1], carry);
let (r3, carry) = overflowing_add(r3, carry);
let (r4, carry) = mac_with_carry(r4, self.0[2], self.0[2], carry);
let (r5, carry) = overflowing_add(r5, carry);
let (r6, carry) = mac_with_carry(r6, self.0[3], self.0[3], carry);
let r7 = r7 + carry;
self.montgomery_reduce(r0, r1, r2, r3, r4, r5, r6, r7);
}