Implement {Add, Div, Mul, Sub}Assign for Gf256

This commit is contained in:
Noah Vesely
2018-03-03 12:33:28 -06:00
committed by Romain Ruetschi
parent 3de16890a4
commit 9c123a900d
5 changed files with 34 additions and 8 deletions

View File

@ -31,7 +31,7 @@ pub(crate) fn encode_secret_byte(m: u8, j: u8, poly: &Poly) -> u8 {
let mut acc = Gf256::from_byte(m); let mut acc = Gf256::from_byte(m);
for (l, &r) in poly.coeffs.iter().enumerate() { for (l, &r) in poly.coeffs.iter().enumerate() {
let s = Gf256::from_byte(j).pow(l as u8 + 1); let s = Gf256::from_byte(j).pow(l as u8 + 1);
acc = acc + r * s; acc += r * s;
} }
acc.to_byte() acc.to_byte()
} }

View File

@ -1,7 +1,7 @@
//! This module provides the Gf256 type which is used to represent //! This module provides the Gf256 type which is used to represent
//! elements of a finite field with 256 elements. //! elements of a finite field with 256 elements.
use std::ops::{Add, Div, Mul, Neg, Sub}; use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign};
include!(concat!(env!("OUT_DIR"), "/nothinghardcoded.rs")); include!(concat!(env!("OUT_DIR"), "/nothinghardcoded.rs"));
@ -74,6 +74,13 @@ impl Add<Gf256> for Gf256 {
} }
} }
impl AddAssign<Gf256> for Gf256 {
#[inline]
fn add_assign(&mut self, rhs: Gf256) {
*self = *self + rhs;
}
}
impl Sub<Gf256> for Gf256 { impl Sub<Gf256> for Gf256 {
type Output = Gf256; type Output = Gf256;
#[inline] #[inline]
@ -82,6 +89,13 @@ impl Sub<Gf256> for Gf256 {
} }
} }
impl SubAssign<Gf256> for Gf256 {
#[inline]
fn sub_assign(&mut self, rhs: Gf256) {
*self = *self - rhs;
}
}
impl Mul<Gf256> for Gf256 { impl Mul<Gf256> for Gf256 {
type Output = Gf256; type Output = Gf256;
fn mul(self, rhs: Gf256) -> Gf256 { fn mul(self, rhs: Gf256) -> Gf256 {
@ -94,6 +108,12 @@ impl Mul<Gf256> for Gf256 {
} }
} }
impl MulAssign<Gf256> for Gf256 {
fn mul_assign(&mut self, rhs: Gf256) {
*self = *self * rhs;
}
}
impl Div<Gf256> for Gf256 { impl Div<Gf256> for Gf256 {
type Output = Gf256; type Output = Gf256;
fn div(self, rhs: Gf256) -> Gf256 { fn div(self, rhs: Gf256) -> Gf256 {
@ -107,6 +127,12 @@ impl Div<Gf256> for Gf256 {
} }
} }
impl DivAssign<Gf256> for Gf256 {
fn div_assign(&mut self, rhs: Gf256) {
*self = *self / rhs;
}
}
impl Neg for Gf256 { impl Neg for Gf256 {
type Output = Gf256; type Output = Gf256;
fn neg(self) -> Gf256 { fn neg(self) -> Gf256 {

View File

@ -15,10 +15,10 @@ pub(crate) fn interpolate_at(points: &[(u8, u8)]) -> u8 {
let xj = Gf256::from_byte(raw_xj); let xj = Gf256::from_byte(raw_xj);
let delta = xi - xj; let delta = xi - xj;
assert_ne!(delta.poly, 0, "Duplicate shares"); assert_ne!(delta.poly, 0, "Duplicate shares");
prod = prod * xj / delta; prod *= xj / delta;
} }
} }
sum = sum + prod * yi; sum += prod * yi;
} }
sum.to_byte() sum.to_byte()
} }
@ -37,7 +37,7 @@ pub(crate) fn interpolate(points: &[(Gf256, Gf256)]) -> Poly {
let mut prod = Gf256::one(); let mut prod = Gf256::one();
for &(x1, _) in points { for &(x1, _) in points {
if x != x1 { if x != x1 {
prod = prod * (x - x1); prod *= x - x1;
let mut prec = Gf256::zero(); let mut prec = Gf256::zero();
coeffs = coeffs coeffs = coeffs

View File

@ -21,7 +21,7 @@ impl Poly {
let mut result = Gf256::zero(); let mut result = Gf256::zero();
for (i, c) in self.coeffs.iter().enumerate() { for (i, c) in self.coeffs.iter().enumerate() {
result = result + *c * x.pow(i as u8); result += *c * x.pow(i as u8);
} }
result result

View File

@ -9,8 +9,8 @@ pub(crate) fn encode_secret_byte<W: Write>(src: &[u8], n: u8, w: &mut W) -> io::
let mut fac = Gf256::one(); let mut fac = Gf256::one();
let mut acc = Gf256::zero(); let mut acc = Gf256::zero();
for &coeff in src.iter() { for &coeff in src.iter() {
acc = acc + fac * Gf256::from_byte(coeff); acc += fac * Gf256::from_byte(coeff);
fac = fac * x; fac *= x;
} }
w.write_all(&[acc.to_byte()])?; w.write_all(&[acc.to_byte()])?;
} }