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: .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: Mlen textequ andre@0: Alen textequ andre@0: X0 textequ andre@0: TAG textequ andre@0: andre@0: T textequ andre@0: TMP0 textequ andre@0: andre@0: mov X0, [rsp + 1*8 + 4*8] andre@0: mov TAG, [rsp + 1*8 + 5*8] andre@0: andre@0: vzeroupper andre@0: vmovdqu T, XMMWORD PTR[Tp] andre@0: vpxor TMP0, TMP0, TMP0 andre@0: andre@0: shl Mlen, 3 andre@0: shl Alen, 3 andre@0: andre@0: ;vpinsrq TMP0, TMP0, Mlen, 0 andre@0: ;vpinsrq TMP0, TMP0, Alen, 1 andre@0: ; workaround the ml64.exe vpinsrq issue andre@0: vpinsrd TMP0, TMP0, r8d, 0 andre@0: vpinsrd TMP0, TMP0, r9d, 2 andre@0: shr Mlen, 32 andre@0: shr Alen, 32 andre@0: vpinsrd TMP0, TMP0, r8d, 1 andre@0: vpinsrd TMP0, TMP0, r9d, 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: 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: 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: test len, len andre@0: jnz LbeginAAD andre@0: ret andre@0: andre@0: LbeginAAD: andre@0: vzeroupper andre@0: andre@0: sub rsp, 2*16 andre@0: vmovdqu XMMWORD PTR[rsp + 0*16], xmm6 andre@0: vmovdqu XMMWORD PTR[rsp + 1*16], xmm7 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, [Htbl + hlp0], 0h andre@0: vpclmulqdq TMP1, DATA, [Htbl + hlp0], 011h andre@0: vpshufd TMP3, DATA, 78 andre@0: vpxor TMP3, TMP3, DATA andre@0: vpclmulqdq TMP2, TMP3, [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, [Htbl + hlp0], 0h andre@0: vpxor TMP0, TMP0, TMP3 andre@0: vpclmulqdq TMP3, DATA, [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, [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: 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, [Lbswap_mask] andre@0: andre@0: vpclmulqdq TMP0, DATA, [Htbl + 0*16], 0h andre@0: vpclmulqdq TMP1, DATA, [Htbl + 0*16], 011h andre@0: vpshufd TMP3, DATA, 78 andre@0: vpxor TMP3, TMP3, DATA andre@0: vpclmulqdq TMP2, TMP3, [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: vmovdqu xmm6, XMMWORD PTR[rsp + 0*16] andre@0: vmovdqu xmm7, XMMWORD PTR[rsp + 1*16] andre@0: add rsp, 16*2 andre@0: 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: aluKSl 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: 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: CTR7 textequ andre@0: BSWAPMASK textequ andre@0: andre@0: ROUND MACRO i andre@0: vmovdqu TMP3, XMMWORD PTR[i*16 + KS] andre@0: vaesenc CTR0, CTR0, TMP3 andre@0: vaesenc CTR1, CTR1, TMP3 andre@0: vaesenc CTR2, CTR2, TMP3 andre@0: vaesenc CTR3, CTR3, TMP3 andre@0: vaesenc CTR4, CTR4, TMP3 andre@0: vaesenc CTR5, CTR5, TMP3 andre@0: vaesenc CTR6, CTR6, TMP3 andre@0: vaesenc CTR7, CTR7, TMP3 andre@0: ENDM andre@0: ROUNDMUL MACRO i andre@0: vmovdqu TMP3, XMMWORD PTR[i*16 + KS] andre@0: andre@0: vaesenc CTR0, CTR0, TMP3 andre@0: vaesenc CTR1, CTR1, TMP3 andre@0: vaesenc CTR2, CTR2, TMP3 andre@0: vaesenc CTR3, CTR3, TMP3 andre@0: andre@0: vpshufd TMP4, TMP5, 78 andre@0: vpxor TMP4, TMP4, TMP5 andre@0: andre@0: vaesenc CTR4, CTR4, TMP3 andre@0: vaesenc CTR5, CTR5, TMP3 andre@0: vaesenc CTR6, CTR6, TMP3 andre@0: vaesenc CTR7, CTR7, TMP3 andre@0: 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: 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: NEXTCTR MACRO i andre@0: add aluCTR, 1 andre@0: mov aluTMP, aluCTR andre@0: xor aluTMP, aluKSl andre@0: bswap aluTMP andre@0: mov [3*4 + 8*16 + i*16 + rsp], aluTMP andre@0: ENDM andre@0: andre@0: andre@0: test len, len andre@0: jnz LbeginENC andre@0: ret andre@0: andre@0: LbeginENC: andre@0: andre@0: vzeroupper andre@0: push r11 andre@0: push r12 andre@0: push r13 andre@0: push rbp andre@0: sub rsp, 10*16 andre@0: vmovdqu XMMWORD PTR[rsp + 0*16], xmm6 andre@0: vmovdqu XMMWORD PTR[rsp + 1*16], xmm7 andre@0: vmovdqu XMMWORD PTR[rsp + 2*16], xmm8 andre@0: vmovdqu XMMWORD PTR[rsp + 3*16], xmm9 andre@0: vmovdqu XMMWORD PTR[rsp + 4*16], xmm10 andre@0: vmovdqu XMMWORD PTR[rsp + 5*16], xmm11 andre@0: vmovdqu XMMWORD PTR[rsp + 6*16], xmm12 andre@0: vmovdqu XMMWORD PTR[rsp + 7*16], xmm13 andre@0: vmovdqu XMMWORD PTR[rsp + 8*16], xmm14 andre@0: vmovdqu XMMWORD PTR[rsp + 9*16], xmm15 andre@0: andre@0: mov rbp, rsp andre@0: sub rsp, 16*16 andre@0: and rsp, -16 andre@0: andre@0: vmovdqu T, XMMWORD PTR[16*16 + 1*16 + Gctx] andre@0: vmovdqu CTR0, XMMWORD PTR[16*16 + 2*16 + Gctx] andre@0: vmovdqu BSWAPMASK, XMMWORD PTR[Lbswap_mask] andre@0: mov KS, [16*16 + 3*16 + Gctx] andre@0: mov NR, [4 + KS] andre@0: lea KS, [48 + KS] andre@0: andre@0: vpshufb CTR0, CTR0, BSWAPMASK andre@0: andre@0: mov aluCTR, [16*16 + 2*16 + 3*4 + Gctx] andre@0: mov aluKSl, [3*4 + KS] andre@0: bswap aluCTR andre@0: bswap aluKSl 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 + rsp], TMP0 andre@0: andre@0: cmp len, 128 andre@0: jb LEncDataSingles andre@0: ; Prepare the "top" counters andre@0: vmovdqu XMMWORD PTR[8*16 + 1*16 + rsp], TMP0 andre@0: vmovdqu XMMWORD PTR[8*16 + 2*16 + rsp], TMP0 andre@0: vmovdqu XMMWORD PTR[8*16 + 3*16 + rsp], TMP0 andre@0: vmovdqu XMMWORD PTR[8*16 + 4*16 + rsp], TMP0 andre@0: vmovdqu XMMWORD PTR[8*16 + 5*16 + rsp], TMP0 andre@0: vmovdqu XMMWORD PTR[8*16 + 6*16 + rsp], TMP0 andre@0: vmovdqu XMMWORD PTR[8*16 + 7*16 + rsp], TMP0 andre@0: andre@0: ; Encrypt the initial 8 blocks andre@0: sub len, 128 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: vpaddd CTR7, CTR6, XMMWORD PTR[Lone] andre@0: andre@0: vpshufb CTR0, CTR0, BSWAPMASK andre@0: vpshufb CTR1, CTR1, BSWAPMASK andre@0: vpshufb CTR2, CTR2, BSWAPMASK andre@0: vpshufb CTR3, CTR3, BSWAPMASK andre@0: vpshufb CTR4, CTR4, BSWAPMASK andre@0: vpshufb CTR5, CTR5, BSWAPMASK andre@0: vpshufb CTR6, CTR6, BSWAPMASK andre@0: vpshufb CTR7, CTR7, BSWAPMASK andre@0: andre@0: vmovdqu TMP3, XMMWORD PTR[0*16 + KS] andre@0: vpxor CTR0, CTR0, TMP3 andre@0: vpxor CTR1, CTR1, TMP3 andre@0: vpxor CTR2, CTR2, TMP3 andre@0: vpxor CTR3, CTR3, TMP3 andre@0: vpxor CTR4, CTR4, TMP3 andre@0: vpxor CTR5, CTR5, TMP3 andre@0: vpxor CTR6, CTR6, TMP3 andre@0: vpxor CTR7, CTR7, TMP3 andre@0: andre@0: ROUND 1 andre@0: andre@0: add aluCTR, 8 andre@0: mov aluTMP, aluCTR andre@0: xor aluTMP, aluKSl andre@0: bswap aluTMP andre@0: mov [8*16 + 0*16 + 3*4 + rsp], 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: NEXTCTR 7 andre@0: ROUND 9 andre@0: vmovdqu TMP5, 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 TMP5, 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 TMP5, XMMWORD PTR[14*16 + KS] andre@0: @@: andre@0: vpxor TMP3, TMP5, XMMWORD PTR[0*16 + PT] andre@0: vaesenclast CTR0, CTR0, TMP3 andre@0: vpxor TMP3, TMP5, XMMWORD PTR[1*16 + PT] andre@0: vaesenclast CTR1, CTR1, TMP3 andre@0: vpxor TMP3, TMP5, XMMWORD PTR[2*16 + PT] andre@0: vaesenclast CTR2, CTR2, TMP3 andre@0: vpxor TMP3, TMP5, XMMWORD PTR[3*16 + PT] andre@0: vaesenclast CTR3, CTR3, TMP3 andre@0: vpxor TMP3, TMP5, XMMWORD PTR[4*16 + PT] andre@0: vaesenclast CTR4, CTR4, TMP3 andre@0: vpxor TMP3, TMP5, XMMWORD PTR[5*16 + PT] andre@0: vaesenclast CTR5, CTR5, TMP3 andre@0: vpxor TMP3, TMP5, XMMWORD PTR[6*16 + PT] andre@0: vaesenclast CTR6, CTR6, TMP3 andre@0: vpxor TMP3, TMP5, XMMWORD PTR[7*16 + PT] andre@0: vaesenclast CTR7, CTR7, TMP3 andre@0: andre@0: vmovdqu XMMWORD PTR[0*16 + CT], CTR0 andre@0: vpshufb CTR0, CTR0, BSWAPMASK andre@0: vmovdqu XMMWORD PTR[1*16 + CT], CTR1 andre@0: vpshufb CTR1, CTR1, BSWAPMASK andre@0: vmovdqu XMMWORD PTR[2*16 + CT], CTR2 andre@0: vpshufb CTR2, CTR2, BSWAPMASK andre@0: vmovdqu XMMWORD PTR[3*16 + CT], CTR3 andre@0: vpshufb CTR3, CTR3, BSWAPMASK andre@0: vmovdqu XMMWORD PTR[4*16 + CT], CTR4 andre@0: vpshufb CTR4, CTR4, BSWAPMASK andre@0: vmovdqu XMMWORD PTR[5*16 + CT], CTR5 andre@0: vpshufb CTR5, CTR5, BSWAPMASK andre@0: vmovdqu XMMWORD PTR[6*16 + CT], CTR6 andre@0: vpshufb CTR6, CTR6, BSWAPMASK andre@0: vmovdqu XMMWORD PTR[7*16 + CT], CTR7 andre@0: vpshufb TMP5, CTR7, BSWAPMASK andre@0: andre@0: vmovdqa XMMWORD PTR[1*16 + rsp], CTR6 andre@0: vmovdqa XMMWORD PTR[2*16 + rsp], CTR5 andre@0: vmovdqa XMMWORD PTR[3*16 + rsp], CTR4 andre@0: vmovdqa XMMWORD PTR[4*16 + rsp], CTR3 andre@0: vmovdqa XMMWORD PTR[5*16 + rsp], CTR2 andre@0: vmovdqa XMMWORD PTR[6*16 + rsp], CTR1 andre@0: vmovdqa XMMWORD PTR[7*16 + rsp], CTR0 andre@0: andre@0: lea CT, [8*16 + CT] andre@0: lea PT, [8*16 + PT] andre@0: jmp LEncDataOctets andre@0: andre@0: LEncDataOctets: andre@0: cmp len, 128 andre@0: jb LEndEncOctets andre@0: sub len, 128 andre@0: andre@0: vmovdqa CTR0, XMMWORD PTR[8*16 + 0*16 + rsp] andre@0: vmovdqa CTR1, XMMWORD PTR[8*16 + 1*16 + rsp] andre@0: vmovdqa CTR2, XMMWORD PTR[8*16 + 2*16 + rsp] andre@0: vmovdqa CTR3, XMMWORD PTR[8*16 + 3*16 + rsp] andre@0: vmovdqa CTR4, XMMWORD PTR[8*16 + 4*16 + rsp] andre@0: vmovdqa CTR5, XMMWORD PTR[8*16 + 5*16 + rsp] andre@0: vmovdqa CTR6, XMMWORD PTR[8*16 + 6*16 + rsp] andre@0: vmovdqa CTR7, XMMWORD PTR[8*16 + 7*16 + rsp] 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 + rsp] andre@0: ROUNDMUL 1 andre@0: NEXTCTR 0 andre@0: vmovdqu TMP5, XMMWORD PTR[2*16 + rsp] andre@0: ROUNDMUL 2 andre@0: NEXTCTR 1 andre@0: vmovdqu TMP5, XMMWORD PTR[3*16 + rsp] andre@0: ROUNDMUL 3 andre@0: NEXTCTR 2 andre@0: vmovdqu TMP5, XMMWORD PTR[4*16 + rsp] andre@0: ROUNDMUL 4 andre@0: NEXTCTR 3 andre@0: vmovdqu TMP5, XMMWORD PTR[5*16 + rsp] andre@0: ROUNDMUL 5 andre@0: NEXTCTR 4 andre@0: vmovdqu TMP5, XMMWORD PTR[6*16 + rsp] andre@0: ROUNDMUL 6 andre@0: NEXTCTR 5 andre@0: vpxor TMP5, T, XMMWORD PTR[7*16 + rsp] andre@0: ROUNDMUL 7 andre@0: NEXTCTR 6 andre@0: andre@0: ROUND 8 andre@0: NEXTCTR 7 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 T, TMP2, TMP3 andre@0: andre@0: vpclmulqdq TMP1, T, XMMWORD PTR[Lpoly], 010h andre@0: vpalignr T,T,T,8 andre@0: vpxor T, T, TMP1 andre@0: andre@0: ROUND 9 andre@0: andre@0: vpclmulqdq TMP1, T, XMMWORD PTR[Lpoly], 010h andre@0: vpalignr T,T,T,8 andre@0: vpxor T, T, TMP1 andre@0: andre@0: vmovdqu TMP5, 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 TMP5, 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 TMP5, XMMWORD PTR[14*16 + KS] andre@0: @@: andre@0: vpxor TMP3, TMP5, XMMWORD PTR[0*16 + PT] andre@0: vaesenclast CTR0, CTR0, TMP3 andre@0: vpxor TMP3, TMP5, XMMWORD PTR[1*16 + PT] andre@0: vaesenclast CTR1, CTR1, TMP3 andre@0: vpxor TMP3, TMP5, XMMWORD PTR[2*16 + PT] andre@0: vaesenclast CTR2, CTR2, TMP3 andre@0: vpxor TMP3, TMP5, XMMWORD PTR[3*16 + PT] andre@0: vaesenclast CTR3, CTR3, TMP3 andre@0: vpxor TMP3, TMP5, XMMWORD PTR[4*16 + PT] andre@0: vaesenclast CTR4, CTR4, TMP3 andre@0: vpxor TMP3, TMP5, XMMWORD PTR[5*16 + PT] andre@0: vaesenclast CTR5, CTR5, TMP3 andre@0: vpxor TMP3, TMP5, XMMWORD PTR[6*16 + PT] andre@0: vaesenclast CTR6, CTR6, TMP3 andre@0: vpxor TMP3, TMP5, XMMWORD PTR[7*16 + PT] andre@0: vaesenclast CTR7, CTR7, TMP3 andre@0: andre@0: vmovdqu XMMWORD PTR[0*16 + CT], CTR0 andre@0: vpshufb CTR0, CTR0, BSWAPMASK andre@0: vmovdqu XMMWORD PTR[1*16 + CT], CTR1 andre@0: vpshufb CTR1, CTR1, BSWAPMASK andre@0: vmovdqu XMMWORD PTR[2*16 + CT], CTR2 andre@0: vpshufb CTR2, CTR2, BSWAPMASK andre@0: vmovdqu XMMWORD PTR[3*16 + CT], CTR3 andre@0: vpshufb CTR3, CTR3, BSWAPMASK andre@0: vmovdqu XMMWORD PTR[4*16 + CT], CTR4 andre@0: vpshufb CTR4, CTR4, BSWAPMASK andre@0: vmovdqu XMMWORD PTR[5*16 + CT], CTR5 andre@0: vpshufb CTR5, CTR5, BSWAPMASK andre@0: vmovdqu XMMWORD PTR[6*16 + CT], CTR6 andre@0: vpshufb CTR6, CTR6, BSWAPMASK andre@0: vmovdqu XMMWORD PTR[7*16 + CT], CTR7 andre@0: vpshufb TMP5, CTR7, BSWAPMASK andre@0: andre@0: vmovdqa XMMWORD PTR[1*16 + rsp], CTR6 andre@0: vmovdqa XMMWORD PTR[2*16 + rsp], CTR5 andre@0: vmovdqa XMMWORD PTR[3*16 + rsp], CTR4 andre@0: vmovdqa XMMWORD PTR[4*16 + rsp], CTR3 andre@0: vmovdqa XMMWORD PTR[5*16 + rsp], CTR2 andre@0: vmovdqa XMMWORD PTR[6*16 + rsp], CTR1 andre@0: vmovdqa XMMWORD PTR[7*16 + rsp], CTR0 andre@0: andre@0: vpxor T, T, TMP4 andre@0: andre@0: lea CT, [8*16 + CT] andre@0: lea PT, [8*16 + PT] andre@0: jmp LEncDataOctets andre@0: andre@0: LEndEncOctets: 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 + rsp] andre@0: KARATSUBA 1 andre@0: vmovdqu TMP5, XMMWORD PTR[2*16 + rsp] andre@0: KARATSUBA 2 andre@0: vmovdqu TMP5, XMMWORD PTR[3*16 + rsp] andre@0: KARATSUBA 3 andre@0: vmovdqu TMP5, XMMWORD PTR[4*16 + rsp] andre@0: KARATSUBA 4 andre@0: vmovdqu TMP5, XMMWORD PTR[5*16 + rsp] andre@0: KARATSUBA 5 andre@0: vmovdqu TMP5, XMMWORD PTR[6*16 + rsp] andre@0: KARATSUBA 6 andre@0: vpxor TMP5, T, XMMWORD PTR[7*16 + rsp] andre@0: KARATSUBA 7 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 T, TMP2, TMP3 andre@0: andre@0: vpclmulqdq TMP1, T, XMMWORD PTR[Lpoly], 010h andre@0: vpalignr T,T,T,8 andre@0: vpxor T, T, TMP1 andre@0: andre@0: vpclmulqdq TMP1, T, XMMWORD PTR[Lpoly], 010h andre@0: vpalignr T,T,T,8 andre@0: vpxor T, T, TMP1 andre@0: andre@0: vpxor T, T, TMP4 andre@0: andre@0: sub aluCTR, 7 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 + rsp] 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, BSWAPMASK andre@0: vpxor T, T, TMP1 andre@0: vmovdqu TMP0, XMMWORD PTR[Htbl] andre@0: GFMUL T, T, TMP0, TMP1, TMP2, TMP3, TMP4 andre@0: andre@0: jmp LEncDataSingles andre@0: andre@0: LEncDataTail: andre@0: andre@0: test len, len andre@0: jz LEncDataEnd andre@0: andre@0: vmovdqa TMP1, XMMWORD PTR[8*16 + 0*16 + rsp] 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[rsp], TMP2 andre@0: ; copy as many bytes as needed andre@0: xor KS, KS andre@0: andre@0: @@: andre@0: cmp len, KS andre@0: je @f andre@0: mov al, [PT + KS] andre@0: mov [rsp + KS], al andre@0: inc KS andre@0: jmp @b andre@0: @@: andre@0: vpxor TMP1, TMP1, XMMWORD PTR[rsp] andre@0: vmovdqa XMMWORD PTR[rsp], TMP1 andre@0: xor KS, KS andre@0: @@: andre@0: cmp len, KS andre@0: je @f andre@0: mov al, [rsp + KS] andre@0: mov [CT + KS], al andre@0: inc KS andre@0: jmp @b andre@0: @@: andre@0: cmp KS, 16 andre@0: je @f andre@0: mov BYTE PTR[rsp + KS], 0 andre@0: inc KS andre@0: jmp @b andre@0: @@: andre@0: BAIL: andre@0: vmovdqa TMP1, XMMWORD PTR[rsp] andre@0: vpshufb TMP1, TMP1, BSWAPMASK andre@0: vpxor T, T, TMP1 andre@0: vmovdqu TMP0, XMMWORD PTR[Htbl] andre@0: GFMUL T, T, TMP0, TMP1, TMP2, TMP3, TMP4 andre@0: andre@0: LEncDataEnd: andre@0: andre@0: vmovdqu XMMWORD PTR[16*16 + 1*16 + Gctx], T andre@0: bswap aluCTR andre@0: mov [16*16 + 2*16 + 3*4 + Gctx], aluCTR andre@0: andre@0: mov rsp, rbp andre@0: andre@0: vmovdqu xmm6, XMMWORD PTR[rsp + 0*16] andre@0: vmovdqu xmm7, XMMWORD PTR[rsp + 1*16] andre@0: vmovdqu xmm8, XMMWORD PTR[rsp + 2*16] andre@0: vmovdqu xmm9, XMMWORD PTR[rsp + 3*16] andre@0: vmovdqu xmm10, XMMWORD PTR[rsp + 4*16] andre@0: vmovdqu xmm11, XMMWORD PTR[rsp + 5*16] andre@0: vmovdqu xmm12, XMMWORD PTR[rsp + 6*16] andre@0: vmovdqu xmm13, XMMWORD PTR[rsp + 7*16] andre@0: vmovdqu xmm14, XMMWORD PTR[rsp + 8*16] andre@0: vmovdqu xmm15, XMMWORD PTR[rsp + 9*16] andre@0: andre@0: add rsp, 10*16 andre@0: pop rbp andre@0: pop r13 andre@0: pop r12 andre@0: pop r11 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: ALIGN 16 andre@0: intel_aes_gcmDEC PROC andre@0: andre@0: NEXTCTR MACRO i andre@0: add aluCTR, 1 andre@0: mov aluTMP, aluCTR andre@0: xor aluTMP, aluKSl andre@0: bswap aluTMP andre@0: mov [3*4 + i*16 + rsp], aluTMP andre@0: ENDM andre@0: andre@0: PT textequ andre@0: CT textequ andre@0: andre@0: test len, len andre@0: jnz LbeginDEC andre@0: ret andre@0: andre@0: LbeginDEC: andre@0: andre@0: vzeroupper andre@0: push r11 andre@0: push r12 andre@0: push r13 andre@0: push rbp andre@0: sub rsp, 10*16 andre@0: vmovdqu XMMWORD PTR[rsp + 0*16], xmm6 andre@0: vmovdqu XMMWORD PTR[rsp + 1*16], xmm7 andre@0: vmovdqu XMMWORD PTR[rsp + 2*16], xmm8 andre@0: vmovdqu XMMWORD PTR[rsp + 3*16], xmm9 andre@0: vmovdqu XMMWORD PTR[rsp + 4*16], xmm10 andre@0: vmovdqu XMMWORD PTR[rsp + 5*16], xmm11 andre@0: vmovdqu XMMWORD PTR[rsp + 6*16], xmm12 andre@0: vmovdqu XMMWORD PTR[rsp + 7*16], xmm13 andre@0: vmovdqu XMMWORD PTR[rsp + 8*16], xmm14 andre@0: vmovdqu XMMWORD PTR[rsp + 9*16], xmm15 andre@0: andre@0: mov rbp, rsp andre@0: sub rsp, 8*16 andre@0: and rsp, -16 andre@0: andre@0: vmovdqu T, XMMWORD PTR[16*16 + 1*16 + Gctx] andre@0: vmovdqu CTR0, XMMWORD PTR[16*16 + 2*16 + Gctx] andre@0: vmovdqu BSWAPMASK, XMMWORD PTR[Lbswap_mask] andre@0: mov KS, [16*16 + 3*16 + Gctx] andre@0: mov NR, [4 + KS] andre@0: lea KS, [48 + KS] andre@0: andre@0: vpshufb CTR0, CTR0, BSWAPMASK andre@0: andre@0: mov aluCTR, [16*16 + 2*16 + 3*4 + Gctx] andre@0: mov aluKSl, [3*4 + KS] andre@0: bswap aluCTR andre@0: bswap aluKSl 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 + rsp], TMP0 andre@0: andre@0: cmp len, 128 andre@0: jb LDecDataSingles andre@0: ; Prepare the "top" counters andre@0: vmovdqu XMMWORD PTR[1*16 + rsp], TMP0 andre@0: vmovdqu XMMWORD PTR[2*16 + rsp], TMP0 andre@0: vmovdqu XMMWORD PTR[3*16 + rsp], TMP0 andre@0: vmovdqu XMMWORD PTR[4*16 + rsp], TMP0 andre@0: vmovdqu XMMWORD PTR[5*16 + rsp], TMP0 andre@0: vmovdqu XMMWORD PTR[6*16 + rsp], TMP0 andre@0: vmovdqu XMMWORD PTR[7*16 + rsp], TMP0 andre@0: andre@0: NEXTCTR 1 andre@0: NEXTCTR 2 andre@0: NEXTCTR 3 andre@0: NEXTCTR 4 andre@0: NEXTCTR 5 andre@0: NEXTCTR 6 andre@0: NEXTCTR 7 andre@0: andre@0: LDecDataOctets: andre@0: cmp len, 128 andre@0: jb LEndDecOctets andre@0: sub len, 128 andre@0: andre@0: vmovdqa CTR0, XMMWORD PTR[0*16 + rsp] andre@0: vmovdqa CTR1, XMMWORD PTR[1*16 + rsp] andre@0: vmovdqa CTR2, XMMWORD PTR[2*16 + rsp] andre@0: vmovdqa CTR3, XMMWORD PTR[3*16 + rsp] andre@0: vmovdqa CTR4, XMMWORD PTR[4*16 + rsp] andre@0: vmovdqa CTR5, XMMWORD PTR[5*16 + rsp] andre@0: vmovdqa CTR6, XMMWORD PTR[6*16 + rsp] andre@0: vmovdqa CTR7, XMMWORD PTR[7*16 + rsp] andre@0: andre@0: vmovdqu TMP5, XMMWORD PTR[7*16 + CT] andre@0: vpshufb TMP5, TMP5, BSWAPMASK 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[6*16 + CT] andre@0: vpshufb TMP5, TMP5, BSWAPMASK andre@0: ROUNDMUL 1 andre@0: NEXTCTR 0 andre@0: vmovdqu TMP5, XMMWORD PTR[5*16 + CT] andre@0: vpshufb TMP5, TMP5, BSWAPMASK andre@0: ROUNDMUL 2 andre@0: NEXTCTR 1 andre@0: vmovdqu TMP5, XMMWORD PTR[4*16 + CT] andre@0: vpshufb TMP5, TMP5, BSWAPMASK andre@0: ROUNDMUL 3 andre@0: NEXTCTR 2 andre@0: vmovdqu TMP5, XMMWORD PTR[3*16 + CT] andre@0: vpshufb TMP5, TMP5, BSWAPMASK andre@0: ROUNDMUL 4 andre@0: NEXTCTR 3 andre@0: vmovdqu TMP5, XMMWORD PTR[2*16 + CT] andre@0: vpshufb TMP5, TMP5, BSWAPMASK andre@0: ROUNDMUL 5 andre@0: NEXTCTR 4 andre@0: vmovdqu TMP5, XMMWORD PTR[1*16 + CT] andre@0: vpshufb TMP5, TMP5, BSWAPMASK andre@0: ROUNDMUL 6 andre@0: NEXTCTR 5 andre@0: vmovdqu TMP5, XMMWORD PTR[0*16 + CT] andre@0: vpshufb TMP5, TMP5, BSWAPMASK andre@0: vpxor TMP5, TMP5, T andre@0: ROUNDMUL 7 andre@0: NEXTCTR 6 andre@0: andre@0: ROUND 8 andre@0: NEXTCTR 7 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 T, TMP2, TMP3 andre@0: andre@0: vpclmulqdq TMP1, T, XMMWORD PTR[Lpoly], 010h andre@0: vpalignr T,T,T,8 andre@0: vpxor T, T, TMP1 andre@0: andre@0: ROUND 9 andre@0: andre@0: vpclmulqdq TMP1, T, XMMWORD PTR[Lpoly], 010h andre@0: vpalignr T,T,T,8 andre@0: vpxor T, T, TMP1 andre@0: andre@0: vmovdqu TMP5, 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 TMP5, 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 TMP5, XMMWORD PTR[14*16 + KS] andre@0: @@: andre@0: vpxor TMP3, TMP5, XMMWORD PTR[0*16 + CT] andre@0: vaesenclast CTR0, CTR0, TMP3 andre@0: vpxor TMP3, TMP5, XMMWORD PTR[1*16 + CT] andre@0: vaesenclast CTR1, CTR1, TMP3 andre@0: vpxor TMP3, TMP5, XMMWORD PTR[2*16 + CT] andre@0: vaesenclast CTR2, CTR2, TMP3 andre@0: vpxor TMP3, TMP5, XMMWORD PTR[3*16 + CT] andre@0: vaesenclast CTR3, CTR3, TMP3 andre@0: vpxor TMP3, TMP5, XMMWORD PTR[4*16 + CT] andre@0: vaesenclast CTR4, CTR4, TMP3 andre@0: vpxor TMP3, TMP5, XMMWORD PTR[5*16 + CT] andre@0: vaesenclast CTR5, CTR5, TMP3 andre@0: vpxor TMP3, TMP5, XMMWORD PTR[6*16 + CT] andre@0: vaesenclast CTR6, CTR6, TMP3 andre@0: vpxor TMP3, TMP5, XMMWORD PTR[7*16 + CT] andre@0: vaesenclast CTR7, CTR7, TMP3 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: vmovdqu XMMWORD PTR[7*16 + PT], CTR7 andre@0: andre@0: vpxor T, T, TMP4 andre@0: andre@0: lea CT, [8*16 + CT] andre@0: lea PT, [8*16 + PT] andre@0: jmp LDecDataOctets andre@0: andre@0: LEndDecOctets: andre@0: andre@0: sub aluCTR, 7 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: vmovdqa TMP1, XMMWORD PTR[0*16 + rsp] 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: andre@0: vmovdqu TMP2, XMMWORD PTR[CT] andre@0: vpxor TMP1, TMP1, TMP2 andre@0: vmovdqu XMMWORD PTR[PT], TMP1 andre@0: andre@0: lea PT, [16+PT] andre@0: lea CT, [16+CT] andre@0: andre@0: vpshufb TMP2, TMP2, BSWAPMASK andre@0: vpxor T, T, TMP2 andre@0: vmovdqu TMP0, XMMWORD PTR[Htbl] andre@0: GFMUL T, T, TMP0, TMP1, TMP2, TMP3, TMP4 andre@0: andre@0: jmp LDecDataSingles andre@0: andre@0: LDecDataTail: andre@0: andre@0: test len, len andre@0: jz LDecDataEnd andre@0: andre@0: vmovdqa TMP1, XMMWORD PTR[0*16 + rsp] 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 TMP1, TMP1, TMP2 andre@0: ; copy as many bytes as needed andre@0: xor KS, KS andre@0: @@: andre@0: cmp len, KS andre@0: je @f andre@0: mov al, [CT + KS] andre@0: mov [rsp + KS], al andre@0: inc KS andre@0: jmp @b andre@0: @@: andre@0: cmp KS, 16 andre@0: je @f andre@0: mov BYTE PTR[rsp + KS], 0 andre@0: inc KS andre@0: jmp @b andre@0: @@: andre@0: vmovdqa TMP2, XMMWORD PTR[rsp] andre@0: vpshufb TMP2, TMP2, BSWAPMASK andre@0: vpxor T, T, TMP2 andre@0: vmovdqu TMP0, XMMWORD PTR[Htbl] andre@0: GFMUL T, T, TMP0, TMP5, TMP2, TMP3, TMP4 andre@0: andre@0: andre@0: vpxor TMP1, TMP1, XMMWORD PTR[rsp] andre@0: vmovdqa XMMWORD PTR[rsp], TMP1 andre@0: xor KS, KS andre@0: @@: andre@0: cmp len, KS andre@0: je @f andre@0: mov al, [rsp + KS] andre@0: mov [PT + KS], al andre@0: inc KS andre@0: jmp @b andre@0: @@: andre@0: andre@0: LDecDataEnd: andre@0: andre@0: vmovdqu XMMWORD PTR[16*16 + 1*16 + Gctx], T andre@0: bswap aluCTR andre@0: mov [16*16 + 2*16 + 3*4 + Gctx], aluCTR andre@0: andre@0: mov rsp, rbp andre@0: andre@0: vmovdqu xmm6, XMMWORD PTR[rsp + 0*16] andre@0: vmovdqu xmm7, XMMWORD PTR[rsp + 1*16] andre@0: vmovdqu xmm8, XMMWORD PTR[rsp + 2*16] andre@0: vmovdqu xmm9, XMMWORD PTR[rsp + 3*16] andre@0: vmovdqu xmm10, XMMWORD PTR[rsp + 4*16] andre@0: vmovdqu xmm11, XMMWORD PTR[rsp + 5*16] andre@0: vmovdqu xmm12, XMMWORD PTR[rsp + 6*16] andre@0: vmovdqu xmm13, XMMWORD PTR[rsp + 7*16] andre@0: vmovdqu xmm14, XMMWORD PTR[rsp + 8*16] andre@0: vmovdqu xmm15, XMMWORD PTR[rsp + 9*16] andre@0: andre@0: add rsp, 10*16 andre@0: pop rbp andre@0: pop r13 andre@0: pop r12 andre@0: pop r11 andre@0: andre@0: vzeroupper andre@0: andre@0: ret andre@0: ret andre@0: intel_aes_gcmDEC ENDP andre@0: andre@0: andre@0: END