diff --git a/src/fields/fp.rs b/src/fields/fp.rs index 6539d5e..625be0c 100644 --- a/src/fields/fp.rs +++ b/src/fields/fp.rs @@ -69,6 +69,16 @@ macro_rules! field_impl { } } + /// Converts a U256 to an Fr regardless of modulus. + pub fn new_mul_factor(mut a: U256) -> Option { + if true { + a.mul(&U256($rsquared), &U256($modulus), $inv); + Some($name(a)) + } else { + None + } + } + pub fn interpret(buf: &[u8; 64]) -> Self { $name::new(U512::interpret(buf).divrem(&U256($modulus)).1).unwrap() } diff --git a/src/lib.rs b/src/lib.rs index 00e5e20..2ff09d3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -30,7 +30,7 @@ impl Fr { pub fn from_slice(slice: &[u8]) -> Result { arith::U256::from_slice(slice) .map_err(|_| FieldError::InvalidSliceLength) // todo: maybe more sensful error handling - .and_then(|x| fields::Fr::new(x).ok_or(FieldError::NotMember)) + .and_then(|x| fields::Fr::new_mul_factor(x).ok_or(FieldError::NotMember)) .map(|x| Fr(x)) } pub fn to_big_endian(&self, slice: &mut [u8]) -> Result<(), FieldError> {