diff --git a/crypto/src/hash/rpo/digest.rs b/crypto/src/hash/rpo/digest.rs index a0c20a4..da32980 100644 --- a/crypto/src/hash/rpo/digest.rs +++ b/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 Serializable for RpoDigest256 { impl Deserializable for RpoDigest256 { fn read_from(source: &mut R) -> Result { - 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)) } }