1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#[cfg(all(test, feature = "browser"))]
wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser);
#[cfg(test)]
mod tests {
use crate::fuzz_test;
use bin_prot::Deserializer;
use mina_serialization_types::v1::*;
use rand::prelude::*;
use serde::Deserialize;
use wasm_bindgen_test::*;
#[test]
#[wasm_bindgen_test]
fn test_corrupted_deserialization() {
fuzz_test!(
ExternalTransitionV1
ProtocolStateV1
ProtocolStateBodyV1
BlockchainStateV1
ConsensusStateV1
ProtocolConstantsV1
ProtocolStateProofV1
ProofStatementV1
PrevEvalsV1
ProofV1
ProofMessagesV1
ProofOpeningsV1
StagedLedgerDiffV1
StagedLedgerDiffTupleV1
StagedLedgerPreDiffV1
DeltaTransitionChainProof
Option<ProtocolVersionV1>
()
);
}
#[test]
#[wasm_bindgen_test]
fn ensure_non_exhaustive_deserialization() {
let mut rng = StdRng::from_seed([0; 32]);
let mut bytes = vec![0; rng.gen_range((1024 * 1024)..(50 * 1024 * 1024))];
bytes[0] = 1;
let mut de = Deserializer::from_reader(bytes.as_slice());
let _et: ProtocolVersionV1 = Deserialize::deserialize(&mut de).unwrap();
}
#[macro_export]
macro_rules! fuzz_test {
($($ty: ty) *) => {
$(
let mut rng = StdRng::from_seed([0; 32]);
for _i in 0..5 {
let mut bytes = vec![0; rng.gen_range((1024 * 1024)..(50 * 1024 * 1024))];
rng.try_fill_bytes(&mut bytes).unwrap();
let et: anyhow::Result<$ty> = (|| {
let mut de = Deserializer::from_reader(bytes.as_slice());
let et: $ty = Deserialize::deserialize(&mut de)?;
Ok(et)
})();
et.unwrap_err();
}
)*
};
}
}