From f165b63ee965d5c0b793b312a6ccdd69b71d37fb Mon Sep 17 00:00:00 2001 From: Henry de Valence Date: Wed, 22 Nov 2017 17:01:44 -0800 Subject: [PATCH] Encode scalars canonically using Serde. --- src/scalar.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) 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)) }