Skip to content

Commit 665cc11

Browse files
authored
Fix scalar deserialization issue (#171)
1 parent d733f37 commit 665cc11

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ features = ["ecdsa", "ecdsa-core"]
5252

5353
[dev-dependencies]
5454
serde_test = "1.0"
55+
serde_json = "1"
5556
paste = "1.0.2"
5657
proptest = "0.10"
5758
proptest-derive = "0.2"

src/elliptic/curves/wrappers/serde_support.rs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -429,9 +429,15 @@ impl<'de, E: Curve> Deserialize<'de> for ScalarFromBytes<E> {
429429
}
430430
}
431431

432-
deserializer
433-
.deserialize_bytes(ScalarBytesVisitor(PhantomData))
434-
.map(ScalarFromBytes)
432+
if !deserializer.is_human_readable() {
433+
deserializer
434+
.deserialize_bytes(ScalarBytesVisitor(PhantomData))
435+
.map(ScalarFromBytes)
436+
} else {
437+
deserializer
438+
.deserialize_str(ScalarBytesVisitor(PhantomData))
439+
.map(ScalarFromBytes)
440+
}
435441
}
436442
}
437443

@@ -640,4 +646,17 @@ mod serde_tests {
640646
),
641647
)
642648
}
649+
650+
test_for_all_curves!(supports_serde_json);
651+
fn supports_serde_json<E: Curve>() {
652+
let random_scalar = Scalar::<E>::random();
653+
let scalar_json = serde_json::to_string(&random_scalar).unwrap();
654+
let deserialized_scalar = serde_json::from_str(&scalar_json).unwrap();
655+
assert_eq!(random_scalar, deserialized_scalar);
656+
657+
let random_point = Point::generator() * random_scalar;
658+
let point_json = serde_json::to_string(&random_point).unwrap();
659+
let deserialized_point: Point<E> = serde_json::from_str(&point_json).unwrap();
660+
assert_eq!(random_point, deserialized_point);
661+
}
643662
}

0 commit comments

Comments
 (0)