@@ -294,38 +294,47 @@ where
294294 subkeys : & Array < DeoxysKey , B :: SubkeysSize > ,
295295 tag : & mut Tag ,
296296 ) {
297- if !buffer. is_empty ( ) {
298- tweak[ 0 ] = TWEAK_M ;
297+ if buffer. is_empty ( ) {
298+ return ;
299+ }
300+ tweak[ 0 ] = TWEAK_M ;
299301
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 ( ) ;
303304
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 ( ) ) ;
307308
308- B :: encrypt_in_place ( & mut block, tweak, subkeys) ;
309+ let mut block = data. clone ( ) ;
310+ B :: encrypt_in_place ( & mut block, tweak, subkeys) ;
309311
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+ }
316316
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+ }
319322
320- block[ data. len ( ) ] = 0x80 ;
323+ // Copy block number
324+ tweak[ 8 ..] . copy_from_slice ( & ( index as u64 ) . to_be_bytes ( ) ) ;
321325
322- B :: encrypt_in_place ( & mut block, tweak, subkeys) ;
326+ // Last block
327+ tweak[ 0 ] = TWEAK_M_LAST ;
323328
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;
329338 }
330339 }
331340
0 commit comments