Skip to content

Commit adcadab

Browse files
Dave Watsonherbertx
authored andcommitted
crypto: aesni - Add GCM_COMPLETE macro
Merge encode and decode tag calculations in GCM_COMPLETE macro. Scatter/gather routines will call this once at the end of encryption or decryption. Signed-off-by: Dave Watson <[email protected]> Signed-off-by: Herbert Xu <[email protected]>
1 parent 7af964c commit adcadab

File tree

1 file changed

+63
-109
lines changed

1 file changed

+63
-109
lines changed

arch/x86/crypto/aesni-intel_asm.S

Lines changed: 63 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,67 @@ ALL_F: .octa 0xffffffffffffffffffffffffffffffff
223223
mov %r13, %r12
224224
.endm
225225

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+
226287
#ifdef __x86_64__
227288
/* GHASH_MUL MACRO to implement: Data*HashKey mod (128,127,126,121,0)
228289
*
@@ -1272,61 +1333,7 @@ _less_than_8_bytes_left_decrypt:
12721333
sub $1, %r13
12731334
jne _less_than_8_bytes_left_decrypt
12741335
_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
13301337
FUNC_RESTORE
13311338
ret
13321339
ENDPROC(aesni_gcm_dec)
@@ -1502,61 +1509,8 @@ _less_than_8_bytes_left_encrypt:
15021509
sub $1, %r13
15031510
jne _less_than_8_bytes_left_encrypt
15041511
_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
15221512
_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
15601514
FUNC_RESTORE
15611515
ret
15621516
ENDPROC(aesni_gcm_enc)

0 commit comments

Comments
 (0)