From 665cc11d1c56ea8d9d2ead67e3671a084ba4503c Mon Sep 17 00:00:00 2001 From: Denis Varlakov Date: Mon, 5 Sep 2022 15:43:54 +0200 Subject: [PATCH] Fix scalar deserialization issue (#171) --- Cargo.toml | 1 + src/elliptic/curves/wrappers/serde_support.rs | 25 ++++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 8fb33d3f..9c007b50 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -52,6 +52,7 @@ features = ["ecdsa", "ecdsa-core"] [dev-dependencies] serde_test = "1.0" +serde_json = "1" paste = "1.0.2" proptest = "0.10" proptest-derive = "0.2" diff --git a/src/elliptic/curves/wrappers/serde_support.rs b/src/elliptic/curves/wrappers/serde_support.rs index a0362176..1604a728 100644 --- a/src/elliptic/curves/wrappers/serde_support.rs +++ b/src/elliptic/curves/wrappers/serde_support.rs @@ -429,9 +429,15 @@ impl<'de, E: Curve> Deserialize<'de> for ScalarFromBytes { } } - deserializer - .deserialize_bytes(ScalarBytesVisitor(PhantomData)) - .map(ScalarFromBytes) + if !deserializer.is_human_readable() { + deserializer + .deserialize_bytes(ScalarBytesVisitor(PhantomData)) + .map(ScalarFromBytes) + } else { + deserializer + .deserialize_str(ScalarBytesVisitor(PhantomData)) + .map(ScalarFromBytes) + } } } @@ -640,4 +646,17 @@ mod serde_tests { ), ) } + + test_for_all_curves!(supports_serde_json); + fn supports_serde_json() { + let random_scalar = Scalar::::random(); + let scalar_json = serde_json::to_string(&random_scalar).unwrap(); + let deserialized_scalar = serde_json::from_str(&scalar_json).unwrap(); + assert_eq!(random_scalar, deserialized_scalar); + + let random_point = Point::generator() * random_scalar; + let point_json = serde_json::to_string(&random_point).unwrap(); + let deserialized_point: Point = serde_json::from_str(&point_json).unwrap(); + assert_eq!(random_point, deserialized_point); + } }