|
1 | 1 | use super::{Block, DeoxysBcType, DeoxysKey, DeoxysMode, Tag, Tweak}; |
2 | 2 | use aead::{ |
3 | 3 | array::Array, |
4 | | - consts::{U8, U15, U16}, |
| 4 | + consts::{U15, U16, U8}, |
5 | 5 | }; |
6 | 6 | use core::marker::PhantomData; |
7 | 7 | use subtle::ConstantTimeEq; |
@@ -294,38 +294,47 @@ where |
294 | 294 | subkeys: &Array<DeoxysKey, B::SubkeysSize>, |
295 | 295 | tag: &mut Tag, |
296 | 296 | ) { |
297 | | - if !buffer.is_empty() { |
298 | | - tweak[0] = TWEAK_M; |
| 297 | + if buffer.is_empty() { |
| 298 | + return; |
| 299 | + } |
| 300 | + tweak[0] = TWEAK_M; |
299 | 301 |
|
300 | | - for (index, data) in buffer.chunks(16).enumerate() { |
301 | | - // Copy block number |
302 | | - tweak[8..].copy_from_slice(&(index as u64).to_be_bytes()); |
| 302 | + let (chunks, tail) = Block::slice_as_chunks(buffer); |
| 303 | + let chunks_len = chunks.len(); |
303 | 304 |
|
304 | | - if data.len() == 16 { |
305 | | - let mut block = Block::default(); |
306 | | - block.copy_from_slice(data); |
| 305 | + for (index, data) in chunks.into_iter().enumerate() { |
| 306 | + // Copy block number |
| 307 | + tweak[8..].copy_from_slice(&(index as u64).to_be_bytes()); |
307 | 308 |
|
308 | | - B::encrypt_in_place(&mut block, tweak, subkeys); |
| 309 | + let mut block = data.clone(); |
| 310 | + B::encrypt_in_place(&mut block, tweak, subkeys); |
309 | 311 |
|
310 | | - for (t, b) in tag.iter_mut().zip(block.iter()) { |
311 | | - *t ^= b; |
312 | | - } |
313 | | - } else { |
314 | | - // Last block |
315 | | - tweak[0] = TWEAK_M_LAST; |
| 312 | + for (t, b) in tag.iter_mut().zip(block.iter()) { |
| 313 | + *t ^= b; |
| 314 | + } |
| 315 | + } |
316 | 316 |
|
317 | | - let mut block = Block::default(); |
318 | | - block[0..data.len()].copy_from_slice(data); |
| 317 | + let index = chunks_len; |
| 318 | + let data = tail; |
| 319 | + if data.is_empty() { |
| 320 | + return; |
| 321 | + } |
319 | 322 |
|
320 | | - block[data.len()] = 0x80; |
| 323 | + // Copy block number |
| 324 | + tweak[8..].copy_from_slice(&(index as u64).to_be_bytes()); |
321 | 325 |
|
322 | | - B::encrypt_in_place(&mut block, tweak, subkeys); |
| 326 | + // Last block |
| 327 | + tweak[0] = TWEAK_M_LAST; |
323 | 328 |
|
324 | | - for (t, b) in tag.iter_mut().zip(block.iter()) { |
325 | | - *t ^= b; |
326 | | - } |
327 | | - } |
328 | | - } |
| 329 | + let mut block = Block::default(); |
| 330 | + block[0..data.len()].copy_from_slice(data); |
| 331 | + |
| 332 | + block[data.len()] = 0x80; |
| 333 | + |
| 334 | + B::encrypt_in_place(&mut block, tweak, subkeys); |
| 335 | + |
| 336 | + for (t, b) in tag.iter_mut().zip(block.iter()) { |
| 337 | + *t ^= b; |
329 | 338 | } |
330 | 339 | } |
331 | 340 |
|
|
0 commit comments