Skip to content

Commit c6e4a48

Browse files
authored
[CHIA-2843] add function to check if a serialization uses canonical encoding of atoms (#580)
* add function to check if a CLVM serialization uses canonical encoding of atoms * address clippy warning
1 parent acffacf commit c6e4a48

File tree

6 files changed

+265
-127
lines changed

6 files changed

+265
-127
lines changed

fuzz/Cargo.toml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,3 +110,15 @@ name = "tree-cache"
110110
path = "fuzz_targets/tree_cache.rs"
111111
test = false
112112
doc = false
113+
114+
[[bin]]
115+
name = "canonical-serialization"
116+
path = "fuzz_targets/canonical_serialization.rs"
117+
test = false
118+
doc = false
119+
120+
[[bin]]
121+
name = "canonical-serialization-br"
122+
path = "fuzz_targets/canonical_serialization_br.rs"
123+
test = false
124+
doc = false
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#![no_main]
2+
mod make_tree;
3+
4+
use clvmr::serde::is_canonical_serialization;
5+
use clvmr::serde::node_to_bytes;
6+
use clvmr::Allocator;
7+
use libfuzzer_sys::fuzz_target;
8+
use make_tree::make_tree_limits;
9+
10+
fuzz_target!(|data: &[u8]| {
11+
let mut unstructured = arbitrary::Unstructured::new(data);
12+
let mut a = Allocator::new();
13+
let (tree, _) = make_tree_limits(&mut a, &mut unstructured, 1000, false);
14+
15+
let buffer = node_to_bytes(&a, tree).expect("internal error, failed to serialize");
16+
17+
// out serializer should always produce canonical serialization
18+
assert!(is_canonical_serialization(&buffer));
19+
});
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#![no_main]
2+
mod make_tree;
3+
4+
use clvmr::serde::is_canonical_serialization;
5+
use clvmr::serde::node_to_bytes_backrefs;
6+
use clvmr::Allocator;
7+
use libfuzzer_sys::fuzz_target;
8+
use make_tree::make_tree_limits;
9+
10+
fuzz_target!(|data: &[u8]| {
11+
let mut unstructured = arbitrary::Unstructured::new(data);
12+
let mut a = Allocator::new();
13+
let (tree, _) = make_tree_limits(&mut a, &mut unstructured, 1000, true);
14+
15+
let buffer = node_to_bytes_backrefs(&a, tree).expect("internal error, failed to serialize");
16+
17+
// out serializer should always produce canonical serialization
18+
assert!(is_canonical_serialization(&buffer));
19+
});

src/reduction.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,6 @@ impl std::error::Error for EvalErr {}
2121

2222
impl From<EvalErr> for io::Error {
2323
fn from(v: EvalErr) -> Self {
24-
Self::new(io::ErrorKind::Other, v.1)
24+
Self::other(v.1)
2525
}
2626
}

src/serde/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ pub use ser::{node_to_bytes, node_to_bytes_limit};
3636
pub use ser_br::{node_to_bytes_backrefs, node_to_bytes_backrefs_limit};
3737
pub use serialized_length::{serialized_length_atom, serialized_length_small_number};
3838
pub use tools::{
39-
serialized_length_from_bytes, serialized_length_from_bytes_trusted, tree_hash_from_stream,
39+
is_canonical_serialization, serialized_length_from_bytes, serialized_length_from_bytes_trusted,
40+
tree_hash_from_stream,
4041
};
4142
pub use tree_cache::{TreeCache, TreeCacheCheckpoint};

0 commit comments

Comments
 (0)