fix step state register

This commit is contained in:
2026-04-09 10:38:24 +02:00
parent 5d49815922
commit 381cabeda4
2 changed files with 19 additions and 12 deletions
+5 -6
View File
@@ -46,13 +46,11 @@ impl Tea3 {
} }
pub fn step_state_register(&mut self, kout: u8) -> u8 { 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 bp_r4 = bp(self.state_register[4]);
let f2_r2_r1 = f2(e(self.state_register[2], self.state_register[1])); 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 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; let r5_new = self.state_register[4] ^ f1_r6_r5;
self.state_register[7] = self.state_register[6]; 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[1] = self.state_register[0];
self.state_register[0] = r0_new; self.state_register[0] = r0_new;
r7 self.state_register[7]
} }
pub fn step(&mut self) -> u8 { 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 mut tea3 = Tea3::new(vec![0; 10], vec![1, 2, 3, 4, 5, 6, 7, 8]);
let kout = 0xAA; 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); let out = tea3.step_state_register(kout);
assert_eq!(out, r7_before); assert_eq!(out, r6_before);
let s = tea3.state_register(); let s = tea3.state_register();
+14 -6
View File
@@ -35,17 +35,21 @@ impl Tea3FromC {
fn step(&mut self) { fn step(&mut self) {
// Step 1: Derive non-linear feedback byte with the SBOX and feed back into key register // 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.copy_within(1..10, 0);
self.key_register[9] = b_sbox_out; self.key_register[9] = b_sbox_out;
// Step 2: Compute 3 bytes derived from current state // 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_byte12 =
let b_deriv_byte56 = tea3_state_word_to_newbyte(((self.iv >> 40) & 0xffff) as u16, &TEA3_LUT_B); 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); 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 // 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; let b_mix_byte = b_deriv_byte56 as u64;
// Step 4: Update 64 bits state // 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, 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_A: [u16; 8] = [
const TEA3_LUT_B: [u16; 8] = [0x9D58, 0xA46D, 0x176C, 0x79C4, 0xC62B, 0xB2C9, 0x4D93, 0x2E93]; 0x92A7, 0xA761, 0x974C, 0x6B8C, 0x29CE, 0x176C, 0x39D4, 0x7463,
];
const TEA3_LUT_B: [u16; 8] = [
0x9D58, 0xA46D, 0x176C, 0x79C4, 0xC62B, 0xB2C9, 0x4D93, 0x2E93,
];
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {