feat: canonical range check deserialize Digest
Al-Kindi-0 82364884+Al-Kindi-0@users.noreply.github.com
Mon, 24 Oct 2022 11:53:24 +0200
1 files changed,
12 insertions(+),
7 deletions(-)
jump to
M
crypto/src/hash/rpo/digest.rs
→
crypto/src/hash/rpo/digest.rs
@@ -1,7 +1,6 @@
use super::DIGEST_SIZE; -use crate::{Digest, Felt, StarkField}; +use crate::{Digest, Felt, StarkField, ZERO}; use core::ops::Deref; - use winterfell::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable}; // DIGEST TRAIT IMPLEMENTATIONS@@ -54,12 +53,18 @@ }
impl Deserializable for RpoDigest256 { fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> { - let e1 = Felt::new(source.read_u64()?); - let e2 = Felt::new(source.read_u64()?); - let e3 = Felt::new(source.read_u64()?); - let e4 = Felt::new(source.read_u64()?); + let mut inner: [Felt; DIGEST_SIZE] = [ZERO; DIGEST_SIZE]; + for inner in inner.iter_mut() { + let e = source.read_u64()?; + if e >= Felt::MODULUS { + return Err(DeserializationError::InvalidValue( + "Value not in the appropriate range".to_owned(), + )); + } + *inner = Felt::new(e); + } - Ok(Self([e1, e2, e3, e4])) + Ok(Self(inner)) } }