From 381cabeda44287abd4a5e0cfbb6ce06702eb64ad Mon Sep 17 00:00:00 2001 From: Sam Hadow Date: Thu, 9 Apr 2026 10:38:24 +0200 Subject: [PATCH] fix step state register --- src/tea3.rs | 11 +++++------ src/tea3_from_c.rs | 20 ++++++++++++++------ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/tea3.rs b/src/tea3.rs index 0782588..1c044a5 100644 --- a/src/tea3.rs +++ b/src/tea3.rs @@ -46,13 +46,11 @@ impl Tea3 { } pub fn step_state_register(&mut self, kout: u8) -> u8 { - let r7 = self.state_register[7]; - let bp_r4 = bp(self.state_register[4]); let f2_r2_r1 = f2(e(self.state_register[2], self.state_register[1])); let f1_r6_r5 = f1(e(self.state_register[6], self.state_register[5])); - let r0_new = r7 ^ bp_r4 ^ f2_r2_r1 ^ kout; + let r0_new = self.state_register[7] ^ bp_r4 ^ f2_r2_r1 ^ kout; let r5_new = self.state_register[4] ^ f1_r6_r5; self.state_register[7] = self.state_register[6]; @@ -64,7 +62,7 @@ impl Tea3 { self.state_register[1] = self.state_register[0]; self.state_register[0] = r0_new; - r7 + self.state_register[7] } pub fn step(&mut self) -> u8 { @@ -328,11 +326,12 @@ mod tests { let mut tea3 = Tea3::new(vec![0; 10], vec![1, 2, 3, 4, 5, 6, 7, 8]); let kout = 0xAA; - let r7_before = tea3.state_register()[7]; + + let r6_before = tea3.state_register()[6]; // new r7 let out = tea3.step_state_register(kout); - assert_eq!(out, r7_before); + assert_eq!(out, r6_before); let s = tea3.state_register(); diff --git a/src/tea3_from_c.rs b/src/tea3_from_c.rs index 83390c2..71b82bf 100644 --- a/src/tea3_from_c.rs +++ b/src/tea3_from_c.rs @@ -35,17 +35,21 @@ impl Tea3FromC { fn step(&mut self) { // Step 1: Derive non-linear feedback byte with the SBOX and feed back into key register - let b_sbox_out = TEA3_SBOX[(self.key_register[7] ^ self.key_register[2]) as usize] ^ self.key_register[0]; + let b_sbox_out = TEA3_SBOX[(self.key_register[7] ^ self.key_register[2]) as usize] + ^ self.key_register[0]; self.key_register.copy_within(1..10, 0); self.key_register[9] = b_sbox_out; // Step 2: Compute 3 bytes derived from current state - let b_deriv_byte12 = tea3_state_word_to_newbyte(((self.iv >> 8) & 0xffff) as u16, &TEA3_LUT_A); - let b_deriv_byte56 = tea3_state_word_to_newbyte(((self.iv >> 40) & 0xffff) as u16, &TEA3_LUT_B); + let b_deriv_byte12 = + tea3_state_word_to_newbyte(((self.iv >> 8) & 0xffff) as u16, &TEA3_LUT_A); + let b_deriv_byte56 = + tea3_state_word_to_newbyte(((self.iv >> 40) & 0xffff) as u16, &TEA3_LUT_B); let b_reord_byte4 = tea3_reorder_state_byte(((self.iv >> 32) & 0xff) as u8); // Step 3: Combine current state with state derived values and XOR in key derived SBOX output - let b_new_byte = (((self.iv >> 56) as u8) ^ b_reord_byte4 ^ b_deriv_byte12 ^ b_sbox_out) & 0xff; + let b_new_byte = + (((self.iv >> 56) as u8) ^ b_reord_byte4 ^ b_deriv_byte12 ^ b_sbox_out) & 0xff; let b_mix_byte = b_deriv_byte56 as u64; // Step 4: Update 64 bits state @@ -121,8 +125,12 @@ const TEA3_SBOX: [u8; 256] = [ 0x52, 0x8C, 0x5D, 0x29, 0x6D, 0x04, 0xBC, 0x25, 0x15, 0x8B, 0x12, 0x9B, 0xD6, 0x75, 0xA3, 0x97, ]; -const TEA3_LUT_A: [u16; 8] = [0x92A7, 0xA761, 0x974C, 0x6B8C, 0x29CE, 0x176C, 0x39D4, 0x7463]; -const TEA3_LUT_B: [u16; 8] = [0x9D58, 0xA46D, 0x176C, 0x79C4, 0xC62B, 0xB2C9, 0x4D93, 0x2E93]; +const TEA3_LUT_A: [u16; 8] = [ + 0x92A7, 0xA761, 0x974C, 0x6B8C, 0x29CE, 0x176C, 0x39D4, 0x7463, +]; +const TEA3_LUT_B: [u16; 8] = [ + 0x9D58, 0xA46D, 0x176C, 0x79C4, 0xC62B, 0xB2C9, 0x4D93, 0x2E93, +]; #[cfg(test)] mod tests {