diff --git a/Cargo.lock b/Cargo.lock index 12f38458..669d4d81 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -612,6 +612,7 @@ dependencies = [ "crc", "funty", "modular-bitfield-msb", + "rand 0.9.1", "serde", "structpack", "tlmcmddb", @@ -663,7 +664,19 @@ checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", ] [[package]] @@ -1003,9 +1016,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.153" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libredox" @@ -1092,7 +1105,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.48.0", ] @@ -1447,6 +1460,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "radium" version = "0.7.0" @@ -1460,8 +1479,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", ] [[package]] @@ -1471,7 +1500,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", ] [[package]] @@ -1480,7 +1519,16 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.14", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.2", ] [[package]] @@ -1498,7 +1546,7 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" dependencies = [ - "getrandom", + "getrandom 0.2.14", "libredox", "thiserror", ] @@ -1597,7 +1645,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.14", "libc", "spin", "untrusted", @@ -1799,7 +1847,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "161283cfe8e99c8f6f236a402b9ccf726b201f365988b5bb637ebca0abbd4a30" dependencies = [ "once_cell", - "rand", + "rand 0.8.5", "sentry-types", "serde", "serde_json", @@ -1835,7 +1883,7 @@ checksum = "5d68cdf6bc41b8ff3ae2a9c4671e97426dcdd154cc1d4b6b72813f285d6b163f" dependencies = [ "debugid", "hex", - "rand", + "rand 0.8.5", "serde", "serde_json", "thiserror", @@ -2359,7 +2407,7 @@ dependencies = [ "indexmap 1.9.3", "pin-project", "pin-project-lite", - "rand", + "rand 0.8.5", "slab", "tokio", "tokio-util", @@ -2479,7 +2527,7 @@ dependencies = [ "http 0.2.12", "httparse", "log", - "rand", + "rand 0.8.5", "sha1", "thiserror", "url", @@ -2623,6 +2671,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" version = "0.2.92" @@ -2932,6 +2989,15 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.5.0", +] + [[package]] name = "wyz" version = "0.5.1" diff --git a/gaia-ccsds-c2a/Cargo.toml b/gaia-ccsds-c2a/Cargo.toml index c3c049e3..00c72d37 100644 --- a/gaia-ccsds-c2a/Cargo.toml +++ b/gaia-ccsds-c2a/Cargo.toml @@ -19,3 +19,6 @@ zerocopy = "0.6" tlmcmddb = "=2.5.1" structpack.workspace = true async-trait = "0.1" + +[dev-dependencies] +rand = "0.9.1" diff --git a/gaia-ccsds-c2a/src/ccsds/tc/cltu.rs b/gaia-ccsds-c2a/src/ccsds/tc/cltu.rs index 651e7160..b8f60484 100644 --- a/gaia-ccsds-c2a/src/ccsds/tc/cltu.rs +++ b/gaia-ccsds-c2a/src/ccsds/tc/cltu.rs @@ -73,6 +73,75 @@ mod tests { assert_eq!(bch, 0xCC); } + // bch code, without complement, lsb aligned + fn raw_bch(info_bytes: &[u8]) -> u8 { + !bch_code(info_bytes) >> 1 + } + + // input: code(x) (7 bits) + // output: code(x) * x + fn shift(code: u8) -> u8 { + let mut shifted = code << 1; + if shifted & 0b10000000 != 0 { + shifted ^= 0b11000101; + } + shifted + } + + // input: code(x) (7 bits) + // output: code(x) * x^n + fn shift_n(code: u8, n: usize) -> u8 { + let mut shifted = code; + for _ in 0..n { + shifted = shift(shifted); + } + shifted + } + + #[test] + fn test_bch_zero() { + let bch = raw_bch(&[0; 7]); + assert_eq!(bch, 0); + } + + #[test] + fn test_bch_one() { + assert_eq!(raw_bch(&[0, 0, 0, 0, 0, 0, 1]), 0x45); + } + + // check forall i in [0, 56), BCH(x ^ i) = x ^ (i + 7) + #[test] + fn test_bc_single_bit() { + for i in 0..56 { + let byte_pos = i / 8; + let bit_pos = i % 8; + let mut info_bytes = [0; 7]; + info_bytes[6 - byte_pos] = 1 << bit_pos; + assert_eq!(raw_bch(&info_bytes), shift_n(1, i + 7)); + } + } + + // check forall p q, BCH(p + q) = BCH(p) + BCH(q) + #[test] + fn test_bch_homomorphism() { + use rand::{rngs::SmallRng, Rng, SeedableRng}; + let seed = rand::random(); + println!("seed = {}", seed); + let mut rng = SmallRng::seed_from_u64(seed); + + for _ in 0..1000 { + let p: [u8; 7] = rng.random(); + let q: [u8; 7] = rng.random(); + let r: [u8; 7] = std::array::from_fn(|i| p[i] ^ q[i]); + + let p_code = raw_bch(&p); + let q_code = raw_bch(&q); + let r_code = raw_bch(&r); + + assert_eq!(p_code ^ q_code, r_code); + } + } + #[test] fn test_randomize() { let mut bytes = vec![