automerge/rust/automerge/fuzz/fuzz_targets/load.rs
Conrad Irwin 931ee7e77b
Add Fuzz Testing (#498)
* Add fuzz testing for document load

* Fix fuzz crashers and add to test suite
2023-01-25 16:03:05 +00:00

37 lines
960 B
Rust

#![no_main]
use sha2::{Sha256, Digest};
use automerge::{Automerge};
use libfuzzer_sys::arbitrary::{Arbitrary, Result, Unstructured};
use libfuzzer_sys::fuzz_target;
#[derive(Debug)]
struct DocumentChunk {
bytes: Vec<u8>,
}
fn add_header(typ: u8, data: &[u8]) -> Vec<u8> {
let mut input = vec![u8::from(typ)];
leb128::write::unsigned(&mut input, data.len() as u64).unwrap();
input.extend(data.as_ref());
let hash_result = Sha256::digest(input.clone());
let array: [u8; 32] = hash_result.into();
let mut out = vec![133, 111, 74, 131, array[0], array[1], array[2], array[3]];
out.extend(input);
out
}
impl<'a> Arbitrary<'a> for DocumentChunk
{
fn arbitrary(u: &mut Unstructured<'a>) -> Result<Self> {
let input = u.bytes(u.len())?;
let contents = add_header(0, input);
return Ok(DocumentChunk{bytes: contents})
}
}
fuzz_target!(|doc: DocumentChunk| {
Automerge::load(&doc.bytes);
});