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