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

mercurial