From 84f7a73666754e569f2f697cc6611b738bfc1a07 Mon Sep 17 00:00:00 2001 From: Al-Kindi-0 <82364884+Al-Kindi-0@users.noreply.github.com> Date: Mon, 24 Oct 2022 11:53:24 +0200 Subject: [PATCH] feat: canonical range check deserialize Digest --- crypto/src/hash/rpo/digest.rs | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) 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)) } }