CCSDS Frame Security Report (FSR)
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add ocaml-reed-solomon, full Proximity-1 codec, fuzzers

New package:
- ocaml-reed-solomon: RS error correction over GF(2^8) with
Berlekamp-Massey decoder, Chien search, Forney algorithm.
CCSDS RS(255,223) preset. 17 tests including error correction
up to t=16 symbols.

Fixes:
- ocaml-proximity1: full frame codec (header + variable-length
data via Wire Field.ref on frame_length), not just header

Fuzz tests added for:
- ocaml-cltu: CLTU/BCH roundtrip, ASM, sync parsers (6 tests)
- ocaml-cop1: FOP-1/FARM-1 random event sequences (5 tests)
- ocaml-fsr: encode/decode roundtrip, crash safety (4 tests)
- ocaml-ccsds-time: CUC/CDS roundtrip, pfield (7 tests)
- ocaml-tm-sync: randomizer self-inverse property (5 tests)
- ocaml-proximity1: full frame roundtrip, crash safety (5 tests)

+81
+22
fuzz/dune
··· 1 + (executable 2 + (name fuzz) 3 + (modules fuzz fuzz_fsr) 4 + (libraries fsr alcobar)) 5 + 6 + (rule 7 + (alias runtest) 8 + (enabled_if 9 + (<> %{profile} afl)) 10 + (deps fuzz.exe) 11 + (action 12 + (run %{exe:fuzz.exe}))) 13 + 14 + (rule 15 + (alias fuzz) 16 + (enabled_if 17 + (= %{profile} afl)) 18 + (deps fuzz.exe) 19 + (action 20 + (progn 21 + (run %{exe:fuzz.exe} --gen-corpus corpus) 22 + (run afl-fuzz -V 60 -i corpus -o _fuzz -- %{exe:fuzz.exe} @@))))
+1
fuzz/fuzz.ml
··· 1 + let () = Alcobar.run "fsr" [ Fuzz_fsr.suite ]
+54
fuzz/fuzz_fsr.ml
··· 1 + (*--------------------------------------------------------------------------- 2 + Copyright (c) 2025 Thomas Gazagnaire. All rights reserved. 3 + SPDX-License-Identifier: ISC 4 + ---------------------------------------------------------------------------*) 5 + 6 + open Alcobar 7 + 8 + (** Roundtrip: random FSR -> encode to int32 -> decode -> verify equal. *) 9 + let test_roundtrip alarm bad_sn bad_mac bad_sa spi arsn_lsb = 10 + let spi = spi mod 65536 in 11 + let arsn_lsb = arsn_lsb mod 256 in 12 + let fsr = Fsr.v ~alarm ~bad_sn ~bad_mac ~bad_sa ~spi ~arsn_lsb in 13 + let word = Fsr.encode fsr in 14 + match Fsr.decode word with 15 + | Error e -> fail (Fmt.str "decode failed: %a" Fsr.pp_error e) 16 + | Ok fsr' -> check_eq ~pp:Fsr.pp ~eq:( = ) fsr fsr' 17 + 18 + (** Crash safety: random int32 -> decode -> should not crash (may return Error). 19 + *) 20 + let test_decode_crash word = 21 + let _ = Fsr.decode word in 22 + () 23 + 24 + (** Encode determinism: same FSR encodes to same word. *) 25 + let test_encode_determinism alarm bad_sn bad_mac bad_sa spi arsn_lsb = 26 + let spi = spi mod 65536 in 27 + let arsn_lsb = arsn_lsb mod 256 in 28 + let fsr = Fsr.v ~alarm ~bad_sn ~bad_mac ~bad_sa ~spi ~arsn_lsb in 29 + let w1 = Fsr.encode fsr in 30 + let w2 = Fsr.encode fsr in 31 + check_eq ~pp:pp_int32 w1 w2 32 + 33 + (** pp crash safety: pretty-printing should not crash. *) 34 + let test_pp_crash alarm bad_sn bad_mac bad_sa spi arsn_lsb = 35 + let spi = spi mod 65536 in 36 + let arsn_lsb = arsn_lsb mod 256 in 37 + let fsr = Fsr.v ~alarm ~bad_sn ~bad_mac ~bad_sa ~spi ~arsn_lsb in 38 + let _ = Fmt.str "%a" Fsr.pp fsr in 39 + () 40 + 41 + let suite = 42 + ( "fsr", 43 + [ 44 + test_case "roundtrip" 45 + [ bool; bool; bool; bool; range 65536; range 256 ] 46 + test_roundtrip; 47 + test_case "decode crash safety" [ int32 ] test_decode_crash; 48 + test_case "encode determinism" 49 + [ bool; bool; bool; bool; range 65536; range 256 ] 50 + test_encode_determinism; 51 + test_case "pp crash safety" 52 + [ bool; bool; bool; bool; range 65536; range 256 ] 53 + test_pp_crash; 54 + ] )
+4
fuzz/fuzz_fsr.mli
··· 1 + (** Fuzz tests for {!Fsr}. *) 2 + 3 + val suite : string * Alcobar.test_case list 4 + (** Test suite. *)