From b515e43dfd09b8efce0a44da755fded662ac331b Mon Sep 17 00:00:00 2001 From: Henry de Valence Date: Sun, 12 Mar 2017 23:18:37 -0700 Subject: [PATCH] Move to_bytes_64 to to_bytes for radix51 --- src/field.rs | 84 +++++++++++++++++++++++++++------------------------- 1 file changed, 44 insertions(+), 40 deletions(-) diff --git a/src/field.rs b/src/field.rs index 37d7ba5..e0fbbe3 100644 --- a/src/field.rs +++ b/src/field.rs @@ -75,46 +75,6 @@ pub fn mul64(a: &[u64;5], b: &[u64;5]) -> [u64;5] { [c0,c1,c2,c3,c4] } -fn to_bytes_64(limbs: &[u64;5]) -> [u8;32] { - let mut s = [0u8;32]; - 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 - s[31] &= 127u8; - - return s -} /// With the `radix51` feature enabled, `FieldElements` are represented /// in radix 2^51 as five `u64`s. @@ -685,10 +645,54 @@ impl FieldElement { s[31] = (h[9] >> 18) as u8; //Clear high bit + debug_assert!((s[31] & 0b1000_0000u8) == 0u8); s[31] &= 127u8; s } + #[cfg(feature="radix_51")] + pub fn to_bytes(&self) -> [u8;32] { + // XXX need to do reduction first + 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; + + //Clear high bit + debug_assert!((s[31] & 0b1000_0000u8) == 0u8); + s[31] &= 127u8; + + return s + } /// XXX clarify documentation /// Determine if this field element, represented as a byte array,