From e40dde2bd587bd9db7e0ac226b3ce1be46699ea2 Mon Sep 17 00:00:00 2001 From: Lucas Meier Date: Tue, 30 Jan 2024 10:19:25 -0800 Subject: [PATCH] Implement a checked conversion from bytes method in Fq --- src/fields/fq.rs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/fields/fq.rs b/src/fields/fq.rs index 5f79956..c5011c5 100644 --- a/src/fields/fq.rs +++ b/src/fields/fq.rs @@ -24,3 +24,29 @@ cfg_if! { } } } + +impl Fq { + /// Convert bytes into an Fq element, returning None if these bytes are not already reduced. + /// + /// This means that values that cannot be produced by encoding a field element will return + /// None, enforcing canonical serialization. + pub fn from_bytes_checked(bytes: &[u8; 32]) -> Option { + let reduced = Self::from_raw_bytes(bytes); + if reduced.to_bytes_le() == *bytes { + Some(reduced) + } else { + None + } + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_from_bytes_checked() { + assert_eq!(Fq::from_bytes_checked(&[0; 32]), Some(Fq::zero())); + assert_eq!(Fq::from_bytes_checked(&[0xFF; 32]), None); + } +}