@@ -294,38 +294,46 @@ 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) ;
303303
304- if data . len ( ) == 16 {
305- let mut block = Block :: default ( ) ;
306- block . copy_from_slice ( data ) ;
304+ for ( index , data ) in chunks . iter ( ) . enumerate ( ) {
305+ // Copy block number
306+ tweak [ 8 .. ] . copy_from_slice ( & ( index as u64 ) . to_be_bytes ( ) ) ;
307307
308- B :: encrypt_in_place ( & mut block, tweak, subkeys) ;
308+ let mut block = * data;
309+ B :: encrypt_in_place ( & mut block, tweak, subkeys) ;
309310
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 ;
311+ for ( t, b) in tag. iter_mut ( ) . zip ( block. iter ( ) ) {
312+ * t ^= b;
313+ }
314+ }
316315
317- let mut block = Block :: default ( ) ;
318- block[ 0 ..data. len ( ) ] . copy_from_slice ( data) ;
316+ let index = chunks. len ( ) ;
317+ let data = tail;
318+ if data. is_empty ( ) {
319+ return ;
320+ }
319321
320- block[ data. len ( ) ] = 0x80 ;
322+ // Copy block number
323+ tweak[ 8 ..] . copy_from_slice ( & ( index as u64 ) . to_be_bytes ( ) ) ;
321324
322- B :: encrypt_in_place ( & mut block, tweak, subkeys) ;
325+ // Last block
326+ tweak[ 0 ] = TWEAK_M_LAST ;
323327
324- for ( t, b) in tag. iter_mut ( ) . zip ( block. iter ( ) ) {
325- * t ^= b;
326- }
327- }
328- }
328+ let mut block = Block :: default ( ) ;
329+ block[ 0 ..data. len ( ) ] . copy_from_slice ( data) ;
330+
331+ block[ data. len ( ) ] = 0x80 ;
332+
333+ B :: encrypt_in_place ( & mut block, tweak, subkeys) ;
334+
335+ for ( t, b) in tag. iter_mut ( ) . zip ( block. iter ( ) ) {
336+ * t ^= b;
329337 }
330338 }
331339
0 commit comments