Reduce to narrower range before to_bytes

This commit is contained in:
Henry de Valence 2017-03-12 23:18:46 -07:00
parent 24f11427a1
commit 0fa8d8f4a7

View file

@ -608,39 +608,41 @@ impl FieldElement {
#[cfg(feature="radix_51")]
pub fn to_bytes(&self) -> [u8;32] {
// XXX need to do reduction first
// This reduces to the range [0,2^255), but we need [0,2^255-19)
let limbs = FieldElement::reduce(self.0).0;
let mut s = [0u8;32];
s[ 0] = self.0[0] as u8;
s[ 1] = (self.0[0] >> 8) as u8;
s[ 2] = (self.0[0] >> 16) as u8;
s[ 3] = (self.0[0] >> 24) as u8;
s[ 4] = (self.0[0] >> 32) as u8;
s[ 5] = (self.0[0] >> 40) as u8;
s[ 6] = ((self.0[0] >> 48) | (self.0[1] << 3)) as u8;
s[ 7] = (self.0[1] >> 5) as u8;
s[ 8] = (self.0[1] >> 13) as u8;
s[ 9] = (self.0[1] >> 21) as u8;
s[10] = (self.0[1] >> 29) as u8;
s[11] = (self.0[1] >> 37) as u8;
s[12] = ((self.0[1] >> 45) | (self.0[2] << 6)) as u8;
s[13] = (self.0[2] >> 2) as u8;
s[14] = (self.0[2] >> 10) as u8;
s[15] = (self.0[2] >> 18) as u8;
s[16] = (self.0[2] >> 26) as u8;
s[17] = (self.0[2] >> 34) as u8;
s[18] = (self.0[2] >> 42) as u8;
s[19] = ((self.0[2] >> 50) | (self.0[3] << 1)) as u8;
s[20] = (self.0[3] >> 7) as u8;
s[21] = (self.0[3] >> 15) as u8;
s[22] = (self.0[3] >> 23) as u8;
s[23] = (self.0[3] >> 31) as u8;
s[24] = (self.0[3] >> 39) as u8;
s[25] = ((self.0[3] >> 47) | (self.0[4] << 4)) as u8;
s[26] = (self.0[4] >> 4) as u8;
s[27] = (self.0[4] >> 12) as u8;
s[28] = (self.0[4] >> 20) as u8;
s[29] = (self.0[4] >> 28) as u8;
s[30] = (self.0[4] >> 36) as u8;
s[31] = (self.0[4] >> 44) as u8;
s[ 0] = limbs[0] as u8;
s[ 1] = (limbs[0] >> 8) as u8;
s[ 2] = (limbs[0] >> 16) as u8;
s[ 3] = (limbs[0] >> 24) as u8;
s[ 4] = (limbs[0] >> 32) as u8;
s[ 5] = (limbs[0] >> 40) as u8;
s[ 6] = ((limbs[0] >> 48) | (limbs[1] << 3)) as u8;
s[ 7] = (limbs[1] >> 5) as u8;
s[ 8] = (limbs[1] >> 13) as u8;
s[ 9] = (limbs[1] >> 21) as u8;
s[10] = (limbs[1] >> 29) as u8;
s[11] = (limbs[1] >> 37) as u8;
s[12] = ((limbs[1] >> 45) | (limbs[2] << 6)) as u8;
s[13] = (limbs[2] >> 2) as u8;
s[14] = (limbs[2] >> 10) as u8;
s[15] = (limbs[2] >> 18) as u8;
s[16] = (limbs[2] >> 26) as u8;
s[17] = (limbs[2] >> 34) as u8;
s[18] = (limbs[2] >> 42) as u8;
s[19] = ((limbs[2] >> 50) | (limbs[3] << 1)) as u8;
s[20] = (limbs[3] >> 7) as u8;
s[21] = (limbs[3] >> 15) as u8;
s[22] = (limbs[3] >> 23) as u8;
s[23] = (limbs[3] >> 31) as u8;
s[24] = (limbs[3] >> 39) as u8;
s[25] = ((limbs[3] >> 47) | (limbs[4] << 4)) as u8;
s[26] = (limbs[4] >> 4) as u8;
s[27] = (limbs[4] >> 12) as u8;
s[28] = (limbs[4] >> 20) as u8;
s[29] = (limbs[4] >> 28) as u8;
s[30] = (limbs[4] >> 36) as u8;
s[31] = (limbs[4] >> 44) as u8;
//Clear high bit
debug_assert!((s[31] & 0b1000_0000u8) == 0u8);