@@ -223,6 +223,67 @@ ALL_F: .octa 0xffffffffffffffffffffffffffffffff
223
223
mov %r13 , %r12
224
224
.endm
225
225
226
+ # GCM_COMPLETE Finishes update of tag of last partial block
227
+ # Output: Authorization Tag (AUTH_TAG)
228
+ # Clobbers rax, r10-r12, and xmm0, xmm1, xmm5-xmm15
229
+ .macro GCM_COMPLETE
230
+ mov arg8, %r12 # %r13 = aadLen (number of bytes)
231
+ shl $3 , %r12 # convert into number of bits
232
+ movd %r12d , %xmm15 # len(A) in %xmm15
233
+ shl $3 , %arg4 # len(C) in bits (*128)
234
+ MOVQ_R64_XMM %arg4, %xmm1
235
+ pslldq $8 , %xmm15 # %xmm15 = len(A)||0x0000000000000000
236
+ pxor %xmm1 , %xmm15 # %xmm15 = len(A)||len(C)
237
+ pxor %xmm15 , %xmm8
238
+ GHASH_MUL %xmm8 , %xmm13 , %xmm9 , %xmm10 , %xmm11 , %xmm5 , %xmm6
239
+ # final GHASH computation
240
+ movdqa SHUF_MASK(%rip ), %xmm10
241
+ PSHUFB_XMM %xmm10 , %xmm8
242
+
243
+ mov %arg5, %rax # %rax = *Y0
244
+ movdqu (%rax ), %xmm0 # %xmm0 = Y0
245
+ ENCRYPT_SINGLE_BLOCK %xmm0 , %xmm1 # E(K, Y0)
246
+ pxor %xmm8 , %xmm0
247
+ _return_T_\@:
248
+ mov arg9, %r10 # %r10 = authTag
249
+ mov arg10, %r11 # %r11 = auth_tag_len
250
+ cmp $16 , %r11
251
+ je _T_16_\@
252
+ cmp $8 , %r11
253
+ jl _T_4_\@
254
+ _T_8_\@:
255
+ MOVQ_R64_XMM %xmm0 , %rax
256
+ mov %rax , (%r10 )
257
+ add $8 , %r10
258
+ sub $8 , %r11
259
+ psrldq $8 , %xmm0
260
+ cmp $0 , %r11
261
+ je _return_T_done_\@
262
+ _T_4_\@:
263
+ movd %xmm0 , %eax
264
+ mov %eax , (%r10 )
265
+ add $4 , %r10
266
+ sub $4 , %r11
267
+ psrldq $4 , %xmm0
268
+ cmp $0 , %r11
269
+ je _return_T_done_\@
270
+ _T_123_\@:
271
+ movd %xmm0 , %eax
272
+ cmp $2 , %r11
273
+ jl _T_1_\@
274
+ mov %ax , (%r10 )
275
+ cmp $2 , %r11
276
+ je _return_T_done_\@
277
+ add $2 , %r10
278
+ sar $16 , %eax
279
+ _T_1_\@:
280
+ mov %al , (%r10 )
281
+ jmp _return_T_done_\@
282
+ _T_16_\@:
283
+ movdqu %xmm0 , (%r10 )
284
+ _return_T_done_\@:
285
+ .endm
286
+
226
287
#ifdef __x86_64__
227
288
/* GHASH_MUL MACRO to implement: Data*HashKey mod (128,127,126,121,0)
228
289
*
@@ -1272,61 +1333,7 @@ _less_than_8_bytes_left_decrypt:
1272
1333
sub $1 , %r13
1273
1334
jne _less_than_8_bytes_left_decrypt
1274
1335
_multiple_of_16_bytes_decrypt:
1275
- mov arg8, %r12 # %r13 = aadLen (number of bytes)
1276
- shl $3 , %r12 # convert into number of bits
1277
- movd %r12d , %xmm15 # len(A) in %xmm15
1278
- shl $3 , %arg4 # len(C) in bits (*128)
1279
- MOVQ_R64_XMM %arg4, %xmm1
1280
- pslldq $8 , %xmm15 # %xmm15 = len(A)||0x0000000000000000
1281
- pxor %xmm1 , %xmm15 # %xmm15 = len(A)||len(C)
1282
- pxor %xmm15 , %xmm8
1283
- GHASH_MUL %xmm8 , %xmm13 , %xmm9 , %xmm10 , %xmm11 , %xmm5 , %xmm6
1284
- # final GHASH computation
1285
- movdqa SHUF_MASK(%rip ), %xmm10
1286
- PSHUFB_XMM %xmm10 , %xmm8
1287
-
1288
- mov %arg5, %rax # %rax = *Y0
1289
- movdqu (%rax ), %xmm0 # %xmm0 = Y0
1290
- ENCRYPT_SINGLE_BLOCK %xmm0 , %xmm1 # E(K, Y0)
1291
- pxor %xmm8 , %xmm0
1292
- _return_T_decrypt:
1293
- mov arg9, %r10 # %r10 = authTag
1294
- mov arg10, %r11 # %r11 = auth_tag_len
1295
- cmp $16 , %r11
1296
- je _T_16_decrypt
1297
- cmp $8 , %r11
1298
- jl _T_4_decrypt
1299
- _T_8_decrypt:
1300
- MOVQ_R64_XMM %xmm0 , %rax
1301
- mov %rax , (%r10 )
1302
- add $8 , %r10
1303
- sub $8 , %r11
1304
- psrldq $8 , %xmm0
1305
- cmp $0 , %r11
1306
- je _return_T_done_decrypt
1307
- _T_4_decrypt:
1308
- movd %xmm0 , %eax
1309
- mov %eax , (%r10 )
1310
- add $4 , %r10
1311
- sub $4 , %r11
1312
- psrldq $4 , %xmm0
1313
- cmp $0 , %r11
1314
- je _return_T_done_decrypt
1315
- _T_123_decrypt:
1316
- movd %xmm0 , %eax
1317
- cmp $2 , %r11
1318
- jl _T_1_decrypt
1319
- mov %ax , (%r10 )
1320
- cmp $2 , %r11
1321
- je _return_T_done_decrypt
1322
- add $2 , %r10
1323
- sar $16 , %eax
1324
- _T_1_decrypt:
1325
- mov %al , (%r10 )
1326
- jmp _return_T_done_decrypt
1327
- _T_16_decrypt:
1328
- movdqu %xmm0 , (%r10 )
1329
- _return_T_done_decrypt:
1336
+ GCM_COMPLETE
1330
1337
FUNC_RESTORE
1331
1338
ret
1332
1339
ENDPROC(aesni_gcm_dec)
@@ -1502,61 +1509,8 @@ _less_than_8_bytes_left_encrypt:
1502
1509
sub $1 , %r13
1503
1510
jne _less_than_8_bytes_left_encrypt
1504
1511
_multiple_of_16_bytes_encrypt:
1505
- mov arg8, %r12 # %r12 = addLen (number of bytes)
1506
- shl $3 , %r12
1507
- movd %r12d , %xmm15 # len(A) in %xmm15
1508
- shl $3 , %arg4 # len(C) in bits (*128)
1509
- MOVQ_R64_XMM %arg4, %xmm1
1510
- pslldq $8 , %xmm15 # %xmm15 = len(A)||0x0000000000000000
1511
- pxor %xmm1 , %xmm15 # %xmm15 = len(A)||len(C)
1512
- pxor %xmm15 , %xmm8
1513
- GHASH_MUL %xmm8 , %xmm13 , %xmm9 , %xmm10 , %xmm11 , %xmm5 , %xmm6
1514
- # final GHASH computation
1515
- movdqa SHUF_MASK(%rip ), %xmm10
1516
- PSHUFB_XMM %xmm10 , %xmm8 # perform a 16 byte swap
1517
-
1518
- mov %arg5, %rax # %rax = *Y0
1519
- movdqu (%rax ), %xmm0 # %xmm0 = Y0
1520
- ENCRYPT_SINGLE_BLOCK %xmm0 , %xmm15 # Encrypt(K, Y0)
1521
- pxor %xmm8 , %xmm0
1522
1512
_return_T_encrypt:
1523
- mov arg9, %r10 # %r10 = authTag
1524
- mov arg10, %r11 # %r11 = auth_tag_len
1525
- cmp $16 , %r11
1526
- je _T_16_encrypt
1527
- cmp $8 , %r11
1528
- jl _T_4_encrypt
1529
- _T_8_encrypt:
1530
- MOVQ_R64_XMM %xmm0 , %rax
1531
- mov %rax , (%r10 )
1532
- add $8 , %r10
1533
- sub $8 , %r11
1534
- psrldq $8 , %xmm0
1535
- cmp $0 , %r11
1536
- je _return_T_done_encrypt
1537
- _T_4_encrypt:
1538
- movd %xmm0 , %eax
1539
- mov %eax , (%r10 )
1540
- add $4 , %r10
1541
- sub $4 , %r11
1542
- psrldq $4 , %xmm0
1543
- cmp $0 , %r11
1544
- je _return_T_done_encrypt
1545
- _T_123_encrypt:
1546
- movd %xmm0 , %eax
1547
- cmp $2 , %r11
1548
- jl _T_1_encrypt
1549
- mov %ax , (%r10 )
1550
- cmp $2 , %r11
1551
- je _return_T_done_encrypt
1552
- add $2 , %r10
1553
- sar $16 , %eax
1554
- _T_1_encrypt:
1555
- mov %al , (%r10 )
1556
- jmp _return_T_done_encrypt
1557
- _T_16_encrypt:
1558
- movdqu %xmm0 , (%r10 )
1559
- _return_T_done_encrypt:
1513
+ GCM_COMPLETE
1560
1514
FUNC_RESTORE
1561
1515
ret
1562
1516
ENDPROC(aesni_gcm_enc)
0 commit comments