diff --git a/deoxys/src/modes.rs b/deoxys/src/modes.rs index d02d586a..ccb2b117 100644 --- a/deoxys/src/modes.rs +++ b/deoxys/src/modes.rs @@ -294,38 +294,46 @@ where subkeys: &Array, tag: &mut Tag, ) { - if !buffer.is_empty() { - tweak[0] = TWEAK_M; + if buffer.is_empty() { + return; + } + tweak[0] = TWEAK_M; - for (index, data) in buffer.chunks(16).enumerate() { - // Copy block number - tweak[8..].copy_from_slice(&(index as u64).to_be_bytes()); + let (chunks, tail) = Block::slice_as_chunks(buffer); - if data.len() == 16 { - let mut block = Block::default(); - block.copy_from_slice(data); + for (index, data) in chunks.iter().enumerate() { + // Copy block number + tweak[8..].copy_from_slice(&(index as u64).to_be_bytes()); - B::encrypt_in_place(&mut block, tweak, subkeys); + let mut block = *data; + B::encrypt_in_place(&mut block, tweak, subkeys); - for (t, b) in tag.iter_mut().zip(block.iter()) { - *t ^= b; - } - } else { - // Last block - tweak[0] = TWEAK_M_LAST; + for (t, b) in tag.iter_mut().zip(block.iter()) { + *t ^= b; + } + } - let mut block = Block::default(); - block[0..data.len()].copy_from_slice(data); + let index = chunks.len(); + let data = tail; + if data.is_empty() { + return; + } - block[data.len()] = 0x80; + // Copy block number + tweak[8..].copy_from_slice(&(index as u64).to_be_bytes()); - B::encrypt_in_place(&mut block, tweak, subkeys); + // Last block + tweak[0] = TWEAK_M_LAST; - for (t, b) in tag.iter_mut().zip(block.iter()) { - *t ^= b; - } - } - } + let mut block = Block::default(); + block[0..data.len()].copy_from_slice(data); + + block[data.len()] = 0x80; + + B::encrypt_in_place(&mut block, tweak, subkeys); + + for (t, b) in tag.iter_mut().zip(block.iter()) { + *t ^= b; } }