diff --git a/src/scalar.rs b/src/scalar.rs index 73110e9..17e8143 100644 --- a/src/scalar.rs +++ b/src/scalar.rs @@ -265,7 +265,7 @@ impl Serialize for Scalar { fn serialize(&self, serializer: S) -> Result where S: Serializer { - serializer.serialize_bytes(self.as_bytes()) + serializer.serialize_bytes(self.reduce().as_bytes()) } } @@ -280,17 +280,25 @@ impl<'de> Deserialize<'de> for Scalar { type Value = Scalar; fn expecting(&self, formatter: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { - formatter.write_str("a 32-byte scalar value") + formatter.write_str("a canonically-encoded 32-byte scalar value") } fn visit_bytes(self, v: &[u8]) -> Result where E: serde::de::Error { if v.len() == 32 { - // array_ref turns &[u8] into &[u8;32] let mut bytes = [0u8;32]; bytes.copy_from_slice(v); - Ok(Scalar(bytes)) + + static ERRMSG: &'static str = "encoding was not canonical"; + + Scalar::from_canonical_bytes(bytes) + .ok_or( + serde::de::Error::invalid_value( + serde::de::Unexpected::Bytes(v), + &ERRMSG, + ) + ) } else { Err(serde::de::Error::invalid_length(v.len(), &self)) }