decompose key register LFSR
This commit is contained in:
56
src/tea3.rs
56
src/tea3.rs
@@ -1,3 +1,5 @@
|
|||||||
|
use crate::Lfsr;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct Tea3 {
|
pub struct Tea3 {
|
||||||
/// Cipher key register k0..k9
|
/// Cipher key register k0..k9
|
||||||
@@ -89,14 +91,48 @@ mod tests {
|
|||||||
assert_eq!(tea3.key_register(), &[0x70, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
|
assert_eq!(tea3.key_register(), &[0x70, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// #[test]
|
#[test]
|
||||||
// fn test_decompose() {
|
fn test_decompose() {
|
||||||
// // key register should be able to be decomposed into 2 registers g and h,
|
fn p(x: u8) -> u8 {
|
||||||
// // both register of 5 bytes.
|
TEA3_P[x as usize]
|
||||||
// // let's note the bytes of g, a0 to a4
|
}
|
||||||
// // and the bytes of h, r0 to r4
|
|
||||||
// // h feedback function should be r0 ^ s(r2)
|
let k = vec![1u8, 2, 3, 4, 5, 6, 7, 8, 9, 10];
|
||||||
// // g feedback function should be a0 ^ h.next_custom
|
let mut tea3 = Tea3::new(k, vec![0; 8]);
|
||||||
// // then the byte a0 should be outputed
|
|
||||||
// }
|
let mut full_outputs = Vec::new();
|
||||||
|
for _ in 0..20 {
|
||||||
|
let kout = tea3.step_key_register();
|
||||||
|
full_outputs.push(kout);
|
||||||
|
}
|
||||||
|
|
||||||
|
let s = &full_outputs[0..10];
|
||||||
|
|
||||||
|
let g_orig = [s[0], s[1], s[2], s[3], s[4]];
|
||||||
|
let h_orig = [
|
||||||
|
s[5] ^ s[0],
|
||||||
|
s[6] ^ s[1],
|
||||||
|
s[7] ^ s[2],
|
||||||
|
s[8] ^ s[3],
|
||||||
|
s[9] ^ s[4],
|
||||||
|
];
|
||||||
|
|
||||||
|
let g_rev: Vec<u8> = g_orig.iter().rev().copied().collect();
|
||||||
|
let h_rev: Vec<u8> = h_orig.iter().rev().copied().collect();
|
||||||
|
|
||||||
|
let mut g_lfsr = Lfsr::new(5, vec![], g_rev);
|
||||||
|
let mut h_lfsr = Lfsr::new(5, vec![], h_rev);
|
||||||
|
|
||||||
|
let mut decomposed_outputs = Vec::new();
|
||||||
|
for _ in 0..20 {
|
||||||
|
let h_out = h_lfsr.next_custom([4, 2], |[h0, h2]| h0 ^ p(h2));
|
||||||
|
let g_out = g_lfsr.next_custom([4], |[g0]| g0 ^ h_out);
|
||||||
|
decomposed_outputs.push(g_out);
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
decomposed_outputs, full_outputs,
|
||||||
|
"g + h LFSRs must reproduce the exact output sequence"
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user