Skip to content

Commit 04bce4e

Browse files
authored
Merge pull request #26 from Stentonian/stent/serd-json-fix
Fix issue with serde_json RangeProof failure
2 parents 29c9e3c + 9b01763 commit 04bce4e

3 files changed

Lines changed: 70 additions & 15 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
Entries are listed in reverse chronological order.
44

5+
## 5.0.1
6+
7+
* Support for `serde_json`. Any library trying to deserialize RangeProof from json would run into an error, which is now fixed.
8+
59
## 5.0.0
610

711
* Change `curve25519-dalek-ng` dependency to `curve25519-dalek`. A major version bump is required because one cannot import `curve25519-dalek` and `bulletproofs` without conflicts.

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ name = "bulletproofs"
44
# - update version field
55
# - update html_root_url
66
# - update CHANGELOG
7-
version = "5.0.0"
7+
version = "5.0.1"
88
authors = ["Cathie Yun <cathieyun@gmail.com>",
99
"Henry de Valence <hdevalence@hdevalence.ca>",
1010
"Oleg Andreev <oleganza@gmail.com>"]
@@ -35,6 +35,7 @@ clear_on_drop = { version = "0.2", default-features = false }
3535
hex = "0.3"
3636
criterion = "0.3"
3737
bincode = "1"
38+
serde_json = "1"
3839
rand_chacha = "0.3"
3940
curve25519-dalek = { version = "4.1.1", features = ["digest", "group", "legacy_compatibility", "rand_core", "serde"] }
4041

src/range_proof/mod.rs

Lines changed: 64 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use crate::transcript::TranscriptProtocol;
2222
use crate::util;
2323

2424
use rand_core::{CryptoRng, RngCore};
25-
use serde::de::Visitor;
25+
use serde::de::{Error, SeqAccess, Visitor};
2626
use serde::{self, Deserialize, Deserializer, Serialize, Serializer};
2727

2828
// Modules for MPC protocol
@@ -559,7 +559,25 @@ impl<'de> Deserialize<'de> for RangeProof {
559559
type Value = RangeProof;
560560

561561
fn expecting(&self, formatter: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
562-
formatter.write_str("a valid RangeProof")
562+
formatter.write_str("a byte sequence (raw or UTF-8) representation of RangeProof")
563+
}
564+
565+
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
566+
where
567+
A: SeqAccess<'de>,
568+
{
569+
let mut vec = Vec::<u8>::new();
570+
while let Some(elem) = seq.next_element()? {
571+
vec.push(elem);
572+
}
573+
// Using Error::custom requires T: Display, which our error
574+
// type only implements when it implements std::error::Error.
575+
#[cfg(feature = "std")]
576+
return RangeProof::from_bytes(&*vec).map_err(serde::de::Error::custom);
577+
// In no-std contexts, drop the error message.
578+
#[cfg(not(feature = "std"))]
579+
return RangeProof::from_bytes(&*vec)
580+
.map_err(|_| serde::de::Error::custom("deserialization error"));
563581
}
564582

565583
fn visit_bytes<E>(self, v: &[u8]) -> Result<RangeProof, E>
@@ -631,7 +649,15 @@ mod tests {
631649
/// 2. Serialize to wire format;
632650
/// 3. Deserialize from wire format;
633651
/// 4. Verify the proof.
634-
fn singleparty_create_and_verify_helper(n: usize, m: usize) {
652+
fn singleparty_create_and_verify_helper<T, S, D>(
653+
n: usize,
654+
m: usize,
655+
serialize: S,
656+
deserialize: D,
657+
) where
658+
S: Fn(&RangeProof) -> T,
659+
D: Fn(&T) -> RangeProof,
660+
{
635661
// Split the test into two scopes, so that it's explicit what
636662
// data is shared between the prover and the verifier.
637663

@@ -645,7 +671,7 @@ mod tests {
645671
let bp_gens = BulletproofGens::new(max_bitsize, max_parties);
646672

647673
// Prover's scope
648-
let (proof_bytes, value_commitments) = {
674+
let (serialized_proof, value_commitments) = {
649675
use self::rand::Rng;
650676
let mut rng = rand::thread_rng();
651677

@@ -667,13 +693,13 @@ mod tests {
667693
.unwrap();
668694

669695
// 2. Return serialized proof and value commitments
670-
(bincode::serialize(&proof).unwrap(), value_commitments)
696+
(serialize(&proof), value_commitments)
671697
};
672698

673699
// Verifier's scope
674700
{
675701
// 3. Deserialize
676-
let proof: RangeProof = bincode::deserialize(&proof_bytes).unwrap();
702+
let proof: RangeProof = deserialize(&serialized_proof);
677703

678704
// 4. Verify with the same customization label as above
679705
let mut transcript = Transcript::new(b"AggregatedRangeProofTest");
@@ -684,44 +710,68 @@ mod tests {
684710
}
685711
}
686712

713+
fn serialize_json(proof: &RangeProof) -> String {
714+
serde_json::to_string_pretty(proof).unwrap()
715+
}
716+
717+
fn deserialize_json(serialized_json: &String) -> RangeProof {
718+
serde_json::from_str(serialized_json).unwrap()
719+
}
720+
721+
fn serialize_bin(proof: &RangeProof) -> Vec<u8> {
722+
bincode::serialize(&proof).unwrap()
723+
}
724+
725+
fn deserialize_bin(serialized_bytes: &Vec<u8>) -> RangeProof {
726+
bincode::deserialize(&serialized_bytes).unwrap()
727+
}
728+
687729
#[test]
688730
fn create_and_verify_n_32_m_1() {
689-
singleparty_create_and_verify_helper(32, 1);
731+
singleparty_create_and_verify_helper(32, 1, serialize_json, deserialize_json);
732+
singleparty_create_and_verify_helper(32, 1, serialize_bin, deserialize_bin);
690733
}
691734

692735
#[test]
693736
fn create_and_verify_n_32_m_2() {
694-
singleparty_create_and_verify_helper(32, 2);
737+
singleparty_create_and_verify_helper(32, 2, serialize_json, deserialize_json);
738+
singleparty_create_and_verify_helper(32, 2, serialize_bin, deserialize_bin);
695739
}
696740

697741
#[test]
698742
fn create_and_verify_n_32_m_4() {
699-
singleparty_create_and_verify_helper(32, 4);
743+
singleparty_create_and_verify_helper(32, 4, serialize_json, deserialize_json);
744+
singleparty_create_and_verify_helper(32, 4, serialize_bin, deserialize_bin);
700745
}
701746

702747
#[test]
703748
fn create_and_verify_n_32_m_8() {
704-
singleparty_create_and_verify_helper(32, 8);
749+
singleparty_create_and_verify_helper(32, 8, serialize_json, deserialize_json);
750+
singleparty_create_and_verify_helper(32, 8, serialize_bin, deserialize_bin);
705751
}
706752

707753
#[test]
708754
fn create_and_verify_n_64_m_1() {
709-
singleparty_create_and_verify_helper(64, 1);
755+
singleparty_create_and_verify_helper(64, 1, serialize_json, deserialize_json);
756+
singleparty_create_and_verify_helper(64, 1, serialize_bin, deserialize_bin);
710757
}
711758

712759
#[test]
713760
fn create_and_verify_n_64_m_2() {
714-
singleparty_create_and_verify_helper(64, 2);
761+
singleparty_create_and_verify_helper(64, 2, serialize_json, deserialize_json);
762+
singleparty_create_and_verify_helper(64, 2, serialize_bin, deserialize_bin);
715763
}
716764

717765
#[test]
718766
fn create_and_verify_n_64_m_4() {
719-
singleparty_create_and_verify_helper(64, 4);
767+
singleparty_create_and_verify_helper(64, 4, serialize_json, deserialize_json);
768+
singleparty_create_and_verify_helper(64, 4, serialize_bin, deserialize_bin);
720769
}
721770

722771
#[test]
723772
fn create_and_verify_n_64_m_8() {
724-
singleparty_create_and_verify_helper(64, 8);
773+
singleparty_create_and_verify_helper(64, 8, serialize_json, deserialize_json);
774+
singleparty_create_and_verify_helper(64, 8, serialize_bin, deserialize_bin);
725775
}
726776

727777
#[test]

0 commit comments

Comments
 (0)