@@ -93,8 +93,11 @@ private void P(int nr)
9393 ROUND (0xd2L );
9494 ROUND (0xc3L );
9595 }
96- ROUND (0xb4L );
97- ROUND (0xa5L );
96+ if (nr >= 8 )
97+ {
98+ ROUND (0xb4L );
99+ ROUND (0xa5L );
100+ }
98101 ROUND (0x96L );
99102 ROUND (0x87L );
100103 ROUND (0x78L );
@@ -197,40 +200,33 @@ private void finishAAD(State nextState)
197200 m_state = nextState ;
198201 }
199202
200- private void processBufferDecrypt (byte [] buffer , int bufOff , byte [] output , int outOff )
203+ private void processBufferDecrypt (byte [] buffer , int bufOff , int bufLen , byte [] output , int outOff )
201204 {
202205 if (outOff + ASCON_AEAD_RATE > output .length )
203206 {
204207 throw new OutputLengthException ("output buffer too short" );
205208 }
206- long t0 = Pack .littleEndianToLong (buffer , bufOff );
207- Pack .longToLittleEndian (x0 ^ t0 , output , outOff );
208- x0 = t0 ;
209+ long c0 = Pack .littleEndianToLong (buffer , bufOff );
210+ long c1 = Pack .littleEndianToLong (buffer , bufOff + 8 , 8 );
211+
212+ Pack .longToLittleEndian (x0 ^ c0 , output , outOff );
213+ Pack .longToLittleEndian (x1 ^ c1 , output , outOff + 8 , 8 );
214+ x0 = c0 ;
215+ x1 = c1 ;
209216
210- if (ASCON_AEAD_RATE == 16 )
211- {
212- long t1 = Pack .littleEndianToLong (buffer , bufOff + 8 );
213- Pack .longToLittleEndian (x1 ^ t1 , output , outOff + 8 );
214- x1 = t1 ;
215- }
216217 P (nr );
217218 }
218219
219- private void processBufferEncrypt (byte [] buffer , int bufOff , byte [] output , int outOff )
220+ private void processBufferEncrypt (byte [] buffer , int bufOff , int bufLen , byte [] output , int outOff )
220221 {
221222 if (outOff + ASCON_AEAD_RATE > output .length )
222223 {
223224 throw new OutputLengthException ("output buffer too short" );
224225 }
225- x0 ^= Pack .littleEndianToLong (buffer , bufOff );
226+ x0 ^= Pack .littleEndianToLong (buffer , bufOff , 8 );
227+ x1 ^= Pack .littleEndianToLong (buffer , bufOff + 8 , 8 );
226228 Pack .longToLittleEndian (x0 , output , outOff );
227-
228- if (ASCON_AEAD_RATE == 16 )
229- {
230- x1 ^= Pack .littleEndianToLong (buffer , bufOff + 8 );
231- Pack .longToLittleEndian (x1 , output , outOff + 8 );
232- }
233-
229+ Pack .longToLittleEndian (x1 , output , outOff + 8 );
234230 P (nr );
235231 }
236232
@@ -239,33 +235,27 @@ private void processFinalDecrypt(byte[] input, int inOff, int inLen, byte[] outp
239235 if (inLen >= 8 ) // ASCON_AEAD_RATE == 16 is implied
240236 {
241237 long c0 = Pack .littleEndianToLong (input , inOff );
242- x0 ^= c0 ;
243- Pack .longToLittleEndian (x0 , output , outOff );
238+ long c1 = Pack .littleEndianToLong (input , inOff + 8 , inLen - 8 );
239+
240+ Pack .longToLittleEndian (x0 ^ c0 , output , outOff );
241+ Pack .longToLittleEndian (x1 ^ c1 , output , outOff + 8 , inLen - 8 );
242+
244243 x0 = c0 ;
245- inOff += 8 ;
246- outOff += 8 ;
247244 inLen -= 8 ;
245+ x1 &= -(1L << (inLen << 3 ));
246+ x1 |= c1 ;
248247 x1 ^= PAD (inLen );
249- if (inLen != 0 )
250- {
251- long c1 = Pack .littleEndianToLong_High (input , inOff , inLen );
252- x1 ^= c1 ;
253- Pack .longToLittleEndian_High (x1 , output , outOff , inLen );
254- x1 &= -1L >>> (inLen << 3 );
255- x1 ^= c1 ;
256- }
257248 }
258249 else
259250 {
260- x0 ^= PAD (inLen );
261251 if (inLen != 0 )
262252 {
263- long c0 = Pack .littleEndianToLong_High (input , inOff , inLen );
264- x0 ^= c0 ;
265- Pack .longToLittleEndian_High (x0 , output , outOff , inLen );
266- x0 &= -1L >>> (inLen << 3 );
267- x0 ^= c0 ;
253+ long c0 = Pack .littleEndianToLong (input , inOff , inLen );
254+ Pack .longToLittleEndian (x0 ^ c0 , output , outOff , inLen );
255+ x0 &= -(1L << (inLen << 3 ));
256+ x0 |= c0 ;
268257 }
258+ x0 ^= PAD (inLen );
269259 }
270260
271261 finishData (State .DecFinal );
@@ -276,26 +266,23 @@ private void processFinalEncrypt(byte[] input, int inOff, int inLen, byte[] outp
276266 if (inLen >= 8 ) // ASCON_AEAD_RATE == 16 is implied
277267 {
278268 x0 ^= Pack .littleEndianToLong (input , inOff );
269+ x1 ^= Pack .littleEndianToLong (input , inOff + 8 , inLen - 8 );
279270 Pack .longToLittleEndian (x0 , output , outOff );
280- inOff += 8 ;
281- outOff += 8 ;
271+ Pack .longToLittleEndian (x1 , output , outOff + 8 );
282272 inLen -= 8 ;
283273 x1 ^= PAD (inLen );
284- if (inLen != 0 )
285- {
286- x1 ^= Pack .littleEndianToLong_High (input , inOff , inLen );
287- Pack .longToLittleEndian_High (x1 , output , outOff , inLen );
288- }
289274 }
290275 else
291276 {
292- x0 ^= PAD (inLen );
293277 if (inLen != 0 )
294278 {
295- x0 ^= Pack .littleEndianToLong_High (input , inOff , inLen );
296- Pack .longToLittleEndian_High (x0 , output , outOff , inLen );
279+ x0 ^= Pack .littleEndianToLong (input , inOff , inLen );
280+ Pack .longToLittleEndian (x0 , output , outOff , inLen );
297281 }
282+ x0 ^= PAD (inLen );
298283 }
284+
285+
299286 finishData (State .EncFinal );
300287 }
301288
@@ -455,14 +442,14 @@ public int processBytes(byte[] inBytes, int inOff, int len, byte[] outBytes, int
455442 inOff += available ;
456443 len -= available ;
457444
458- processBufferEncrypt (m_buf , 0 , outBytes , outOff );
445+ processBufferEncrypt (m_buf , 0 , m_bufPos , outBytes , outOff );
459446 resultLength = ASCON_AEAD_RATE ;
460447 //m_bufPos = 0;
461448 }
462449
463450 while (len >= ASCON_AEAD_RATE )
464451 {
465- processBufferEncrypt (inBytes , inOff , outBytes , outOff + resultLength );
452+ processBufferEncrypt (inBytes , inOff , ASCON_AEAD_RATE , outBytes , outOff + resultLength );
466453 inOff += ASCON_AEAD_RATE ;
467454 len -= ASCON_AEAD_RATE ;
468455 resultLength += ASCON_AEAD_RATE ;
@@ -481,7 +468,7 @@ public int processBytes(byte[] inBytes, int inOff, int len, byte[] outBytes, int
481468 // NOTE: Need 'while' here because ASCON_AEAD_RATE < CRYPTO_ABYTES in some parameter sets
482469 while (m_bufPos >= ASCON_AEAD_RATE )
483470 {
484- processBufferDecrypt (m_buf , 0 , outBytes , outOff + resultLength );
471+ processBufferDecrypt (m_buf , 0 , m_bufPos , outBytes , outOff + resultLength );
485472 m_bufPos -= ASCON_AEAD_RATE ;
486473 System .arraycopy (m_buf , ASCON_AEAD_RATE , m_buf , 0 , m_bufPos );
487474 resultLength += ASCON_AEAD_RATE ;
@@ -499,13 +486,13 @@ public int processBytes(byte[] inBytes, int inOff, int len, byte[] outBytes, int
499486 System .arraycopy (inBytes , inOff , m_buf , m_bufPos , available );
500487 inOff += available ;
501488 len -= available ;
502- processBufferDecrypt (m_buf , 0 , outBytes , outOff + resultLength );
489+ processBufferDecrypt (m_buf , 0 , m_bufPos , outBytes , outOff + resultLength );
503490 resultLength += ASCON_AEAD_RATE ;
504491 //m_bufPos = 0;
505492
506493 while (len >= m_bufferSizeDecrypt )
507494 {
508- processBufferDecrypt (inBytes , inOff , outBytes , outOff + resultLength );
495+ processBufferDecrypt (inBytes , inOff , ASCON_AEAD_RATE , outBytes , outOff + resultLength );
509496 inOff += ASCON_AEAD_RATE ;
510497 len -= ASCON_AEAD_RATE ;
511498 resultLength += ASCON_AEAD_RATE ;
0 commit comments