security/nss/lib/freebl/intel-gcm-x64-masm.asm

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

michael@0 1 ; LICENSE:
michael@0 2 ; This submission to NSS is to be made available under the terms of the
michael@0 3 ; Mozilla Public License, v. 2.0. You can obtain one at http:
michael@0 4 ; //mozilla.org/MPL/2.0/.
michael@0 5 ;###############################################################################
michael@0 6 ; Copyright(c) 2014, Intel Corp.
michael@0 7 ; Developers and authors:
michael@0 8 ; Shay Gueron and Vlad Krasnov
michael@0 9 ; Intel Corporation, Israel Development Centre, Haifa, Israel
michael@0 10 ; Please send feedback directly to crypto.feedback.alias@intel.com
michael@0 11
michael@0 12
michael@0 13 .DATA
michael@0 14 ALIGN 16
michael@0 15 Lone dq 1,0
michael@0 16 Ltwo dq 2,0
michael@0 17 Lbswap_mask db 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
michael@0 18 Lshuff_mask dq 0f0f0f0f0f0f0f0fh, 0f0f0f0f0f0f0f0fh
michael@0 19 Lpoly dq 01h, 0c200000000000000h
michael@0 20
michael@0 21 .CODE
michael@0 22
michael@0 23
michael@0 24 GFMUL MACRO DST, SRC1, SRC2, TMP1, TMP2, TMP3, TMP4
michael@0 25 vpclmulqdq TMP1, SRC2, SRC1, 0h
michael@0 26 vpclmulqdq TMP4, SRC2, SRC1, 011h
michael@0 27
michael@0 28 vpshufd TMP2, SRC2, 78
michael@0 29 vpshufd TMP3, SRC1, 78
michael@0 30 vpxor TMP2, TMP2, SRC2
michael@0 31 vpxor TMP3, TMP3, SRC1
michael@0 32
michael@0 33 vpclmulqdq TMP2, TMP2, TMP3, 0h
michael@0 34 vpxor TMP2, TMP2, TMP1
michael@0 35 vpxor TMP2, TMP2, TMP4
michael@0 36
michael@0 37 vpslldq TMP3, TMP2, 8
michael@0 38 vpsrldq TMP2, TMP2, 8
michael@0 39
michael@0 40 vpxor TMP1, TMP1, TMP3
michael@0 41 vpxor TMP4, TMP4, TMP2
michael@0 42
michael@0 43 vpclmulqdq TMP2, TMP1, [Lpoly], 010h
michael@0 44 vpshufd TMP3, TMP1, 78
michael@0 45 vpxor TMP1, TMP2, TMP3
michael@0 46
michael@0 47 vpclmulqdq TMP2, TMP1, [Lpoly], 010h
michael@0 48 vpshufd TMP3, TMP1, 78
michael@0 49 vpxor TMP1, TMP2, TMP3
michael@0 50
michael@0 51 vpxor DST, TMP1, TMP4
michael@0 52
michael@0 53 ENDM
michael@0 54
michael@0 55 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
michael@0 56 ;
michael@0 57 ; Generates the final GCM tag
michael@0 58 ; void intel_aes_gcmTAG(unsigned char Htbl[16*16],
michael@0 59 ; unsigned char *Tp,
michael@0 60 ; unsigned int Mlen,
michael@0 61 ; unsigned int Alen,
michael@0 62 ; unsigned char *X0,
michael@0 63 ; unsigned char *TAG);
michael@0 64 ;
michael@0 65 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
michael@0 66
michael@0 67 ALIGN 16
michael@0 68 intel_aes_gcmTAG PROC
michael@0 69
michael@0 70 Htbl textequ <rcx>
michael@0 71 Tp textequ <rdx>
michael@0 72 Mlen textequ <r8>
michael@0 73 Alen textequ <r9>
michael@0 74 X0 textequ <r10>
michael@0 75 TAG textequ <r11>
michael@0 76
michael@0 77 T textequ <xmm0>
michael@0 78 TMP0 textequ <xmm1>
michael@0 79
michael@0 80 mov X0, [rsp + 1*8 + 4*8]
michael@0 81 mov TAG, [rsp + 1*8 + 5*8]
michael@0 82
michael@0 83 vzeroupper
michael@0 84 vmovdqu T, XMMWORD PTR[Tp]
michael@0 85 vpxor TMP0, TMP0, TMP0
michael@0 86
michael@0 87 shl Mlen, 3
michael@0 88 shl Alen, 3
michael@0 89
michael@0 90 ;vpinsrq TMP0, TMP0, Mlen, 0
michael@0 91 ;vpinsrq TMP0, TMP0, Alen, 1
michael@0 92 ; workaround the ml64.exe vpinsrq issue
michael@0 93 vpinsrd TMP0, TMP0, r8d, 0
michael@0 94 vpinsrd TMP0, TMP0, r9d, 2
michael@0 95 shr Mlen, 32
michael@0 96 shr Alen, 32
michael@0 97 vpinsrd TMP0, TMP0, r8d, 1
michael@0 98 vpinsrd TMP0, TMP0, r9d, 3
michael@0 99
michael@0 100 vpxor T, T, TMP0
michael@0 101 vmovdqu TMP0, XMMWORD PTR[Htbl]
michael@0 102 GFMUL T, T, TMP0, xmm2, xmm3, xmm4, xmm5
michael@0 103
michael@0 104 vpshufb T, T, [Lbswap_mask]
michael@0 105 vpxor T, T, [X0]
michael@0 106 vmovdqu XMMWORD PTR[TAG], T
michael@0 107 vzeroupper
michael@0 108
michael@0 109 ret
michael@0 110
michael@0 111 intel_aes_gcmTAG ENDP
michael@0 112
michael@0 113 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
michael@0 114 ;
michael@0 115 ; Generates the H table
michael@0 116 ; void intel_aes_gcmINIT(unsigned char Htbl[16*16], unsigned char *KS, int NR);
michael@0 117 ;
michael@0 118 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
michael@0 119
michael@0 120 ALIGN 16
michael@0 121 intel_aes_gcmINIT PROC
michael@0 122
michael@0 123 Htbl textequ <rcx>
michael@0 124 KS textequ <rdx>
michael@0 125 NR textequ <r8d>
michael@0 126
michael@0 127 T textequ <xmm0>
michael@0 128 TMP0 textequ <xmm1>
michael@0 129
michael@0 130 vzeroupper
michael@0 131 ; AES-ENC(0)
michael@0 132 vmovdqu T, XMMWORD PTR[KS]
michael@0 133 lea KS, [16 + KS]
michael@0 134 dec NR
michael@0 135 Lenc_loop:
michael@0 136 vaesenc T, T, [KS]
michael@0 137 lea KS, [16 + KS]
michael@0 138 dec NR
michael@0 139 jnz Lenc_loop
michael@0 140
michael@0 141 vaesenclast T, T, [KS]
michael@0 142 vpshufb T, T, [Lbswap_mask]
michael@0 143
michael@0 144 ;Calculate H` = GFMUL(H, 2)
michael@0 145 vpsrad xmm3, T, 31
michael@0 146 vpshufd xmm3, xmm3, 0ffh
michael@0 147 vpand xmm5, xmm3, [Lpoly]
michael@0 148 vpsrld xmm3, T, 31
michael@0 149 vpslld xmm4, T, 1
michael@0 150 vpslldq xmm3, xmm3, 4
michael@0 151 vpxor T, xmm4, xmm3
michael@0 152 vpxor T, T, xmm5
michael@0 153
michael@0 154 vmovdqu TMP0, T
michael@0 155 vmovdqu XMMWORD PTR[Htbl + 0*16], T
michael@0 156
michael@0 157 vpshufd xmm2, T, 78
michael@0 158 vpxor xmm2, xmm2, T
michael@0 159 vmovdqu XMMWORD PTR[Htbl + 8*16 + 0*16], xmm2
michael@0 160
michael@0 161 i = 1
michael@0 162 WHILE i LT 8
michael@0 163 GFMUL T, T, TMP0, xmm2, xmm3, xmm4, xmm5
michael@0 164 vmovdqu XMMWORD PTR[Htbl + i*16], T
michael@0 165 vpshufd xmm2, T, 78
michael@0 166 vpxor xmm2, xmm2, T
michael@0 167 vmovdqu XMMWORD PTR[Htbl + 8*16 + i*16], xmm2
michael@0 168 i = i+1
michael@0 169 ENDM
michael@0 170 vzeroupper
michael@0 171 ret
michael@0 172 intel_aes_gcmINIT ENDP
michael@0 173
michael@0 174
michael@0 175 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
michael@0 176 ;
michael@0 177 ; Authenticate only
michael@0 178 ; void intel_aes_gcmAAD(unsigned char Htbl[16*16], unsigned char *AAD, unsigned int Alen, unsigned char *Tp);
michael@0 179 ;
michael@0 180 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
michael@0 181
michael@0 182 ALIGN 16
michael@0 183 intel_aes_gcmAAD PROC
michael@0 184
michael@0 185 Htbl textequ <rcx>
michael@0 186 inp textequ <rdx>
michael@0 187 len textequ <r8>
michael@0 188 Tp textequ <r9>
michael@0 189 hlp0 textequ <r10>
michael@0 190
michael@0 191 DATA textequ <xmm0>
michael@0 192 T textequ <xmm1>
michael@0 193 TMP0 textequ <xmm2>
michael@0 194 TMP1 textequ <xmm3>
michael@0 195 TMP2 textequ <xmm4>
michael@0 196 TMP3 textequ <xmm5>
michael@0 197 TMP4 textequ <xmm6>
michael@0 198 Xhi textequ <xmm7>
michael@0 199
michael@0 200 KARATSUBA_AAD MACRO i
michael@0 201 vpclmulqdq TMP3, DATA, [Htbl + i*16], 0h
michael@0 202 vpxor TMP0, TMP0, TMP3
michael@0 203 vpclmulqdq TMP3, DATA, [Htbl + i*16], 011h
michael@0 204 vpxor TMP1, TMP1, TMP3
michael@0 205 vpshufd TMP3, DATA, 78
michael@0 206 vpxor TMP3, TMP3, DATA
michael@0 207 vpclmulqdq TMP3, TMP3, [Htbl + 8*16 + i*16], 0h
michael@0 208 vpxor TMP2, TMP2, TMP3
michael@0 209 ENDM
michael@0 210
michael@0 211 test len, len
michael@0 212 jnz LbeginAAD
michael@0 213 ret
michael@0 214
michael@0 215 LbeginAAD:
michael@0 216 vzeroupper
michael@0 217
michael@0 218 sub rsp, 2*16
michael@0 219 vmovdqu XMMWORD PTR[rsp + 0*16], xmm6
michael@0 220 vmovdqu XMMWORD PTR[rsp + 1*16], xmm7
michael@0 221
michael@0 222 vpxor Xhi, Xhi, Xhi
michael@0 223
michael@0 224 vmovdqu T, XMMWORD PTR[Tp]
michael@0 225 ;we hash 8 block each iteration, if the total amount of blocks is not a multiple of 8, we hash the first n%8 blocks first
michael@0 226 mov hlp0, len
michael@0 227 and hlp0, 128-1
michael@0 228 jz Lmod_loop
michael@0 229
michael@0 230 and len, -128
michael@0 231 sub hlp0, 16
michael@0 232
michael@0 233 ; Prefix block
michael@0 234 vmovdqu DATA, XMMWORD PTR[inp]
michael@0 235 vpshufb DATA, DATA, [Lbswap_mask]
michael@0 236 vpxor DATA, DATA, T
michael@0 237
michael@0 238 vpclmulqdq TMP0, DATA, [Htbl + hlp0], 0h
michael@0 239 vpclmulqdq TMP1, DATA, [Htbl + hlp0], 011h
michael@0 240 vpshufd TMP3, DATA, 78
michael@0 241 vpxor TMP3, TMP3, DATA
michael@0 242 vpclmulqdq TMP2, TMP3, [Htbl + 8*16 + hlp0], 0h
michael@0 243
michael@0 244 lea inp, [inp+16]
michael@0 245 test hlp0, hlp0
michael@0 246 jnz Lpre_loop
michael@0 247 jmp Lred1
michael@0 248
michael@0 249 ;hash remaining prefix bocks (up to 7 total prefix blocks)
michael@0 250 Lpre_loop:
michael@0 251
michael@0 252 sub hlp0, 16
michael@0 253
michael@0 254 vmovdqu DATA, XMMWORD PTR[inp]
michael@0 255 vpshufb DATA, DATA, [Lbswap_mask]
michael@0 256
michael@0 257 vpclmulqdq TMP3, DATA, [Htbl + hlp0], 0h
michael@0 258 vpxor TMP0, TMP0, TMP3
michael@0 259 vpclmulqdq TMP3, DATA, [Htbl + hlp0], 011h
michael@0 260 vpxor TMP1, TMP1, TMP3
michael@0 261 vpshufd TMP3, DATA, 78
michael@0 262 vpxor TMP3, TMP3, DATA
michael@0 263 vpclmulqdq TMP3, TMP3, [Htbl + 8*16 + hlp0], 0h
michael@0 264 vpxor TMP2, TMP2, TMP3
michael@0 265
michael@0 266 test hlp0, hlp0
michael@0 267 lea inp, [inp+16]
michael@0 268 jnz Lpre_loop
michael@0 269
michael@0 270 Lred1:
michael@0 271
michael@0 272 vpxor TMP2, TMP2, TMP0
michael@0 273 vpxor TMP2, TMP2, TMP1
michael@0 274 vpsrldq TMP3, TMP2, 8
michael@0 275 vpslldq TMP2, TMP2, 8
michael@0 276
michael@0 277 vpxor Xhi, TMP1, TMP3
michael@0 278 vpxor T, TMP0, TMP2
michael@0 279
michael@0 280
michael@0 281 Lmod_loop:
michael@0 282
michael@0 283 sub len, 16*8
michael@0 284 jb Ldone
michael@0 285 ; Block #0
michael@0 286 vmovdqu DATA, XMMWORD PTR[inp + 16*7]
michael@0 287 vpshufb DATA, DATA, [Lbswap_mask]
michael@0 288
michael@0 289 vpclmulqdq TMP0, DATA, [Htbl + 0*16], 0h
michael@0 290 vpclmulqdq TMP1, DATA, [Htbl + 0*16], 011h
michael@0 291 vpshufd TMP3, DATA, 78
michael@0 292 vpxor TMP3, TMP3, DATA
michael@0 293 vpclmulqdq TMP2, TMP3, [Htbl + 8*16 + 0*16], 0h
michael@0 294
michael@0 295 ; Block #1
michael@0 296 vmovdqu DATA, XMMWORD PTR[inp + 16*6]
michael@0 297 vpshufb DATA, DATA, [Lbswap_mask]
michael@0 298 KARATSUBA_AAD 1
michael@0 299
michael@0 300 ; Block #2
michael@0 301 vmovdqu DATA, XMMWORD PTR[inp + 16*5]
michael@0 302 vpshufb DATA, DATA, [Lbswap_mask]
michael@0 303
michael@0 304 vpclmulqdq TMP4, T, [Lpoly], 010h ;reduction stage 1a
michael@0 305 vpalignr T, T, T, 8
michael@0 306
michael@0 307 KARATSUBA_AAD 2
michael@0 308
michael@0 309 vpxor T, T, TMP4 ;reduction stage 1b
michael@0 310
michael@0 311 ; Block #3
michael@0 312 vmovdqu DATA, XMMWORD PTR[inp + 16*4]
michael@0 313 vpshufb DATA, DATA, [Lbswap_mask]
michael@0 314 KARATSUBA_AAD 3
michael@0 315 ; Block #4
michael@0 316 vmovdqu DATA, XMMWORD PTR[inp + 16*3]
michael@0 317 vpshufb DATA, DATA, [Lbswap_mask]
michael@0 318
michael@0 319 vpclmulqdq TMP4, T, [Lpoly], 010h ;reduction stage 2a
michael@0 320 vpalignr T, T, T, 8
michael@0 321
michael@0 322 KARATSUBA_AAD 4
michael@0 323
michael@0 324 vpxor T, T, TMP4 ;reduction stage 2b
michael@0 325 ; Block #5
michael@0 326 vmovdqu DATA, XMMWORD PTR[inp + 16*2]
michael@0 327 vpshufb DATA, DATA, [Lbswap_mask]
michael@0 328 KARATSUBA_AAD 5
michael@0 329
michael@0 330 vpxor T, T, Xhi ;reduction finalize
michael@0 331 ; Block #6
michael@0 332 vmovdqu DATA, XMMWORD PTR[inp + 16*1]
michael@0 333 vpshufb DATA, DATA, [Lbswap_mask]
michael@0 334 KARATSUBA_AAD 6
michael@0 335 ; Block #7
michael@0 336 vmovdqu DATA, XMMWORD PTR[inp + 16*0]
michael@0 337 vpshufb DATA, DATA, [Lbswap_mask]
michael@0 338 vpxor DATA, DATA, T
michael@0 339 KARATSUBA_AAD 7
michael@0 340 ; Aggregated 8 blocks, now karatsuba fixup
michael@0 341 vpxor TMP2, TMP2, TMP0
michael@0 342 vpxor TMP2, TMP2, TMP1
michael@0 343 vpsrldq TMP3, TMP2, 8
michael@0 344 vpslldq TMP2, TMP2, 8
michael@0 345
michael@0 346 vpxor Xhi, TMP1, TMP3
michael@0 347 vpxor T, TMP0, TMP2
michael@0 348
michael@0 349 lea inp, [inp + 16*8]
michael@0 350 jmp Lmod_loop
michael@0 351
michael@0 352 Ldone:
michael@0 353 vpclmulqdq TMP4, T, [Lpoly], 010h
michael@0 354 vpalignr T, T, T, 8
michael@0 355 vpxor T, T, TMP4
michael@0 356
michael@0 357 vpclmulqdq TMP4, T, [Lpoly], 010h
michael@0 358 vpalignr T, T, T, 8
michael@0 359 vpxor T, T, TMP4
michael@0 360
michael@0 361 vpxor T, T, Xhi
michael@0 362 vmovdqu XMMWORD PTR[Tp], T
michael@0 363 vzeroupper
michael@0 364
michael@0 365 vmovdqu xmm6, XMMWORD PTR[rsp + 0*16]
michael@0 366 vmovdqu xmm7, XMMWORD PTR[rsp + 1*16]
michael@0 367 add rsp, 16*2
michael@0 368
michael@0 369 ret
michael@0 370
michael@0 371 intel_aes_gcmAAD ENDP
michael@0 372
michael@0 373
michael@0 374 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
michael@0 375 ;
michael@0 376 ; Encrypt and Authenticate
michael@0 377 ; void intel_aes_gcmENC(unsigned char* PT, unsigned char* CT, void *Gctx, unsigned int len);
michael@0 378 ;
michael@0 379 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
michael@0 380
michael@0 381 ALIGN 16
michael@0 382 intel_aes_gcmENC PROC
michael@0 383
michael@0 384 PT textequ <rcx>
michael@0 385 CT textequ <rdx>
michael@0 386 Htbl textequ <r8>
michael@0 387 Gctx textequ <r8>
michael@0 388 len textequ <r9>
michael@0 389 KS textequ <r10>
michael@0 390 NR textequ <eax>
michael@0 391
michael@0 392 aluCTR textequ <r11d>
michael@0 393 aluKSl textequ <r12d>
michael@0 394 aluTMP textequ <r13d>
michael@0 395
michael@0 396 T textequ <xmm0>
michael@0 397 TMP0 textequ <xmm1>
michael@0 398 TMP1 textequ <xmm2>
michael@0 399 TMP2 textequ <xmm3>
michael@0 400 TMP3 textequ <xmm4>
michael@0 401 TMP4 textequ <xmm5>
michael@0 402 TMP5 textequ <xmm6>
michael@0 403 CTR0 textequ <xmm7>
michael@0 404 CTR1 textequ <xmm8>
michael@0 405 CTR2 textequ <xmm9>
michael@0 406 CTR3 textequ <xmm10>
michael@0 407 CTR4 textequ <xmm11>
michael@0 408 CTR5 textequ <xmm12>
michael@0 409 CTR6 textequ <xmm13>
michael@0 410 CTR7 textequ <xmm14>
michael@0 411 BSWAPMASK textequ <xmm15>
michael@0 412
michael@0 413 ROUND MACRO i
michael@0 414 vmovdqu TMP3, XMMWORD PTR[i*16 + KS]
michael@0 415 vaesenc CTR0, CTR0, TMP3
michael@0 416 vaesenc CTR1, CTR1, TMP3
michael@0 417 vaesenc CTR2, CTR2, TMP3
michael@0 418 vaesenc CTR3, CTR3, TMP3
michael@0 419 vaesenc CTR4, CTR4, TMP3
michael@0 420 vaesenc CTR5, CTR5, TMP3
michael@0 421 vaesenc CTR6, CTR6, TMP3
michael@0 422 vaesenc CTR7, CTR7, TMP3
michael@0 423 ENDM
michael@0 424 ROUNDMUL MACRO i
michael@0 425 vmovdqu TMP3, XMMWORD PTR[i*16 + KS]
michael@0 426
michael@0 427 vaesenc CTR0, CTR0, TMP3
michael@0 428 vaesenc CTR1, CTR1, TMP3
michael@0 429 vaesenc CTR2, CTR2, TMP3
michael@0 430 vaesenc CTR3, CTR3, TMP3
michael@0 431
michael@0 432 vpshufd TMP4, TMP5, 78
michael@0 433 vpxor TMP4, TMP4, TMP5
michael@0 434
michael@0 435 vaesenc CTR4, CTR4, TMP3
michael@0 436 vaesenc CTR5, CTR5, TMP3
michael@0 437 vaesenc CTR6, CTR6, TMP3
michael@0 438 vaesenc CTR7, CTR7, TMP3
michael@0 439
michael@0 440 vpclmulqdq TMP3, TMP4, XMMWORD PTR[i*16 + 8*16 + Htbl], 000h
michael@0 441 vpxor TMP0, TMP0, TMP3
michael@0 442 vmovdqu TMP4, XMMWORD PTR[i*16 + Htbl]
michael@0 443 vpclmulqdq TMP3, TMP5, TMP4, 011h
michael@0 444 vpxor TMP1, TMP1, TMP3
michael@0 445 vpclmulqdq TMP3, TMP5, TMP4, 000h
michael@0 446 vpxor TMP2, TMP2, TMP3
michael@0 447 ENDM
michael@0 448 KARATSUBA MACRO i
michael@0 449 vpshufd TMP4, TMP5, 78
michael@0 450 vpxor TMP4, TMP4, TMP5
michael@0 451 vpclmulqdq TMP3, TMP4, XMMWORD PTR[i*16 + 8*16 + Htbl], 000h
michael@0 452 vpxor TMP0, TMP0, TMP3
michael@0 453 vmovdqu TMP4, XMMWORD PTR[i*16 + Htbl]
michael@0 454 vpclmulqdq TMP3, TMP5, TMP4, 011h
michael@0 455 vpxor TMP1, TMP1, TMP3
michael@0 456 vpclmulqdq TMP3, TMP5, TMP4, 000h
michael@0 457 vpxor TMP2, TMP2, TMP3
michael@0 458 ENDM
michael@0 459 NEXTCTR MACRO i
michael@0 460 add aluCTR, 1
michael@0 461 mov aluTMP, aluCTR
michael@0 462 xor aluTMP, aluKSl
michael@0 463 bswap aluTMP
michael@0 464 mov [3*4 + 8*16 + i*16 + rsp], aluTMP
michael@0 465 ENDM
michael@0 466
michael@0 467
michael@0 468 test len, len
michael@0 469 jnz LbeginENC
michael@0 470 ret
michael@0 471
michael@0 472 LbeginENC:
michael@0 473
michael@0 474 vzeroupper
michael@0 475 push r11
michael@0 476 push r12
michael@0 477 push r13
michael@0 478 push rbp
michael@0 479 sub rsp, 10*16
michael@0 480 vmovdqu XMMWORD PTR[rsp + 0*16], xmm6
michael@0 481 vmovdqu XMMWORD PTR[rsp + 1*16], xmm7
michael@0 482 vmovdqu XMMWORD PTR[rsp + 2*16], xmm8
michael@0 483 vmovdqu XMMWORD PTR[rsp + 3*16], xmm9
michael@0 484 vmovdqu XMMWORD PTR[rsp + 4*16], xmm10
michael@0 485 vmovdqu XMMWORD PTR[rsp + 5*16], xmm11
michael@0 486 vmovdqu XMMWORD PTR[rsp + 6*16], xmm12
michael@0 487 vmovdqu XMMWORD PTR[rsp + 7*16], xmm13
michael@0 488 vmovdqu XMMWORD PTR[rsp + 8*16], xmm14
michael@0 489 vmovdqu XMMWORD PTR[rsp + 9*16], xmm15
michael@0 490
michael@0 491 mov rbp, rsp
michael@0 492 sub rsp, 16*16
michael@0 493 and rsp, -16
michael@0 494
michael@0 495 vmovdqu T, XMMWORD PTR[16*16 + 1*16 + Gctx]
michael@0 496 vmovdqu CTR0, XMMWORD PTR[16*16 + 2*16 + Gctx]
michael@0 497 vmovdqu BSWAPMASK, XMMWORD PTR[Lbswap_mask]
michael@0 498 mov KS, [16*16 + 3*16 + Gctx]
michael@0 499 mov NR, [4 + KS]
michael@0 500 lea KS, [48 + KS]
michael@0 501
michael@0 502 vpshufb CTR0, CTR0, BSWAPMASK
michael@0 503
michael@0 504 mov aluCTR, [16*16 + 2*16 + 3*4 + Gctx]
michael@0 505 mov aluKSl, [3*4 + KS]
michael@0 506 bswap aluCTR
michael@0 507 bswap aluKSl
michael@0 508
michael@0 509 vmovdqu TMP0, XMMWORD PTR[0*16 + KS]
michael@0 510 vpxor TMP0, TMP0, XMMWORD PTR[16*16 + 2*16 + Gctx]
michael@0 511 vmovdqu XMMWORD PTR[8*16 + 0*16 + rsp], TMP0
michael@0 512
michael@0 513 cmp len, 128
michael@0 514 jb LEncDataSingles
michael@0 515 ; Prepare the "top" counters
michael@0 516 vmovdqu XMMWORD PTR[8*16 + 1*16 + rsp], TMP0
michael@0 517 vmovdqu XMMWORD PTR[8*16 + 2*16 + rsp], TMP0
michael@0 518 vmovdqu XMMWORD PTR[8*16 + 3*16 + rsp], TMP0
michael@0 519 vmovdqu XMMWORD PTR[8*16 + 4*16 + rsp], TMP0
michael@0 520 vmovdqu XMMWORD PTR[8*16 + 5*16 + rsp], TMP0
michael@0 521 vmovdqu XMMWORD PTR[8*16 + 6*16 + rsp], TMP0
michael@0 522 vmovdqu XMMWORD PTR[8*16 + 7*16 + rsp], TMP0
michael@0 523
michael@0 524 ; Encrypt the initial 8 blocks
michael@0 525 sub len, 128
michael@0 526 vpaddd CTR1, CTR0, XMMWORD PTR[Lone]
michael@0 527 vpaddd CTR2, CTR0, XMMWORD PTR[Ltwo]
michael@0 528 vpaddd CTR3, CTR2, XMMWORD PTR[Lone]
michael@0 529 vpaddd CTR4, CTR2, XMMWORD PTR[Ltwo]
michael@0 530 vpaddd CTR5, CTR4, XMMWORD PTR[Lone]
michael@0 531 vpaddd CTR6, CTR4, XMMWORD PTR[Ltwo]
michael@0 532 vpaddd CTR7, CTR6, XMMWORD PTR[Lone]
michael@0 533
michael@0 534 vpshufb CTR0, CTR0, BSWAPMASK
michael@0 535 vpshufb CTR1, CTR1, BSWAPMASK
michael@0 536 vpshufb CTR2, CTR2, BSWAPMASK
michael@0 537 vpshufb CTR3, CTR3, BSWAPMASK
michael@0 538 vpshufb CTR4, CTR4, BSWAPMASK
michael@0 539 vpshufb CTR5, CTR5, BSWAPMASK
michael@0 540 vpshufb CTR6, CTR6, BSWAPMASK
michael@0 541 vpshufb CTR7, CTR7, BSWAPMASK
michael@0 542
michael@0 543 vmovdqu TMP3, XMMWORD PTR[0*16 + KS]
michael@0 544 vpxor CTR0, CTR0, TMP3
michael@0 545 vpxor CTR1, CTR1, TMP3
michael@0 546 vpxor CTR2, CTR2, TMP3
michael@0 547 vpxor CTR3, CTR3, TMP3
michael@0 548 vpxor CTR4, CTR4, TMP3
michael@0 549 vpxor CTR5, CTR5, TMP3
michael@0 550 vpxor CTR6, CTR6, TMP3
michael@0 551 vpxor CTR7, CTR7, TMP3
michael@0 552
michael@0 553 ROUND 1
michael@0 554
michael@0 555 add aluCTR, 8
michael@0 556 mov aluTMP, aluCTR
michael@0 557 xor aluTMP, aluKSl
michael@0 558 bswap aluTMP
michael@0 559 mov [8*16 + 0*16 + 3*4 + rsp], aluTMP
michael@0 560
michael@0 561 ROUND 2
michael@0 562 NEXTCTR 1
michael@0 563 ROUND 3
michael@0 564 NEXTCTR 2
michael@0 565 ROUND 4
michael@0 566 NEXTCTR 3
michael@0 567 ROUND 5
michael@0 568 NEXTCTR 4
michael@0 569 ROUND 6
michael@0 570 NEXTCTR 5
michael@0 571 ROUND 7
michael@0 572 NEXTCTR 6
michael@0 573 ROUND 8
michael@0 574 NEXTCTR 7
michael@0 575 ROUND 9
michael@0 576 vmovdqu TMP5, XMMWORD PTR[10*16 + KS]
michael@0 577 cmp NR, 10
michael@0 578 je @f
michael@0 579
michael@0 580 ROUND 10
michael@0 581 ROUND 11
michael@0 582 vmovdqu TMP5, XMMWORD PTR[12*16 + KS]
michael@0 583 cmp NR, 12
michael@0 584 je @f
michael@0 585
michael@0 586 ROUND 12
michael@0 587 ROUND 13
michael@0 588 vmovdqu TMP5, XMMWORD PTR[14*16 + KS]
michael@0 589 @@:
michael@0 590 vpxor TMP3, TMP5, XMMWORD PTR[0*16 + PT]
michael@0 591 vaesenclast CTR0, CTR0, TMP3
michael@0 592 vpxor TMP3, TMP5, XMMWORD PTR[1*16 + PT]
michael@0 593 vaesenclast CTR1, CTR1, TMP3
michael@0 594 vpxor TMP3, TMP5, XMMWORD PTR[2*16 + PT]
michael@0 595 vaesenclast CTR2, CTR2, TMP3
michael@0 596 vpxor TMP3, TMP5, XMMWORD PTR[3*16 + PT]
michael@0 597 vaesenclast CTR3, CTR3, TMP3
michael@0 598 vpxor TMP3, TMP5, XMMWORD PTR[4*16 + PT]
michael@0 599 vaesenclast CTR4, CTR4, TMP3
michael@0 600 vpxor TMP3, TMP5, XMMWORD PTR[5*16 + PT]
michael@0 601 vaesenclast CTR5, CTR5, TMP3
michael@0 602 vpxor TMP3, TMP5, XMMWORD PTR[6*16 + PT]
michael@0 603 vaesenclast CTR6, CTR6, TMP3
michael@0 604 vpxor TMP3, TMP5, XMMWORD PTR[7*16 + PT]
michael@0 605 vaesenclast CTR7, CTR7, TMP3
michael@0 606
michael@0 607 vmovdqu XMMWORD PTR[0*16 + CT], CTR0
michael@0 608 vpshufb CTR0, CTR0, BSWAPMASK
michael@0 609 vmovdqu XMMWORD PTR[1*16 + CT], CTR1
michael@0 610 vpshufb CTR1, CTR1, BSWAPMASK
michael@0 611 vmovdqu XMMWORD PTR[2*16 + CT], CTR2
michael@0 612 vpshufb CTR2, CTR2, BSWAPMASK
michael@0 613 vmovdqu XMMWORD PTR[3*16 + CT], CTR3
michael@0 614 vpshufb CTR3, CTR3, BSWAPMASK
michael@0 615 vmovdqu XMMWORD PTR[4*16 + CT], CTR4
michael@0 616 vpshufb CTR4, CTR4, BSWAPMASK
michael@0 617 vmovdqu XMMWORD PTR[5*16 + CT], CTR5
michael@0 618 vpshufb CTR5, CTR5, BSWAPMASK
michael@0 619 vmovdqu XMMWORD PTR[6*16 + CT], CTR6
michael@0 620 vpshufb CTR6, CTR6, BSWAPMASK
michael@0 621 vmovdqu XMMWORD PTR[7*16 + CT], CTR7
michael@0 622 vpshufb TMP5, CTR7, BSWAPMASK
michael@0 623
michael@0 624 vmovdqa XMMWORD PTR[1*16 + rsp], CTR6
michael@0 625 vmovdqa XMMWORD PTR[2*16 + rsp], CTR5
michael@0 626 vmovdqa XMMWORD PTR[3*16 + rsp], CTR4
michael@0 627 vmovdqa XMMWORD PTR[4*16 + rsp], CTR3
michael@0 628 vmovdqa XMMWORD PTR[5*16 + rsp], CTR2
michael@0 629 vmovdqa XMMWORD PTR[6*16 + rsp], CTR1
michael@0 630 vmovdqa XMMWORD PTR[7*16 + rsp], CTR0
michael@0 631
michael@0 632 lea CT, [8*16 + CT]
michael@0 633 lea PT, [8*16 + PT]
michael@0 634 jmp LEncDataOctets
michael@0 635
michael@0 636 LEncDataOctets:
michael@0 637 cmp len, 128
michael@0 638 jb LEndEncOctets
michael@0 639 sub len, 128
michael@0 640
michael@0 641 vmovdqa CTR0, XMMWORD PTR[8*16 + 0*16 + rsp]
michael@0 642 vmovdqa CTR1, XMMWORD PTR[8*16 + 1*16 + rsp]
michael@0 643 vmovdqa CTR2, XMMWORD PTR[8*16 + 2*16 + rsp]
michael@0 644 vmovdqa CTR3, XMMWORD PTR[8*16 + 3*16 + rsp]
michael@0 645 vmovdqa CTR4, XMMWORD PTR[8*16 + 4*16 + rsp]
michael@0 646 vmovdqa CTR5, XMMWORD PTR[8*16 + 5*16 + rsp]
michael@0 647 vmovdqa CTR6, XMMWORD PTR[8*16 + 6*16 + rsp]
michael@0 648 vmovdqa CTR7, XMMWORD PTR[8*16 + 7*16 + rsp]
michael@0 649
michael@0 650 vpshufd TMP4, TMP5, 78
michael@0 651 vpxor TMP4, TMP4, TMP5
michael@0 652 vpclmulqdq TMP0, TMP4, XMMWORD PTR[0*16 + 8*16 + Htbl], 000h
michael@0 653 vmovdqu TMP4, XMMWORD PTR[0*16 + Htbl]
michael@0 654 vpclmulqdq TMP1, TMP5, TMP4, 011h
michael@0 655 vpclmulqdq TMP2, TMP5, TMP4, 000h
michael@0 656
michael@0 657 vmovdqu TMP5, XMMWORD PTR[1*16 + rsp]
michael@0 658 ROUNDMUL 1
michael@0 659 NEXTCTR 0
michael@0 660 vmovdqu TMP5, XMMWORD PTR[2*16 + rsp]
michael@0 661 ROUNDMUL 2
michael@0 662 NEXTCTR 1
michael@0 663 vmovdqu TMP5, XMMWORD PTR[3*16 + rsp]
michael@0 664 ROUNDMUL 3
michael@0 665 NEXTCTR 2
michael@0 666 vmovdqu TMP5, XMMWORD PTR[4*16 + rsp]
michael@0 667 ROUNDMUL 4
michael@0 668 NEXTCTR 3
michael@0 669 vmovdqu TMP5, XMMWORD PTR[5*16 + rsp]
michael@0 670 ROUNDMUL 5
michael@0 671 NEXTCTR 4
michael@0 672 vmovdqu TMP5, XMMWORD PTR[6*16 + rsp]
michael@0 673 ROUNDMUL 6
michael@0 674 NEXTCTR 5
michael@0 675 vpxor TMP5, T, XMMWORD PTR[7*16 + rsp]
michael@0 676 ROUNDMUL 7
michael@0 677 NEXTCTR 6
michael@0 678
michael@0 679 ROUND 8
michael@0 680 NEXTCTR 7
michael@0 681
michael@0 682 vpxor TMP0, TMP0, TMP1
michael@0 683 vpxor TMP0, TMP0, TMP2
michael@0 684 vpsrldq TMP3, TMP0, 8
michael@0 685 vpxor TMP4, TMP1, TMP3
michael@0 686 vpslldq TMP3, TMP0, 8
michael@0 687 vpxor T, TMP2, TMP3
michael@0 688
michael@0 689 vpclmulqdq TMP1, T, XMMWORD PTR[Lpoly], 010h
michael@0 690 vpalignr T,T,T,8
michael@0 691 vpxor T, T, TMP1
michael@0 692
michael@0 693 ROUND 9
michael@0 694
michael@0 695 vpclmulqdq TMP1, T, XMMWORD PTR[Lpoly], 010h
michael@0 696 vpalignr T,T,T,8
michael@0 697 vpxor T, T, TMP1
michael@0 698
michael@0 699 vmovdqu TMP5, XMMWORD PTR[10*16 + KS]
michael@0 700 cmp NR, 10
michael@0 701 je @f
michael@0 702
michael@0 703 ROUND 10
michael@0 704 ROUND 11
michael@0 705 vmovdqu TMP5, XMMWORD PTR[12*16 + KS]
michael@0 706 cmp NR, 12
michael@0 707 je @f
michael@0 708
michael@0 709 ROUND 12
michael@0 710 ROUND 13
michael@0 711 vmovdqu TMP5, XMMWORD PTR[14*16 + KS]
michael@0 712 @@:
michael@0 713 vpxor TMP3, TMP5, XMMWORD PTR[0*16 + PT]
michael@0 714 vaesenclast CTR0, CTR0, TMP3
michael@0 715 vpxor TMP3, TMP5, XMMWORD PTR[1*16 + PT]
michael@0 716 vaesenclast CTR1, CTR1, TMP3
michael@0 717 vpxor TMP3, TMP5, XMMWORD PTR[2*16 + PT]
michael@0 718 vaesenclast CTR2, CTR2, TMP3
michael@0 719 vpxor TMP3, TMP5, XMMWORD PTR[3*16 + PT]
michael@0 720 vaesenclast CTR3, CTR3, TMP3
michael@0 721 vpxor TMP3, TMP5, XMMWORD PTR[4*16 + PT]
michael@0 722 vaesenclast CTR4, CTR4, TMP3
michael@0 723 vpxor TMP3, TMP5, XMMWORD PTR[5*16 + PT]
michael@0 724 vaesenclast CTR5, CTR5, TMP3
michael@0 725 vpxor TMP3, TMP5, XMMWORD PTR[6*16 + PT]
michael@0 726 vaesenclast CTR6, CTR6, TMP3
michael@0 727 vpxor TMP3, TMP5, XMMWORD PTR[7*16 + PT]
michael@0 728 vaesenclast CTR7, CTR7, TMP3
michael@0 729
michael@0 730 vmovdqu XMMWORD PTR[0*16 + CT], CTR0
michael@0 731 vpshufb CTR0, CTR0, BSWAPMASK
michael@0 732 vmovdqu XMMWORD PTR[1*16 + CT], CTR1
michael@0 733 vpshufb CTR1, CTR1, BSWAPMASK
michael@0 734 vmovdqu XMMWORD PTR[2*16 + CT], CTR2
michael@0 735 vpshufb CTR2, CTR2, BSWAPMASK
michael@0 736 vmovdqu XMMWORD PTR[3*16 + CT], CTR3
michael@0 737 vpshufb CTR3, CTR3, BSWAPMASK
michael@0 738 vmovdqu XMMWORD PTR[4*16 + CT], CTR4
michael@0 739 vpshufb CTR4, CTR4, BSWAPMASK
michael@0 740 vmovdqu XMMWORD PTR[5*16 + CT], CTR5
michael@0 741 vpshufb CTR5, CTR5, BSWAPMASK
michael@0 742 vmovdqu XMMWORD PTR[6*16 + CT], CTR6
michael@0 743 vpshufb CTR6, CTR6, BSWAPMASK
michael@0 744 vmovdqu XMMWORD PTR[7*16 + CT], CTR7
michael@0 745 vpshufb TMP5, CTR7, BSWAPMASK
michael@0 746
michael@0 747 vmovdqa XMMWORD PTR[1*16 + rsp], CTR6
michael@0 748 vmovdqa XMMWORD PTR[2*16 + rsp], CTR5
michael@0 749 vmovdqa XMMWORD PTR[3*16 + rsp], CTR4
michael@0 750 vmovdqa XMMWORD PTR[4*16 + rsp], CTR3
michael@0 751 vmovdqa XMMWORD PTR[5*16 + rsp], CTR2
michael@0 752 vmovdqa XMMWORD PTR[6*16 + rsp], CTR1
michael@0 753 vmovdqa XMMWORD PTR[7*16 + rsp], CTR0
michael@0 754
michael@0 755 vpxor T, T, TMP4
michael@0 756
michael@0 757 lea CT, [8*16 + CT]
michael@0 758 lea PT, [8*16 + PT]
michael@0 759 jmp LEncDataOctets
michael@0 760
michael@0 761 LEndEncOctets:
michael@0 762
michael@0 763 vpshufd TMP4, TMP5, 78
michael@0 764 vpxor TMP4, TMP4, TMP5
michael@0 765 vpclmulqdq TMP0, TMP4, XMMWORD PTR[0*16 + 8*16 + Htbl], 000h
michael@0 766 vmovdqu TMP4, XMMWORD PTR[0*16 + Htbl]
michael@0 767 vpclmulqdq TMP1, TMP5, TMP4, 011h
michael@0 768 vpclmulqdq TMP2, TMP5, TMP4, 000h
michael@0 769
michael@0 770 vmovdqu TMP5, XMMWORD PTR[1*16 + rsp]
michael@0 771 KARATSUBA 1
michael@0 772 vmovdqu TMP5, XMMWORD PTR[2*16 + rsp]
michael@0 773 KARATSUBA 2
michael@0 774 vmovdqu TMP5, XMMWORD PTR[3*16 + rsp]
michael@0 775 KARATSUBA 3
michael@0 776 vmovdqu TMP5, XMMWORD PTR[4*16 + rsp]
michael@0 777 KARATSUBA 4
michael@0 778 vmovdqu TMP5, XMMWORD PTR[5*16 + rsp]
michael@0 779 KARATSUBA 5
michael@0 780 vmovdqu TMP5, XMMWORD PTR[6*16 + rsp]
michael@0 781 KARATSUBA 6
michael@0 782 vpxor TMP5, T, XMMWORD PTR[7*16 + rsp]
michael@0 783 KARATSUBA 7
michael@0 784
michael@0 785 vpxor TMP0, TMP0, TMP1
michael@0 786 vpxor TMP0, TMP0, TMP2
michael@0 787 vpsrldq TMP3, TMP0, 8
michael@0 788 vpxor TMP4, TMP1, TMP3
michael@0 789 vpslldq TMP3, TMP0, 8
michael@0 790 vpxor T, TMP2, TMP3
michael@0 791
michael@0 792 vpclmulqdq TMP1, T, XMMWORD PTR[Lpoly], 010h
michael@0 793 vpalignr T,T,T,8
michael@0 794 vpxor T, T, TMP1
michael@0 795
michael@0 796 vpclmulqdq TMP1, T, XMMWORD PTR[Lpoly], 010h
michael@0 797 vpalignr T,T,T,8
michael@0 798 vpxor T, T, TMP1
michael@0 799
michael@0 800 vpxor T, T, TMP4
michael@0 801
michael@0 802 sub aluCTR, 7
michael@0 803
michael@0 804 LEncDataSingles:
michael@0 805
michael@0 806 cmp len, 16
michael@0 807 jb LEncDataTail
michael@0 808 sub len, 16
michael@0 809
michael@0 810 vmovdqa TMP1, XMMWORD PTR[8*16 + 0*16 + rsp]
michael@0 811 NEXTCTR 0
michael@0 812
michael@0 813 vaesenc TMP1, TMP1, XMMWORD PTR[1*16 + KS]
michael@0 814 vaesenc TMP1, TMP1, XMMWORD PTR[2*16 + KS]
michael@0 815 vaesenc TMP1, TMP1, XMMWORD PTR[3*16 + KS]
michael@0 816 vaesenc TMP1, TMP1, XMMWORD PTR[4*16 + KS]
michael@0 817 vaesenc TMP1, TMP1, XMMWORD PTR[5*16 + KS]
michael@0 818 vaesenc TMP1, TMP1, XMMWORD PTR[6*16 + KS]
michael@0 819 vaesenc TMP1, TMP1, XMMWORD PTR[7*16 + KS]
michael@0 820 vaesenc TMP1, TMP1, XMMWORD PTR[8*16 + KS]
michael@0 821 vaesenc TMP1, TMP1, XMMWORD PTR[9*16 + KS]
michael@0 822 vmovdqu TMP2, XMMWORD PTR[10*16 + KS]
michael@0 823 cmp NR, 10
michael@0 824 je @f
michael@0 825 vaesenc TMP1, TMP1, XMMWORD PTR[10*16 + KS]
michael@0 826 vaesenc TMP1, TMP1, XMMWORD PTR[11*16 + KS]
michael@0 827 vmovdqu TMP2, XMMWORD PTR[12*16 + KS]
michael@0 828 cmp NR, 12
michael@0 829 je @f
michael@0 830 vaesenc TMP1, TMP1, XMMWORD PTR[12*16 + KS]
michael@0 831 vaesenc TMP1, TMP1, XMMWORD PTR[13*16 + KS]
michael@0 832 vmovdqu TMP2, XMMWORD PTR[14*16 + KS]
michael@0 833 @@:
michael@0 834 vaesenclast TMP1, TMP1, TMP2
michael@0 835 vpxor TMP1, TMP1, XMMWORD PTR[PT]
michael@0 836 vmovdqu XMMWORD PTR[CT], TMP1
michael@0 837
michael@0 838 lea PT, [16+PT]
michael@0 839 lea CT, [16+CT]
michael@0 840
michael@0 841 vpshufb TMP1, TMP1, BSWAPMASK
michael@0 842 vpxor T, T, TMP1
michael@0 843 vmovdqu TMP0, XMMWORD PTR[Htbl]
michael@0 844 GFMUL T, T, TMP0, TMP1, TMP2, TMP3, TMP4
michael@0 845
michael@0 846 jmp LEncDataSingles
michael@0 847
michael@0 848 LEncDataTail:
michael@0 849
michael@0 850 test len, len
michael@0 851 jz LEncDataEnd
michael@0 852
michael@0 853 vmovdqa TMP1, XMMWORD PTR[8*16 + 0*16 + rsp]
michael@0 854
michael@0 855 vaesenc TMP1, TMP1, XMMWORD PTR[1*16 + KS]
michael@0 856 vaesenc TMP1, TMP1, XMMWORD PTR[2*16 + KS]
michael@0 857 vaesenc TMP1, TMP1, XMMWORD PTR[3*16 + KS]
michael@0 858 vaesenc TMP1, TMP1, XMMWORD PTR[4*16 + KS]
michael@0 859 vaesenc TMP1, TMP1, XMMWORD PTR[5*16 + KS]
michael@0 860 vaesenc TMP1, TMP1, XMMWORD PTR[6*16 + KS]
michael@0 861 vaesenc TMP1, TMP1, XMMWORD PTR[7*16 + KS]
michael@0 862 vaesenc TMP1, TMP1, XMMWORD PTR[8*16 + KS]
michael@0 863 vaesenc TMP1, TMP1, XMMWORD PTR[9*16 + KS]
michael@0 864 vmovdqu TMP2, XMMWORD PTR[10*16 + KS]
michael@0 865 cmp NR, 10
michael@0 866 je @f
michael@0 867 vaesenc TMP1, TMP1, XMMWORD PTR[10*16 + KS]
michael@0 868 vaesenc TMP1, TMP1, XMMWORD PTR[11*16 + KS]
michael@0 869 vmovdqu TMP2, XMMWORD PTR[12*16 + KS]
michael@0 870 cmp NR, 12
michael@0 871 je @f
michael@0 872 vaesenc TMP1, TMP1, XMMWORD PTR[12*16 + KS]
michael@0 873 vaesenc TMP1, TMP1, XMMWORD PTR[13*16 + KS]
michael@0 874 vmovdqu TMP2, XMMWORD PTR[14*16 + KS]
michael@0 875 @@:
michael@0 876 vaesenclast TMP1, TMP1, TMP2
michael@0 877 ; zero a temp location
michael@0 878 vpxor TMP2, TMP2, TMP2
michael@0 879 vmovdqa XMMWORD PTR[rsp], TMP2
michael@0 880 ; copy as many bytes as needed
michael@0 881 xor KS, KS
michael@0 882
michael@0 883 @@:
michael@0 884 cmp len, KS
michael@0 885 je @f
michael@0 886 mov al, [PT + KS]
michael@0 887 mov [rsp + KS], al
michael@0 888 inc KS
michael@0 889 jmp @b
michael@0 890 @@:
michael@0 891 vpxor TMP1, TMP1, XMMWORD PTR[rsp]
michael@0 892 vmovdqa XMMWORD PTR[rsp], TMP1
michael@0 893 xor KS, KS
michael@0 894 @@:
michael@0 895 cmp len, KS
michael@0 896 je @f
michael@0 897 mov al, [rsp + KS]
michael@0 898 mov [CT + KS], al
michael@0 899 inc KS
michael@0 900 jmp @b
michael@0 901 @@:
michael@0 902 cmp KS, 16
michael@0 903 je @f
michael@0 904 mov BYTE PTR[rsp + KS], 0
michael@0 905 inc KS
michael@0 906 jmp @b
michael@0 907 @@:
michael@0 908 BAIL:
michael@0 909 vmovdqa TMP1, XMMWORD PTR[rsp]
michael@0 910 vpshufb TMP1, TMP1, BSWAPMASK
michael@0 911 vpxor T, T, TMP1
michael@0 912 vmovdqu TMP0, XMMWORD PTR[Htbl]
michael@0 913 GFMUL T, T, TMP0, TMP1, TMP2, TMP3, TMP4
michael@0 914
michael@0 915 LEncDataEnd:
michael@0 916
michael@0 917 vmovdqu XMMWORD PTR[16*16 + 1*16 + Gctx], T
michael@0 918 bswap aluCTR
michael@0 919 mov [16*16 + 2*16 + 3*4 + Gctx], aluCTR
michael@0 920
michael@0 921 mov rsp, rbp
michael@0 922
michael@0 923 vmovdqu xmm6, XMMWORD PTR[rsp + 0*16]
michael@0 924 vmovdqu xmm7, XMMWORD PTR[rsp + 1*16]
michael@0 925 vmovdqu xmm8, XMMWORD PTR[rsp + 2*16]
michael@0 926 vmovdqu xmm9, XMMWORD PTR[rsp + 3*16]
michael@0 927 vmovdqu xmm10, XMMWORD PTR[rsp + 4*16]
michael@0 928 vmovdqu xmm11, XMMWORD PTR[rsp + 5*16]
michael@0 929 vmovdqu xmm12, XMMWORD PTR[rsp + 6*16]
michael@0 930 vmovdqu xmm13, XMMWORD PTR[rsp + 7*16]
michael@0 931 vmovdqu xmm14, XMMWORD PTR[rsp + 8*16]
michael@0 932 vmovdqu xmm15, XMMWORD PTR[rsp + 9*16]
michael@0 933
michael@0 934 add rsp, 10*16
michael@0 935 pop rbp
michael@0 936 pop r13
michael@0 937 pop r12
michael@0 938 pop r11
michael@0 939
michael@0 940 vzeroupper
michael@0 941
michael@0 942 ret
michael@0 943 intel_aes_gcmENC ENDP
michael@0 944
michael@0 945 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
michael@0 946 ;
michael@0 947 ; Decrypt and Authenticate
michael@0 948 ; void intel_aes_gcmDEC(uint8_t* PT, uint8_t* CT, void *Gctx, unsigned int len);
michael@0 949 ;
michael@0 950 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
michael@0 951
michael@0 952 ALIGN 16
michael@0 953 intel_aes_gcmDEC PROC
michael@0 954
michael@0 955 NEXTCTR MACRO i
michael@0 956 add aluCTR, 1
michael@0 957 mov aluTMP, aluCTR
michael@0 958 xor aluTMP, aluKSl
michael@0 959 bswap aluTMP
michael@0 960 mov [3*4 + i*16 + rsp], aluTMP
michael@0 961 ENDM
michael@0 962
michael@0 963 PT textequ <rdx>
michael@0 964 CT textequ <rcx>
michael@0 965
michael@0 966 test len, len
michael@0 967 jnz LbeginDEC
michael@0 968 ret
michael@0 969
michael@0 970 LbeginDEC:
michael@0 971
michael@0 972 vzeroupper
michael@0 973 push r11
michael@0 974 push r12
michael@0 975 push r13
michael@0 976 push rbp
michael@0 977 sub rsp, 10*16
michael@0 978 vmovdqu XMMWORD PTR[rsp + 0*16], xmm6
michael@0 979 vmovdqu XMMWORD PTR[rsp + 1*16], xmm7
michael@0 980 vmovdqu XMMWORD PTR[rsp + 2*16], xmm8
michael@0 981 vmovdqu XMMWORD PTR[rsp + 3*16], xmm9
michael@0 982 vmovdqu XMMWORD PTR[rsp + 4*16], xmm10
michael@0 983 vmovdqu XMMWORD PTR[rsp + 5*16], xmm11
michael@0 984 vmovdqu XMMWORD PTR[rsp + 6*16], xmm12
michael@0 985 vmovdqu XMMWORD PTR[rsp + 7*16], xmm13
michael@0 986 vmovdqu XMMWORD PTR[rsp + 8*16], xmm14
michael@0 987 vmovdqu XMMWORD PTR[rsp + 9*16], xmm15
michael@0 988
michael@0 989 mov rbp, rsp
michael@0 990 sub rsp, 8*16
michael@0 991 and rsp, -16
michael@0 992
michael@0 993 vmovdqu T, XMMWORD PTR[16*16 + 1*16 + Gctx]
michael@0 994 vmovdqu CTR0, XMMWORD PTR[16*16 + 2*16 + Gctx]
michael@0 995 vmovdqu BSWAPMASK, XMMWORD PTR[Lbswap_mask]
michael@0 996 mov KS, [16*16 + 3*16 + Gctx]
michael@0 997 mov NR, [4 + KS]
michael@0 998 lea KS, [48 + KS]
michael@0 999
michael@0 1000 vpshufb CTR0, CTR0, BSWAPMASK
michael@0 1001
michael@0 1002 mov aluCTR, [16*16 + 2*16 + 3*4 + Gctx]
michael@0 1003 mov aluKSl, [3*4 + KS]
michael@0 1004 bswap aluCTR
michael@0 1005 bswap aluKSl
michael@0 1006
michael@0 1007 vmovdqu TMP0, XMMWORD PTR[0*16 + KS]
michael@0 1008 vpxor TMP0, TMP0, XMMWORD PTR[16*16 + 2*16 + Gctx]
michael@0 1009 vmovdqu XMMWORD PTR[0*16 + rsp], TMP0
michael@0 1010
michael@0 1011 cmp len, 128
michael@0 1012 jb LDecDataSingles
michael@0 1013 ; Prepare the "top" counters
michael@0 1014 vmovdqu XMMWORD PTR[1*16 + rsp], TMP0
michael@0 1015 vmovdqu XMMWORD PTR[2*16 + rsp], TMP0
michael@0 1016 vmovdqu XMMWORD PTR[3*16 + rsp], TMP0
michael@0 1017 vmovdqu XMMWORD PTR[4*16 + rsp], TMP0
michael@0 1018 vmovdqu XMMWORD PTR[5*16 + rsp], TMP0
michael@0 1019 vmovdqu XMMWORD PTR[6*16 + rsp], TMP0
michael@0 1020 vmovdqu XMMWORD PTR[7*16 + rsp], TMP0
michael@0 1021
michael@0 1022 NEXTCTR 1
michael@0 1023 NEXTCTR 2
michael@0 1024 NEXTCTR 3
michael@0 1025 NEXTCTR 4
michael@0 1026 NEXTCTR 5
michael@0 1027 NEXTCTR 6
michael@0 1028 NEXTCTR 7
michael@0 1029
michael@0 1030 LDecDataOctets:
michael@0 1031 cmp len, 128
michael@0 1032 jb LEndDecOctets
michael@0 1033 sub len, 128
michael@0 1034
michael@0 1035 vmovdqa CTR0, XMMWORD PTR[0*16 + rsp]
michael@0 1036 vmovdqa CTR1, XMMWORD PTR[1*16 + rsp]
michael@0 1037 vmovdqa CTR2, XMMWORD PTR[2*16 + rsp]
michael@0 1038 vmovdqa CTR3, XMMWORD PTR[3*16 + rsp]
michael@0 1039 vmovdqa CTR4, XMMWORD PTR[4*16 + rsp]
michael@0 1040 vmovdqa CTR5, XMMWORD PTR[5*16 + rsp]
michael@0 1041 vmovdqa CTR6, XMMWORD PTR[6*16 + rsp]
michael@0 1042 vmovdqa CTR7, XMMWORD PTR[7*16 + rsp]
michael@0 1043
michael@0 1044 vmovdqu TMP5, XMMWORD PTR[7*16 + CT]
michael@0 1045 vpshufb TMP5, TMP5, BSWAPMASK
michael@0 1046 vpshufd TMP4, TMP5, 78
michael@0 1047 vpxor TMP4, TMP4, TMP5
michael@0 1048 vpclmulqdq TMP0, TMP4, XMMWORD PTR[0*16 + 8*16 + Htbl], 000h
michael@0 1049 vmovdqu TMP4, XMMWORD PTR[0*16 + Htbl]
michael@0 1050 vpclmulqdq TMP1, TMP5, TMP4, 011h
michael@0 1051 vpclmulqdq TMP2, TMP5, TMP4, 000h
michael@0 1052
michael@0 1053 vmovdqu TMP5, XMMWORD PTR[6*16 + CT]
michael@0 1054 vpshufb TMP5, TMP5, BSWAPMASK
michael@0 1055 ROUNDMUL 1
michael@0 1056 NEXTCTR 0
michael@0 1057 vmovdqu TMP5, XMMWORD PTR[5*16 + CT]
michael@0 1058 vpshufb TMP5, TMP5, BSWAPMASK
michael@0 1059 ROUNDMUL 2
michael@0 1060 NEXTCTR 1
michael@0 1061 vmovdqu TMP5, XMMWORD PTR[4*16 + CT]
michael@0 1062 vpshufb TMP5, TMP5, BSWAPMASK
michael@0 1063 ROUNDMUL 3
michael@0 1064 NEXTCTR 2
michael@0 1065 vmovdqu TMP5, XMMWORD PTR[3*16 + CT]
michael@0 1066 vpshufb TMP5, TMP5, BSWAPMASK
michael@0 1067 ROUNDMUL 4
michael@0 1068 NEXTCTR 3
michael@0 1069 vmovdqu TMP5, XMMWORD PTR[2*16 + CT]
michael@0 1070 vpshufb TMP5, TMP5, BSWAPMASK
michael@0 1071 ROUNDMUL 5
michael@0 1072 NEXTCTR 4
michael@0 1073 vmovdqu TMP5, XMMWORD PTR[1*16 + CT]
michael@0 1074 vpshufb TMP5, TMP5, BSWAPMASK
michael@0 1075 ROUNDMUL 6
michael@0 1076 NEXTCTR 5
michael@0 1077 vmovdqu TMP5, XMMWORD PTR[0*16 + CT]
michael@0 1078 vpshufb TMP5, TMP5, BSWAPMASK
michael@0 1079 vpxor TMP5, TMP5, T
michael@0 1080 ROUNDMUL 7
michael@0 1081 NEXTCTR 6
michael@0 1082
michael@0 1083 ROUND 8
michael@0 1084 NEXTCTR 7
michael@0 1085
michael@0 1086 vpxor TMP0, TMP0, TMP1
michael@0 1087 vpxor TMP0, TMP0, TMP2
michael@0 1088 vpsrldq TMP3, TMP0, 8
michael@0 1089 vpxor TMP4, TMP1, TMP3
michael@0 1090 vpslldq TMP3, TMP0, 8
michael@0 1091 vpxor T, TMP2, TMP3
michael@0 1092
michael@0 1093 vpclmulqdq TMP1, T, XMMWORD PTR[Lpoly], 010h
michael@0 1094 vpalignr T,T,T,8
michael@0 1095 vpxor T, T, TMP1
michael@0 1096
michael@0 1097 ROUND 9
michael@0 1098
michael@0 1099 vpclmulqdq TMP1, T, XMMWORD PTR[Lpoly], 010h
michael@0 1100 vpalignr T,T,T,8
michael@0 1101 vpxor T, T, TMP1
michael@0 1102
michael@0 1103 vmovdqu TMP5, XMMWORD PTR[10*16 + KS]
michael@0 1104 cmp NR, 10
michael@0 1105 je @f
michael@0 1106
michael@0 1107 ROUND 10
michael@0 1108 ROUND 11
michael@0 1109 vmovdqu TMP5, XMMWORD PTR[12*16 + KS]
michael@0 1110 cmp NR, 12
michael@0 1111 je @f
michael@0 1112
michael@0 1113 ROUND 12
michael@0 1114 ROUND 13
michael@0 1115 vmovdqu TMP5, XMMWORD PTR[14*16 + KS]
michael@0 1116 @@:
michael@0 1117 vpxor TMP3, TMP5, XMMWORD PTR[0*16 + CT]
michael@0 1118 vaesenclast CTR0, CTR0, TMP3
michael@0 1119 vpxor TMP3, TMP5, XMMWORD PTR[1*16 + CT]
michael@0 1120 vaesenclast CTR1, CTR1, TMP3
michael@0 1121 vpxor TMP3, TMP5, XMMWORD PTR[2*16 + CT]
michael@0 1122 vaesenclast CTR2, CTR2, TMP3
michael@0 1123 vpxor TMP3, TMP5, XMMWORD PTR[3*16 + CT]
michael@0 1124 vaesenclast CTR3, CTR3, TMP3
michael@0 1125 vpxor TMP3, TMP5, XMMWORD PTR[4*16 + CT]
michael@0 1126 vaesenclast CTR4, CTR4, TMP3
michael@0 1127 vpxor TMP3, TMP5, XMMWORD PTR[5*16 + CT]
michael@0 1128 vaesenclast CTR5, CTR5, TMP3
michael@0 1129 vpxor TMP3, TMP5, XMMWORD PTR[6*16 + CT]
michael@0 1130 vaesenclast CTR6, CTR6, TMP3
michael@0 1131 vpxor TMP3, TMP5, XMMWORD PTR[7*16 + CT]
michael@0 1132 vaesenclast CTR7, CTR7, TMP3
michael@0 1133
michael@0 1134 vmovdqu XMMWORD PTR[0*16 + PT], CTR0
michael@0 1135 vmovdqu XMMWORD PTR[1*16 + PT], CTR1
michael@0 1136 vmovdqu XMMWORD PTR[2*16 + PT], CTR2
michael@0 1137 vmovdqu XMMWORD PTR[3*16 + PT], CTR3
michael@0 1138 vmovdqu XMMWORD PTR[4*16 + PT], CTR4
michael@0 1139 vmovdqu XMMWORD PTR[5*16 + PT], CTR5
michael@0 1140 vmovdqu XMMWORD PTR[6*16 + PT], CTR6
michael@0 1141 vmovdqu XMMWORD PTR[7*16 + PT], CTR7
michael@0 1142
michael@0 1143 vpxor T, T, TMP4
michael@0 1144
michael@0 1145 lea CT, [8*16 + CT]
michael@0 1146 lea PT, [8*16 + PT]
michael@0 1147 jmp LDecDataOctets
michael@0 1148
michael@0 1149 LEndDecOctets:
michael@0 1150
michael@0 1151 sub aluCTR, 7
michael@0 1152
michael@0 1153 LDecDataSingles:
michael@0 1154
michael@0 1155 cmp len, 16
michael@0 1156 jb LDecDataTail
michael@0 1157 sub len, 16
michael@0 1158
michael@0 1159 vmovdqa TMP1, XMMWORD PTR[0*16 + rsp]
michael@0 1160 NEXTCTR 0
michael@0 1161
michael@0 1162 vaesenc TMP1, TMP1, XMMWORD PTR[1*16 + KS]
michael@0 1163 vaesenc TMP1, TMP1, XMMWORD PTR[2*16 + KS]
michael@0 1164 vaesenc TMP1, TMP1, XMMWORD PTR[3*16 + KS]
michael@0 1165 vaesenc TMP1, TMP1, XMMWORD PTR[4*16 + KS]
michael@0 1166 vaesenc TMP1, TMP1, XMMWORD PTR[5*16 + KS]
michael@0 1167 vaesenc TMP1, TMP1, XMMWORD PTR[6*16 + KS]
michael@0 1168 vaesenc TMP1, TMP1, XMMWORD PTR[7*16 + KS]
michael@0 1169 vaesenc TMP1, TMP1, XMMWORD PTR[8*16 + KS]
michael@0 1170 vaesenc TMP1, TMP1, XMMWORD PTR[9*16 + KS]
michael@0 1171 vmovdqu TMP2, XMMWORD PTR[10*16 + KS]
michael@0 1172 cmp NR, 10
michael@0 1173 je @f
michael@0 1174 vaesenc TMP1, TMP1, XMMWORD PTR[10*16 + KS]
michael@0 1175 vaesenc TMP1, TMP1, XMMWORD PTR[11*16 + KS]
michael@0 1176 vmovdqu TMP2, XMMWORD PTR[12*16 + KS]
michael@0 1177 cmp NR, 12
michael@0 1178 je @f
michael@0 1179 vaesenc TMP1, TMP1, XMMWORD PTR[12*16 + KS]
michael@0 1180 vaesenc TMP1, TMP1, XMMWORD PTR[13*16 + KS]
michael@0 1181 vmovdqu TMP2, XMMWORD PTR[14*16 + KS]
michael@0 1182 @@:
michael@0 1183 vaesenclast TMP1, TMP1, TMP2
michael@0 1184
michael@0 1185 vmovdqu TMP2, XMMWORD PTR[CT]
michael@0 1186 vpxor TMP1, TMP1, TMP2
michael@0 1187 vmovdqu XMMWORD PTR[PT], TMP1
michael@0 1188
michael@0 1189 lea PT, [16+PT]
michael@0 1190 lea CT, [16+CT]
michael@0 1191
michael@0 1192 vpshufb TMP2, TMP2, BSWAPMASK
michael@0 1193 vpxor T, T, TMP2
michael@0 1194 vmovdqu TMP0, XMMWORD PTR[Htbl]
michael@0 1195 GFMUL T, T, TMP0, TMP1, TMP2, TMP3, TMP4
michael@0 1196
michael@0 1197 jmp LDecDataSingles
michael@0 1198
michael@0 1199 LDecDataTail:
michael@0 1200
michael@0 1201 test len, len
michael@0 1202 jz LDecDataEnd
michael@0 1203
michael@0 1204 vmovdqa TMP1, XMMWORD PTR[0*16 + rsp]
michael@0 1205 inc aluCTR
michael@0 1206 vaesenc TMP1, TMP1, XMMWORD PTR[1*16 + KS]
michael@0 1207 vaesenc TMP1, TMP1, XMMWORD PTR[2*16 + KS]
michael@0 1208 vaesenc TMP1, TMP1, XMMWORD PTR[3*16 + KS]
michael@0 1209 vaesenc TMP1, TMP1, XMMWORD PTR[4*16 + KS]
michael@0 1210 vaesenc TMP1, TMP1, XMMWORD PTR[5*16 + KS]
michael@0 1211 vaesenc TMP1, TMP1, XMMWORD PTR[6*16 + KS]
michael@0 1212 vaesenc TMP1, TMP1, XMMWORD PTR[7*16 + KS]
michael@0 1213 vaesenc TMP1, TMP1, XMMWORD PTR[8*16 + KS]
michael@0 1214 vaesenc TMP1, TMP1, XMMWORD PTR[9*16 + KS]
michael@0 1215 vmovdqu TMP2, XMMWORD PTR[10*16 + KS]
michael@0 1216 cmp NR, 10
michael@0 1217 je @f
michael@0 1218 vaesenc TMP1, TMP1, XMMWORD PTR[10*16 + KS]
michael@0 1219 vaesenc TMP1, TMP1, XMMWORD PTR[11*16 + KS]
michael@0 1220 vmovdqu TMP2, XMMWORD PTR[12*16 + KS]
michael@0 1221 cmp NR, 12
michael@0 1222 je @f
michael@0 1223 vaesenc TMP1, TMP1, XMMWORD PTR[12*16 + KS]
michael@0 1224 vaesenc TMP1, TMP1, XMMWORD PTR[13*16 + KS]
michael@0 1225 vmovdqu TMP2, XMMWORD PTR[14*16 + KS]
michael@0 1226 @@:
michael@0 1227 vaesenclast TMP1, TMP1, TMP2
michael@0 1228 ; copy as many bytes as needed
michael@0 1229 xor KS, KS
michael@0 1230 @@:
michael@0 1231 cmp len, KS
michael@0 1232 je @f
michael@0 1233 mov al, [CT + KS]
michael@0 1234 mov [rsp + KS], al
michael@0 1235 inc KS
michael@0 1236 jmp @b
michael@0 1237 @@:
michael@0 1238 cmp KS, 16
michael@0 1239 je @f
michael@0 1240 mov BYTE PTR[rsp + KS], 0
michael@0 1241 inc KS
michael@0 1242 jmp @b
michael@0 1243 @@:
michael@0 1244 vmovdqa TMP2, XMMWORD PTR[rsp]
michael@0 1245 vpshufb TMP2, TMP2, BSWAPMASK
michael@0 1246 vpxor T, T, TMP2
michael@0 1247 vmovdqu TMP0, XMMWORD PTR[Htbl]
michael@0 1248 GFMUL T, T, TMP0, TMP5, TMP2, TMP3, TMP4
michael@0 1249
michael@0 1250
michael@0 1251 vpxor TMP1, TMP1, XMMWORD PTR[rsp]
michael@0 1252 vmovdqa XMMWORD PTR[rsp], TMP1
michael@0 1253 xor KS, KS
michael@0 1254 @@:
michael@0 1255 cmp len, KS
michael@0 1256 je @f
michael@0 1257 mov al, [rsp + KS]
michael@0 1258 mov [PT + KS], al
michael@0 1259 inc KS
michael@0 1260 jmp @b
michael@0 1261 @@:
michael@0 1262
michael@0 1263 LDecDataEnd:
michael@0 1264
michael@0 1265 vmovdqu XMMWORD PTR[16*16 + 1*16 + Gctx], T
michael@0 1266 bswap aluCTR
michael@0 1267 mov [16*16 + 2*16 + 3*4 + Gctx], aluCTR
michael@0 1268
michael@0 1269 mov rsp, rbp
michael@0 1270
michael@0 1271 vmovdqu xmm6, XMMWORD PTR[rsp + 0*16]
michael@0 1272 vmovdqu xmm7, XMMWORD PTR[rsp + 1*16]
michael@0 1273 vmovdqu xmm8, XMMWORD PTR[rsp + 2*16]
michael@0 1274 vmovdqu xmm9, XMMWORD PTR[rsp + 3*16]
michael@0 1275 vmovdqu xmm10, XMMWORD PTR[rsp + 4*16]
michael@0 1276 vmovdqu xmm11, XMMWORD PTR[rsp + 5*16]
michael@0 1277 vmovdqu xmm12, XMMWORD PTR[rsp + 6*16]
michael@0 1278 vmovdqu xmm13, XMMWORD PTR[rsp + 7*16]
michael@0 1279 vmovdqu xmm14, XMMWORD PTR[rsp + 8*16]
michael@0 1280 vmovdqu xmm15, XMMWORD PTR[rsp + 9*16]
michael@0 1281
michael@0 1282 add rsp, 10*16
michael@0 1283 pop rbp
michael@0 1284 pop r13
michael@0 1285 pop r12
michael@0 1286 pop r11
michael@0 1287
michael@0 1288 vzeroupper
michael@0 1289
michael@0 1290 ret
michael@0 1291 ret
michael@0 1292 intel_aes_gcmDEC ENDP
michael@0 1293
michael@0 1294
michael@0 1295 END

mercurial