···11+(** Generate seed corpus for MBR fuzz testing. *)
22+33+let () =
44+ (try Unix.mkdir "corpus" 0o755
55+ with Unix.Unix_error (Unix.EEXIST, _, _) -> ());
66+ let write name data =
77+ let oc = open_out_bin (Filename.concat "corpus" name) in
88+ output_string oc data;
99+ close_out oc
1010+ in
1111+ (* Valid MBR with one partition *)
1212+ let p1 =
1313+ match
1414+ Mbr.Partition.make ~active:false ~partition_type:0x83 2048l 1048576l
1515+ with
1616+ | Ok p -> p
1717+ | Error _ -> failwith "failed to create partition"
1818+ in
1919+ let mbr = match Mbr.v [ p1 ] with Ok m -> m | Error _ -> failwith "mbr" in
2020+ write "seed_000" (Mbr.to_string mbr);
2121+ (* Active partition with FAT32 type *)
2222+ let p2 =
2323+ match Mbr.Partition.make ~active:true ~partition_type:0x0C 2048l 4096l with
2424+ | Ok p -> p
2525+ | Error _ -> failwith "failed to create partition"
2626+ in
2727+ let mbr2 = match Mbr.v [ p2 ] with Ok m -> m | Error _ -> failwith "mbr" in
2828+ write "seed_001" (Mbr.to_string mbr2);
2929+ (* Too short - exercises error paths *)
3030+ write "seed_002" "\x00\x00\x00\x00";
3131+ (* All zeros, 512 bytes *)
3232+ write "seed_003" (String.make 512 '\x00');
3333+ (* All ones, 512 bytes *)
3434+ write "seed_004" (String.make 512 '\xFF');
3535+ (* Valid boot signature at end but garbage elsewhere *)
3636+ let buf = Bytes.make 512 '\x00' in
3737+ Bytes.set buf 510 '\x55';
3838+ Bytes.set buf 511 '\xAA';
3939+ write "seed_005" (Bytes.to_string buf);
4040+ print_endline "gen_corpus: wrote 6 MBR seed files"