mirror of
https://github.com/pineappleEA/pineapple-src.git
synced 2024-11-26 10:18:24 -05:00
3100 lines
62 KiB
ArmAsm
Executable File
3100 lines
62 KiB
ArmAsm
Executable File
; 1 "crypto/aes/aesni-masm-x86_64.S.tmp"
|
|
; 1 "<built-in>" 1
|
|
; 1 "<built-in>" 3
|
|
; 340 "<built-in>" 3
|
|
; 1 "<command line>" 1
|
|
; 1 "<built-in>" 2
|
|
; 1 "crypto/aes/aesni-masm-x86_64.S.tmp" 2
|
|
OPTION DOTNAME
|
|
|
|
; 1 "./crypto/x86_arch.h" 1
|
|
|
|
|
|
; 16 "./crypto/x86_arch.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
; 40 "./crypto/x86_arch.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
; 3 "crypto/aes/aesni-masm-x86_64.S.tmp" 2
|
|
.text$ SEGMENT ALIGN(64) 'CODE'
|
|
PUBLIC aesni_encrypt
|
|
|
|
ALIGN 16
|
|
aesni_encrypt PROC PUBLIC
|
|
movups xmm2,XMMWORD PTR[rcx]
|
|
mov eax,DWORD PTR[240+r8]
|
|
movups xmm0,XMMWORD PTR[r8]
|
|
movups xmm1,XMMWORD PTR[16+r8]
|
|
lea r8,QWORD PTR[32+r8]
|
|
xorps xmm2,xmm0
|
|
$L$oop_enc1_1::
|
|
aesenc xmm2,xmm1
|
|
dec eax
|
|
movups xmm1,XMMWORD PTR[r8]
|
|
lea r8,QWORD PTR[16+r8]
|
|
jnz $L$oop_enc1_1
|
|
aesenclast xmm2,xmm1
|
|
movups XMMWORD PTR[rdx],xmm2
|
|
DB 0F3h,0C3h ;repret
|
|
aesni_encrypt ENDP
|
|
|
|
PUBLIC aesni_decrypt
|
|
|
|
ALIGN 16
|
|
aesni_decrypt PROC PUBLIC
|
|
movups xmm2,XMMWORD PTR[rcx]
|
|
mov eax,DWORD PTR[240+r8]
|
|
movups xmm0,XMMWORD PTR[r8]
|
|
movups xmm1,XMMWORD PTR[16+r8]
|
|
lea r8,QWORD PTR[32+r8]
|
|
xorps xmm2,xmm0
|
|
$L$oop_dec1_2::
|
|
aesdec xmm2,xmm1
|
|
dec eax
|
|
movups xmm1,XMMWORD PTR[r8]
|
|
lea r8,QWORD PTR[16+r8]
|
|
jnz $L$oop_dec1_2
|
|
aesdeclast xmm2,xmm1
|
|
movups XMMWORD PTR[rdx],xmm2
|
|
DB 0F3h,0C3h ;repret
|
|
aesni_decrypt ENDP
|
|
|
|
ALIGN 16
|
|
_aesni_encrypt3 PROC PRIVATE
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
shr eax,1
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
xorps xmm2,xmm0
|
|
xorps xmm3,xmm0
|
|
xorps xmm4,xmm0
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
|
|
$L$enc_loop3::
|
|
aesenc xmm2,xmm1
|
|
aesenc xmm3,xmm1
|
|
dec eax
|
|
aesenc xmm4,xmm1
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
aesenc xmm2,xmm0
|
|
aesenc xmm3,xmm0
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
aesenc xmm4,xmm0
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
jnz $L$enc_loop3
|
|
|
|
aesenc xmm2,xmm1
|
|
aesenc xmm3,xmm1
|
|
aesenc xmm4,xmm1
|
|
aesenclast xmm2,xmm0
|
|
aesenclast xmm3,xmm0
|
|
aesenclast xmm4,xmm0
|
|
DB 0F3h,0C3h ;repret
|
|
_aesni_encrypt3 ENDP
|
|
|
|
ALIGN 16
|
|
_aesni_decrypt3 PROC PRIVATE
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
shr eax,1
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
xorps xmm2,xmm0
|
|
xorps xmm3,xmm0
|
|
xorps xmm4,xmm0
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
|
|
$L$dec_loop3::
|
|
aesdec xmm2,xmm1
|
|
aesdec xmm3,xmm1
|
|
dec eax
|
|
aesdec xmm4,xmm1
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
aesdec xmm2,xmm0
|
|
aesdec xmm3,xmm0
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
aesdec xmm4,xmm0
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
jnz $L$dec_loop3
|
|
|
|
aesdec xmm2,xmm1
|
|
aesdec xmm3,xmm1
|
|
aesdec xmm4,xmm1
|
|
aesdeclast xmm2,xmm0
|
|
aesdeclast xmm3,xmm0
|
|
aesdeclast xmm4,xmm0
|
|
DB 0F3h,0C3h ;repret
|
|
_aesni_decrypt3 ENDP
|
|
|
|
ALIGN 16
|
|
_aesni_encrypt4 PROC PRIVATE
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
shr eax,1
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
xorps xmm2,xmm0
|
|
xorps xmm3,xmm0
|
|
xorps xmm4,xmm0
|
|
xorps xmm5,xmm0
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
|
|
$L$enc_loop4::
|
|
aesenc xmm2,xmm1
|
|
aesenc xmm3,xmm1
|
|
dec eax
|
|
aesenc xmm4,xmm1
|
|
aesenc xmm5,xmm1
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
aesenc xmm2,xmm0
|
|
aesenc xmm3,xmm0
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
aesenc xmm4,xmm0
|
|
aesenc xmm5,xmm0
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
jnz $L$enc_loop4
|
|
|
|
aesenc xmm2,xmm1
|
|
aesenc xmm3,xmm1
|
|
aesenc xmm4,xmm1
|
|
aesenc xmm5,xmm1
|
|
aesenclast xmm2,xmm0
|
|
aesenclast xmm3,xmm0
|
|
aesenclast xmm4,xmm0
|
|
aesenclast xmm5,xmm0
|
|
DB 0F3h,0C3h ;repret
|
|
_aesni_encrypt4 ENDP
|
|
|
|
ALIGN 16
|
|
_aesni_decrypt4 PROC PRIVATE
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
shr eax,1
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
xorps xmm2,xmm0
|
|
xorps xmm3,xmm0
|
|
xorps xmm4,xmm0
|
|
xorps xmm5,xmm0
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
|
|
$L$dec_loop4::
|
|
aesdec xmm2,xmm1
|
|
aesdec xmm3,xmm1
|
|
dec eax
|
|
aesdec xmm4,xmm1
|
|
aesdec xmm5,xmm1
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
aesdec xmm2,xmm0
|
|
aesdec xmm3,xmm0
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
aesdec xmm4,xmm0
|
|
aesdec xmm5,xmm0
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
jnz $L$dec_loop4
|
|
|
|
aesdec xmm2,xmm1
|
|
aesdec xmm3,xmm1
|
|
aesdec xmm4,xmm1
|
|
aesdec xmm5,xmm1
|
|
aesdeclast xmm2,xmm0
|
|
aesdeclast xmm3,xmm0
|
|
aesdeclast xmm4,xmm0
|
|
aesdeclast xmm5,xmm0
|
|
DB 0F3h,0C3h ;repret
|
|
_aesni_decrypt4 ENDP
|
|
|
|
ALIGN 16
|
|
_aesni_encrypt6 PROC PRIVATE
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
shr eax,1
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
xorps xmm2,xmm0
|
|
pxor xmm3,xmm0
|
|
aesenc xmm2,xmm1
|
|
pxor xmm4,xmm0
|
|
aesenc xmm3,xmm1
|
|
pxor xmm5,xmm0
|
|
aesenc xmm4,xmm1
|
|
pxor xmm6,xmm0
|
|
aesenc xmm5,xmm1
|
|
pxor xmm7,xmm0
|
|
dec eax
|
|
aesenc xmm6,xmm1
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
aesenc xmm7,xmm1
|
|
jmp $L$enc_loop6_enter
|
|
ALIGN 16
|
|
$L$enc_loop6::
|
|
aesenc xmm2,xmm1
|
|
aesenc xmm3,xmm1
|
|
dec eax
|
|
aesenc xmm4,xmm1
|
|
aesenc xmm5,xmm1
|
|
aesenc xmm6,xmm1
|
|
aesenc xmm7,xmm1
|
|
$L$enc_loop6_enter::
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
aesenc xmm2,xmm0
|
|
aesenc xmm3,xmm0
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
aesenc xmm4,xmm0
|
|
aesenc xmm5,xmm0
|
|
aesenc xmm6,xmm0
|
|
aesenc xmm7,xmm0
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
jnz $L$enc_loop6
|
|
|
|
aesenc xmm2,xmm1
|
|
aesenc xmm3,xmm1
|
|
aesenc xmm4,xmm1
|
|
aesenc xmm5,xmm1
|
|
aesenc xmm6,xmm1
|
|
aesenc xmm7,xmm1
|
|
aesenclast xmm2,xmm0
|
|
aesenclast xmm3,xmm0
|
|
aesenclast xmm4,xmm0
|
|
aesenclast xmm5,xmm0
|
|
aesenclast xmm6,xmm0
|
|
aesenclast xmm7,xmm0
|
|
DB 0F3h,0C3h ;repret
|
|
_aesni_encrypt6 ENDP
|
|
|
|
ALIGN 16
|
|
_aesni_decrypt6 PROC PRIVATE
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
shr eax,1
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
xorps xmm2,xmm0
|
|
pxor xmm3,xmm0
|
|
aesdec xmm2,xmm1
|
|
pxor xmm4,xmm0
|
|
aesdec xmm3,xmm1
|
|
pxor xmm5,xmm0
|
|
aesdec xmm4,xmm1
|
|
pxor xmm6,xmm0
|
|
aesdec xmm5,xmm1
|
|
pxor xmm7,xmm0
|
|
dec eax
|
|
aesdec xmm6,xmm1
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
aesdec xmm7,xmm1
|
|
jmp $L$dec_loop6_enter
|
|
ALIGN 16
|
|
$L$dec_loop6::
|
|
aesdec xmm2,xmm1
|
|
aesdec xmm3,xmm1
|
|
dec eax
|
|
aesdec xmm4,xmm1
|
|
aesdec xmm5,xmm1
|
|
aesdec xmm6,xmm1
|
|
aesdec xmm7,xmm1
|
|
$L$dec_loop6_enter::
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
aesdec xmm2,xmm0
|
|
aesdec xmm3,xmm0
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
aesdec xmm4,xmm0
|
|
aesdec xmm5,xmm0
|
|
aesdec xmm6,xmm0
|
|
aesdec xmm7,xmm0
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
jnz $L$dec_loop6
|
|
|
|
aesdec xmm2,xmm1
|
|
aesdec xmm3,xmm1
|
|
aesdec xmm4,xmm1
|
|
aesdec xmm5,xmm1
|
|
aesdec xmm6,xmm1
|
|
aesdec xmm7,xmm1
|
|
aesdeclast xmm2,xmm0
|
|
aesdeclast xmm3,xmm0
|
|
aesdeclast xmm4,xmm0
|
|
aesdeclast xmm5,xmm0
|
|
aesdeclast xmm6,xmm0
|
|
aesdeclast xmm7,xmm0
|
|
DB 0F3h,0C3h ;repret
|
|
_aesni_decrypt6 ENDP
|
|
|
|
ALIGN 16
|
|
_aesni_encrypt8 PROC PRIVATE
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
shr eax,1
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
xorps xmm2,xmm0
|
|
xorps xmm3,xmm0
|
|
aesenc xmm2,xmm1
|
|
pxor xmm4,xmm0
|
|
aesenc xmm3,xmm1
|
|
pxor xmm5,xmm0
|
|
aesenc xmm4,xmm1
|
|
pxor xmm6,xmm0
|
|
aesenc xmm5,xmm1
|
|
pxor xmm7,xmm0
|
|
dec eax
|
|
aesenc xmm6,xmm1
|
|
pxor xmm8,xmm0
|
|
aesenc xmm7,xmm1
|
|
pxor xmm9,xmm0
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
aesenc xmm8,xmm1
|
|
aesenc xmm9,xmm1
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
jmp $L$enc_loop8_enter
|
|
ALIGN 16
|
|
$L$enc_loop8::
|
|
aesenc xmm2,xmm1
|
|
aesenc xmm3,xmm1
|
|
dec eax
|
|
aesenc xmm4,xmm1
|
|
aesenc xmm5,xmm1
|
|
aesenc xmm6,xmm1
|
|
aesenc xmm7,xmm1
|
|
aesenc xmm8,xmm1
|
|
aesenc xmm9,xmm1
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
$L$enc_loop8_enter::
|
|
aesenc xmm2,xmm0
|
|
aesenc xmm3,xmm0
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
aesenc xmm4,xmm0
|
|
aesenc xmm5,xmm0
|
|
aesenc xmm6,xmm0
|
|
aesenc xmm7,xmm0
|
|
aesenc xmm8,xmm0
|
|
aesenc xmm9,xmm0
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
jnz $L$enc_loop8
|
|
|
|
aesenc xmm2,xmm1
|
|
aesenc xmm3,xmm1
|
|
aesenc xmm4,xmm1
|
|
aesenc xmm5,xmm1
|
|
aesenc xmm6,xmm1
|
|
aesenc xmm7,xmm1
|
|
aesenc xmm8,xmm1
|
|
aesenc xmm9,xmm1
|
|
aesenclast xmm2,xmm0
|
|
aesenclast xmm3,xmm0
|
|
aesenclast xmm4,xmm0
|
|
aesenclast xmm5,xmm0
|
|
aesenclast xmm6,xmm0
|
|
aesenclast xmm7,xmm0
|
|
aesenclast xmm8,xmm0
|
|
aesenclast xmm9,xmm0
|
|
DB 0F3h,0C3h ;repret
|
|
_aesni_encrypt8 ENDP
|
|
|
|
ALIGN 16
|
|
_aesni_decrypt8 PROC PRIVATE
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
shr eax,1
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
xorps xmm2,xmm0
|
|
xorps xmm3,xmm0
|
|
aesdec xmm2,xmm1
|
|
pxor xmm4,xmm0
|
|
aesdec xmm3,xmm1
|
|
pxor xmm5,xmm0
|
|
aesdec xmm4,xmm1
|
|
pxor xmm6,xmm0
|
|
aesdec xmm5,xmm1
|
|
pxor xmm7,xmm0
|
|
dec eax
|
|
aesdec xmm6,xmm1
|
|
pxor xmm8,xmm0
|
|
aesdec xmm7,xmm1
|
|
pxor xmm9,xmm0
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
aesdec xmm8,xmm1
|
|
aesdec xmm9,xmm1
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
jmp $L$dec_loop8_enter
|
|
ALIGN 16
|
|
$L$dec_loop8::
|
|
aesdec xmm2,xmm1
|
|
aesdec xmm3,xmm1
|
|
dec eax
|
|
aesdec xmm4,xmm1
|
|
aesdec xmm5,xmm1
|
|
aesdec xmm6,xmm1
|
|
aesdec xmm7,xmm1
|
|
aesdec xmm8,xmm1
|
|
aesdec xmm9,xmm1
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
$L$dec_loop8_enter::
|
|
aesdec xmm2,xmm0
|
|
aesdec xmm3,xmm0
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
aesdec xmm4,xmm0
|
|
aesdec xmm5,xmm0
|
|
aesdec xmm6,xmm0
|
|
aesdec xmm7,xmm0
|
|
aesdec xmm8,xmm0
|
|
aesdec xmm9,xmm0
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
jnz $L$dec_loop8
|
|
|
|
aesdec xmm2,xmm1
|
|
aesdec xmm3,xmm1
|
|
aesdec xmm4,xmm1
|
|
aesdec xmm5,xmm1
|
|
aesdec xmm6,xmm1
|
|
aesdec xmm7,xmm1
|
|
aesdec xmm8,xmm1
|
|
aesdec xmm9,xmm1
|
|
aesdeclast xmm2,xmm0
|
|
aesdeclast xmm3,xmm0
|
|
aesdeclast xmm4,xmm0
|
|
aesdeclast xmm5,xmm0
|
|
aesdeclast xmm6,xmm0
|
|
aesdeclast xmm7,xmm0
|
|
aesdeclast xmm8,xmm0
|
|
aesdeclast xmm9,xmm0
|
|
DB 0F3h,0C3h ;repret
|
|
_aesni_decrypt8 ENDP
|
|
PUBLIC aesni_ecb_encrypt
|
|
|
|
ALIGN 16
|
|
aesni_ecb_encrypt PROC PUBLIC
|
|
mov QWORD PTR[8+rsp],rdi ;WIN64 prologue
|
|
mov QWORD PTR[16+rsp],rsi
|
|
mov rax,rsp
|
|
$L$SEH_begin_aesni_ecb_encrypt::
|
|
mov rdi,rcx
|
|
mov rsi,rdx
|
|
mov rdx,r8
|
|
mov rcx,r9
|
|
mov r8,QWORD PTR[40+rsp]
|
|
|
|
|
|
and rdx,-16
|
|
jz $L$ecb_ret
|
|
|
|
mov eax,DWORD PTR[240+rcx]
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
mov r11,rcx
|
|
mov r10d,eax
|
|
test r8d,r8d
|
|
jz $L$ecb_decrypt
|
|
|
|
cmp rdx,080h
|
|
jb $L$ecb_enc_tail
|
|
|
|
movdqu xmm2,XMMWORD PTR[rdi]
|
|
movdqu xmm3,XMMWORD PTR[16+rdi]
|
|
movdqu xmm4,XMMWORD PTR[32+rdi]
|
|
movdqu xmm5,XMMWORD PTR[48+rdi]
|
|
movdqu xmm6,XMMWORD PTR[64+rdi]
|
|
movdqu xmm7,XMMWORD PTR[80+rdi]
|
|
movdqu xmm8,XMMWORD PTR[96+rdi]
|
|
movdqu xmm9,XMMWORD PTR[112+rdi]
|
|
lea rdi,QWORD PTR[128+rdi]
|
|
sub rdx,080h
|
|
jmp $L$ecb_enc_loop8_enter
|
|
ALIGN 16
|
|
$L$ecb_enc_loop8::
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
mov rcx,r11
|
|
movdqu xmm2,XMMWORD PTR[rdi]
|
|
mov eax,r10d
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
movdqu xmm3,XMMWORD PTR[16+rdi]
|
|
movups XMMWORD PTR[32+rsi],xmm4
|
|
movdqu xmm4,XMMWORD PTR[32+rdi]
|
|
movups XMMWORD PTR[48+rsi],xmm5
|
|
movdqu xmm5,XMMWORD PTR[48+rdi]
|
|
movups XMMWORD PTR[64+rsi],xmm6
|
|
movdqu xmm6,XMMWORD PTR[64+rdi]
|
|
movups XMMWORD PTR[80+rsi],xmm7
|
|
movdqu xmm7,XMMWORD PTR[80+rdi]
|
|
movups XMMWORD PTR[96+rsi],xmm8
|
|
movdqu xmm8,XMMWORD PTR[96+rdi]
|
|
movups XMMWORD PTR[112+rsi],xmm9
|
|
lea rsi,QWORD PTR[128+rsi]
|
|
movdqu xmm9,XMMWORD PTR[112+rdi]
|
|
lea rdi,QWORD PTR[128+rdi]
|
|
$L$ecb_enc_loop8_enter::
|
|
|
|
call _aesni_encrypt8
|
|
|
|
sub rdx,080h
|
|
jnc $L$ecb_enc_loop8
|
|
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
mov rcx,r11
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
mov eax,r10d
|
|
movups XMMWORD PTR[32+rsi],xmm4
|
|
movups XMMWORD PTR[48+rsi],xmm5
|
|
movups XMMWORD PTR[64+rsi],xmm6
|
|
movups XMMWORD PTR[80+rsi],xmm7
|
|
movups XMMWORD PTR[96+rsi],xmm8
|
|
movups XMMWORD PTR[112+rsi],xmm9
|
|
lea rsi,QWORD PTR[128+rsi]
|
|
add rdx,080h
|
|
jz $L$ecb_ret
|
|
|
|
$L$ecb_enc_tail::
|
|
movups xmm2,XMMWORD PTR[rdi]
|
|
cmp rdx,020h
|
|
jb $L$ecb_enc_one
|
|
movups xmm3,XMMWORD PTR[16+rdi]
|
|
je $L$ecb_enc_two
|
|
movups xmm4,XMMWORD PTR[32+rdi]
|
|
cmp rdx,040h
|
|
jb $L$ecb_enc_three
|
|
movups xmm5,XMMWORD PTR[48+rdi]
|
|
je $L$ecb_enc_four
|
|
movups xmm6,XMMWORD PTR[64+rdi]
|
|
cmp rdx,060h
|
|
jb $L$ecb_enc_five
|
|
movups xmm7,XMMWORD PTR[80+rdi]
|
|
je $L$ecb_enc_six
|
|
movdqu xmm8,XMMWORD PTR[96+rdi]
|
|
call _aesni_encrypt8
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
movups XMMWORD PTR[32+rsi],xmm4
|
|
movups XMMWORD PTR[48+rsi],xmm5
|
|
movups XMMWORD PTR[64+rsi],xmm6
|
|
movups XMMWORD PTR[80+rsi],xmm7
|
|
movups XMMWORD PTR[96+rsi],xmm8
|
|
jmp $L$ecb_ret
|
|
ALIGN 16
|
|
$L$ecb_enc_one::
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
xorps xmm2,xmm0
|
|
$L$oop_enc1_3::
|
|
aesenc xmm2,xmm1
|
|
dec eax
|
|
movups xmm1,XMMWORD PTR[rcx]
|
|
lea rcx,QWORD PTR[16+rcx]
|
|
jnz $L$oop_enc1_3
|
|
aesenclast xmm2,xmm1
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
jmp $L$ecb_ret
|
|
ALIGN 16
|
|
$L$ecb_enc_two::
|
|
xorps xmm4,xmm4
|
|
call _aesni_encrypt3
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
jmp $L$ecb_ret
|
|
ALIGN 16
|
|
$L$ecb_enc_three::
|
|
call _aesni_encrypt3
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
movups XMMWORD PTR[32+rsi],xmm4
|
|
jmp $L$ecb_ret
|
|
ALIGN 16
|
|
$L$ecb_enc_four::
|
|
call _aesni_encrypt4
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
movups XMMWORD PTR[32+rsi],xmm4
|
|
movups XMMWORD PTR[48+rsi],xmm5
|
|
jmp $L$ecb_ret
|
|
ALIGN 16
|
|
$L$ecb_enc_five::
|
|
xorps xmm7,xmm7
|
|
call _aesni_encrypt6
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
movups XMMWORD PTR[32+rsi],xmm4
|
|
movups XMMWORD PTR[48+rsi],xmm5
|
|
movups XMMWORD PTR[64+rsi],xmm6
|
|
jmp $L$ecb_ret
|
|
ALIGN 16
|
|
$L$ecb_enc_six::
|
|
call _aesni_encrypt6
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
movups XMMWORD PTR[32+rsi],xmm4
|
|
movups XMMWORD PTR[48+rsi],xmm5
|
|
movups XMMWORD PTR[64+rsi],xmm6
|
|
movups XMMWORD PTR[80+rsi],xmm7
|
|
jmp $L$ecb_ret
|
|
|
|
ALIGN 16
|
|
$L$ecb_decrypt::
|
|
cmp rdx,080h
|
|
jb $L$ecb_dec_tail
|
|
|
|
movdqu xmm2,XMMWORD PTR[rdi]
|
|
movdqu xmm3,XMMWORD PTR[16+rdi]
|
|
movdqu xmm4,XMMWORD PTR[32+rdi]
|
|
movdqu xmm5,XMMWORD PTR[48+rdi]
|
|
movdqu xmm6,XMMWORD PTR[64+rdi]
|
|
movdqu xmm7,XMMWORD PTR[80+rdi]
|
|
movdqu xmm8,XMMWORD PTR[96+rdi]
|
|
movdqu xmm9,XMMWORD PTR[112+rdi]
|
|
lea rdi,QWORD PTR[128+rdi]
|
|
sub rdx,080h
|
|
jmp $L$ecb_dec_loop8_enter
|
|
ALIGN 16
|
|
$L$ecb_dec_loop8::
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
mov rcx,r11
|
|
movdqu xmm2,XMMWORD PTR[rdi]
|
|
mov eax,r10d
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
movdqu xmm3,XMMWORD PTR[16+rdi]
|
|
movups XMMWORD PTR[32+rsi],xmm4
|
|
movdqu xmm4,XMMWORD PTR[32+rdi]
|
|
movups XMMWORD PTR[48+rsi],xmm5
|
|
movdqu xmm5,XMMWORD PTR[48+rdi]
|
|
movups XMMWORD PTR[64+rsi],xmm6
|
|
movdqu xmm6,XMMWORD PTR[64+rdi]
|
|
movups XMMWORD PTR[80+rsi],xmm7
|
|
movdqu xmm7,XMMWORD PTR[80+rdi]
|
|
movups XMMWORD PTR[96+rsi],xmm8
|
|
movdqu xmm8,XMMWORD PTR[96+rdi]
|
|
movups XMMWORD PTR[112+rsi],xmm9
|
|
lea rsi,QWORD PTR[128+rsi]
|
|
movdqu xmm9,XMMWORD PTR[112+rdi]
|
|
lea rdi,QWORD PTR[128+rdi]
|
|
$L$ecb_dec_loop8_enter::
|
|
|
|
call _aesni_decrypt8
|
|
|
|
movups xmm0,XMMWORD PTR[r11]
|
|
sub rdx,080h
|
|
jnc $L$ecb_dec_loop8
|
|
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
mov rcx,r11
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
mov eax,r10d
|
|
movups XMMWORD PTR[32+rsi],xmm4
|
|
movups XMMWORD PTR[48+rsi],xmm5
|
|
movups XMMWORD PTR[64+rsi],xmm6
|
|
movups XMMWORD PTR[80+rsi],xmm7
|
|
movups XMMWORD PTR[96+rsi],xmm8
|
|
movups XMMWORD PTR[112+rsi],xmm9
|
|
lea rsi,QWORD PTR[128+rsi]
|
|
add rdx,080h
|
|
jz $L$ecb_ret
|
|
|
|
$L$ecb_dec_tail::
|
|
movups xmm2,XMMWORD PTR[rdi]
|
|
cmp rdx,020h
|
|
jb $L$ecb_dec_one
|
|
movups xmm3,XMMWORD PTR[16+rdi]
|
|
je $L$ecb_dec_two
|
|
movups xmm4,XMMWORD PTR[32+rdi]
|
|
cmp rdx,040h
|
|
jb $L$ecb_dec_three
|
|
movups xmm5,XMMWORD PTR[48+rdi]
|
|
je $L$ecb_dec_four
|
|
movups xmm6,XMMWORD PTR[64+rdi]
|
|
cmp rdx,060h
|
|
jb $L$ecb_dec_five
|
|
movups xmm7,XMMWORD PTR[80+rdi]
|
|
je $L$ecb_dec_six
|
|
movups xmm8,XMMWORD PTR[96+rdi]
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
call _aesni_decrypt8
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
movups XMMWORD PTR[32+rsi],xmm4
|
|
movups XMMWORD PTR[48+rsi],xmm5
|
|
movups XMMWORD PTR[64+rsi],xmm6
|
|
movups XMMWORD PTR[80+rsi],xmm7
|
|
movups XMMWORD PTR[96+rsi],xmm8
|
|
jmp $L$ecb_ret
|
|
ALIGN 16
|
|
$L$ecb_dec_one::
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
xorps xmm2,xmm0
|
|
$L$oop_dec1_4::
|
|
aesdec xmm2,xmm1
|
|
dec eax
|
|
movups xmm1,XMMWORD PTR[rcx]
|
|
lea rcx,QWORD PTR[16+rcx]
|
|
jnz $L$oop_dec1_4
|
|
aesdeclast xmm2,xmm1
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
jmp $L$ecb_ret
|
|
ALIGN 16
|
|
$L$ecb_dec_two::
|
|
xorps xmm4,xmm4
|
|
call _aesni_decrypt3
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
jmp $L$ecb_ret
|
|
ALIGN 16
|
|
$L$ecb_dec_three::
|
|
call _aesni_decrypt3
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
movups XMMWORD PTR[32+rsi],xmm4
|
|
jmp $L$ecb_ret
|
|
ALIGN 16
|
|
$L$ecb_dec_four::
|
|
call _aesni_decrypt4
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
movups XMMWORD PTR[32+rsi],xmm4
|
|
movups XMMWORD PTR[48+rsi],xmm5
|
|
jmp $L$ecb_ret
|
|
ALIGN 16
|
|
$L$ecb_dec_five::
|
|
xorps xmm7,xmm7
|
|
call _aesni_decrypt6
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
movups XMMWORD PTR[32+rsi],xmm4
|
|
movups XMMWORD PTR[48+rsi],xmm5
|
|
movups XMMWORD PTR[64+rsi],xmm6
|
|
jmp $L$ecb_ret
|
|
ALIGN 16
|
|
$L$ecb_dec_six::
|
|
call _aesni_decrypt6
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
movups XMMWORD PTR[32+rsi],xmm4
|
|
movups XMMWORD PTR[48+rsi],xmm5
|
|
movups XMMWORD PTR[64+rsi],xmm6
|
|
movups XMMWORD PTR[80+rsi],xmm7
|
|
|
|
$L$ecb_ret::
|
|
mov rdi,QWORD PTR[8+rsp] ;WIN64 epilogue
|
|
mov rsi,QWORD PTR[16+rsp]
|
|
DB 0F3h,0C3h ;repret
|
|
$L$SEH_end_aesni_ecb_encrypt::
|
|
aesni_ecb_encrypt ENDP
|
|
PUBLIC aesni_ccm64_encrypt_blocks
|
|
|
|
ALIGN 16
|
|
aesni_ccm64_encrypt_blocks PROC PUBLIC
|
|
mov QWORD PTR[8+rsp],rdi ;WIN64 prologue
|
|
mov QWORD PTR[16+rsp],rsi
|
|
mov rax,rsp
|
|
$L$SEH_begin_aesni_ccm64_encrypt_blocks::
|
|
mov rdi,rcx
|
|
mov rsi,rdx
|
|
mov rdx,r8
|
|
mov rcx,r9
|
|
mov r8,QWORD PTR[40+rsp]
|
|
mov r9,QWORD PTR[48+rsp]
|
|
|
|
|
|
lea rsp,QWORD PTR[((-88))+rsp]
|
|
movaps XMMWORD PTR[rsp],xmm6
|
|
movaps XMMWORD PTR[16+rsp],xmm7
|
|
movaps XMMWORD PTR[32+rsp],xmm8
|
|
movaps XMMWORD PTR[48+rsp],xmm9
|
|
$L$ccm64_enc_body::
|
|
mov eax,DWORD PTR[240+rcx]
|
|
movdqu xmm9,XMMWORD PTR[r8]
|
|
movdqa xmm6,XMMWORD PTR[$L$increment64]
|
|
movdqa xmm7,XMMWORD PTR[$L$bswap_mask]
|
|
|
|
shr eax,1
|
|
lea r11,QWORD PTR[rcx]
|
|
movdqu xmm3,XMMWORD PTR[r9]
|
|
movdqa xmm2,xmm9
|
|
mov r10d,eax
|
|
DB 102,68,15,56,0,207
|
|
jmp $L$ccm64_enc_outer
|
|
ALIGN 16
|
|
$L$ccm64_enc_outer::
|
|
movups xmm0,XMMWORD PTR[r11]
|
|
mov eax,r10d
|
|
movups xmm8,XMMWORD PTR[rdi]
|
|
|
|
xorps xmm2,xmm0
|
|
movups xmm1,XMMWORD PTR[16+r11]
|
|
xorps xmm0,xmm8
|
|
lea rcx,QWORD PTR[32+r11]
|
|
xorps xmm3,xmm0
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
|
|
$L$ccm64_enc2_loop::
|
|
aesenc xmm2,xmm1
|
|
dec eax
|
|
aesenc xmm3,xmm1
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
aesenc xmm2,xmm0
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
aesenc xmm3,xmm0
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
jnz $L$ccm64_enc2_loop
|
|
aesenc xmm2,xmm1
|
|
aesenc xmm3,xmm1
|
|
paddq xmm9,xmm6
|
|
aesenclast xmm2,xmm0
|
|
aesenclast xmm3,xmm0
|
|
|
|
dec rdx
|
|
lea rdi,QWORD PTR[16+rdi]
|
|
xorps xmm8,xmm2
|
|
movdqa xmm2,xmm9
|
|
movups XMMWORD PTR[rsi],xmm8
|
|
lea rsi,QWORD PTR[16+rsi]
|
|
DB 102,15,56,0,215
|
|
jnz $L$ccm64_enc_outer
|
|
|
|
movups XMMWORD PTR[r9],xmm3
|
|
movaps xmm6,XMMWORD PTR[rsp]
|
|
movaps xmm7,XMMWORD PTR[16+rsp]
|
|
movaps xmm8,XMMWORD PTR[32+rsp]
|
|
movaps xmm9,XMMWORD PTR[48+rsp]
|
|
lea rsp,QWORD PTR[88+rsp]
|
|
$L$ccm64_enc_ret::
|
|
mov rdi,QWORD PTR[8+rsp] ;WIN64 epilogue
|
|
mov rsi,QWORD PTR[16+rsp]
|
|
DB 0F3h,0C3h ;repret
|
|
$L$SEH_end_aesni_ccm64_encrypt_blocks::
|
|
aesni_ccm64_encrypt_blocks ENDP
|
|
PUBLIC aesni_ccm64_decrypt_blocks
|
|
|
|
ALIGN 16
|
|
aesni_ccm64_decrypt_blocks PROC PUBLIC
|
|
mov QWORD PTR[8+rsp],rdi ;WIN64 prologue
|
|
mov QWORD PTR[16+rsp],rsi
|
|
mov rax,rsp
|
|
$L$SEH_begin_aesni_ccm64_decrypt_blocks::
|
|
mov rdi,rcx
|
|
mov rsi,rdx
|
|
mov rdx,r8
|
|
mov rcx,r9
|
|
mov r8,QWORD PTR[40+rsp]
|
|
mov r9,QWORD PTR[48+rsp]
|
|
|
|
|
|
lea rsp,QWORD PTR[((-88))+rsp]
|
|
movaps XMMWORD PTR[rsp],xmm6
|
|
movaps XMMWORD PTR[16+rsp],xmm7
|
|
movaps XMMWORD PTR[32+rsp],xmm8
|
|
movaps XMMWORD PTR[48+rsp],xmm9
|
|
$L$ccm64_dec_body::
|
|
mov eax,DWORD PTR[240+rcx]
|
|
movups xmm9,XMMWORD PTR[r8]
|
|
movdqu xmm3,XMMWORD PTR[r9]
|
|
movdqa xmm6,XMMWORD PTR[$L$increment64]
|
|
movdqa xmm7,XMMWORD PTR[$L$bswap_mask]
|
|
|
|
movaps xmm2,xmm9
|
|
mov r10d,eax
|
|
mov r11,rcx
|
|
DB 102,68,15,56,0,207
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
xorps xmm2,xmm0
|
|
$L$oop_enc1_5::
|
|
aesenc xmm2,xmm1
|
|
dec eax
|
|
movups xmm1,XMMWORD PTR[rcx]
|
|
lea rcx,QWORD PTR[16+rcx]
|
|
jnz $L$oop_enc1_5
|
|
aesenclast xmm2,xmm1
|
|
movups xmm8,XMMWORD PTR[rdi]
|
|
paddq xmm9,xmm6
|
|
lea rdi,QWORD PTR[16+rdi]
|
|
jmp $L$ccm64_dec_outer
|
|
ALIGN 16
|
|
$L$ccm64_dec_outer::
|
|
xorps xmm8,xmm2
|
|
movdqa xmm2,xmm9
|
|
mov eax,r10d
|
|
movups XMMWORD PTR[rsi],xmm8
|
|
lea rsi,QWORD PTR[16+rsi]
|
|
DB 102,15,56,0,215
|
|
|
|
sub rdx,1
|
|
jz $L$ccm64_dec_break
|
|
|
|
movups xmm0,XMMWORD PTR[r11]
|
|
shr eax,1
|
|
movups xmm1,XMMWORD PTR[16+r11]
|
|
xorps xmm8,xmm0
|
|
lea rcx,QWORD PTR[32+r11]
|
|
xorps xmm2,xmm0
|
|
xorps xmm3,xmm8
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
|
|
$L$ccm64_dec2_loop::
|
|
aesenc xmm2,xmm1
|
|
dec eax
|
|
aesenc xmm3,xmm1
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
aesenc xmm2,xmm0
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
aesenc xmm3,xmm0
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
jnz $L$ccm64_dec2_loop
|
|
movups xmm8,XMMWORD PTR[rdi]
|
|
paddq xmm9,xmm6
|
|
aesenc xmm2,xmm1
|
|
aesenc xmm3,xmm1
|
|
lea rdi,QWORD PTR[16+rdi]
|
|
aesenclast xmm2,xmm0
|
|
aesenclast xmm3,xmm0
|
|
jmp $L$ccm64_dec_outer
|
|
|
|
ALIGN 16
|
|
$L$ccm64_dec_break::
|
|
|
|
movups xmm0,XMMWORD PTR[r11]
|
|
movups xmm1,XMMWORD PTR[16+r11]
|
|
xorps xmm8,xmm0
|
|
lea r11,QWORD PTR[32+r11]
|
|
xorps xmm3,xmm8
|
|
$L$oop_enc1_6::
|
|
aesenc xmm3,xmm1
|
|
dec eax
|
|
movups xmm1,XMMWORD PTR[r11]
|
|
lea r11,QWORD PTR[16+r11]
|
|
jnz $L$oop_enc1_6
|
|
aesenclast xmm3,xmm1
|
|
movups XMMWORD PTR[r9],xmm3
|
|
movaps xmm6,XMMWORD PTR[rsp]
|
|
movaps xmm7,XMMWORD PTR[16+rsp]
|
|
movaps xmm8,XMMWORD PTR[32+rsp]
|
|
movaps xmm9,XMMWORD PTR[48+rsp]
|
|
lea rsp,QWORD PTR[88+rsp]
|
|
$L$ccm64_dec_ret::
|
|
mov rdi,QWORD PTR[8+rsp] ;WIN64 epilogue
|
|
mov rsi,QWORD PTR[16+rsp]
|
|
DB 0F3h,0C3h ;repret
|
|
$L$SEH_end_aesni_ccm64_decrypt_blocks::
|
|
aesni_ccm64_decrypt_blocks ENDP
|
|
PUBLIC aesni_ctr32_encrypt_blocks
|
|
|
|
ALIGN 16
|
|
aesni_ctr32_encrypt_blocks PROC PUBLIC
|
|
mov QWORD PTR[8+rsp],rdi ;WIN64 prologue
|
|
mov QWORD PTR[16+rsp],rsi
|
|
mov rax,rsp
|
|
$L$SEH_begin_aesni_ctr32_encrypt_blocks::
|
|
mov rdi,rcx
|
|
mov rsi,rdx
|
|
mov rdx,r8
|
|
mov rcx,r9
|
|
mov r8,QWORD PTR[40+rsp]
|
|
|
|
|
|
lea rsp,QWORD PTR[((-200))+rsp]
|
|
movaps XMMWORD PTR[32+rsp],xmm6
|
|
movaps XMMWORD PTR[48+rsp],xmm7
|
|
movaps XMMWORD PTR[64+rsp],xmm8
|
|
movaps XMMWORD PTR[80+rsp],xmm9
|
|
movaps XMMWORD PTR[96+rsp],xmm10
|
|
movaps XMMWORD PTR[112+rsp],xmm11
|
|
movaps XMMWORD PTR[128+rsp],xmm12
|
|
movaps XMMWORD PTR[144+rsp],xmm13
|
|
movaps XMMWORD PTR[160+rsp],xmm14
|
|
movaps XMMWORD PTR[176+rsp],xmm15
|
|
$L$ctr32_body::
|
|
cmp rdx,1
|
|
je $L$ctr32_one_shortcut
|
|
|
|
movdqu xmm14,XMMWORD PTR[r8]
|
|
movdqa xmm15,XMMWORD PTR[$L$bswap_mask]
|
|
xor eax,eax
|
|
DB 102,69,15,58,22,242,3
|
|
DB 102,68,15,58,34,240,3
|
|
|
|
mov eax,DWORD PTR[240+rcx]
|
|
bswap r10d
|
|
pxor xmm12,xmm12
|
|
pxor xmm13,xmm13
|
|
DB 102,69,15,58,34,226,0
|
|
lea r11,QWORD PTR[3+r10]
|
|
DB 102,69,15,58,34,235,0
|
|
inc r10d
|
|
DB 102,69,15,58,34,226,1
|
|
inc r11
|
|
DB 102,69,15,58,34,235,1
|
|
inc r10d
|
|
DB 102,69,15,58,34,226,2
|
|
inc r11
|
|
DB 102,69,15,58,34,235,2
|
|
movdqa XMMWORD PTR[rsp],xmm12
|
|
DB 102,69,15,56,0,231
|
|
movdqa XMMWORD PTR[16+rsp],xmm13
|
|
DB 102,69,15,56,0,239
|
|
|
|
pshufd xmm2,xmm12,192
|
|
pshufd xmm3,xmm12,128
|
|
pshufd xmm4,xmm12,64
|
|
cmp rdx,6
|
|
jb $L$ctr32_tail
|
|
shr eax,1
|
|
mov r11,rcx
|
|
mov r10d,eax
|
|
sub rdx,6
|
|
jmp $L$ctr32_loop6
|
|
|
|
ALIGN 16
|
|
$L$ctr32_loop6::
|
|
pshufd xmm5,xmm13,192
|
|
por xmm2,xmm14
|
|
movups xmm0,XMMWORD PTR[r11]
|
|
pshufd xmm6,xmm13,128
|
|
por xmm3,xmm14
|
|
movups xmm1,XMMWORD PTR[16+r11]
|
|
pshufd xmm7,xmm13,64
|
|
por xmm4,xmm14
|
|
por xmm5,xmm14
|
|
xorps xmm2,xmm0
|
|
por xmm6,xmm14
|
|
por xmm7,xmm14
|
|
|
|
|
|
|
|
|
|
pxor xmm3,xmm0
|
|
aesenc xmm2,xmm1
|
|
lea rcx,QWORD PTR[32+r11]
|
|
pxor xmm4,xmm0
|
|
aesenc xmm3,xmm1
|
|
movdqa xmm13,XMMWORD PTR[$L$increment32]
|
|
pxor xmm5,xmm0
|
|
aesenc xmm4,xmm1
|
|
movdqa xmm12,XMMWORD PTR[rsp]
|
|
pxor xmm6,xmm0
|
|
aesenc xmm5,xmm1
|
|
pxor xmm7,xmm0
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
dec eax
|
|
aesenc xmm6,xmm1
|
|
aesenc xmm7,xmm1
|
|
jmp $L$ctr32_enc_loop6_enter
|
|
ALIGN 16
|
|
$L$ctr32_enc_loop6::
|
|
aesenc xmm2,xmm1
|
|
aesenc xmm3,xmm1
|
|
dec eax
|
|
aesenc xmm4,xmm1
|
|
aesenc xmm5,xmm1
|
|
aesenc xmm6,xmm1
|
|
aesenc xmm7,xmm1
|
|
$L$ctr32_enc_loop6_enter::
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
aesenc xmm2,xmm0
|
|
aesenc xmm3,xmm0
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
aesenc xmm4,xmm0
|
|
aesenc xmm5,xmm0
|
|
aesenc xmm6,xmm0
|
|
aesenc xmm7,xmm0
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
jnz $L$ctr32_enc_loop6
|
|
|
|
aesenc xmm2,xmm1
|
|
paddd xmm12,xmm13
|
|
aesenc xmm3,xmm1
|
|
paddd xmm13,XMMWORD PTR[16+rsp]
|
|
aesenc xmm4,xmm1
|
|
movdqa XMMWORD PTR[rsp],xmm12
|
|
aesenc xmm5,xmm1
|
|
movdqa XMMWORD PTR[16+rsp],xmm13
|
|
aesenc xmm6,xmm1
|
|
DB 102,69,15,56,0,231
|
|
aesenc xmm7,xmm1
|
|
DB 102,69,15,56,0,239
|
|
|
|
aesenclast xmm2,xmm0
|
|
movups xmm8,XMMWORD PTR[rdi]
|
|
aesenclast xmm3,xmm0
|
|
movups xmm9,XMMWORD PTR[16+rdi]
|
|
aesenclast xmm4,xmm0
|
|
movups xmm10,XMMWORD PTR[32+rdi]
|
|
aesenclast xmm5,xmm0
|
|
movups xmm11,XMMWORD PTR[48+rdi]
|
|
aesenclast xmm6,xmm0
|
|
movups xmm1,XMMWORD PTR[64+rdi]
|
|
aesenclast xmm7,xmm0
|
|
movups xmm0,XMMWORD PTR[80+rdi]
|
|
lea rdi,QWORD PTR[96+rdi]
|
|
|
|
xorps xmm8,xmm2
|
|
pshufd xmm2,xmm12,192
|
|
xorps xmm9,xmm3
|
|
pshufd xmm3,xmm12,128
|
|
movups XMMWORD PTR[rsi],xmm8
|
|
xorps xmm10,xmm4
|
|
pshufd xmm4,xmm12,64
|
|
movups XMMWORD PTR[16+rsi],xmm9
|
|
xorps xmm11,xmm5
|
|
movups XMMWORD PTR[32+rsi],xmm10
|
|
xorps xmm1,xmm6
|
|
movups XMMWORD PTR[48+rsi],xmm11
|
|
xorps xmm0,xmm7
|
|
movups XMMWORD PTR[64+rsi],xmm1
|
|
movups XMMWORD PTR[80+rsi],xmm0
|
|
lea rsi,QWORD PTR[96+rsi]
|
|
mov eax,r10d
|
|
sub rdx,6
|
|
jnc $L$ctr32_loop6
|
|
|
|
add rdx,6
|
|
jz $L$ctr32_done
|
|
mov rcx,r11
|
|
lea eax,DWORD PTR[1+rax*1+rax]
|
|
|
|
$L$ctr32_tail::
|
|
por xmm2,xmm14
|
|
movups xmm8,XMMWORD PTR[rdi]
|
|
cmp rdx,2
|
|
jb $L$ctr32_one
|
|
|
|
por xmm3,xmm14
|
|
movups xmm9,XMMWORD PTR[16+rdi]
|
|
je $L$ctr32_two
|
|
|
|
pshufd xmm5,xmm13,192
|
|
por xmm4,xmm14
|
|
movups xmm10,XMMWORD PTR[32+rdi]
|
|
cmp rdx,4
|
|
jb $L$ctr32_three
|
|
|
|
pshufd xmm6,xmm13,128
|
|
por xmm5,xmm14
|
|
movups xmm11,XMMWORD PTR[48+rdi]
|
|
je $L$ctr32_four
|
|
|
|
por xmm6,xmm14
|
|
xorps xmm7,xmm7
|
|
|
|
call _aesni_encrypt6
|
|
|
|
movups xmm1,XMMWORD PTR[64+rdi]
|
|
xorps xmm8,xmm2
|
|
xorps xmm9,xmm3
|
|
movups XMMWORD PTR[rsi],xmm8
|
|
xorps xmm10,xmm4
|
|
movups XMMWORD PTR[16+rsi],xmm9
|
|
xorps xmm11,xmm5
|
|
movups XMMWORD PTR[32+rsi],xmm10
|
|
xorps xmm1,xmm6
|
|
movups XMMWORD PTR[48+rsi],xmm11
|
|
movups XMMWORD PTR[64+rsi],xmm1
|
|
jmp $L$ctr32_done
|
|
|
|
ALIGN 16
|
|
$L$ctr32_one_shortcut::
|
|
movups xmm2,XMMWORD PTR[r8]
|
|
movups xmm8,XMMWORD PTR[rdi]
|
|
mov eax,DWORD PTR[240+rcx]
|
|
$L$ctr32_one::
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
xorps xmm2,xmm0
|
|
$L$oop_enc1_7::
|
|
aesenc xmm2,xmm1
|
|
dec eax
|
|
movups xmm1,XMMWORD PTR[rcx]
|
|
lea rcx,QWORD PTR[16+rcx]
|
|
jnz $L$oop_enc1_7
|
|
aesenclast xmm2,xmm1
|
|
xorps xmm8,xmm2
|
|
movups XMMWORD PTR[rsi],xmm8
|
|
jmp $L$ctr32_done
|
|
|
|
ALIGN 16
|
|
$L$ctr32_two::
|
|
xorps xmm4,xmm4
|
|
call _aesni_encrypt3
|
|
xorps xmm8,xmm2
|
|
xorps xmm9,xmm3
|
|
movups XMMWORD PTR[rsi],xmm8
|
|
movups XMMWORD PTR[16+rsi],xmm9
|
|
jmp $L$ctr32_done
|
|
|
|
ALIGN 16
|
|
$L$ctr32_three::
|
|
call _aesni_encrypt3
|
|
xorps xmm8,xmm2
|
|
xorps xmm9,xmm3
|
|
movups XMMWORD PTR[rsi],xmm8
|
|
xorps xmm10,xmm4
|
|
movups XMMWORD PTR[16+rsi],xmm9
|
|
movups XMMWORD PTR[32+rsi],xmm10
|
|
jmp $L$ctr32_done
|
|
|
|
ALIGN 16
|
|
$L$ctr32_four::
|
|
call _aesni_encrypt4
|
|
xorps xmm8,xmm2
|
|
xorps xmm9,xmm3
|
|
movups XMMWORD PTR[rsi],xmm8
|
|
xorps xmm10,xmm4
|
|
movups XMMWORD PTR[16+rsi],xmm9
|
|
xorps xmm11,xmm5
|
|
movups XMMWORD PTR[32+rsi],xmm10
|
|
movups XMMWORD PTR[48+rsi],xmm11
|
|
|
|
$L$ctr32_done::
|
|
movaps xmm6,XMMWORD PTR[32+rsp]
|
|
movaps xmm7,XMMWORD PTR[48+rsp]
|
|
movaps xmm8,XMMWORD PTR[64+rsp]
|
|
movaps xmm9,XMMWORD PTR[80+rsp]
|
|
movaps xmm10,XMMWORD PTR[96+rsp]
|
|
movaps xmm11,XMMWORD PTR[112+rsp]
|
|
movaps xmm12,XMMWORD PTR[128+rsp]
|
|
movaps xmm13,XMMWORD PTR[144+rsp]
|
|
movaps xmm14,XMMWORD PTR[160+rsp]
|
|
movaps xmm15,XMMWORD PTR[176+rsp]
|
|
lea rsp,QWORD PTR[200+rsp]
|
|
$L$ctr32_ret::
|
|
mov rdi,QWORD PTR[8+rsp] ;WIN64 epilogue
|
|
mov rsi,QWORD PTR[16+rsp]
|
|
DB 0F3h,0C3h ;repret
|
|
$L$SEH_end_aesni_ctr32_encrypt_blocks::
|
|
aesni_ctr32_encrypt_blocks ENDP
|
|
PUBLIC aesni_xts_encrypt
|
|
|
|
ALIGN 16
|
|
aesni_xts_encrypt PROC PUBLIC
|
|
mov QWORD PTR[8+rsp],rdi ;WIN64 prologue
|
|
mov QWORD PTR[16+rsp],rsi
|
|
mov rax,rsp
|
|
$L$SEH_begin_aesni_xts_encrypt::
|
|
mov rdi,rcx
|
|
mov rsi,rdx
|
|
mov rdx,r8
|
|
mov rcx,r9
|
|
mov r8,QWORD PTR[40+rsp]
|
|
mov r9,QWORD PTR[48+rsp]
|
|
|
|
|
|
lea rsp,QWORD PTR[((-264))+rsp]
|
|
movaps XMMWORD PTR[96+rsp],xmm6
|
|
movaps XMMWORD PTR[112+rsp],xmm7
|
|
movaps XMMWORD PTR[128+rsp],xmm8
|
|
movaps XMMWORD PTR[144+rsp],xmm9
|
|
movaps XMMWORD PTR[160+rsp],xmm10
|
|
movaps XMMWORD PTR[176+rsp],xmm11
|
|
movaps XMMWORD PTR[192+rsp],xmm12
|
|
movaps XMMWORD PTR[208+rsp],xmm13
|
|
movaps XMMWORD PTR[224+rsp],xmm14
|
|
movaps XMMWORD PTR[240+rsp],xmm15
|
|
$L$xts_enc_body::
|
|
movups xmm15,XMMWORD PTR[r9]
|
|
mov eax,DWORD PTR[240+r8]
|
|
mov r10d,DWORD PTR[240+rcx]
|
|
movups xmm0,XMMWORD PTR[r8]
|
|
movups xmm1,XMMWORD PTR[16+r8]
|
|
lea r8,QWORD PTR[32+r8]
|
|
xorps xmm15,xmm0
|
|
$L$oop_enc1_8::
|
|
aesenc xmm15,xmm1
|
|
dec eax
|
|
movups xmm1,XMMWORD PTR[r8]
|
|
lea r8,QWORD PTR[16+r8]
|
|
jnz $L$oop_enc1_8
|
|
aesenclast xmm15,xmm1
|
|
mov r11,rcx
|
|
mov eax,r10d
|
|
mov r9,rdx
|
|
and rdx,-16
|
|
|
|
movdqa xmm8,XMMWORD PTR[$L$xts_magic]
|
|
pxor xmm14,xmm14
|
|
pcmpgtd xmm14,xmm15
|
|
pshufd xmm9,xmm14,013h
|
|
pxor xmm14,xmm14
|
|
movdqa xmm10,xmm15
|
|
paddq xmm15,xmm15
|
|
pand xmm9,xmm8
|
|
pcmpgtd xmm14,xmm15
|
|
pxor xmm15,xmm9
|
|
pshufd xmm9,xmm14,013h
|
|
pxor xmm14,xmm14
|
|
movdqa xmm11,xmm15
|
|
paddq xmm15,xmm15
|
|
pand xmm9,xmm8
|
|
pcmpgtd xmm14,xmm15
|
|
pxor xmm15,xmm9
|
|
pshufd xmm9,xmm14,013h
|
|
pxor xmm14,xmm14
|
|
movdqa xmm12,xmm15
|
|
paddq xmm15,xmm15
|
|
pand xmm9,xmm8
|
|
pcmpgtd xmm14,xmm15
|
|
pxor xmm15,xmm9
|
|
pshufd xmm9,xmm14,013h
|
|
pxor xmm14,xmm14
|
|
movdqa xmm13,xmm15
|
|
paddq xmm15,xmm15
|
|
pand xmm9,xmm8
|
|
pcmpgtd xmm14,xmm15
|
|
pxor xmm15,xmm9
|
|
sub rdx,16*6
|
|
jc $L$xts_enc_short
|
|
|
|
shr eax,1
|
|
sub eax,1
|
|
mov r10d,eax
|
|
jmp $L$xts_enc_grandloop
|
|
|
|
ALIGN 16
|
|
$L$xts_enc_grandloop::
|
|
pshufd xmm9,xmm14,013h
|
|
movdqa xmm14,xmm15
|
|
paddq xmm15,xmm15
|
|
movdqu xmm2,XMMWORD PTR[rdi]
|
|
pand xmm9,xmm8
|
|
movdqu xmm3,XMMWORD PTR[16+rdi]
|
|
pxor xmm15,xmm9
|
|
|
|
movdqu xmm4,XMMWORD PTR[32+rdi]
|
|
pxor xmm2,xmm10
|
|
movdqu xmm5,XMMWORD PTR[48+rdi]
|
|
pxor xmm3,xmm11
|
|
movdqu xmm6,XMMWORD PTR[64+rdi]
|
|
pxor xmm4,xmm12
|
|
movdqu xmm7,XMMWORD PTR[80+rdi]
|
|
lea rdi,QWORD PTR[96+rdi]
|
|
pxor xmm5,xmm13
|
|
movups xmm0,XMMWORD PTR[r11]
|
|
pxor xmm6,xmm14
|
|
pxor xmm7,xmm15
|
|
|
|
|
|
|
|
movups xmm1,XMMWORD PTR[16+r11]
|
|
pxor xmm2,xmm0
|
|
pxor xmm3,xmm0
|
|
movdqa XMMWORD PTR[rsp],xmm10
|
|
aesenc xmm2,xmm1
|
|
lea rcx,QWORD PTR[32+r11]
|
|
pxor xmm4,xmm0
|
|
movdqa XMMWORD PTR[16+rsp],xmm11
|
|
aesenc xmm3,xmm1
|
|
pxor xmm5,xmm0
|
|
movdqa XMMWORD PTR[32+rsp],xmm12
|
|
aesenc xmm4,xmm1
|
|
pxor xmm6,xmm0
|
|
movdqa XMMWORD PTR[48+rsp],xmm13
|
|
aesenc xmm5,xmm1
|
|
pxor xmm7,xmm0
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
dec eax
|
|
movdqa XMMWORD PTR[64+rsp],xmm14
|
|
aesenc xmm6,xmm1
|
|
movdqa XMMWORD PTR[80+rsp],xmm15
|
|
aesenc xmm7,xmm1
|
|
pxor xmm14,xmm14
|
|
pcmpgtd xmm14,xmm15
|
|
jmp $L$xts_enc_loop6_enter
|
|
|
|
ALIGN 16
|
|
$L$xts_enc_loop6::
|
|
aesenc xmm2,xmm1
|
|
aesenc xmm3,xmm1
|
|
dec eax
|
|
aesenc xmm4,xmm1
|
|
aesenc xmm5,xmm1
|
|
aesenc xmm6,xmm1
|
|
aesenc xmm7,xmm1
|
|
$L$xts_enc_loop6_enter::
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
aesenc xmm2,xmm0
|
|
aesenc xmm3,xmm0
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
aesenc xmm4,xmm0
|
|
aesenc xmm5,xmm0
|
|
aesenc xmm6,xmm0
|
|
aesenc xmm7,xmm0
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
jnz $L$xts_enc_loop6
|
|
|
|
pshufd xmm9,xmm14,013h
|
|
pxor xmm14,xmm14
|
|
paddq xmm15,xmm15
|
|
aesenc xmm2,xmm1
|
|
pand xmm9,xmm8
|
|
aesenc xmm3,xmm1
|
|
pcmpgtd xmm14,xmm15
|
|
aesenc xmm4,xmm1
|
|
pxor xmm15,xmm9
|
|
aesenc xmm5,xmm1
|
|
aesenc xmm6,xmm1
|
|
aesenc xmm7,xmm1
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
|
|
pshufd xmm9,xmm14,013h
|
|
pxor xmm14,xmm14
|
|
movdqa xmm10,xmm15
|
|
paddq xmm15,xmm15
|
|
aesenc xmm2,xmm0
|
|
pand xmm9,xmm8
|
|
aesenc xmm3,xmm0
|
|
pcmpgtd xmm14,xmm15
|
|
aesenc xmm4,xmm0
|
|
pxor xmm15,xmm9
|
|
aesenc xmm5,xmm0
|
|
aesenc xmm6,xmm0
|
|
aesenc xmm7,xmm0
|
|
movups xmm0,XMMWORD PTR[32+rcx]
|
|
|
|
pshufd xmm9,xmm14,013h
|
|
pxor xmm14,xmm14
|
|
movdqa xmm11,xmm15
|
|
paddq xmm15,xmm15
|
|
aesenc xmm2,xmm1
|
|
pand xmm9,xmm8
|
|
aesenc xmm3,xmm1
|
|
pcmpgtd xmm14,xmm15
|
|
aesenc xmm4,xmm1
|
|
pxor xmm15,xmm9
|
|
aesenc xmm5,xmm1
|
|
aesenc xmm6,xmm1
|
|
aesenc xmm7,xmm1
|
|
|
|
pshufd xmm9,xmm14,013h
|
|
pxor xmm14,xmm14
|
|
movdqa xmm12,xmm15
|
|
paddq xmm15,xmm15
|
|
aesenclast xmm2,xmm0
|
|
pand xmm9,xmm8
|
|
aesenclast xmm3,xmm0
|
|
pcmpgtd xmm14,xmm15
|
|
aesenclast xmm4,xmm0
|
|
pxor xmm15,xmm9
|
|
aesenclast xmm5,xmm0
|
|
aesenclast xmm6,xmm0
|
|
aesenclast xmm7,xmm0
|
|
|
|
pshufd xmm9,xmm14,013h
|
|
pxor xmm14,xmm14
|
|
movdqa xmm13,xmm15
|
|
paddq xmm15,xmm15
|
|
xorps xmm2,XMMWORD PTR[rsp]
|
|
pand xmm9,xmm8
|
|
xorps xmm3,XMMWORD PTR[16+rsp]
|
|
pcmpgtd xmm14,xmm15
|
|
pxor xmm15,xmm9
|
|
|
|
xorps xmm4,XMMWORD PTR[32+rsp]
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
xorps xmm5,XMMWORD PTR[48+rsp]
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
xorps xmm6,XMMWORD PTR[64+rsp]
|
|
movups XMMWORD PTR[32+rsi],xmm4
|
|
xorps xmm7,XMMWORD PTR[80+rsp]
|
|
movups XMMWORD PTR[48+rsi],xmm5
|
|
mov eax,r10d
|
|
movups XMMWORD PTR[64+rsi],xmm6
|
|
movups XMMWORD PTR[80+rsi],xmm7
|
|
lea rsi,QWORD PTR[96+rsi]
|
|
sub rdx,16*6
|
|
jnc $L$xts_enc_grandloop
|
|
|
|
lea eax,DWORD PTR[3+rax*1+rax]
|
|
mov rcx,r11
|
|
mov r10d,eax
|
|
|
|
$L$xts_enc_short::
|
|
add rdx,16*6
|
|
jz $L$xts_enc_done
|
|
|
|
cmp rdx,020h
|
|
jb $L$xts_enc_one
|
|
je $L$xts_enc_two
|
|
|
|
cmp rdx,040h
|
|
jb $L$xts_enc_three
|
|
je $L$xts_enc_four
|
|
|
|
pshufd xmm9,xmm14,013h
|
|
movdqa xmm14,xmm15
|
|
paddq xmm15,xmm15
|
|
movdqu xmm2,XMMWORD PTR[rdi]
|
|
pand xmm9,xmm8
|
|
movdqu xmm3,XMMWORD PTR[16+rdi]
|
|
pxor xmm15,xmm9
|
|
|
|
movdqu xmm4,XMMWORD PTR[32+rdi]
|
|
pxor xmm2,xmm10
|
|
movdqu xmm5,XMMWORD PTR[48+rdi]
|
|
pxor xmm3,xmm11
|
|
movdqu xmm6,XMMWORD PTR[64+rdi]
|
|
lea rdi,QWORD PTR[80+rdi]
|
|
pxor xmm4,xmm12
|
|
pxor xmm5,xmm13
|
|
pxor xmm6,xmm14
|
|
|
|
call _aesni_encrypt6
|
|
|
|
xorps xmm2,xmm10
|
|
movdqa xmm10,xmm15
|
|
xorps xmm3,xmm11
|
|
xorps xmm4,xmm12
|
|
movdqu XMMWORD PTR[rsi],xmm2
|
|
xorps xmm5,xmm13
|
|
movdqu XMMWORD PTR[16+rsi],xmm3
|
|
xorps xmm6,xmm14
|
|
movdqu XMMWORD PTR[32+rsi],xmm4
|
|
movdqu XMMWORD PTR[48+rsi],xmm5
|
|
movdqu XMMWORD PTR[64+rsi],xmm6
|
|
lea rsi,QWORD PTR[80+rsi]
|
|
jmp $L$xts_enc_done
|
|
|
|
ALIGN 16
|
|
$L$xts_enc_one::
|
|
movups xmm2,XMMWORD PTR[rdi]
|
|
lea rdi,QWORD PTR[16+rdi]
|
|
xorps xmm2,xmm10
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
xorps xmm2,xmm0
|
|
$L$oop_enc1_9::
|
|
aesenc xmm2,xmm1
|
|
dec eax
|
|
movups xmm1,XMMWORD PTR[rcx]
|
|
lea rcx,QWORD PTR[16+rcx]
|
|
jnz $L$oop_enc1_9
|
|
aesenclast xmm2,xmm1
|
|
xorps xmm2,xmm10
|
|
movdqa xmm10,xmm11
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
lea rsi,QWORD PTR[16+rsi]
|
|
jmp $L$xts_enc_done
|
|
|
|
ALIGN 16
|
|
$L$xts_enc_two::
|
|
movups xmm2,XMMWORD PTR[rdi]
|
|
movups xmm3,XMMWORD PTR[16+rdi]
|
|
lea rdi,QWORD PTR[32+rdi]
|
|
xorps xmm2,xmm10
|
|
xorps xmm3,xmm11
|
|
|
|
call _aesni_encrypt3
|
|
|
|
xorps xmm2,xmm10
|
|
movdqa xmm10,xmm12
|
|
xorps xmm3,xmm11
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
lea rsi,QWORD PTR[32+rsi]
|
|
jmp $L$xts_enc_done
|
|
|
|
ALIGN 16
|
|
$L$xts_enc_three::
|
|
movups xmm2,XMMWORD PTR[rdi]
|
|
movups xmm3,XMMWORD PTR[16+rdi]
|
|
movups xmm4,XMMWORD PTR[32+rdi]
|
|
lea rdi,QWORD PTR[48+rdi]
|
|
xorps xmm2,xmm10
|
|
xorps xmm3,xmm11
|
|
xorps xmm4,xmm12
|
|
|
|
call _aesni_encrypt3
|
|
|
|
xorps xmm2,xmm10
|
|
movdqa xmm10,xmm13
|
|
xorps xmm3,xmm11
|
|
xorps xmm4,xmm12
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
movups XMMWORD PTR[32+rsi],xmm4
|
|
lea rsi,QWORD PTR[48+rsi]
|
|
jmp $L$xts_enc_done
|
|
|
|
ALIGN 16
|
|
$L$xts_enc_four::
|
|
movups xmm2,XMMWORD PTR[rdi]
|
|
movups xmm3,XMMWORD PTR[16+rdi]
|
|
movups xmm4,XMMWORD PTR[32+rdi]
|
|
xorps xmm2,xmm10
|
|
movups xmm5,XMMWORD PTR[48+rdi]
|
|
lea rdi,QWORD PTR[64+rdi]
|
|
xorps xmm3,xmm11
|
|
xorps xmm4,xmm12
|
|
xorps xmm5,xmm13
|
|
|
|
call _aesni_encrypt4
|
|
|
|
xorps xmm2,xmm10
|
|
movdqa xmm10,xmm15
|
|
xorps xmm3,xmm11
|
|
xorps xmm4,xmm12
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
xorps xmm5,xmm13
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
movups XMMWORD PTR[32+rsi],xmm4
|
|
movups XMMWORD PTR[48+rsi],xmm5
|
|
lea rsi,QWORD PTR[64+rsi]
|
|
jmp $L$xts_enc_done
|
|
|
|
ALIGN 16
|
|
$L$xts_enc_done::
|
|
and r9,15
|
|
jz $L$xts_enc_ret
|
|
mov rdx,r9
|
|
|
|
$L$xts_enc_steal::
|
|
movzx eax,BYTE PTR[rdi]
|
|
movzx ecx,BYTE PTR[((-16))+rsi]
|
|
lea rdi,QWORD PTR[1+rdi]
|
|
mov BYTE PTR[((-16))+rsi],al
|
|
mov BYTE PTR[rsi],cl
|
|
lea rsi,QWORD PTR[1+rsi]
|
|
sub rdx,1
|
|
jnz $L$xts_enc_steal
|
|
|
|
sub rsi,r9
|
|
mov rcx,r11
|
|
mov eax,r10d
|
|
|
|
movups xmm2,XMMWORD PTR[((-16))+rsi]
|
|
xorps xmm2,xmm10
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
xorps xmm2,xmm0
|
|
$L$oop_enc1_10::
|
|
aesenc xmm2,xmm1
|
|
dec eax
|
|
movups xmm1,XMMWORD PTR[rcx]
|
|
lea rcx,QWORD PTR[16+rcx]
|
|
jnz $L$oop_enc1_10
|
|
aesenclast xmm2,xmm1
|
|
xorps xmm2,xmm10
|
|
movups XMMWORD PTR[(-16)+rsi],xmm2
|
|
|
|
$L$xts_enc_ret::
|
|
movaps xmm6,XMMWORD PTR[96+rsp]
|
|
movaps xmm7,XMMWORD PTR[112+rsp]
|
|
movaps xmm8,XMMWORD PTR[128+rsp]
|
|
movaps xmm9,XMMWORD PTR[144+rsp]
|
|
movaps xmm10,XMMWORD PTR[160+rsp]
|
|
movaps xmm11,XMMWORD PTR[176+rsp]
|
|
movaps xmm12,XMMWORD PTR[192+rsp]
|
|
movaps xmm13,XMMWORD PTR[208+rsp]
|
|
movaps xmm14,XMMWORD PTR[224+rsp]
|
|
movaps xmm15,XMMWORD PTR[240+rsp]
|
|
lea rsp,QWORD PTR[264+rsp]
|
|
$L$xts_enc_epilogue::
|
|
mov rdi,QWORD PTR[8+rsp] ;WIN64 epilogue
|
|
mov rsi,QWORD PTR[16+rsp]
|
|
DB 0F3h,0C3h ;repret
|
|
$L$SEH_end_aesni_xts_encrypt::
|
|
aesni_xts_encrypt ENDP
|
|
PUBLIC aesni_xts_decrypt
|
|
|
|
ALIGN 16
|
|
aesni_xts_decrypt PROC PUBLIC
|
|
mov QWORD PTR[8+rsp],rdi ;WIN64 prologue
|
|
mov QWORD PTR[16+rsp],rsi
|
|
mov rax,rsp
|
|
$L$SEH_begin_aesni_xts_decrypt::
|
|
mov rdi,rcx
|
|
mov rsi,rdx
|
|
mov rdx,r8
|
|
mov rcx,r9
|
|
mov r8,QWORD PTR[40+rsp]
|
|
mov r9,QWORD PTR[48+rsp]
|
|
|
|
|
|
lea rsp,QWORD PTR[((-264))+rsp]
|
|
movaps XMMWORD PTR[96+rsp],xmm6
|
|
movaps XMMWORD PTR[112+rsp],xmm7
|
|
movaps XMMWORD PTR[128+rsp],xmm8
|
|
movaps XMMWORD PTR[144+rsp],xmm9
|
|
movaps XMMWORD PTR[160+rsp],xmm10
|
|
movaps XMMWORD PTR[176+rsp],xmm11
|
|
movaps XMMWORD PTR[192+rsp],xmm12
|
|
movaps XMMWORD PTR[208+rsp],xmm13
|
|
movaps XMMWORD PTR[224+rsp],xmm14
|
|
movaps XMMWORD PTR[240+rsp],xmm15
|
|
$L$xts_dec_body::
|
|
movups xmm15,XMMWORD PTR[r9]
|
|
mov eax,DWORD PTR[240+r8]
|
|
mov r10d,DWORD PTR[240+rcx]
|
|
movups xmm0,XMMWORD PTR[r8]
|
|
movups xmm1,XMMWORD PTR[16+r8]
|
|
lea r8,QWORD PTR[32+r8]
|
|
xorps xmm15,xmm0
|
|
$L$oop_enc1_11::
|
|
aesenc xmm15,xmm1
|
|
dec eax
|
|
movups xmm1,XMMWORD PTR[r8]
|
|
lea r8,QWORD PTR[16+r8]
|
|
jnz $L$oop_enc1_11
|
|
aesenclast xmm15,xmm1
|
|
xor eax,eax
|
|
test rdx,15
|
|
setnz al
|
|
shl rax,4
|
|
sub rdx,rax
|
|
|
|
mov r11,rcx
|
|
mov eax,r10d
|
|
mov r9,rdx
|
|
and rdx,-16
|
|
|
|
movdqa xmm8,XMMWORD PTR[$L$xts_magic]
|
|
pxor xmm14,xmm14
|
|
pcmpgtd xmm14,xmm15
|
|
pshufd xmm9,xmm14,013h
|
|
pxor xmm14,xmm14
|
|
movdqa xmm10,xmm15
|
|
paddq xmm15,xmm15
|
|
pand xmm9,xmm8
|
|
pcmpgtd xmm14,xmm15
|
|
pxor xmm15,xmm9
|
|
pshufd xmm9,xmm14,013h
|
|
pxor xmm14,xmm14
|
|
movdqa xmm11,xmm15
|
|
paddq xmm15,xmm15
|
|
pand xmm9,xmm8
|
|
pcmpgtd xmm14,xmm15
|
|
pxor xmm15,xmm9
|
|
pshufd xmm9,xmm14,013h
|
|
pxor xmm14,xmm14
|
|
movdqa xmm12,xmm15
|
|
paddq xmm15,xmm15
|
|
pand xmm9,xmm8
|
|
pcmpgtd xmm14,xmm15
|
|
pxor xmm15,xmm9
|
|
pshufd xmm9,xmm14,013h
|
|
pxor xmm14,xmm14
|
|
movdqa xmm13,xmm15
|
|
paddq xmm15,xmm15
|
|
pand xmm9,xmm8
|
|
pcmpgtd xmm14,xmm15
|
|
pxor xmm15,xmm9
|
|
sub rdx,16*6
|
|
jc $L$xts_dec_short
|
|
|
|
shr eax,1
|
|
sub eax,1
|
|
mov r10d,eax
|
|
jmp $L$xts_dec_grandloop
|
|
|
|
ALIGN 16
|
|
$L$xts_dec_grandloop::
|
|
pshufd xmm9,xmm14,013h
|
|
movdqa xmm14,xmm15
|
|
paddq xmm15,xmm15
|
|
movdqu xmm2,XMMWORD PTR[rdi]
|
|
pand xmm9,xmm8
|
|
movdqu xmm3,XMMWORD PTR[16+rdi]
|
|
pxor xmm15,xmm9
|
|
|
|
movdqu xmm4,XMMWORD PTR[32+rdi]
|
|
pxor xmm2,xmm10
|
|
movdqu xmm5,XMMWORD PTR[48+rdi]
|
|
pxor xmm3,xmm11
|
|
movdqu xmm6,XMMWORD PTR[64+rdi]
|
|
pxor xmm4,xmm12
|
|
movdqu xmm7,XMMWORD PTR[80+rdi]
|
|
lea rdi,QWORD PTR[96+rdi]
|
|
pxor xmm5,xmm13
|
|
movups xmm0,XMMWORD PTR[r11]
|
|
pxor xmm6,xmm14
|
|
pxor xmm7,xmm15
|
|
|
|
|
|
|
|
movups xmm1,XMMWORD PTR[16+r11]
|
|
pxor xmm2,xmm0
|
|
pxor xmm3,xmm0
|
|
movdqa XMMWORD PTR[rsp],xmm10
|
|
aesdec xmm2,xmm1
|
|
lea rcx,QWORD PTR[32+r11]
|
|
pxor xmm4,xmm0
|
|
movdqa XMMWORD PTR[16+rsp],xmm11
|
|
aesdec xmm3,xmm1
|
|
pxor xmm5,xmm0
|
|
movdqa XMMWORD PTR[32+rsp],xmm12
|
|
aesdec xmm4,xmm1
|
|
pxor xmm6,xmm0
|
|
movdqa XMMWORD PTR[48+rsp],xmm13
|
|
aesdec xmm5,xmm1
|
|
pxor xmm7,xmm0
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
dec eax
|
|
movdqa XMMWORD PTR[64+rsp],xmm14
|
|
aesdec xmm6,xmm1
|
|
movdqa XMMWORD PTR[80+rsp],xmm15
|
|
aesdec xmm7,xmm1
|
|
pxor xmm14,xmm14
|
|
pcmpgtd xmm14,xmm15
|
|
jmp $L$xts_dec_loop6_enter
|
|
|
|
ALIGN 16
|
|
$L$xts_dec_loop6::
|
|
aesdec xmm2,xmm1
|
|
aesdec xmm3,xmm1
|
|
dec eax
|
|
aesdec xmm4,xmm1
|
|
aesdec xmm5,xmm1
|
|
aesdec xmm6,xmm1
|
|
aesdec xmm7,xmm1
|
|
$L$xts_dec_loop6_enter::
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
aesdec xmm2,xmm0
|
|
aesdec xmm3,xmm0
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
aesdec xmm4,xmm0
|
|
aesdec xmm5,xmm0
|
|
aesdec xmm6,xmm0
|
|
aesdec xmm7,xmm0
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
jnz $L$xts_dec_loop6
|
|
|
|
pshufd xmm9,xmm14,013h
|
|
pxor xmm14,xmm14
|
|
paddq xmm15,xmm15
|
|
aesdec xmm2,xmm1
|
|
pand xmm9,xmm8
|
|
aesdec xmm3,xmm1
|
|
pcmpgtd xmm14,xmm15
|
|
aesdec xmm4,xmm1
|
|
pxor xmm15,xmm9
|
|
aesdec xmm5,xmm1
|
|
aesdec xmm6,xmm1
|
|
aesdec xmm7,xmm1
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
|
|
pshufd xmm9,xmm14,013h
|
|
pxor xmm14,xmm14
|
|
movdqa xmm10,xmm15
|
|
paddq xmm15,xmm15
|
|
aesdec xmm2,xmm0
|
|
pand xmm9,xmm8
|
|
aesdec xmm3,xmm0
|
|
pcmpgtd xmm14,xmm15
|
|
aesdec xmm4,xmm0
|
|
pxor xmm15,xmm9
|
|
aesdec xmm5,xmm0
|
|
aesdec xmm6,xmm0
|
|
aesdec xmm7,xmm0
|
|
movups xmm0,XMMWORD PTR[32+rcx]
|
|
|
|
pshufd xmm9,xmm14,013h
|
|
pxor xmm14,xmm14
|
|
movdqa xmm11,xmm15
|
|
paddq xmm15,xmm15
|
|
aesdec xmm2,xmm1
|
|
pand xmm9,xmm8
|
|
aesdec xmm3,xmm1
|
|
pcmpgtd xmm14,xmm15
|
|
aesdec xmm4,xmm1
|
|
pxor xmm15,xmm9
|
|
aesdec xmm5,xmm1
|
|
aesdec xmm6,xmm1
|
|
aesdec xmm7,xmm1
|
|
|
|
pshufd xmm9,xmm14,013h
|
|
pxor xmm14,xmm14
|
|
movdqa xmm12,xmm15
|
|
paddq xmm15,xmm15
|
|
aesdeclast xmm2,xmm0
|
|
pand xmm9,xmm8
|
|
aesdeclast xmm3,xmm0
|
|
pcmpgtd xmm14,xmm15
|
|
aesdeclast xmm4,xmm0
|
|
pxor xmm15,xmm9
|
|
aesdeclast xmm5,xmm0
|
|
aesdeclast xmm6,xmm0
|
|
aesdeclast xmm7,xmm0
|
|
|
|
pshufd xmm9,xmm14,013h
|
|
pxor xmm14,xmm14
|
|
movdqa xmm13,xmm15
|
|
paddq xmm15,xmm15
|
|
xorps xmm2,XMMWORD PTR[rsp]
|
|
pand xmm9,xmm8
|
|
xorps xmm3,XMMWORD PTR[16+rsp]
|
|
pcmpgtd xmm14,xmm15
|
|
pxor xmm15,xmm9
|
|
|
|
xorps xmm4,XMMWORD PTR[32+rsp]
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
xorps xmm5,XMMWORD PTR[48+rsp]
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
xorps xmm6,XMMWORD PTR[64+rsp]
|
|
movups XMMWORD PTR[32+rsi],xmm4
|
|
xorps xmm7,XMMWORD PTR[80+rsp]
|
|
movups XMMWORD PTR[48+rsi],xmm5
|
|
mov eax,r10d
|
|
movups XMMWORD PTR[64+rsi],xmm6
|
|
movups XMMWORD PTR[80+rsi],xmm7
|
|
lea rsi,QWORD PTR[96+rsi]
|
|
sub rdx,16*6
|
|
jnc $L$xts_dec_grandloop
|
|
|
|
lea eax,DWORD PTR[3+rax*1+rax]
|
|
mov rcx,r11
|
|
mov r10d,eax
|
|
|
|
$L$xts_dec_short::
|
|
add rdx,16*6
|
|
jz $L$xts_dec_done
|
|
|
|
cmp rdx,020h
|
|
jb $L$xts_dec_one
|
|
je $L$xts_dec_two
|
|
|
|
cmp rdx,040h
|
|
jb $L$xts_dec_three
|
|
je $L$xts_dec_four
|
|
|
|
pshufd xmm9,xmm14,013h
|
|
movdqa xmm14,xmm15
|
|
paddq xmm15,xmm15
|
|
movdqu xmm2,XMMWORD PTR[rdi]
|
|
pand xmm9,xmm8
|
|
movdqu xmm3,XMMWORD PTR[16+rdi]
|
|
pxor xmm15,xmm9
|
|
|
|
movdqu xmm4,XMMWORD PTR[32+rdi]
|
|
pxor xmm2,xmm10
|
|
movdqu xmm5,XMMWORD PTR[48+rdi]
|
|
pxor xmm3,xmm11
|
|
movdqu xmm6,XMMWORD PTR[64+rdi]
|
|
lea rdi,QWORD PTR[80+rdi]
|
|
pxor xmm4,xmm12
|
|
pxor xmm5,xmm13
|
|
pxor xmm6,xmm14
|
|
|
|
call _aesni_decrypt6
|
|
|
|
xorps xmm2,xmm10
|
|
xorps xmm3,xmm11
|
|
xorps xmm4,xmm12
|
|
movdqu XMMWORD PTR[rsi],xmm2
|
|
xorps xmm5,xmm13
|
|
movdqu XMMWORD PTR[16+rsi],xmm3
|
|
xorps xmm6,xmm14
|
|
movdqu XMMWORD PTR[32+rsi],xmm4
|
|
pxor xmm14,xmm14
|
|
movdqu XMMWORD PTR[48+rsi],xmm5
|
|
pcmpgtd xmm14,xmm15
|
|
movdqu XMMWORD PTR[64+rsi],xmm6
|
|
lea rsi,QWORD PTR[80+rsi]
|
|
pshufd xmm11,xmm14,013h
|
|
and r9,15
|
|
jz $L$xts_dec_ret
|
|
|
|
movdqa xmm10,xmm15
|
|
paddq xmm15,xmm15
|
|
pand xmm11,xmm8
|
|
pxor xmm11,xmm15
|
|
jmp $L$xts_dec_done2
|
|
|
|
ALIGN 16
|
|
$L$xts_dec_one::
|
|
movups xmm2,XMMWORD PTR[rdi]
|
|
lea rdi,QWORD PTR[16+rdi]
|
|
xorps xmm2,xmm10
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
xorps xmm2,xmm0
|
|
$L$oop_dec1_12::
|
|
aesdec xmm2,xmm1
|
|
dec eax
|
|
movups xmm1,XMMWORD PTR[rcx]
|
|
lea rcx,QWORD PTR[16+rcx]
|
|
jnz $L$oop_dec1_12
|
|
aesdeclast xmm2,xmm1
|
|
xorps xmm2,xmm10
|
|
movdqa xmm10,xmm11
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
movdqa xmm11,xmm12
|
|
lea rsi,QWORD PTR[16+rsi]
|
|
jmp $L$xts_dec_done
|
|
|
|
ALIGN 16
|
|
$L$xts_dec_two::
|
|
movups xmm2,XMMWORD PTR[rdi]
|
|
movups xmm3,XMMWORD PTR[16+rdi]
|
|
lea rdi,QWORD PTR[32+rdi]
|
|
xorps xmm2,xmm10
|
|
xorps xmm3,xmm11
|
|
|
|
call _aesni_decrypt3
|
|
|
|
xorps xmm2,xmm10
|
|
movdqa xmm10,xmm12
|
|
xorps xmm3,xmm11
|
|
movdqa xmm11,xmm13
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
lea rsi,QWORD PTR[32+rsi]
|
|
jmp $L$xts_dec_done
|
|
|
|
ALIGN 16
|
|
$L$xts_dec_three::
|
|
movups xmm2,XMMWORD PTR[rdi]
|
|
movups xmm3,XMMWORD PTR[16+rdi]
|
|
movups xmm4,XMMWORD PTR[32+rdi]
|
|
lea rdi,QWORD PTR[48+rdi]
|
|
xorps xmm2,xmm10
|
|
xorps xmm3,xmm11
|
|
xorps xmm4,xmm12
|
|
|
|
call _aesni_decrypt3
|
|
|
|
xorps xmm2,xmm10
|
|
movdqa xmm10,xmm13
|
|
xorps xmm3,xmm11
|
|
movdqa xmm11,xmm15
|
|
xorps xmm4,xmm12
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
movups XMMWORD PTR[32+rsi],xmm4
|
|
lea rsi,QWORD PTR[48+rsi]
|
|
jmp $L$xts_dec_done
|
|
|
|
ALIGN 16
|
|
$L$xts_dec_four::
|
|
pshufd xmm9,xmm14,013h
|
|
movdqa xmm14,xmm15
|
|
paddq xmm15,xmm15
|
|
movups xmm2,XMMWORD PTR[rdi]
|
|
pand xmm9,xmm8
|
|
movups xmm3,XMMWORD PTR[16+rdi]
|
|
pxor xmm15,xmm9
|
|
|
|
movups xmm4,XMMWORD PTR[32+rdi]
|
|
xorps xmm2,xmm10
|
|
movups xmm5,XMMWORD PTR[48+rdi]
|
|
lea rdi,QWORD PTR[64+rdi]
|
|
xorps xmm3,xmm11
|
|
xorps xmm4,xmm12
|
|
xorps xmm5,xmm13
|
|
|
|
call _aesni_decrypt4
|
|
|
|
xorps xmm2,xmm10
|
|
movdqa xmm10,xmm14
|
|
xorps xmm3,xmm11
|
|
movdqa xmm11,xmm15
|
|
xorps xmm4,xmm12
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
xorps xmm5,xmm13
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
movups XMMWORD PTR[32+rsi],xmm4
|
|
movups XMMWORD PTR[48+rsi],xmm5
|
|
lea rsi,QWORD PTR[64+rsi]
|
|
jmp $L$xts_dec_done
|
|
|
|
ALIGN 16
|
|
$L$xts_dec_done::
|
|
and r9,15
|
|
jz $L$xts_dec_ret
|
|
$L$xts_dec_done2::
|
|
mov rdx,r9
|
|
mov rcx,r11
|
|
mov eax,r10d
|
|
|
|
movups xmm2,XMMWORD PTR[rdi]
|
|
xorps xmm2,xmm11
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
xorps xmm2,xmm0
|
|
$L$oop_dec1_13::
|
|
aesdec xmm2,xmm1
|
|
dec eax
|
|
movups xmm1,XMMWORD PTR[rcx]
|
|
lea rcx,QWORD PTR[16+rcx]
|
|
jnz $L$oop_dec1_13
|
|
aesdeclast xmm2,xmm1
|
|
xorps xmm2,xmm11
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
|
|
$L$xts_dec_steal::
|
|
movzx eax,BYTE PTR[16+rdi]
|
|
movzx ecx,BYTE PTR[rsi]
|
|
lea rdi,QWORD PTR[1+rdi]
|
|
mov BYTE PTR[rsi],al
|
|
mov BYTE PTR[16+rsi],cl
|
|
lea rsi,QWORD PTR[1+rsi]
|
|
sub rdx,1
|
|
jnz $L$xts_dec_steal
|
|
|
|
sub rsi,r9
|
|
mov rcx,r11
|
|
mov eax,r10d
|
|
|
|
movups xmm2,XMMWORD PTR[rsi]
|
|
xorps xmm2,xmm10
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
xorps xmm2,xmm0
|
|
$L$oop_dec1_14::
|
|
aesdec xmm2,xmm1
|
|
dec eax
|
|
movups xmm1,XMMWORD PTR[rcx]
|
|
lea rcx,QWORD PTR[16+rcx]
|
|
jnz $L$oop_dec1_14
|
|
aesdeclast xmm2,xmm1
|
|
xorps xmm2,xmm10
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
|
|
$L$xts_dec_ret::
|
|
movaps xmm6,XMMWORD PTR[96+rsp]
|
|
movaps xmm7,XMMWORD PTR[112+rsp]
|
|
movaps xmm8,XMMWORD PTR[128+rsp]
|
|
movaps xmm9,XMMWORD PTR[144+rsp]
|
|
movaps xmm10,XMMWORD PTR[160+rsp]
|
|
movaps xmm11,XMMWORD PTR[176+rsp]
|
|
movaps xmm12,XMMWORD PTR[192+rsp]
|
|
movaps xmm13,XMMWORD PTR[208+rsp]
|
|
movaps xmm14,XMMWORD PTR[224+rsp]
|
|
movaps xmm15,XMMWORD PTR[240+rsp]
|
|
lea rsp,QWORD PTR[264+rsp]
|
|
$L$xts_dec_epilogue::
|
|
mov rdi,QWORD PTR[8+rsp] ;WIN64 epilogue
|
|
mov rsi,QWORD PTR[16+rsp]
|
|
DB 0F3h,0C3h ;repret
|
|
$L$SEH_end_aesni_xts_decrypt::
|
|
aesni_xts_decrypt ENDP
|
|
PUBLIC aesni_cbc_encrypt
|
|
|
|
ALIGN 16
|
|
aesni_cbc_encrypt PROC PUBLIC
|
|
mov QWORD PTR[8+rsp],rdi ;WIN64 prologue
|
|
mov QWORD PTR[16+rsp],rsi
|
|
mov rax,rsp
|
|
$L$SEH_begin_aesni_cbc_encrypt::
|
|
mov rdi,rcx
|
|
mov rsi,rdx
|
|
mov rdx,r8
|
|
mov rcx,r9
|
|
mov r8,QWORD PTR[40+rsp]
|
|
mov r9,QWORD PTR[48+rsp]
|
|
|
|
|
|
test rdx,rdx
|
|
jz $L$cbc_ret
|
|
|
|
mov r10d,DWORD PTR[240+rcx]
|
|
mov r11,rcx
|
|
test r9d,r9d
|
|
jz $L$cbc_decrypt
|
|
|
|
movups xmm2,XMMWORD PTR[r8]
|
|
mov eax,r10d
|
|
cmp rdx,16
|
|
jb $L$cbc_enc_tail
|
|
sub rdx,16
|
|
jmp $L$cbc_enc_loop
|
|
ALIGN 16
|
|
$L$cbc_enc_loop::
|
|
movups xmm3,XMMWORD PTR[rdi]
|
|
lea rdi,QWORD PTR[16+rdi]
|
|
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
xorps xmm3,xmm0
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
xorps xmm2,xmm3
|
|
$L$oop_enc1_15::
|
|
aesenc xmm2,xmm1
|
|
dec eax
|
|
movups xmm1,XMMWORD PTR[rcx]
|
|
lea rcx,QWORD PTR[16+rcx]
|
|
jnz $L$oop_enc1_15
|
|
aesenclast xmm2,xmm1
|
|
mov eax,r10d
|
|
mov rcx,r11
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
lea rsi,QWORD PTR[16+rsi]
|
|
sub rdx,16
|
|
jnc $L$cbc_enc_loop
|
|
add rdx,16
|
|
jnz $L$cbc_enc_tail
|
|
movups XMMWORD PTR[r8],xmm2
|
|
jmp $L$cbc_ret
|
|
|
|
$L$cbc_enc_tail::
|
|
mov rcx,rdx
|
|
xchg rsi,rdi
|
|
DD 09066A4F3h
|
|
mov ecx,16
|
|
sub rcx,rdx
|
|
xor eax,eax
|
|
DD 09066AAF3h
|
|
lea rdi,QWORD PTR[((-16))+rdi]
|
|
mov eax,r10d
|
|
mov rsi,rdi
|
|
mov rcx,r11
|
|
xor rdx,rdx
|
|
jmp $L$cbc_enc_loop
|
|
|
|
ALIGN 16
|
|
$L$cbc_decrypt::
|
|
lea rsp,QWORD PTR[((-88))+rsp]
|
|
movaps XMMWORD PTR[rsp],xmm6
|
|
movaps XMMWORD PTR[16+rsp],xmm7
|
|
movaps XMMWORD PTR[32+rsp],xmm8
|
|
movaps XMMWORD PTR[48+rsp],xmm9
|
|
$L$cbc_decrypt_body::
|
|
movups xmm9,XMMWORD PTR[r8]
|
|
mov eax,r10d
|
|
cmp rdx,070h
|
|
jbe $L$cbc_dec_tail
|
|
shr r10d,1
|
|
sub rdx,070h
|
|
mov eax,r10d
|
|
movaps XMMWORD PTR[64+rsp],xmm9
|
|
jmp $L$cbc_dec_loop8_enter
|
|
ALIGN 16
|
|
$L$cbc_dec_loop8::
|
|
movaps XMMWORD PTR[64+rsp],xmm0
|
|
movups XMMWORD PTR[rsi],xmm9
|
|
lea rsi,QWORD PTR[16+rsi]
|
|
$L$cbc_dec_loop8_enter::
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
movups xmm2,XMMWORD PTR[rdi]
|
|
movups xmm3,XMMWORD PTR[16+rdi]
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
movdqu xmm4,XMMWORD PTR[32+rdi]
|
|
xorps xmm2,xmm0
|
|
movdqu xmm5,XMMWORD PTR[48+rdi]
|
|
xorps xmm3,xmm0
|
|
movdqu xmm6,XMMWORD PTR[64+rdi]
|
|
aesdec xmm2,xmm1
|
|
pxor xmm4,xmm0
|
|
movdqu xmm7,XMMWORD PTR[80+rdi]
|
|
aesdec xmm3,xmm1
|
|
pxor xmm5,xmm0
|
|
movdqu xmm8,XMMWORD PTR[96+rdi]
|
|
aesdec xmm4,xmm1
|
|
pxor xmm6,xmm0
|
|
movdqu xmm9,XMMWORD PTR[112+rdi]
|
|
aesdec xmm5,xmm1
|
|
pxor xmm7,xmm0
|
|
dec eax
|
|
aesdec xmm6,xmm1
|
|
pxor xmm8,xmm0
|
|
aesdec xmm7,xmm1
|
|
pxor xmm9,xmm0
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
aesdec xmm8,xmm1
|
|
aesdec xmm9,xmm1
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
|
|
call $L$dec_loop8_enter
|
|
|
|
movups xmm1,XMMWORD PTR[rdi]
|
|
movups xmm0,XMMWORD PTR[16+rdi]
|
|
xorps xmm2,XMMWORD PTR[64+rsp]
|
|
xorps xmm3,xmm1
|
|
movups xmm1,XMMWORD PTR[32+rdi]
|
|
xorps xmm4,xmm0
|
|
movups xmm0,XMMWORD PTR[48+rdi]
|
|
xorps xmm5,xmm1
|
|
movups xmm1,XMMWORD PTR[64+rdi]
|
|
xorps xmm6,xmm0
|
|
movups xmm0,XMMWORD PTR[80+rdi]
|
|
xorps xmm7,xmm1
|
|
movups xmm1,XMMWORD PTR[96+rdi]
|
|
xorps xmm8,xmm0
|
|
movups xmm0,XMMWORD PTR[112+rdi]
|
|
xorps xmm9,xmm1
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
movups XMMWORD PTR[32+rsi],xmm4
|
|
movups XMMWORD PTR[48+rsi],xmm5
|
|
mov eax,r10d
|
|
movups XMMWORD PTR[64+rsi],xmm6
|
|
mov rcx,r11
|
|
movups XMMWORD PTR[80+rsi],xmm7
|
|
lea rdi,QWORD PTR[128+rdi]
|
|
movups XMMWORD PTR[96+rsi],xmm8
|
|
lea rsi,QWORD PTR[112+rsi]
|
|
sub rdx,080h
|
|
ja $L$cbc_dec_loop8
|
|
|
|
movaps xmm2,xmm9
|
|
movaps xmm9,xmm0
|
|
add rdx,070h
|
|
jle $L$cbc_dec_tail_collected
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
lea eax,DWORD PTR[1+r10*1+r10]
|
|
lea rsi,QWORD PTR[16+rsi]
|
|
$L$cbc_dec_tail::
|
|
movups xmm2,XMMWORD PTR[rdi]
|
|
movaps xmm8,xmm2
|
|
cmp rdx,010h
|
|
jbe $L$cbc_dec_one
|
|
|
|
movups xmm3,XMMWORD PTR[16+rdi]
|
|
movaps xmm7,xmm3
|
|
cmp rdx,020h
|
|
jbe $L$cbc_dec_two
|
|
|
|
movups xmm4,XMMWORD PTR[32+rdi]
|
|
movaps xmm6,xmm4
|
|
cmp rdx,030h
|
|
jbe $L$cbc_dec_three
|
|
|
|
movups xmm5,XMMWORD PTR[48+rdi]
|
|
cmp rdx,040h
|
|
jbe $L$cbc_dec_four
|
|
|
|
movups xmm6,XMMWORD PTR[64+rdi]
|
|
cmp rdx,050h
|
|
jbe $L$cbc_dec_five
|
|
|
|
movups xmm7,XMMWORD PTR[80+rdi]
|
|
cmp rdx,060h
|
|
jbe $L$cbc_dec_six
|
|
|
|
movups xmm8,XMMWORD PTR[96+rdi]
|
|
movaps XMMWORD PTR[64+rsp],xmm9
|
|
call _aesni_decrypt8
|
|
movups xmm1,XMMWORD PTR[rdi]
|
|
movups xmm0,XMMWORD PTR[16+rdi]
|
|
xorps xmm2,XMMWORD PTR[64+rsp]
|
|
xorps xmm3,xmm1
|
|
movups xmm1,XMMWORD PTR[32+rdi]
|
|
xorps xmm4,xmm0
|
|
movups xmm0,XMMWORD PTR[48+rdi]
|
|
xorps xmm5,xmm1
|
|
movups xmm1,XMMWORD PTR[64+rdi]
|
|
xorps xmm6,xmm0
|
|
movups xmm0,XMMWORD PTR[80+rdi]
|
|
xorps xmm7,xmm1
|
|
movups xmm9,XMMWORD PTR[96+rdi]
|
|
xorps xmm8,xmm0
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
movups XMMWORD PTR[32+rsi],xmm4
|
|
movups XMMWORD PTR[48+rsi],xmm5
|
|
movups XMMWORD PTR[64+rsi],xmm6
|
|
movups XMMWORD PTR[80+rsi],xmm7
|
|
lea rsi,QWORD PTR[96+rsi]
|
|
movaps xmm2,xmm8
|
|
sub rdx,070h
|
|
jmp $L$cbc_dec_tail_collected
|
|
ALIGN 16
|
|
$L$cbc_dec_one::
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
movups xmm1,XMMWORD PTR[16+rcx]
|
|
lea rcx,QWORD PTR[32+rcx]
|
|
xorps xmm2,xmm0
|
|
$L$oop_dec1_16::
|
|
aesdec xmm2,xmm1
|
|
dec eax
|
|
movups xmm1,XMMWORD PTR[rcx]
|
|
lea rcx,QWORD PTR[16+rcx]
|
|
jnz $L$oop_dec1_16
|
|
aesdeclast xmm2,xmm1
|
|
xorps xmm2,xmm9
|
|
movaps xmm9,xmm8
|
|
sub rdx,010h
|
|
jmp $L$cbc_dec_tail_collected
|
|
ALIGN 16
|
|
$L$cbc_dec_two::
|
|
xorps xmm4,xmm4
|
|
call _aesni_decrypt3
|
|
xorps xmm2,xmm9
|
|
xorps xmm3,xmm8
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
movaps xmm9,xmm7
|
|
movaps xmm2,xmm3
|
|
lea rsi,QWORD PTR[16+rsi]
|
|
sub rdx,020h
|
|
jmp $L$cbc_dec_tail_collected
|
|
ALIGN 16
|
|
$L$cbc_dec_three::
|
|
call _aesni_decrypt3
|
|
xorps xmm2,xmm9
|
|
xorps xmm3,xmm8
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
xorps xmm4,xmm7
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
movaps xmm9,xmm6
|
|
movaps xmm2,xmm4
|
|
lea rsi,QWORD PTR[32+rsi]
|
|
sub rdx,030h
|
|
jmp $L$cbc_dec_tail_collected
|
|
ALIGN 16
|
|
$L$cbc_dec_four::
|
|
call _aesni_decrypt4
|
|
xorps xmm2,xmm9
|
|
movups xmm9,XMMWORD PTR[48+rdi]
|
|
xorps xmm3,xmm8
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
xorps xmm4,xmm7
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
xorps xmm5,xmm6
|
|
movups XMMWORD PTR[32+rsi],xmm4
|
|
movaps xmm2,xmm5
|
|
lea rsi,QWORD PTR[48+rsi]
|
|
sub rdx,040h
|
|
jmp $L$cbc_dec_tail_collected
|
|
ALIGN 16
|
|
$L$cbc_dec_five::
|
|
xorps xmm7,xmm7
|
|
call _aesni_decrypt6
|
|
movups xmm1,XMMWORD PTR[16+rdi]
|
|
movups xmm0,XMMWORD PTR[32+rdi]
|
|
xorps xmm2,xmm9
|
|
xorps xmm3,xmm8
|
|
xorps xmm4,xmm1
|
|
movups xmm1,XMMWORD PTR[48+rdi]
|
|
xorps xmm5,xmm0
|
|
movups xmm9,XMMWORD PTR[64+rdi]
|
|
xorps xmm6,xmm1
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
movups XMMWORD PTR[32+rsi],xmm4
|
|
movups XMMWORD PTR[48+rsi],xmm5
|
|
lea rsi,QWORD PTR[64+rsi]
|
|
movaps xmm2,xmm6
|
|
sub rdx,050h
|
|
jmp $L$cbc_dec_tail_collected
|
|
ALIGN 16
|
|
$L$cbc_dec_six::
|
|
call _aesni_decrypt6
|
|
movups xmm1,XMMWORD PTR[16+rdi]
|
|
movups xmm0,XMMWORD PTR[32+rdi]
|
|
xorps xmm2,xmm9
|
|
xorps xmm3,xmm8
|
|
xorps xmm4,xmm1
|
|
movups xmm1,XMMWORD PTR[48+rdi]
|
|
xorps xmm5,xmm0
|
|
movups xmm0,XMMWORD PTR[64+rdi]
|
|
xorps xmm6,xmm1
|
|
movups xmm9,XMMWORD PTR[80+rdi]
|
|
xorps xmm7,xmm0
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
movups XMMWORD PTR[16+rsi],xmm3
|
|
movups XMMWORD PTR[32+rsi],xmm4
|
|
movups XMMWORD PTR[48+rsi],xmm5
|
|
movups XMMWORD PTR[64+rsi],xmm6
|
|
lea rsi,QWORD PTR[80+rsi]
|
|
movaps xmm2,xmm7
|
|
sub rdx,060h
|
|
jmp $L$cbc_dec_tail_collected
|
|
ALIGN 16
|
|
$L$cbc_dec_tail_collected::
|
|
and rdx,15
|
|
movups XMMWORD PTR[r8],xmm9
|
|
jnz $L$cbc_dec_tail_partial
|
|
movups XMMWORD PTR[rsi],xmm2
|
|
jmp $L$cbc_dec_ret
|
|
ALIGN 16
|
|
$L$cbc_dec_tail_partial::
|
|
movaps XMMWORD PTR[64+rsp],xmm2
|
|
mov rcx,16
|
|
mov rdi,rsi
|
|
sub rcx,rdx
|
|
lea rsi,QWORD PTR[64+rsp]
|
|
DD 09066A4F3h
|
|
|
|
$L$cbc_dec_ret::
|
|
movaps xmm6,XMMWORD PTR[rsp]
|
|
movaps xmm7,XMMWORD PTR[16+rsp]
|
|
movaps xmm8,XMMWORD PTR[32+rsp]
|
|
movaps xmm9,XMMWORD PTR[48+rsp]
|
|
lea rsp,QWORD PTR[88+rsp]
|
|
$L$cbc_ret::
|
|
mov rdi,QWORD PTR[8+rsp] ;WIN64 epilogue
|
|
mov rsi,QWORD PTR[16+rsp]
|
|
DB 0F3h,0C3h ;repret
|
|
$L$SEH_end_aesni_cbc_encrypt::
|
|
aesni_cbc_encrypt ENDP
|
|
PUBLIC aesni_set_decrypt_key
|
|
|
|
ALIGN 16
|
|
aesni_set_decrypt_key PROC PUBLIC
|
|
sub rsp,8
|
|
call __aesni_set_encrypt_key
|
|
shl edx,4
|
|
test eax,eax
|
|
jnz $L$dec_key_ret
|
|
lea rcx,QWORD PTR[16+rdx*1+r8]
|
|
|
|
movups xmm0,XMMWORD PTR[r8]
|
|
movups xmm1,XMMWORD PTR[rcx]
|
|
movups XMMWORD PTR[rcx],xmm0
|
|
movups XMMWORD PTR[r8],xmm1
|
|
lea r8,QWORD PTR[16+r8]
|
|
lea rcx,QWORD PTR[((-16))+rcx]
|
|
|
|
$L$dec_key_inverse::
|
|
movups xmm0,XMMWORD PTR[r8]
|
|
movups xmm1,XMMWORD PTR[rcx]
|
|
aesimc xmm0,xmm0
|
|
aesimc xmm1,xmm1
|
|
lea r8,QWORD PTR[16+r8]
|
|
lea rcx,QWORD PTR[((-16))+rcx]
|
|
movups XMMWORD PTR[16+rcx],xmm0
|
|
movups XMMWORD PTR[(-16)+r8],xmm1
|
|
cmp rcx,r8
|
|
ja $L$dec_key_inverse
|
|
|
|
movups xmm0,XMMWORD PTR[r8]
|
|
aesimc xmm0,xmm0
|
|
movups XMMWORD PTR[rcx],xmm0
|
|
$L$dec_key_ret::
|
|
add rsp,8
|
|
DB 0F3h,0C3h ;repret
|
|
$L$SEH_end_set_decrypt_key::
|
|
aesni_set_decrypt_key ENDP
|
|
PUBLIC aesni_set_encrypt_key
|
|
|
|
ALIGN 16
|
|
aesni_set_encrypt_key PROC PUBLIC
|
|
__aesni_set_encrypt_key::
|
|
sub rsp,8
|
|
mov rax,-1
|
|
test rcx,rcx
|
|
jz $L$enc_key_ret
|
|
test r8,r8
|
|
jz $L$enc_key_ret
|
|
|
|
movups xmm0,XMMWORD PTR[rcx]
|
|
xorps xmm4,xmm4
|
|
lea rax,QWORD PTR[16+r8]
|
|
cmp edx,256
|
|
je $L$14rounds
|
|
cmp edx,192
|
|
je $L$12rounds
|
|
cmp edx,128
|
|
jne $L$bad_keybits
|
|
|
|
$L$10rounds::
|
|
mov edx,9
|
|
movups XMMWORD PTR[r8],xmm0
|
|
aeskeygenassist xmm1,xmm0,01h
|
|
call $L$key_expansion_128_cold
|
|
aeskeygenassist xmm1,xmm0,02h
|
|
call $L$key_expansion_128
|
|
aeskeygenassist xmm1,xmm0,04h
|
|
call $L$key_expansion_128
|
|
aeskeygenassist xmm1,xmm0,08h
|
|
call $L$key_expansion_128
|
|
aeskeygenassist xmm1,xmm0,010h
|
|
call $L$key_expansion_128
|
|
aeskeygenassist xmm1,xmm0,020h
|
|
call $L$key_expansion_128
|
|
aeskeygenassist xmm1,xmm0,040h
|
|
call $L$key_expansion_128
|
|
aeskeygenassist xmm1,xmm0,080h
|
|
call $L$key_expansion_128
|
|
aeskeygenassist xmm1,xmm0,01bh
|
|
call $L$key_expansion_128
|
|
aeskeygenassist xmm1,xmm0,036h
|
|
call $L$key_expansion_128
|
|
movups XMMWORD PTR[rax],xmm0
|
|
mov DWORD PTR[80+rax],edx
|
|
xor eax,eax
|
|
jmp $L$enc_key_ret
|
|
|
|
ALIGN 16
|
|
$L$12rounds::
|
|
movq xmm2,QWORD PTR[16+rcx]
|
|
mov edx,11
|
|
movups XMMWORD PTR[r8],xmm0
|
|
aeskeygenassist xmm1,xmm2,01h
|
|
call $L$key_expansion_192a_cold
|
|
aeskeygenassist xmm1,xmm2,02h
|
|
call $L$key_expansion_192b
|
|
aeskeygenassist xmm1,xmm2,04h
|
|
call $L$key_expansion_192a
|
|
aeskeygenassist xmm1,xmm2,08h
|
|
call $L$key_expansion_192b
|
|
aeskeygenassist xmm1,xmm2,010h
|
|
call $L$key_expansion_192a
|
|
aeskeygenassist xmm1,xmm2,020h
|
|
call $L$key_expansion_192b
|
|
aeskeygenassist xmm1,xmm2,040h
|
|
call $L$key_expansion_192a
|
|
aeskeygenassist xmm1,xmm2,080h
|
|
call $L$key_expansion_192b
|
|
movups XMMWORD PTR[rax],xmm0
|
|
mov DWORD PTR[48+rax],edx
|
|
xor rax,rax
|
|
jmp $L$enc_key_ret
|
|
|
|
ALIGN 16
|
|
$L$14rounds::
|
|
movups xmm2,XMMWORD PTR[16+rcx]
|
|
mov edx,13
|
|
lea rax,QWORD PTR[16+rax]
|
|
movups XMMWORD PTR[r8],xmm0
|
|
movups XMMWORD PTR[16+r8],xmm2
|
|
aeskeygenassist xmm1,xmm2,01h
|
|
call $L$key_expansion_256a_cold
|
|
aeskeygenassist xmm1,xmm0,01h
|
|
call $L$key_expansion_256b
|
|
aeskeygenassist xmm1,xmm2,02h
|
|
call $L$key_expansion_256a
|
|
aeskeygenassist xmm1,xmm0,02h
|
|
call $L$key_expansion_256b
|
|
aeskeygenassist xmm1,xmm2,04h
|
|
call $L$key_expansion_256a
|
|
aeskeygenassist xmm1,xmm0,04h
|
|
call $L$key_expansion_256b
|
|
aeskeygenassist xmm1,xmm2,08h
|
|
call $L$key_expansion_256a
|
|
aeskeygenassist xmm1,xmm0,08h
|
|
call $L$key_expansion_256b
|
|
aeskeygenassist xmm1,xmm2,010h
|
|
call $L$key_expansion_256a
|
|
aeskeygenassist xmm1,xmm0,010h
|
|
call $L$key_expansion_256b
|
|
aeskeygenassist xmm1,xmm2,020h
|
|
call $L$key_expansion_256a
|
|
aeskeygenassist xmm1,xmm0,020h
|
|
call $L$key_expansion_256b
|
|
aeskeygenassist xmm1,xmm2,040h
|
|
call $L$key_expansion_256a
|
|
movups XMMWORD PTR[rax],xmm0
|
|
mov DWORD PTR[16+rax],edx
|
|
xor rax,rax
|
|
jmp $L$enc_key_ret
|
|
|
|
ALIGN 16
|
|
$L$bad_keybits::
|
|
mov rax,-2
|
|
$L$enc_key_ret::
|
|
add rsp,8
|
|
DB 0F3h,0C3h ;repret
|
|
$L$SEH_end_set_encrypt_key::
|
|
|
|
ALIGN 16
|
|
$L$key_expansion_128::
|
|
movups XMMWORD PTR[rax],xmm0
|
|
lea rax,QWORD PTR[16+rax]
|
|
$L$key_expansion_128_cold::
|
|
shufps xmm4,xmm0,16
|
|
xorps xmm0,xmm4
|
|
shufps xmm4,xmm0,140
|
|
xorps xmm0,xmm4
|
|
shufps xmm1,xmm1,255
|
|
xorps xmm0,xmm1
|
|
DB 0F3h,0C3h ;repret
|
|
|
|
ALIGN 16
|
|
$L$key_expansion_192a::
|
|
movups XMMWORD PTR[rax],xmm0
|
|
lea rax,QWORD PTR[16+rax]
|
|
$L$key_expansion_192a_cold::
|
|
movaps xmm5,xmm2
|
|
$L$key_expansion_192b_warm::
|
|
shufps xmm4,xmm0,16
|
|
movdqa xmm3,xmm2
|
|
xorps xmm0,xmm4
|
|
shufps xmm4,xmm0,140
|
|
pslldq xmm3,4
|
|
xorps xmm0,xmm4
|
|
pshufd xmm1,xmm1,85
|
|
pxor xmm2,xmm3
|
|
pxor xmm0,xmm1
|
|
pshufd xmm3,xmm0,255
|
|
pxor xmm2,xmm3
|
|
DB 0F3h,0C3h ;repret
|
|
|
|
ALIGN 16
|
|
$L$key_expansion_192b::
|
|
movaps xmm3,xmm0
|
|
shufps xmm5,xmm0,68
|
|
movups XMMWORD PTR[rax],xmm5
|
|
shufps xmm3,xmm2,78
|
|
movups XMMWORD PTR[16+rax],xmm3
|
|
lea rax,QWORD PTR[32+rax]
|
|
jmp $L$key_expansion_192b_warm
|
|
|
|
ALIGN 16
|
|
$L$key_expansion_256a::
|
|
movups XMMWORD PTR[rax],xmm2
|
|
lea rax,QWORD PTR[16+rax]
|
|
$L$key_expansion_256a_cold::
|
|
shufps xmm4,xmm0,16
|
|
xorps xmm0,xmm4
|
|
shufps xmm4,xmm0,140
|
|
xorps xmm0,xmm4
|
|
shufps xmm1,xmm1,255
|
|
xorps xmm0,xmm1
|
|
DB 0F3h,0C3h ;repret
|
|
|
|
ALIGN 16
|
|
$L$key_expansion_256b::
|
|
movups XMMWORD PTR[rax],xmm0
|
|
lea rax,QWORD PTR[16+rax]
|
|
|
|
shufps xmm4,xmm2,16
|
|
xorps xmm2,xmm4
|
|
shufps xmm4,xmm2,140
|
|
xorps xmm2,xmm4
|
|
shufps xmm1,xmm1,170
|
|
xorps xmm2,xmm1
|
|
DB 0F3h,0C3h ;repret
|
|
aesni_set_encrypt_key ENDP
|
|
|
|
ALIGN 64
|
|
$L$bswap_mask::
|
|
DB 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
|
|
$L$increment32::
|
|
DD 6,6,6,0
|
|
$L$increment64::
|
|
DD 1,0,0,0
|
|
$L$xts_magic::
|
|
DD 087h,0,1,0
|
|
|
|
DB 65,69,83,32,102,111,114,32,73,110,116,101,108,32,65,69
|
|
DB 83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83
|
|
DB 32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115
|
|
DB 115,108,46,111,114,103,62,0
|
|
ALIGN 64
|
|
EXTERN __imp_RtlVirtualUnwind:NEAR
|
|
|
|
ALIGN 16
|
|
ecb_se_handler PROC PRIVATE
|
|
push rsi
|
|
push rdi
|
|
push rbx
|
|
push rbp
|
|
push r12
|
|
push r13
|
|
push r14
|
|
push r15
|
|
pushfq
|
|
sub rsp,64
|
|
|
|
mov rax,QWORD PTR[152+r8]
|
|
|
|
jmp $L$common_seh_tail
|
|
ecb_se_handler ENDP
|
|
|
|
|
|
ALIGN 16
|
|
ccm64_se_handler PROC PRIVATE
|
|
push rsi
|
|
push rdi
|
|
push rbx
|
|
push rbp
|
|
push r12
|
|
push r13
|
|
push r14
|
|
push r15
|
|
pushfq
|
|
sub rsp,64
|
|
|
|
mov rax,QWORD PTR[120+r8]
|
|
mov rbx,QWORD PTR[248+r8]
|
|
|
|
mov rsi,QWORD PTR[8+r9]
|
|
mov r11,QWORD PTR[56+r9]
|
|
|
|
mov r10d,DWORD PTR[r11]
|
|
lea r10,QWORD PTR[r10*1+rsi]
|
|
cmp rbx,r10
|
|
jb $L$common_seh_tail
|
|
|
|
mov rax,QWORD PTR[152+r8]
|
|
|
|
mov r10d,DWORD PTR[4+r11]
|
|
lea r10,QWORD PTR[r10*1+rsi]
|
|
cmp rbx,r10
|
|
jae $L$common_seh_tail
|
|
|
|
lea rsi,QWORD PTR[rax]
|
|
lea rdi,QWORD PTR[512+r8]
|
|
mov ecx,8
|
|
DD 0a548f3fch
|
|
lea rax,QWORD PTR[88+rax]
|
|
|
|
jmp $L$common_seh_tail
|
|
ccm64_se_handler ENDP
|
|
|
|
|
|
ALIGN 16
|
|
ctr32_se_handler PROC PRIVATE
|
|
push rsi
|
|
push rdi
|
|
push rbx
|
|
push rbp
|
|
push r12
|
|
push r13
|
|
push r14
|
|
push r15
|
|
pushfq
|
|
sub rsp,64
|
|
|
|
mov rax,QWORD PTR[120+r8]
|
|
mov rbx,QWORD PTR[248+r8]
|
|
|
|
lea r10,QWORD PTR[$L$ctr32_body]
|
|
cmp rbx,r10
|
|
jb $L$common_seh_tail
|
|
|
|
mov rax,QWORD PTR[152+r8]
|
|
|
|
lea r10,QWORD PTR[$L$ctr32_ret]
|
|
cmp rbx,r10
|
|
jae $L$common_seh_tail
|
|
|
|
lea rsi,QWORD PTR[32+rax]
|
|
lea rdi,QWORD PTR[512+r8]
|
|
mov ecx,20
|
|
DD 0a548f3fch
|
|
lea rax,QWORD PTR[200+rax]
|
|
|
|
jmp $L$common_seh_tail
|
|
ctr32_se_handler ENDP
|
|
|
|
|
|
ALIGN 16
|
|
xts_se_handler PROC PRIVATE
|
|
push rsi
|
|
push rdi
|
|
push rbx
|
|
push rbp
|
|
push r12
|
|
push r13
|
|
push r14
|
|
push r15
|
|
pushfq
|
|
sub rsp,64
|
|
|
|
mov rax,QWORD PTR[120+r8]
|
|
mov rbx,QWORD PTR[248+r8]
|
|
|
|
mov rsi,QWORD PTR[8+r9]
|
|
mov r11,QWORD PTR[56+r9]
|
|
|
|
mov r10d,DWORD PTR[r11]
|
|
lea r10,QWORD PTR[r10*1+rsi]
|
|
cmp rbx,r10
|
|
jb $L$common_seh_tail
|
|
|
|
mov rax,QWORD PTR[152+r8]
|
|
|
|
mov r10d,DWORD PTR[4+r11]
|
|
lea r10,QWORD PTR[r10*1+rsi]
|
|
cmp rbx,r10
|
|
jae $L$common_seh_tail
|
|
|
|
lea rsi,QWORD PTR[96+rax]
|
|
lea rdi,QWORD PTR[512+r8]
|
|
mov ecx,20
|
|
DD 0a548f3fch
|
|
lea rax,QWORD PTR[((104+160))+rax]
|
|
|
|
jmp $L$common_seh_tail
|
|
xts_se_handler ENDP
|
|
|
|
ALIGN 16
|
|
cbc_se_handler PROC PRIVATE
|
|
push rsi
|
|
push rdi
|
|
push rbx
|
|
push rbp
|
|
push r12
|
|
push r13
|
|
push r14
|
|
push r15
|
|
pushfq
|
|
sub rsp,64
|
|
|
|
mov rax,QWORD PTR[152+r8]
|
|
mov rbx,QWORD PTR[248+r8]
|
|
|
|
lea r10,QWORD PTR[$L$cbc_decrypt]
|
|
cmp rbx,r10
|
|
jb $L$common_seh_tail
|
|
|
|
lea r10,QWORD PTR[$L$cbc_decrypt_body]
|
|
cmp rbx,r10
|
|
jb $L$restore_cbc_rax
|
|
|
|
lea r10,QWORD PTR[$L$cbc_ret]
|
|
cmp rbx,r10
|
|
jae $L$common_seh_tail
|
|
|
|
lea rsi,QWORD PTR[rax]
|
|
lea rdi,QWORD PTR[512+r8]
|
|
mov ecx,8
|
|
DD 0a548f3fch
|
|
lea rax,QWORD PTR[88+rax]
|
|
jmp $L$common_seh_tail
|
|
|
|
$L$restore_cbc_rax::
|
|
mov rax,QWORD PTR[120+r8]
|
|
|
|
$L$common_seh_tail::
|
|
mov rdi,QWORD PTR[8+rax]
|
|
mov rsi,QWORD PTR[16+rax]
|
|
mov QWORD PTR[152+r8],rax
|
|
mov QWORD PTR[168+r8],rsi
|
|
mov QWORD PTR[176+r8],rdi
|
|
|
|
mov rdi,QWORD PTR[40+r9]
|
|
mov rsi,r8
|
|
mov ecx,154
|
|
DD 0a548f3fch
|
|
|
|
mov rsi,r9
|
|
xor rcx,rcx
|
|
mov rdx,QWORD PTR[8+rsi]
|
|
mov r8,QWORD PTR[rsi]
|
|
mov r9,QWORD PTR[16+rsi]
|
|
mov r10,QWORD PTR[40+rsi]
|
|
lea r11,QWORD PTR[56+rsi]
|
|
lea r12,QWORD PTR[24+rsi]
|
|
mov QWORD PTR[32+rsp],r10
|
|
mov QWORD PTR[40+rsp],r11
|
|
mov QWORD PTR[48+rsp],r12
|
|
mov QWORD PTR[56+rsp],rcx
|
|
call QWORD PTR[__imp_RtlVirtualUnwind]
|
|
|
|
mov eax,1
|
|
add rsp,64
|
|
popfq
|
|
pop r15
|
|
pop r14
|
|
pop r13
|
|
pop r12
|
|
pop rbp
|
|
pop rbx
|
|
pop rdi
|
|
pop rsi
|
|
DB 0F3h,0C3h ;repret
|
|
cbc_se_handler ENDP
|
|
|
|
.text$ ENDS
|
|
.pdata SEGMENT READONLY ALIGN(4)
|
|
ALIGN 4
|
|
DD imagerel $L$SEH_begin_aesni_ecb_encrypt
|
|
DD imagerel $L$SEH_end_aesni_ecb_encrypt
|
|
DD imagerel $L$SEH_info_ecb
|
|
|
|
DD imagerel $L$SEH_begin_aesni_ccm64_encrypt_blocks
|
|
DD imagerel $L$SEH_end_aesni_ccm64_encrypt_blocks
|
|
DD imagerel $L$SEH_info_ccm64_enc
|
|
|
|
DD imagerel $L$SEH_begin_aesni_ccm64_decrypt_blocks
|
|
DD imagerel $L$SEH_end_aesni_ccm64_decrypt_blocks
|
|
DD imagerel $L$SEH_info_ccm64_dec
|
|
|
|
DD imagerel $L$SEH_begin_aesni_ctr32_encrypt_blocks
|
|
DD imagerel $L$SEH_end_aesni_ctr32_encrypt_blocks
|
|
DD imagerel $L$SEH_info_ctr32
|
|
|
|
DD imagerel $L$SEH_begin_aesni_xts_encrypt
|
|
DD imagerel $L$SEH_end_aesni_xts_encrypt
|
|
DD imagerel $L$SEH_info_xts_enc
|
|
|
|
DD imagerel $L$SEH_begin_aesni_xts_decrypt
|
|
DD imagerel $L$SEH_end_aesni_xts_decrypt
|
|
DD imagerel $L$SEH_info_xts_dec
|
|
DD imagerel $L$SEH_begin_aesni_cbc_encrypt
|
|
DD imagerel $L$SEH_end_aesni_cbc_encrypt
|
|
DD imagerel $L$SEH_info_cbc
|
|
|
|
DD imagerel aesni_set_decrypt_key
|
|
DD imagerel $L$SEH_end_set_decrypt_key
|
|
DD imagerel $L$SEH_info_key
|
|
|
|
DD imagerel aesni_set_encrypt_key
|
|
DD imagerel $L$SEH_end_set_encrypt_key
|
|
DD imagerel $L$SEH_info_key
|
|
.pdata ENDS
|
|
.xdata SEGMENT READONLY ALIGN(8)
|
|
ALIGN 8
|
|
$L$SEH_info_ecb::
|
|
DB 9,0,0,0
|
|
DD imagerel ecb_se_handler
|
|
$L$SEH_info_ccm64_enc::
|
|
DB 9,0,0,0
|
|
DD imagerel ccm64_se_handler
|
|
DD imagerel $L$ccm64_enc_body,imagerel $L$ccm64_enc_ret
|
|
$L$SEH_info_ccm64_dec::
|
|
DB 9,0,0,0
|
|
DD imagerel ccm64_se_handler
|
|
DD imagerel $L$ccm64_dec_body,imagerel $L$ccm64_dec_ret
|
|
$L$SEH_info_ctr32::
|
|
DB 9,0,0,0
|
|
DD imagerel ctr32_se_handler
|
|
$L$SEH_info_xts_enc::
|
|
DB 9,0,0,0
|
|
DD imagerel xts_se_handler
|
|
DD imagerel $L$xts_enc_body,imagerel $L$xts_enc_epilogue
|
|
$L$SEH_info_xts_dec::
|
|
DB 9,0,0,0
|
|
DD imagerel xts_se_handler
|
|
DD imagerel $L$xts_dec_body,imagerel $L$xts_dec_epilogue
|
|
$L$SEH_info_cbc::
|
|
DB 9,0,0,0
|
|
DD imagerel cbc_se_handler
|
|
$L$SEH_info_key::
|
|
DB 001h,004h,001h,000h
|
|
DB 004h,002h,000h,000h
|
|
|
|
.xdata ENDS
|
|
END
|
|
|