andre@0: ; LICENSE: andre@0: ; This submission to NSS is to be made available under the terms of the andre@0: ; Mozilla Public License, v. 2.0. You can obtain one at http: andre@0: ; //mozilla.org/MPL/2.0/. andre@0: ;############################################################################### andre@0: ; Copyright(c) 2014, Intel Corp. andre@0: ; Developers and authors: andre@0: ; Shay Gueron and Vlad Krasnov andre@0: ; Intel Corporation, Israel Development Centre, Haifa, Israel andre@0: ; Please send feedback directly to crypto.feedback.alias@intel.com andre@0: andre@0: andre@0: .MODEL FLAT, C andre@0: .XMM andre@0: andre@0: .DATA andre@0: ALIGN 16 andre@0: Lone dq 1,0 andre@0: Ltwo dq 2,0 andre@0: Lbswap_mask db 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 andre@0: Lshuff_mask dq 0f0f0f0f0f0f0f0fh, 0f0f0f0f0f0f0f0fh andre@0: Lpoly dq 01h, 0c200000000000000h andre@0: andre@0: .CODE andre@0: andre@0: andre@0: GFMUL MACRO DST, SRC1, SRC2, TMP1, TMP2, TMP3, TMP4 andre@0: vpclmulqdq TMP1, SRC2, SRC1, 0h andre@0: vpclmulqdq TMP4, SRC2, SRC1, 011h andre@0: andre@0: vpshufd TMP2, SRC2, 78 andre@0: vpshufd TMP3, SRC1, 78 andre@0: vpxor TMP2, TMP2, SRC2 andre@0: vpxor TMP3, TMP3, SRC1 andre@0: andre@0: vpclmulqdq TMP2, TMP2, TMP3, 0h andre@0: vpxor TMP2, TMP2, TMP1 andre@0: vpxor TMP2, TMP2, TMP4 andre@0: andre@0: vpslldq TMP3, TMP2, 8 andre@0: vpsrldq TMP2, TMP2, 8 andre@0: andre@0: vpxor TMP1, TMP1, TMP3 andre@0: vpxor TMP4, TMP4, TMP2 andre@0: andre@0: vpclmulqdq TMP2, TMP1, [Lpoly], 010h andre@0: vpshufd TMP3, TMP1, 78 andre@0: vpxor TMP1, TMP2, TMP3 andre@0: andre@0: vpclmulqdq TMP2, TMP1, [Lpoly], 010h andre@0: vpshufd TMP3, TMP1, 78 andre@0: vpxor TMP1, TMP2, TMP3 andre@0: andre@0: vpxor DST, TMP1, TMP4 andre@0: andre@0: ENDM andre@0: andre@0: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; andre@0: ; andre@0: ; Generates the final GCM tag andre@0: ; void intel_aes_gcmTAG(unsigned char Htbl[16*16], andre@0: ; unsigned char *Tp, andre@0: ; unsigned int Mlen, andre@0: ; unsigned int Alen, andre@0: ; unsigned char* X0, andre@0: ; unsigned char* TAG); andre@0: ; andre@0: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; andre@0: andre@0: ALIGN 16 andre@0: intel_aes_gcmTAG PROC andre@0: andre@0: Htbl textequ andre@0: Tp textequ andre@0: X0 textequ andre@0: TAG textequ andre@0: andre@0: T textequ andre@0: TMP0 textequ andre@0: andre@0: push ebx andre@0: andre@0: mov Htbl, [esp + 2*4 + 0*4] andre@0: mov Tp, [esp + 2*4 + 1*4] andre@0: mov X0, [esp + 2*4 + 4*4] andre@0: mov TAG, [esp + 2*4 + 5*4] andre@0: andre@0: vzeroupper andre@0: vmovdqu T, XMMWORD PTR[Tp] andre@0: andre@0: vpxor TMP0, TMP0, TMP0 andre@0: vpinsrd TMP0, TMP0, DWORD PTR[esp + 2*4 + 2*4], 0 andre@0: vpinsrd TMP0, TMP0, DWORD PTR[esp + 2*4 + 3*4], 2 andre@0: vpsllq TMP0, TMP0, 3 andre@0: andre@0: vpxor T, T, TMP0 andre@0: vmovdqu TMP0, XMMWORD PTR[Htbl] andre@0: GFMUL T, T, TMP0, xmm2, xmm3, xmm4, xmm5 andre@0: andre@0: vpshufb T, T, [Lbswap_mask] andre@0: vpxor T, T, [X0] andre@0: vmovdqu XMMWORD PTR[TAG], T andre@0: vzeroupper andre@0: andre@0: pop ebx andre@0: andre@0: ret andre@0: andre@0: intel_aes_gcmTAG ENDP andre@0: andre@0: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; andre@0: ; andre@0: ; Generates the H table andre@0: ; void intel_aes_gcmINIT(unsigned char Htbl[16*16], unsigned char *KS, int NR); andre@0: ; andre@0: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; andre@0: andre@0: ALIGN 16 andre@0: intel_aes_gcmINIT PROC andre@0: andre@0: Htbl textequ andre@0: KS textequ andre@0: NR textequ andre@0: andre@0: T textequ andre@0: TMP0 textequ andre@0: andre@0: mov Htbl, [esp + 4*1 + 0*4] andre@0: mov KS, [esp + 4*1 + 1*4] andre@0: mov NR, [esp + 4*1 + 2*4] andre@0: andre@0: vzeroupper andre@0: ; AES-ENC(0) andre@0: vmovdqu T, XMMWORD PTR[KS] andre@0: lea KS, [16 + KS] andre@0: dec NR andre@0: Lenc_loop: andre@0: vaesenc T, T, [KS] andre@0: lea KS, [16 + KS] andre@0: dec NR andre@0: jnz Lenc_loop andre@0: andre@0: vaesenclast T, T, [KS] andre@0: vpshufb T, T, [Lbswap_mask] andre@0: andre@0: ;Calculate H` = GFMUL(H, 2) andre@0: vpsrad xmm3, T, 31 andre@0: vpshufd xmm3, xmm3, 0ffh andre@0: vpand xmm5, xmm3, [Lpoly] andre@0: vpsrld xmm3, T, 31 andre@0: vpslld xmm4, T, 1 andre@0: vpslldq xmm3, xmm3, 4 andre@0: vpxor T, xmm4, xmm3 andre@0: vpxor T, T, xmm5 andre@0: andre@0: vmovdqu TMP0, T andre@0: vmovdqu XMMWORD PTR[Htbl + 0*16], T andre@0: andre@0: vpshufd xmm2, T, 78 andre@0: vpxor xmm2, xmm2, T andre@0: vmovdqu XMMWORD PTR[Htbl + 8*16 + 0*16], xmm2 andre@0: andre@0: i = 1 andre@0: WHILE i LT 8 andre@0: GFMUL T, T, TMP0, xmm2, xmm3, xmm4, xmm5 andre@0: vmovdqu XMMWORD PTR[Htbl + i*16], T andre@0: vpshufd xmm2, T, 78 andre@0: vpxor xmm2, xmm2, T andre@0: vmovdqu XMMWORD PTR[Htbl + 8*16 + i*16], xmm2 andre@0: i = i+1 andre@0: ENDM andre@0: vzeroupper andre@0: ret andre@0: intel_aes_gcmINIT ENDP andre@0: andre@0: andre@0: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; andre@0: ; andre@0: ; Authenticate only andre@0: ; void intel_aes_gcmAAD(unsigned char Htbl[16*16], unsigned char *AAD, unsigned int Alen, unsigned char *Tp); andre@0: ; andre@0: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; andre@0: andre@0: ALIGN 16 andre@0: intel_aes_gcmAAD PROC andre@0: andre@0: Htbl textequ andre@0: inp textequ andre@0: len textequ andre@0: Tp textequ andre@0: hlp0 textequ andre@0: andre@0: DATA textequ andre@0: T textequ andre@0: TMP0 textequ andre@0: TMP1 textequ andre@0: TMP2 textequ andre@0: TMP3 textequ andre@0: TMP4 textequ andre@0: Xhi textequ andre@0: andre@0: KARATSUBA_AAD MACRO i andre@0: vpclmulqdq TMP3, DATA, [Htbl + i*16], 0h andre@0: vpxor TMP0, TMP0, TMP3 andre@0: vpclmulqdq TMP3, DATA, [Htbl + i*16], 011h andre@0: vpxor TMP1, TMP1, TMP3 andre@0: vpshufd TMP3, DATA, 78 andre@0: vpxor TMP3, TMP3, DATA andre@0: vpclmulqdq TMP3, TMP3, [Htbl + 8*16 + i*16], 0h andre@0: vpxor TMP2, TMP2, TMP3 andre@0: ENDM andre@0: andre@0: cmp DWORD PTR[esp + 1*3 + 2*4], 0 andre@0: jnz LbeginAAD andre@0: ret andre@0: andre@0: LbeginAAD: andre@0: push ebx andre@0: push esi andre@0: andre@0: mov Htbl, [esp + 4*3 + 0*4] andre@0: mov inp, [esp + 4*3 + 1*4] andre@0: mov len, [esp + 4*3 + 2*4] andre@0: mov Tp, [esp + 4*3 + 3*4] andre@0: andre@0: vzeroupper andre@0: andre@0: vpxor Xhi, Xhi, Xhi andre@0: andre@0: vmovdqu T, XMMWORD PTR[Tp] andre@0: ;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 andre@0: mov hlp0, len andre@0: and hlp0, 128-1 andre@0: jz Lmod_loop andre@0: andre@0: and len, -128 andre@0: sub hlp0, 16 andre@0: andre@0: ; Prefix block andre@0: vmovdqu DATA, XMMWORD PTR[inp] andre@0: vpshufb DATA, DATA, [Lbswap_mask] andre@0: vpxor DATA, DATA, T andre@0: andre@0: vpclmulqdq TMP0, DATA, XMMWORD PTR[Htbl + hlp0], 0h andre@0: vpclmulqdq TMP1, DATA, XMMWORD PTR[Htbl + hlp0], 011h andre@0: vpshufd TMP3, DATA, 78 andre@0: vpxor TMP3, TMP3, DATA andre@0: vpclmulqdq TMP2, TMP3, XMMWORD PTR[Htbl + 8*16 + hlp0], 0h andre@0: andre@0: lea inp, [inp+16] andre@0: test hlp0, hlp0 andre@0: jnz Lpre_loop andre@0: jmp Lred1 andre@0: andre@0: ;hash remaining prefix bocks (up to 7 total prefix blocks) andre@0: Lpre_loop: andre@0: andre@0: sub hlp0, 16 andre@0: andre@0: vmovdqu DATA, XMMWORD PTR[inp] andre@0: vpshufb DATA, DATA, [Lbswap_mask] andre@0: andre@0: vpclmulqdq TMP3, DATA, XMMWORD PTR[Htbl + hlp0], 0h andre@0: vpxor TMP0, TMP0, TMP3 andre@0: vpclmulqdq TMP3, DATA, XMMWORD PTR[Htbl + hlp0], 011h andre@0: vpxor TMP1, TMP1, TMP3 andre@0: vpshufd TMP3, DATA, 78 andre@0: vpxor TMP3, TMP3, DATA andre@0: vpclmulqdq TMP3, TMP3, XMMWORD PTR[Htbl + 8*16 + hlp0], 0h andre@0: vpxor TMP2, TMP2, TMP3 andre@0: andre@0: test hlp0, hlp0 andre@0: lea inp, [inp+16] andre@0: jnz Lpre_loop andre@0: andre@0: Lred1: andre@0: andre@0: vpxor TMP2, TMP2, TMP0 andre@0: vpxor TMP2, TMP2, TMP1 andre@0: vpsrldq TMP3, TMP2, 8 andre@0: vpslldq TMP2, TMP2, 8 andre@0: andre@0: vpxor Xhi, TMP1, TMP3 andre@0: vpxor T, TMP0, TMP2 andre@0: andre@0: Lmod_loop: andre@0: andre@0: sub len, 16*8 andre@0: jb Ldone andre@0: ; Block #0 andre@0: vmovdqu DATA, XMMWORD PTR[inp + 16*7] andre@0: vpshufb DATA, DATA, XMMWORD PTR[Lbswap_mask] andre@0: andre@0: vpclmulqdq TMP0, DATA, XMMWORD PTR[Htbl + 0*16], 0h andre@0: vpclmulqdq TMP1, DATA, XMMWORD PTR[Htbl + 0*16], 011h andre@0: vpshufd TMP3, DATA, 78 andre@0: vpxor TMP3, TMP3, DATA andre@0: vpclmulqdq TMP2, TMP3, XMMWORD PTR[Htbl + 8*16 + 0*16], 0h andre@0: andre@0: ; Block #1 andre@0: vmovdqu DATA, XMMWORD PTR[inp + 16*6] andre@0: vpshufb DATA, DATA, [Lbswap_mask] andre@0: KARATSUBA_AAD 1 andre@0: andre@0: ; Block #2 andre@0: vmovdqu DATA, XMMWORD PTR[inp + 16*5] andre@0: vpshufb DATA, DATA, [Lbswap_mask] andre@0: andre@0: vpclmulqdq TMP4, T, [Lpoly], 010h ;reduction stage 1a andre@0: vpalignr T, T, T, 8 andre@0: andre@0: KARATSUBA_AAD 2 andre@0: andre@0: vpxor T, T, TMP4 ;reduction stage 1b andre@0: andre@0: ; Block #3 andre@0: vmovdqu DATA, XMMWORD PTR[inp + 16*4] andre@0: vpshufb DATA, DATA, [Lbswap_mask] andre@0: KARATSUBA_AAD 3 andre@0: ; Block #4 andre@0: vmovdqu DATA, XMMWORD PTR[inp + 16*3] andre@0: vpshufb DATA, DATA, [Lbswap_mask] andre@0: andre@0: vpclmulqdq TMP4, T, [Lpoly], 010h ;reduction stage 2a andre@0: vpalignr T, T, T, 8 andre@0: andre@0: KARATSUBA_AAD 4 andre@0: andre@0: vpxor T, T, TMP4 ;reduction stage 2b andre@0: ; Block #5 andre@0: vmovdqu DATA, XMMWORD PTR[inp + 16*2] andre@0: vpshufb DATA, DATA, [Lbswap_mask] andre@0: KARATSUBA_AAD 5 andre@0: andre@0: vpxor T, T, Xhi ;reduction finalize andre@0: ; Block #6 andre@0: vmovdqu DATA, XMMWORD PTR[inp + 16*1] andre@0: vpshufb DATA, DATA, [Lbswap_mask] andre@0: KARATSUBA_AAD 6 andre@0: ; Block #7 andre@0: vmovdqu DATA, XMMWORD PTR[inp + 16*0] andre@0: vpshufb DATA, DATA, [Lbswap_mask] andre@0: vpxor DATA, DATA, T andre@0: KARATSUBA_AAD 7 andre@0: ; Aggregated 8 blocks, now karatsuba fixup andre@0: vpxor TMP2, TMP2, TMP0 andre@0: vpxor TMP2, TMP2, TMP1 andre@0: vpsrldq TMP3, TMP2, 8 andre@0: vpslldq TMP2, TMP2, 8 andre@0: andre@0: vpxor Xhi, TMP1, TMP3 andre@0: vpxor T, TMP0, TMP2 andre@0: andre@0: lea inp, [inp + 16*8] andre@0: jmp Lmod_loop andre@0: andre@0: Ldone: andre@0: vpclmulqdq TMP4, T, [Lpoly], 010h andre@0: vpalignr T, T, T, 8 andre@0: vpxor T, T, TMP4 andre@0: andre@0: vpclmulqdq TMP4, T, [Lpoly], 010h andre@0: vpalignr T, T, T, 8 andre@0: vpxor T, T, TMP4 andre@0: andre@0: vpxor T, T, Xhi andre@0: vmovdqu XMMWORD PTR[Tp], T andre@0: vzeroupper andre@0: andre@0: pop esi andre@0: pop ebx andre@0: ret andre@0: andre@0: intel_aes_gcmAAD ENDP andre@0: andre@0: andre@0: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; andre@0: ; andre@0: ; Encrypt and Authenticate andre@0: ; void intel_aes_gcmENC(unsigned char* PT, unsigned char* CT, void *Gctx, unsigned int len); andre@0: ; andre@0: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; andre@0: andre@0: ALIGN 16 andre@0: intel_aes_gcmENC PROC andre@0: andre@0: PT textequ andre@0: CT textequ andre@0: Htbl textequ andre@0: Gctx textequ andre@0: len textequ andre@0: KS textequ andre@0: NR textequ andre@0: andre@0: aluCTR textequ andre@0: aluTMP textequ andre@0: andre@0: T textequ andre@0: TMP0 textequ andre@0: TMP1 textequ andre@0: TMP2 textequ andre@0: TMP3 textequ andre@0: TMP4 textequ andre@0: TMP5 textequ andre@0: andre@0: CTR0 textequ andre@0: CTR1 textequ andre@0: CTR2 textequ andre@0: CTR3 textequ andre@0: CTR4 textequ andre@0: CTR5 textequ andre@0: CTR6 textequ andre@0: andre@0: ROUND MACRO i andre@0: vmovdqu xmm7, XMMWORD PTR[i*16 + KS] andre@0: vaesenc CTR0, CTR0, xmm7 andre@0: vaesenc CTR1, CTR1, xmm7 andre@0: vaesenc CTR2, CTR2, xmm7 andre@0: vaesenc CTR3, CTR3, xmm7 andre@0: vaesenc CTR4, CTR4, xmm7 andre@0: vaesenc CTR5, CTR5, xmm7 andre@0: vaesenc CTR6, CTR6, xmm7 andre@0: ENDM andre@0: andre@0: KARATSUBA MACRO i andre@0: vpshufd TMP4, TMP5, 78 andre@0: vpxor TMP4, TMP4, TMP5 andre@0: vpclmulqdq TMP3, TMP4, XMMWORD PTR[i*16 + 8*16 + Htbl], 000h andre@0: vpxor TMP0, TMP0, TMP3 andre@0: vmovdqu TMP4, XMMWORD PTR[i*16 + Htbl] andre@0: vpclmulqdq TMP3, TMP5, TMP4, 011h andre@0: vpxor TMP1, TMP1, TMP3 andre@0: vpclmulqdq TMP3, TMP5, TMP4, 000h andre@0: vpxor TMP2, TMP2, TMP3 andre@0: ENDM andre@0: andre@0: NEXTCTR MACRO i andre@0: add aluCTR, 1 andre@0: mov aluTMP, aluCTR andre@0: bswap aluTMP andre@0: xor aluTMP, [3*4 + KS] andre@0: mov [3*4 + 8*16 + i*16 + esp], aluTMP andre@0: ENDM andre@0: andre@0: cmp DWORD PTR[1*4 + 3*4 + esp], 0 andre@0: jne LbeginENC andre@0: ret andre@0: andre@0: LbeginENC: andre@0: andre@0: vzeroupper andre@0: push ebp andre@0: push ebx andre@0: push esi andre@0: push edi andre@0: andre@0: mov ebp, esp andre@0: sub esp, 16*16 andre@0: and esp, -16 andre@0: andre@0: mov PT, [ebp + 5*4 + 0*4] andre@0: mov CT, [ebp + 5*4 + 1*4] andre@0: mov Gctx, [ebp + 5*4 + 2*4] andre@0: andre@0: mov KS, [16*16 + 3*16 + Gctx] andre@0: lea KS, [44 + KS] andre@0: andre@0: mov aluCTR, [16*16 + 2*16 + 3*4 + Gctx] andre@0: bswap aluCTR andre@0: andre@0: andre@0: vmovdqu TMP0, XMMWORD PTR[0*16 + KS] andre@0: vpxor TMP0, TMP0, XMMWORD PTR[16*16 + 2*16 + Gctx] andre@0: vmovdqu XMMWORD PTR[8*16 + 0*16 + esp], TMP0 andre@0: andre@0: cmp len, 16*7 andre@0: jb LEncDataSingles andre@0: ; Prepare the "top" counters andre@0: vmovdqu XMMWORD PTR[8*16 + 1*16 + esp], TMP0 andre@0: vmovdqu XMMWORD PTR[8*16 + 2*16 + esp], TMP0 andre@0: vmovdqu XMMWORD PTR[8*16 + 3*16 + esp], TMP0 andre@0: vmovdqu XMMWORD PTR[8*16 + 4*16 + esp], TMP0 andre@0: vmovdqu XMMWORD PTR[8*16 + 5*16 + esp], TMP0 andre@0: vmovdqu XMMWORD PTR[8*16 + 6*16 + esp], TMP0 andre@0: andre@0: vmovdqu CTR0, XMMWORD PTR[16*16 + 2*16 + Gctx] andre@0: vpshufb CTR0, CTR0, XMMWORD PTR[Lbswap_mask] andre@0: ; Encrypt the initial 7 blocks andre@0: sub len, 16*7 andre@0: vpaddd CTR1, CTR0, XMMWORD PTR[Lone] andre@0: vpaddd CTR2, CTR0, XMMWORD PTR[Ltwo] andre@0: vpaddd CTR3, CTR2, XMMWORD PTR[Lone] andre@0: vpaddd CTR4, CTR2, XMMWORD PTR[Ltwo] andre@0: vpaddd CTR5, CTR4, XMMWORD PTR[Lone] andre@0: vpaddd CTR6, CTR4, XMMWORD PTR[Ltwo] andre@0: andre@0: vpshufb CTR0, CTR0, XMMWORD PTR[Lbswap_mask] andre@0: vpshufb CTR1, CTR1, XMMWORD PTR[Lbswap_mask] andre@0: vpshufb CTR2, CTR2, XMMWORD PTR[Lbswap_mask] andre@0: vpshufb CTR3, CTR3, XMMWORD PTR[Lbswap_mask] andre@0: vpshufb CTR4, CTR4, XMMWORD PTR[Lbswap_mask] andre@0: vpshufb CTR5, CTR5, XMMWORD PTR[Lbswap_mask] andre@0: vpshufb CTR6, CTR6, XMMWORD PTR[Lbswap_mask] andre@0: andre@0: vmovdqu xmm7, XMMWORD PTR[0*16 + KS] andre@0: vpxor CTR0, CTR0, xmm7 andre@0: vpxor CTR1, CTR1, xmm7 andre@0: vpxor CTR2, CTR2, xmm7 andre@0: vpxor CTR3, CTR3, xmm7 andre@0: vpxor CTR4, CTR4, xmm7 andre@0: vpxor CTR5, CTR5, xmm7 andre@0: vpxor CTR6, CTR6, xmm7 andre@0: andre@0: ROUND 1 andre@0: andre@0: add aluCTR, 7 andre@0: mov aluTMP, aluCTR andre@0: bswap aluTMP andre@0: xor aluTMP, [KS + 3*4] andre@0: mov [8*16 + 0*16 + 3*4 + esp], aluTMP andre@0: andre@0: ROUND 2 andre@0: NEXTCTR 1 andre@0: ROUND 3 andre@0: NEXTCTR 2 andre@0: ROUND 4 andre@0: NEXTCTR 3 andre@0: ROUND 5 andre@0: NEXTCTR 4 andre@0: ROUND 6 andre@0: NEXTCTR 5 andre@0: ROUND 7 andre@0: NEXTCTR 6 andre@0: ROUND 8 andre@0: ROUND 9 andre@0: vmovdqu xmm7, XMMWORD PTR[10*16 + KS] andre@0: cmp NR, 10 andre@0: je @f andre@0: andre@0: ROUND 10 andre@0: ROUND 11 andre@0: vmovdqu xmm7, XMMWORD PTR[12*16 + KS] andre@0: cmp NR, 12 andre@0: je @f andre@0: andre@0: ROUND 12 andre@0: ROUND 13 andre@0: vmovdqu xmm7, XMMWORD PTR[14*16 + KS] andre@0: @@: andre@0: vaesenclast CTR0, CTR0, xmm7 andre@0: vaesenclast CTR1, CTR1, xmm7 andre@0: vaesenclast CTR2, CTR2, xmm7 andre@0: vaesenclast CTR3, CTR3, xmm7 andre@0: vaesenclast CTR4, CTR4, xmm7 andre@0: vaesenclast CTR5, CTR5, xmm7 andre@0: vaesenclast CTR6, CTR6, xmm7 andre@0: andre@0: vpxor CTR0, CTR0, XMMWORD PTR[0*16 + PT] andre@0: vpxor CTR1, CTR1, XMMWORD PTR[1*16 + PT] andre@0: vpxor CTR2, CTR2, XMMWORD PTR[2*16 + PT] andre@0: vpxor CTR3, CTR3, XMMWORD PTR[3*16 + PT] andre@0: vpxor CTR4, CTR4, XMMWORD PTR[4*16 + PT] andre@0: vpxor CTR5, CTR5, XMMWORD PTR[5*16 + PT] andre@0: vpxor CTR6, CTR6, XMMWORD PTR[6*16 + PT] andre@0: andre@0: vmovdqu XMMWORD PTR[0*16 + CT], CTR0 andre@0: vmovdqu XMMWORD PTR[1*16 + CT], CTR1 andre@0: vmovdqu XMMWORD PTR[2*16 + CT], CTR2 andre@0: vmovdqu XMMWORD PTR[3*16 + CT], CTR3 andre@0: vmovdqu XMMWORD PTR[4*16 + CT], CTR4 andre@0: vmovdqu XMMWORD PTR[5*16 + CT], CTR5 andre@0: vmovdqu XMMWORD PTR[6*16 + CT], CTR6 andre@0: andre@0: vpshufb CTR0, CTR0, XMMWORD PTR[Lbswap_mask] andre@0: vpshufb CTR1, CTR1, XMMWORD PTR[Lbswap_mask] andre@0: vpshufb CTR2, CTR2, XMMWORD PTR[Lbswap_mask] andre@0: vpshufb CTR3, CTR3, XMMWORD PTR[Lbswap_mask] andre@0: vpshufb CTR4, CTR4, XMMWORD PTR[Lbswap_mask] andre@0: vpshufb CTR5, CTR5, XMMWORD PTR[Lbswap_mask] andre@0: vpshufb TMP5, CTR6, XMMWORD PTR[Lbswap_mask] andre@0: andre@0: vmovdqa XMMWORD PTR[1*16 + esp], CTR5 andre@0: vmovdqa XMMWORD PTR[2*16 + esp], CTR4 andre@0: vmovdqa XMMWORD PTR[3*16 + esp], CTR3 andre@0: vmovdqa XMMWORD PTR[4*16 + esp], CTR2 andre@0: vmovdqa XMMWORD PTR[5*16 + esp], CTR1 andre@0: vmovdqa XMMWORD PTR[6*16 + esp], CTR0 andre@0: andre@0: lea CT, [7*16 + CT] andre@0: lea PT, [7*16 + PT] andre@0: jmp LEncData7 andre@0: andre@0: LEncData7: andre@0: cmp len, 16*7 andre@0: jb LEndEnc7 andre@0: sub len, 16*7 andre@0: andre@0: vpshufd TMP4, TMP5, 78 andre@0: vpxor TMP4, TMP4, TMP5 andre@0: vpclmulqdq TMP0, TMP4, XMMWORD PTR[0*16 + 8*16 + Htbl], 000h andre@0: vmovdqu TMP4, XMMWORD PTR[0*16 + Htbl] andre@0: vpclmulqdq TMP1, TMP5, TMP4, 011h andre@0: vpclmulqdq TMP2, TMP5, TMP4, 000h andre@0: andre@0: vmovdqu TMP5, XMMWORD PTR[1*16 + esp] andre@0: KARATSUBA 1 andre@0: vmovdqu TMP5, XMMWORD PTR[2*16 + esp] andre@0: KARATSUBA 2 andre@0: vmovdqu TMP5, XMMWORD PTR[3*16 + esp] andre@0: KARATSUBA 3 andre@0: vmovdqu TMP5, XMMWORD PTR[4*16 + esp] andre@0: KARATSUBA 4 andre@0: vmovdqu TMP5, XMMWORD PTR[5*16 + esp] andre@0: KARATSUBA 5 andre@0: vmovdqu TMP5, XMMWORD PTR[6*16 + esp] andre@0: vpxor TMP5, TMP5, T andre@0: KARATSUBA 6 andre@0: andre@0: vpxor TMP0, TMP0, TMP1 andre@0: vpxor TMP0, TMP0, TMP2 andre@0: vpsrldq TMP3, TMP0, 8 andre@0: vpxor TMP4, TMP1, TMP3 andre@0: vpslldq TMP3, TMP0, 8 andre@0: vpxor TMP5, TMP2, TMP3 andre@0: andre@0: vpclmulqdq TMP1, TMP5, XMMWORD PTR[Lpoly], 010h andre@0: vpalignr TMP5,TMP5,TMP5,8 andre@0: vpxor TMP5, TMP5, TMP1 andre@0: andre@0: vpclmulqdq TMP1, TMP5, XMMWORD PTR[Lpoly], 010h andre@0: vpalignr TMP5,TMP5,TMP5,8 andre@0: vpxor TMP5, TMP5, TMP1 andre@0: andre@0: vpxor TMP5, TMP5, TMP4 andre@0: vmovdqu T, TMP5 andre@0: andre@0: vmovdqa CTR0, XMMWORD PTR[8*16 + 0*16 + esp] andre@0: vmovdqa CTR1, XMMWORD PTR[8*16 + 1*16 + esp] andre@0: vmovdqa CTR2, XMMWORD PTR[8*16 + 2*16 + esp] andre@0: vmovdqa CTR3, XMMWORD PTR[8*16 + 3*16 + esp] andre@0: vmovdqa CTR4, XMMWORD PTR[8*16 + 4*16 + esp] andre@0: vmovdqa CTR5, XMMWORD PTR[8*16 + 5*16 + esp] andre@0: vmovdqa CTR6, XMMWORD PTR[8*16 + 6*16 + esp] andre@0: andre@0: ROUND 1 andre@0: NEXTCTR 0 andre@0: ROUND 2 andre@0: NEXTCTR 1 andre@0: ROUND 3 andre@0: NEXTCTR 2 andre@0: ROUND 4 andre@0: NEXTCTR 3 andre@0: ROUND 5 andre@0: NEXTCTR 4 andre@0: ROUND 6 andre@0: NEXTCTR 5 andre@0: ROUND 7 andre@0: NEXTCTR 6 andre@0: andre@0: ROUND 8 andre@0: ROUND 9 andre@0: andre@0: vmovdqu xmm7, XMMWORD PTR[10*16 + KS] andre@0: cmp NR, 10 andre@0: je @f andre@0: andre@0: ROUND 10 andre@0: ROUND 11 andre@0: vmovdqu xmm7, XMMWORD PTR[12*16 + KS] andre@0: cmp NR, 12 andre@0: je @f andre@0: andre@0: ROUND 12 andre@0: ROUND 13 andre@0: vmovdqu xmm7, XMMWORD PTR[14*16 + KS] andre@0: @@: andre@0: vaesenclast CTR0, CTR0, xmm7 andre@0: vaesenclast CTR1, CTR1, xmm7 andre@0: vaesenclast CTR2, CTR2, xmm7 andre@0: vaesenclast CTR3, CTR3, xmm7 andre@0: vaesenclast CTR4, CTR4, xmm7 andre@0: vaesenclast CTR5, CTR5, xmm7 andre@0: vaesenclast CTR6, CTR6, xmm7 andre@0: andre@0: vpxor CTR0, CTR0, XMMWORD PTR[0*16 + PT] andre@0: vpxor CTR1, CTR1, XMMWORD PTR[1*16 + PT] andre@0: vpxor CTR2, CTR2, XMMWORD PTR[2*16 + PT] andre@0: vpxor CTR3, CTR3, XMMWORD PTR[3*16 + PT] andre@0: vpxor CTR4, CTR4, XMMWORD PTR[4*16 + PT] andre@0: vpxor CTR5, CTR5, XMMWORD PTR[5*16 + PT] andre@0: vpxor CTR6, CTR6, XMMWORD PTR[6*16 + PT] andre@0: andre@0: vmovdqu XMMWORD PTR[0*16 + CT], CTR0 andre@0: vmovdqu XMMWORD PTR[1*16 + CT], CTR1 andre@0: vmovdqu XMMWORD PTR[2*16 + CT], CTR2 andre@0: vmovdqu XMMWORD PTR[3*16 + CT], CTR3 andre@0: vmovdqu XMMWORD PTR[4*16 + CT], CTR4 andre@0: vmovdqu XMMWORD PTR[5*16 + CT], CTR5 andre@0: vmovdqu XMMWORD PTR[6*16 + CT], CTR6 andre@0: andre@0: vpshufb CTR0, CTR0, XMMWORD PTR[Lbswap_mask] andre@0: vpshufb CTR1, CTR1, XMMWORD PTR[Lbswap_mask] andre@0: vpshufb CTR2, CTR2, XMMWORD PTR[Lbswap_mask] andre@0: vpshufb CTR3, CTR3, XMMWORD PTR[Lbswap_mask] andre@0: vpshufb CTR4, CTR4, XMMWORD PTR[Lbswap_mask] andre@0: vpshufb CTR5, CTR5, XMMWORD PTR[Lbswap_mask] andre@0: vpshufb TMP5, CTR6, XMMWORD PTR[Lbswap_mask] andre@0: andre@0: vmovdqa XMMWORD PTR[1*16 + esp], CTR5 andre@0: vmovdqa XMMWORD PTR[2*16 + esp], CTR4 andre@0: vmovdqa XMMWORD PTR[3*16 + esp], CTR3 andre@0: vmovdqa XMMWORD PTR[4*16 + esp], CTR2 andre@0: vmovdqa XMMWORD PTR[5*16 + esp], CTR1 andre@0: vmovdqa XMMWORD PTR[6*16 + esp], CTR0 andre@0: andre@0: lea CT, [7*16 + CT] andre@0: lea PT, [7*16 + PT] andre@0: jmp LEncData7 andre@0: andre@0: LEndEnc7: andre@0: andre@0: vpshufd TMP4, TMP5, 78 andre@0: vpxor TMP4, TMP4, TMP5 andre@0: vpclmulqdq TMP0, TMP4, XMMWORD PTR[0*16 + 8*16 + Htbl], 000h andre@0: vmovdqu TMP4, XMMWORD PTR[0*16 + Htbl] andre@0: vpclmulqdq TMP1, TMP5, TMP4, 011h andre@0: vpclmulqdq TMP2, TMP5, TMP4, 000h andre@0: andre@0: vmovdqu TMP5, XMMWORD PTR[1*16 + esp] andre@0: KARATSUBA 1 andre@0: vmovdqu TMP5, XMMWORD PTR[2*16 + esp] andre@0: KARATSUBA 2 andre@0: vmovdqu TMP5, XMMWORD PTR[3*16 + esp] andre@0: KARATSUBA 3 andre@0: vmovdqu TMP5, XMMWORD PTR[4*16 + esp] andre@0: KARATSUBA 4 andre@0: vmovdqu TMP5, XMMWORD PTR[5*16 + esp] andre@0: KARATSUBA 5 andre@0: vmovdqu TMP5, XMMWORD PTR[6*16 + esp] andre@0: vpxor TMP5, TMP5, T andre@0: KARATSUBA 6 andre@0: andre@0: vpxor TMP0, TMP0, TMP1 andre@0: vpxor TMP0, TMP0, TMP2 andre@0: vpsrldq TMP3, TMP0, 8 andre@0: vpxor TMP4, TMP1, TMP3 andre@0: vpslldq TMP3, TMP0, 8 andre@0: vpxor TMP5, TMP2, TMP3 andre@0: andre@0: vpclmulqdq TMP1, TMP5, XMMWORD PTR[Lpoly], 010h andre@0: vpalignr TMP5,TMP5,TMP5,8 andre@0: vpxor TMP5, TMP5, TMP1 andre@0: andre@0: vpclmulqdq TMP1, TMP5, XMMWORD PTR[Lpoly], 010h andre@0: vpalignr TMP5,TMP5,TMP5,8 andre@0: vpxor TMP5, TMP5, TMP1 andre@0: andre@0: vpxor TMP5, TMP5, TMP4 andre@0: vmovdqu T, TMP5 andre@0: andre@0: sub aluCTR, 6 andre@0: andre@0: LEncDataSingles: andre@0: andre@0: cmp len, 16 andre@0: jb LEncDataTail andre@0: sub len, 16 andre@0: andre@0: vmovdqa TMP1, XMMWORD PTR[8*16 + 0*16 + esp] andre@0: NEXTCTR 0 andre@0: andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[1*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[2*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[3*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[4*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[5*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[6*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[7*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[8*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[9*16 + KS] andre@0: vmovdqu TMP2, XMMWORD PTR[10*16 + KS] andre@0: cmp NR, 10 andre@0: je @f andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[10*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[11*16 + KS] andre@0: vmovdqu TMP2, XMMWORD PTR[12*16 + KS] andre@0: cmp NR, 12 andre@0: je @f andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[12*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[13*16 + KS] andre@0: vmovdqu TMP2, XMMWORD PTR[14*16 + KS] andre@0: @@: andre@0: vaesenclast TMP1, TMP1, TMP2 andre@0: vpxor TMP1, TMP1, XMMWORD PTR[PT] andre@0: vmovdqu XMMWORD PTR[CT], TMP1 andre@0: andre@0: lea PT, [16+PT] andre@0: lea CT, [16+CT] andre@0: andre@0: vpshufb TMP1, TMP1, XMMWORD PTR[Lbswap_mask] andre@0: vpxor TMP1, TMP1, T andre@0: andre@0: vmovdqu TMP0, XMMWORD PTR[Htbl] andre@0: GFMUL TMP1, TMP1, TMP0, TMP5, TMP2, TMP3, TMP4 andre@0: vmovdqu T, TMP1 andre@0: andre@0: jmp LEncDataSingles andre@0: andre@0: LEncDataTail: andre@0: andre@0: cmp len, 0 andre@0: je LEncDataEnd andre@0: andre@0: vmovdqa TMP1, XMMWORD PTR[8*16 + 0*16 + esp] andre@0: andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[1*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[2*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[3*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[4*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[5*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[6*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[7*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[8*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[9*16 + KS] andre@0: vmovdqu TMP2, XMMWORD PTR[10*16 + KS] andre@0: cmp NR, 10 andre@0: je @f andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[10*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[11*16 + KS] andre@0: vmovdqu TMP2, XMMWORD PTR[12*16 + KS] andre@0: cmp NR, 12 andre@0: je @f andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[12*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[13*16 + KS] andre@0: vmovdqu TMP2, XMMWORD PTR[14*16 + KS] andre@0: @@: andre@0: vaesenclast TMP1, TMP1, TMP2 andre@0: ; zero a temp location andre@0: vpxor TMP2, TMP2, TMP2 andre@0: vmovdqa XMMWORD PTR[esp], TMP2 andre@0: ; copy as many bytes as needed andre@0: xor KS, KS andre@0: mov aluTMP, edx andre@0: @@: andre@0: cmp len, KS andre@0: je @f andre@0: mov dl, BYTE PTR[PT + KS] andre@0: mov BYTE PTR[esp + KS], dl andre@0: inc KS andre@0: jmp @b andre@0: @@: andre@0: vpxor TMP1, TMP1, XMMWORD PTR[esp] andre@0: vmovdqa XMMWORD PTR[esp], TMP1 andre@0: xor KS, KS andre@0: @@: andre@0: cmp len, KS andre@0: je @f andre@0: mov dl, BYTE PTR[esp + KS] andre@0: mov BYTE PTR[CT + KS], dl andre@0: inc KS andre@0: jmp @b andre@0: @@: andre@0: cmp KS, 16 andre@0: je @f andre@0: mov BYTE PTR[esp + KS], 0 andre@0: inc KS andre@0: jmp @b andre@0: @@: andre@0: mov edx, aluTMP andre@0: vmovdqa TMP1, XMMWORD PTR[esp] andre@0: vpshufb TMP1, TMP1, XMMWORD PTR[Lbswap_mask] andre@0: vpxor TMP1, TMP1, T andre@0: andre@0: vmovdqu TMP0, XMMWORD PTR[Htbl] andre@0: GFMUL TMP1, TMP1, TMP0, TMP5, TMP2, TMP3, TMP4 andre@0: vmovdqu T, TMP1 andre@0: andre@0: LEncDataEnd: andre@0: inc aluCTR andre@0: bswap aluCTR andre@0: mov [16*16 + 2*16 + 3*4 + Gctx], aluCTR andre@0: andre@0: mov esp, ebp andre@0: pop edi andre@0: pop esi andre@0: pop ebx andre@0: pop ebp andre@0: andre@0: andre@0: vzeroupper andre@0: andre@0: ret andre@0: intel_aes_gcmENC ENDP andre@0: andre@0: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; andre@0: ; andre@0: ; Decrypt and Authenticate andre@0: ; void intel_aes_gcmDEC(uint8_t* PT, uint8_t* CT, void *Gctx, unsigned int len); andre@0: ; andre@0: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; andre@0: andre@0: andre@0: NEXTCTR MACRO i andre@0: add aluCTR, 1 andre@0: mov aluTMP, aluCTR andre@0: bswap aluTMP andre@0: xor aluTMP, [3*4 + KS] andre@0: mov [3*4 + i*16 + esp], aluTMP andre@0: ENDM andre@0: andre@0: intel_aes_gcmDEC PROC andre@0: andre@0: cmp DWORD PTR[1*4 + 3*4 + esp], 0 andre@0: jne LbeginDEC andre@0: ret andre@0: andre@0: LbeginDEC: andre@0: andre@0: vzeroupper andre@0: push ebp andre@0: push ebx andre@0: push esi andre@0: push edi andre@0: andre@0: mov ebp, esp andre@0: sub esp, 8*16 andre@0: and esp, -16 andre@0: andre@0: mov CT, [ebp + 5*4 + 0*4] andre@0: mov PT, [ebp + 5*4 + 1*4] andre@0: mov Gctx, [ebp + 5*4 + 2*4] andre@0: andre@0: mov KS, [16*16 + 3*16 + Gctx] andre@0: lea KS, [44 + KS] andre@0: andre@0: mov aluCTR, [16*16 + 2*16 + 3*4 + Gctx] andre@0: bswap aluCTR andre@0: andre@0: andre@0: vmovdqu TMP0, XMMWORD PTR[0*16 + KS] andre@0: vpxor TMP0, TMP0, XMMWORD PTR[16*16 + 2*16 + Gctx] andre@0: vmovdqu XMMWORD PTR[0*16 + esp], TMP0 andre@0: andre@0: cmp len, 16*7 andre@0: jb LDecDataSingles andre@0: vmovdqu XMMWORD PTR[1*16 + esp], TMP0 andre@0: vmovdqu XMMWORD PTR[2*16 + esp], TMP0 andre@0: vmovdqu XMMWORD PTR[3*16 + esp], TMP0 andre@0: vmovdqu XMMWORD PTR[4*16 + esp], TMP0 andre@0: vmovdqu XMMWORD PTR[5*16 + esp], TMP0 andre@0: vmovdqu XMMWORD PTR[6*16 + esp], TMP0 andre@0: dec aluCTR andre@0: andre@0: LDecData7: andre@0: cmp len, 16*7 andre@0: jb LDecData7End andre@0: sub len, 16*7 andre@0: andre@0: vmovdqu TMP5, XMMWORD PTR[0*16 + CT] andre@0: vpshufb TMP5, TMP5, XMMWORD PTR[Lbswap_mask] andre@0: vpxor TMP5, TMP5, T andre@0: vpshufd TMP4, TMP5, 78 andre@0: vpxor TMP4, TMP4, TMP5 andre@0: vpclmulqdq TMP0, TMP4, XMMWORD PTR[6*16 + 8*16 + Htbl], 000h andre@0: vmovdqu TMP4, XMMWORD PTR[6*16 + Htbl] andre@0: vpclmulqdq TMP1, TMP5, TMP4, 011h andre@0: vpclmulqdq TMP2, TMP5, TMP4, 000h andre@0: andre@0: NEXTCTR 0 andre@0: vmovdqu TMP5, XMMWORD PTR[1*16 + CT] andre@0: vpshufb TMP5, TMP5, XMMWORD PTR[Lbswap_mask] andre@0: KARATSUBA 5 andre@0: NEXTCTR 1 andre@0: vmovdqu TMP5, XMMWORD PTR[2*16 + CT] andre@0: vpshufb TMP5, TMP5, XMMWORD PTR[Lbswap_mask] andre@0: KARATSUBA 4 andre@0: NEXTCTR 2 andre@0: vmovdqu TMP5, XMMWORD PTR[3*16 + CT] andre@0: vpshufb TMP5, TMP5, XMMWORD PTR[Lbswap_mask] andre@0: KARATSUBA 3 andre@0: NEXTCTR 3 andre@0: vmovdqu TMP5, XMMWORD PTR[4*16 + CT] andre@0: vpshufb TMP5, TMP5, XMMWORD PTR[Lbswap_mask] andre@0: KARATSUBA 2 andre@0: NEXTCTR 4 andre@0: vmovdqu TMP5, XMMWORD PTR[5*16 + CT] andre@0: vpshufb TMP5, TMP5, XMMWORD PTR[Lbswap_mask] andre@0: KARATSUBA 1 andre@0: NEXTCTR 5 andre@0: vmovdqu TMP5, XMMWORD PTR[6*16 + CT] andre@0: vpshufb TMP5, TMP5, XMMWORD PTR[Lbswap_mask] andre@0: KARATSUBA 0 andre@0: NEXTCTR 6 andre@0: andre@0: vpxor TMP0, TMP0, TMP1 andre@0: vpxor TMP0, TMP0, TMP2 andre@0: vpsrldq TMP3, TMP0, 8 andre@0: vpxor TMP4, TMP1, TMP3 andre@0: vpslldq TMP3, TMP0, 8 andre@0: vpxor TMP5, TMP2, TMP3 andre@0: andre@0: vpclmulqdq TMP1, TMP5, XMMWORD PTR[Lpoly], 010h andre@0: vpalignr TMP5,TMP5,TMP5,8 andre@0: vpxor TMP5, TMP5, TMP1 andre@0: andre@0: vpclmulqdq TMP1, TMP5, XMMWORD PTR[Lpoly], 010h andre@0: vpalignr TMP5,TMP5,TMP5,8 andre@0: vpxor TMP5, TMP5, TMP1 andre@0: andre@0: vpxor TMP5, TMP5, TMP4 andre@0: vmovdqu T, TMP5 andre@0: andre@0: vmovdqa CTR0, XMMWORD PTR[0*16 + esp] andre@0: vmovdqa CTR1, XMMWORD PTR[1*16 + esp] andre@0: vmovdqa CTR2, XMMWORD PTR[2*16 + esp] andre@0: vmovdqa CTR3, XMMWORD PTR[3*16 + esp] andre@0: vmovdqa CTR4, XMMWORD PTR[4*16 + esp] andre@0: vmovdqa CTR5, XMMWORD PTR[5*16 + esp] andre@0: vmovdqa CTR6, XMMWORD PTR[6*16 + esp] andre@0: andre@0: ROUND 1 andre@0: ROUND 2 andre@0: ROUND 3 andre@0: ROUND 4 andre@0: ROUND 5 andre@0: ROUND 6 andre@0: ROUND 7 andre@0: ROUND 8 andre@0: ROUND 9 andre@0: vmovdqu xmm7, XMMWORD PTR[10*16 + KS] andre@0: cmp NR, 10 andre@0: je @f andre@0: andre@0: ROUND 10 andre@0: ROUND 11 andre@0: vmovdqu xmm7, XMMWORD PTR[12*16 + KS] andre@0: cmp NR, 12 andre@0: je @f andre@0: andre@0: ROUND 12 andre@0: ROUND 13 andre@0: vmovdqu xmm7, XMMWORD PTR[14*16 + KS] andre@0: @@: andre@0: vaesenclast CTR0, CTR0, xmm7 andre@0: vaesenclast CTR1, CTR1, xmm7 andre@0: vaesenclast CTR2, CTR2, xmm7 andre@0: vaesenclast CTR3, CTR3, xmm7 andre@0: vaesenclast CTR4, CTR4, xmm7 andre@0: vaesenclast CTR5, CTR5, xmm7 andre@0: vaesenclast CTR6, CTR6, xmm7 andre@0: andre@0: vpxor CTR0, CTR0, XMMWORD PTR[0*16 + CT] andre@0: vpxor CTR1, CTR1, XMMWORD PTR[1*16 + CT] andre@0: vpxor CTR2, CTR2, XMMWORD PTR[2*16 + CT] andre@0: vpxor CTR3, CTR3, XMMWORD PTR[3*16 + CT] andre@0: vpxor CTR4, CTR4, XMMWORD PTR[4*16 + CT] andre@0: vpxor CTR5, CTR5, XMMWORD PTR[5*16 + CT] andre@0: vpxor CTR6, CTR6, XMMWORD PTR[6*16 + CT] andre@0: andre@0: vmovdqu XMMWORD PTR[0*16 + PT], CTR0 andre@0: vmovdqu XMMWORD PTR[1*16 + PT], CTR1 andre@0: vmovdqu XMMWORD PTR[2*16 + PT], CTR2 andre@0: vmovdqu XMMWORD PTR[3*16 + PT], CTR3 andre@0: vmovdqu XMMWORD PTR[4*16 + PT], CTR4 andre@0: vmovdqu XMMWORD PTR[5*16 + PT], CTR5 andre@0: vmovdqu XMMWORD PTR[6*16 + PT], CTR6 andre@0: andre@0: lea CT, [7*16 + CT] andre@0: lea PT, [7*16 + PT] andre@0: jmp LDecData7 andre@0: andre@0: LDecData7End: andre@0: andre@0: NEXTCTR 0 andre@0: andre@0: LDecDataSingles: andre@0: andre@0: cmp len, 16 andre@0: jb LDecDataTail andre@0: sub len, 16 andre@0: andre@0: vmovdqu TMP1, XMMWORD PTR[CT] andre@0: vpshufb TMP1, TMP1, XMMWORD PTR[Lbswap_mask] andre@0: vpxor TMP1, TMP1, T andre@0: andre@0: vmovdqu TMP0, XMMWORD PTR[Htbl] andre@0: GFMUL TMP1, TMP1, TMP0, TMP5, TMP2, TMP3, TMP4 andre@0: vmovdqu T, TMP1 andre@0: andre@0: vmovdqa TMP1, XMMWORD PTR[0*16 + esp] andre@0: NEXTCTR 0 andre@0: andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[1*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[2*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[3*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[4*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[5*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[6*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[7*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[8*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[9*16 + KS] andre@0: vmovdqu TMP2, XMMWORD PTR[10*16 + KS] andre@0: cmp NR, 10 andre@0: je @f andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[10*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[11*16 + KS] andre@0: vmovdqu TMP2, XMMWORD PTR[12*16 + KS] andre@0: cmp NR, 12 andre@0: je @f andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[12*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[13*16 + KS] andre@0: vmovdqu TMP2, XMMWORD PTR[14*16 + KS] andre@0: @@: andre@0: vaesenclast TMP1, TMP1, TMP2 andre@0: vpxor TMP1, TMP1, XMMWORD PTR[CT] andre@0: vmovdqu XMMWORD PTR[PT], TMP1 andre@0: andre@0: lea PT, [16+PT] andre@0: lea CT, [16+CT] andre@0: jmp LDecDataSingles andre@0: andre@0: LDecDataTail: andre@0: andre@0: cmp len, 0 andre@0: je LDecDataEnd andre@0: andre@0: vmovdqa TMP1, XMMWORD PTR[0*16 + esp] andre@0: inc aluCTR andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[1*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[2*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[3*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[4*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[5*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[6*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[7*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[8*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[9*16 + KS] andre@0: vmovdqu TMP2, XMMWORD PTR[10*16 + KS] andre@0: cmp NR, 10 andre@0: je @f andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[10*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[11*16 + KS] andre@0: vmovdqu TMP2, XMMWORD PTR[12*16 + KS] andre@0: cmp NR, 12 andre@0: je @f andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[12*16 + KS] andre@0: vaesenc TMP1, TMP1, XMMWORD PTR[13*16 + KS] andre@0: vmovdqu TMP2, XMMWORD PTR[14*16 + KS] andre@0: @@: andre@0: vaesenclast xmm7, TMP1, TMP2 andre@0: andre@0: ; copy as many bytes as needed andre@0: xor KS, KS andre@0: mov aluTMP, edx andre@0: @@: andre@0: cmp len, KS andre@0: je @f andre@0: mov dl, BYTE PTR[CT + KS] andre@0: mov BYTE PTR[esp + KS], dl andre@0: inc KS andre@0: jmp @b andre@0: @@: andre@0: cmp KS, 16 andre@0: je @f andre@0: mov BYTE PTR[esp + KS], 0 andre@0: inc KS andre@0: jmp @b andre@0: @@: andre@0: mov edx, aluTMP andre@0: vmovdqa TMP1, XMMWORD PTR[esp] andre@0: vpshufb TMP1, TMP1, XMMWORD PTR[Lbswap_mask] andre@0: vpxor TMP1, TMP1, T andre@0: andre@0: vmovdqu TMP0, XMMWORD PTR[Htbl] andre@0: GFMUL TMP1, TMP1, TMP0, TMP5, TMP2, TMP3, TMP4 andre@0: vmovdqu T, TMP1 andre@0: andre@0: vpxor xmm7, xmm7, XMMWORD PTR[esp] andre@0: vmovdqa XMMWORD PTR[esp], xmm7 andre@0: xor KS, KS andre@0: mov aluTMP, edx andre@0: @@: andre@0: cmp len, KS andre@0: je @f andre@0: mov dl, BYTE PTR[esp + KS] andre@0: mov BYTE PTR[PT + KS], dl andre@0: inc KS andre@0: jmp @b andre@0: @@: andre@0: mov edx, aluTMP andre@0: andre@0: LDecDataEnd: andre@0: andre@0: bswap aluCTR andre@0: mov [16*16 + 2*16 + 3*4 + Gctx], aluCTR andre@0: andre@0: mov esp, ebp andre@0: pop edi andre@0: pop esi andre@0: pop ebx andre@0: pop ebp andre@0: andre@0: vzeroupper andre@0: andre@0: ret andre@0: intel_aes_gcmDEC ENDP andre@0: andre@0: andre@0: END