1723 lines
32 KiB
NASM
1723 lines
32 KiB
NASM
default rel
|
|
%define XMMWORD
|
|
%define YMMWORD
|
|
%define ZMMWORD
|
|
section .text code align=64
|
|
|
|
global aesni_encrypt
|
|
|
|
ALIGN 16
|
|
aesni_encrypt:
|
|
movups xmm2,XMMWORD[rcx]
|
|
mov eax,DWORD[240+r8]
|
|
movups xmm0,XMMWORD[r8]
|
|
movups xmm1,XMMWORD[16+r8]
|
|
lea r8,[32+r8]
|
|
xorps xmm2,xmm0
|
|
$L$oop_enc1_1:
|
|
DB 102,15,56,220,209
|
|
dec eax
|
|
movups xmm1,XMMWORD[r8]
|
|
lea r8,[16+r8]
|
|
jnz NEAR $L$oop_enc1_1
|
|
DB 102,15,56,221,209
|
|
pxor xmm0,xmm0
|
|
pxor xmm1,xmm1
|
|
movups XMMWORD[rdx],xmm2
|
|
pxor xmm2,xmm2
|
|
ret
|
|
|
|
|
|
global aesni_decrypt
|
|
|
|
ALIGN 16
|
|
aesni_decrypt:
|
|
movups xmm2,XMMWORD[rcx]
|
|
mov eax,DWORD[240+r8]
|
|
movups xmm0,XMMWORD[r8]
|
|
movups xmm1,XMMWORD[16+r8]
|
|
lea r8,[32+r8]
|
|
xorps xmm2,xmm0
|
|
$L$oop_dec1_2:
|
|
DB 102,15,56,222,209
|
|
dec eax
|
|
movups xmm1,XMMWORD[r8]
|
|
lea r8,[16+r8]
|
|
jnz NEAR $L$oop_dec1_2
|
|
DB 102,15,56,223,209
|
|
pxor xmm0,xmm0
|
|
pxor xmm1,xmm1
|
|
movups XMMWORD[rdx],xmm2
|
|
pxor xmm2,xmm2
|
|
ret
|
|
|
|
|
|
ALIGN 16
|
|
_aesni_encrypt2:
|
|
movups xmm0,XMMWORD[rcx]
|
|
shl eax,4
|
|
movups xmm1,XMMWORD[16+rcx]
|
|
xorps xmm2,xmm0
|
|
xorps xmm3,xmm0
|
|
movups xmm0,XMMWORD[32+rcx]
|
|
lea rcx,[32+rax*1+rcx]
|
|
neg rax
|
|
add rax,16
|
|
|
|
$L$enc_loop2:
|
|
DB 102,15,56,220,209
|
|
DB 102,15,56,220,217
|
|
movups xmm1,XMMWORD[rax*1+rcx]
|
|
add rax,32
|
|
DB 102,15,56,220,208
|
|
DB 102,15,56,220,216
|
|
movups xmm0,XMMWORD[((-16))+rax*1+rcx]
|
|
jnz NEAR $L$enc_loop2
|
|
|
|
DB 102,15,56,220,209
|
|
DB 102,15,56,220,217
|
|
DB 102,15,56,221,208
|
|
DB 102,15,56,221,216
|
|
ret
|
|
|
|
|
|
ALIGN 16
|
|
_aesni_decrypt2:
|
|
movups xmm0,XMMWORD[rcx]
|
|
shl eax,4
|
|
movups xmm1,XMMWORD[16+rcx]
|
|
xorps xmm2,xmm0
|
|
xorps xmm3,xmm0
|
|
movups xmm0,XMMWORD[32+rcx]
|
|
lea rcx,[32+rax*1+rcx]
|
|
neg rax
|
|
add rax,16
|
|
|
|
$L$dec_loop2:
|
|
DB 102,15,56,222,209
|
|
DB 102,15,56,222,217
|
|
movups xmm1,XMMWORD[rax*1+rcx]
|
|
add rax,32
|
|
DB 102,15,56,222,208
|
|
DB 102,15,56,222,216
|
|
movups xmm0,XMMWORD[((-16))+rax*1+rcx]
|
|
jnz NEAR $L$dec_loop2
|
|
|
|
DB 102,15,56,222,209
|
|
DB 102,15,56,222,217
|
|
DB 102,15,56,223,208
|
|
DB 102,15,56,223,216
|
|
ret
|
|
|
|
|
|
ALIGN 16
|
|
_aesni_encrypt3:
|
|
movups xmm0,XMMWORD[rcx]
|
|
shl eax,4
|
|
movups xmm1,XMMWORD[16+rcx]
|
|
xorps xmm2,xmm0
|
|
xorps xmm3,xmm0
|
|
xorps xmm4,xmm0
|
|
movups xmm0,XMMWORD[32+rcx]
|
|
lea rcx,[32+rax*1+rcx]
|
|
neg rax
|
|
add rax,16
|
|
|
|
$L$enc_loop3:
|
|
DB 102,15,56,220,209
|
|
DB 102,15,56,220,217
|
|
DB 102,15,56,220,225
|
|
movups xmm1,XMMWORD[rax*1+rcx]
|
|
add rax,32
|
|
DB 102,15,56,220,208
|
|
DB 102,15,56,220,216
|
|
DB 102,15,56,220,224
|
|
movups xmm0,XMMWORD[((-16))+rax*1+rcx]
|
|
jnz NEAR $L$enc_loop3
|
|
|
|
DB 102,15,56,220,209
|
|
DB 102,15,56,220,217
|
|
DB 102,15,56,220,225
|
|
DB 102,15,56,221,208
|
|
DB 102,15,56,221,216
|
|
DB 102,15,56,221,224
|
|
ret
|
|
|
|
|
|
ALIGN 16
|
|
_aesni_decrypt3:
|
|
movups xmm0,XMMWORD[rcx]
|
|
shl eax,4
|
|
movups xmm1,XMMWORD[16+rcx]
|
|
xorps xmm2,xmm0
|
|
xorps xmm3,xmm0
|
|
xorps xmm4,xmm0
|
|
movups xmm0,XMMWORD[32+rcx]
|
|
lea rcx,[32+rax*1+rcx]
|
|
neg rax
|
|
add rax,16
|
|
|
|
$L$dec_loop3:
|
|
DB 102,15,56,222,209
|
|
DB 102,15,56,222,217
|
|
DB 102,15,56,222,225
|
|
movups xmm1,XMMWORD[rax*1+rcx]
|
|
add rax,32
|
|
DB 102,15,56,222,208
|
|
DB 102,15,56,222,216
|
|
DB 102,15,56,222,224
|
|
movups xmm0,XMMWORD[((-16))+rax*1+rcx]
|
|
jnz NEAR $L$dec_loop3
|
|
|
|
DB 102,15,56,222,209
|
|
DB 102,15,56,222,217
|
|
DB 102,15,56,222,225
|
|
DB 102,15,56,223,208
|
|
DB 102,15,56,223,216
|
|
DB 102,15,56,223,224
|
|
ret
|
|
|
|
|
|
ALIGN 16
|
|
_aesni_encrypt4:
|
|
movups xmm0,XMMWORD[rcx]
|
|
shl eax,4
|
|
movups xmm1,XMMWORD[16+rcx]
|
|
xorps xmm2,xmm0
|
|
xorps xmm3,xmm0
|
|
xorps xmm4,xmm0
|
|
xorps xmm5,xmm0
|
|
movups xmm0,XMMWORD[32+rcx]
|
|
lea rcx,[32+rax*1+rcx]
|
|
neg rax
|
|
DB 0x0f,0x1f,0x00
|
|
add rax,16
|
|
|
|
$L$enc_loop4:
|
|
DB 102,15,56,220,209
|
|
DB 102,15,56,220,217
|
|
DB 102,15,56,220,225
|
|
DB 102,15,56,220,233
|
|
movups xmm1,XMMWORD[rax*1+rcx]
|
|
add rax,32
|
|
DB 102,15,56,220,208
|
|
DB 102,15,56,220,216
|
|
DB 102,15,56,220,224
|
|
DB 102,15,56,220,232
|
|
movups xmm0,XMMWORD[((-16))+rax*1+rcx]
|
|
jnz NEAR $L$enc_loop4
|
|
|
|
DB 102,15,56,220,209
|
|
DB 102,15,56,220,217
|
|
DB 102,15,56,220,225
|
|
DB 102,15,56,220,233
|
|
DB 102,15,56,221,208
|
|
DB 102,15,56,221,216
|
|
DB 102,15,56,221,224
|
|
DB 102,15,56,221,232
|
|
ret
|
|
|
|
|
|
ALIGN 16
|
|
_aesni_decrypt4:
|
|
movups xmm0,XMMWORD[rcx]
|
|
shl eax,4
|
|
movups xmm1,XMMWORD[16+rcx]
|
|
xorps xmm2,xmm0
|
|
xorps xmm3,xmm0
|
|
xorps xmm4,xmm0
|
|
xorps xmm5,xmm0
|
|
movups xmm0,XMMWORD[32+rcx]
|
|
lea rcx,[32+rax*1+rcx]
|
|
neg rax
|
|
DB 0x0f,0x1f,0x00
|
|
add rax,16
|
|
|
|
$L$dec_loop4:
|
|
DB 102,15,56,222,209
|
|
DB 102,15,56,222,217
|
|
DB 102,15,56,222,225
|
|
DB 102,15,56,222,233
|
|
movups xmm1,XMMWORD[rax*1+rcx]
|
|
add rax,32
|
|
DB 102,15,56,222,208
|
|
DB 102,15,56,222,216
|
|
DB 102,15,56,222,224
|
|
DB 102,15,56,222,232
|
|
movups xmm0,XMMWORD[((-16))+rax*1+rcx]
|
|
jnz NEAR $L$dec_loop4
|
|
|
|
DB 102,15,56,222,209
|
|
DB 102,15,56,222,217
|
|
DB 102,15,56,222,225
|
|
DB 102,15,56,222,233
|
|
DB 102,15,56,223,208
|
|
DB 102,15,56,223,216
|
|
DB 102,15,56,223,224
|
|
DB 102,15,56,223,232
|
|
ret
|
|
|
|
|
|
ALIGN 16
|
|
_aesni_encrypt6:
|
|
movups xmm0,XMMWORD[rcx]
|
|
shl eax,4
|
|
movups xmm1,XMMWORD[16+rcx]
|
|
xorps xmm2,xmm0
|
|
pxor xmm3,xmm0
|
|
pxor xmm4,xmm0
|
|
DB 102,15,56,220,209
|
|
lea rcx,[32+rax*1+rcx]
|
|
neg rax
|
|
DB 102,15,56,220,217
|
|
pxor xmm5,xmm0
|
|
pxor xmm6,xmm0
|
|
DB 102,15,56,220,225
|
|
pxor xmm7,xmm0
|
|
movups xmm0,XMMWORD[rax*1+rcx]
|
|
add rax,16
|
|
jmp NEAR $L$enc_loop6_enter
|
|
ALIGN 16
|
|
$L$enc_loop6:
|
|
DB 102,15,56,220,209
|
|
DB 102,15,56,220,217
|
|
DB 102,15,56,220,225
|
|
$L$enc_loop6_enter:
|
|
DB 102,15,56,220,233
|
|
DB 102,15,56,220,241
|
|
DB 102,15,56,220,249
|
|
movups xmm1,XMMWORD[rax*1+rcx]
|
|
add rax,32
|
|
DB 102,15,56,220,208
|
|
DB 102,15,56,220,216
|
|
DB 102,15,56,220,224
|
|
DB 102,15,56,220,232
|
|
DB 102,15,56,220,240
|
|
DB 102,15,56,220,248
|
|
movups xmm0,XMMWORD[((-16))+rax*1+rcx]
|
|
jnz NEAR $L$enc_loop6
|
|
|
|
DB 102,15,56,220,209
|
|
DB 102,15,56,220,217
|
|
DB 102,15,56,220,225
|
|
DB 102,15,56,220,233
|
|
DB 102,15,56,220,241
|
|
DB 102,15,56,220,249
|
|
DB 102,15,56,221,208
|
|
DB 102,15,56,221,216
|
|
DB 102,15,56,221,224
|
|
DB 102,15,56,221,232
|
|
DB 102,15,56,221,240
|
|
DB 102,15,56,221,248
|
|
ret
|
|
|
|
|
|
ALIGN 16
|
|
_aesni_decrypt6:
|
|
movups xmm0,XMMWORD[rcx]
|
|
shl eax,4
|
|
movups xmm1,XMMWORD[16+rcx]
|
|
xorps xmm2,xmm0
|
|
pxor xmm3,xmm0
|
|
pxor xmm4,xmm0
|
|
DB 102,15,56,222,209
|
|
lea rcx,[32+rax*1+rcx]
|
|
neg rax
|
|
DB 102,15,56,222,217
|
|
pxor xmm5,xmm0
|
|
pxor xmm6,xmm0
|
|
DB 102,15,56,222,225
|
|
pxor xmm7,xmm0
|
|
movups xmm0,XMMWORD[rax*1+rcx]
|
|
add rax,16
|
|
jmp NEAR $L$dec_loop6_enter
|
|
ALIGN 16
|
|
$L$dec_loop6:
|
|
DB 102,15,56,222,209
|
|
DB 102,15,56,222,217
|
|
DB 102,15,56,222,225
|
|
$L$dec_loop6_enter:
|
|
DB 102,15,56,222,233
|
|
DB 102,15,56,222,241
|
|
DB 102,15,56,222,249
|
|
movups xmm1,XMMWORD[rax*1+rcx]
|
|
add rax,32
|
|
DB 102,15,56,222,208
|
|
DB 102,15,56,222,216
|
|
DB 102,15,56,222,224
|
|
DB 102,15,56,222,232
|
|
DB 102,15,56,222,240
|
|
DB 102,15,56,222,248
|
|
movups xmm0,XMMWORD[((-16))+rax*1+rcx]
|
|
jnz NEAR $L$dec_loop6
|
|
|
|
DB 102,15,56,222,209
|
|
DB 102,15,56,222,217
|
|
DB 102,15,56,222,225
|
|
DB 102,15,56,222,233
|
|
DB 102,15,56,222,241
|
|
DB 102,15,56,222,249
|
|
DB 102,15,56,223,208
|
|
DB 102,15,56,223,216
|
|
DB 102,15,56,223,224
|
|
DB 102,15,56,223,232
|
|
DB 102,15,56,223,240
|
|
DB 102,15,56,223,248
|
|
ret
|
|
|
|
|
|
ALIGN 16
|
|
_aesni_encrypt8:
|
|
movups xmm0,XMMWORD[rcx]
|
|
shl eax,4
|
|
movups xmm1,XMMWORD[16+rcx]
|
|
xorps xmm2,xmm0
|
|
xorps xmm3,xmm0
|
|
pxor xmm4,xmm0
|
|
pxor xmm5,xmm0
|
|
pxor xmm6,xmm0
|
|
lea rcx,[32+rax*1+rcx]
|
|
neg rax
|
|
DB 102,15,56,220,209
|
|
pxor xmm7,xmm0
|
|
pxor xmm8,xmm0
|
|
DB 102,15,56,220,217
|
|
pxor xmm9,xmm0
|
|
movups xmm0,XMMWORD[rax*1+rcx]
|
|
add rax,16
|
|
jmp NEAR $L$enc_loop8_inner
|
|
ALIGN 16
|
|
$L$enc_loop8:
|
|
DB 102,15,56,220,209
|
|
DB 102,15,56,220,217
|
|
$L$enc_loop8_inner:
|
|
DB 102,15,56,220,225
|
|
DB 102,15,56,220,233
|
|
DB 102,15,56,220,241
|
|
DB 102,15,56,220,249
|
|
DB 102,68,15,56,220,193
|
|
DB 102,68,15,56,220,201
|
|
$L$enc_loop8_enter:
|
|
movups xmm1,XMMWORD[rax*1+rcx]
|
|
add rax,32
|
|
DB 102,15,56,220,208
|
|
DB 102,15,56,220,216
|
|
DB 102,15,56,220,224
|
|
DB 102,15,56,220,232
|
|
DB 102,15,56,220,240
|
|
DB 102,15,56,220,248
|
|
DB 102,68,15,56,220,192
|
|
DB 102,68,15,56,220,200
|
|
movups xmm0,XMMWORD[((-16))+rax*1+rcx]
|
|
jnz NEAR $L$enc_loop8
|
|
|
|
DB 102,15,56,220,209
|
|
DB 102,15,56,220,217
|
|
DB 102,15,56,220,225
|
|
DB 102,15,56,220,233
|
|
DB 102,15,56,220,241
|
|
DB 102,15,56,220,249
|
|
DB 102,68,15,56,220,193
|
|
DB 102,68,15,56,220,201
|
|
DB 102,15,56,221,208
|
|
DB 102,15,56,221,216
|
|
DB 102,15,56,221,224
|
|
DB 102,15,56,221,232
|
|
DB 102,15,56,221,240
|
|
DB 102,15,56,221,248
|
|
DB 102,68,15,56,221,192
|
|
DB 102,68,15,56,221,200
|
|
ret
|
|
|
|
|
|
ALIGN 16
|
|
_aesni_decrypt8:
|
|
movups xmm0,XMMWORD[rcx]
|
|
shl eax,4
|
|
movups xmm1,XMMWORD[16+rcx]
|
|
xorps xmm2,xmm0
|
|
xorps xmm3,xmm0
|
|
pxor xmm4,xmm0
|
|
pxor xmm5,xmm0
|
|
pxor xmm6,xmm0
|
|
lea rcx,[32+rax*1+rcx]
|
|
neg rax
|
|
DB 102,15,56,222,209
|
|
pxor xmm7,xmm0
|
|
pxor xmm8,xmm0
|
|
DB 102,15,56,222,217
|
|
pxor xmm9,xmm0
|
|
movups xmm0,XMMWORD[rax*1+rcx]
|
|
add rax,16
|
|
jmp NEAR $L$dec_loop8_inner
|
|
ALIGN 16
|
|
$L$dec_loop8:
|
|
DB 102,15,56,222,209
|
|
DB 102,15,56,222,217
|
|
$L$dec_loop8_inner:
|
|
DB 102,15,56,222,225
|
|
DB 102,15,56,222,233
|
|
DB 102,15,56,222,241
|
|
DB 102,15,56,222,249
|
|
DB 102,68,15,56,222,193
|
|
DB 102,68,15,56,222,201
|
|
$L$dec_loop8_enter:
|
|
movups xmm1,XMMWORD[rax*1+rcx]
|
|
add rax,32
|
|
DB 102,15,56,222,208
|
|
DB 102,15,56,222,216
|
|
DB 102,15,56,222,224
|
|
DB 102,15,56,222,232
|
|
DB 102,15,56,222,240
|
|
DB 102,15,56,222,248
|
|
DB 102,68,15,56,222,192
|
|
DB 102,68,15,56,222,200
|
|
movups xmm0,XMMWORD[((-16))+rax*1+rcx]
|
|
jnz NEAR $L$dec_loop8
|
|
|
|
DB 102,15,56,222,209
|
|
DB 102,15,56,222,217
|
|
DB 102,15,56,222,225
|
|
DB 102,15,56,222,233
|
|
DB 102,15,56,222,241
|
|
DB 102,15,56,222,249
|
|
DB 102,68,15,56,222,193
|
|
DB 102,68,15,56,222,201
|
|
DB 102,15,56,223,208
|
|
DB 102,15,56,223,216
|
|
DB 102,15,56,223,224
|
|
DB 102,15,56,223,232
|
|
DB 102,15,56,223,240
|
|
DB 102,15,56,223,248
|
|
DB 102,68,15,56,223,192
|
|
DB 102,68,15,56,223,200
|
|
ret
|
|
|
|
global aesni_ctr32_encrypt_blocks
|
|
|
|
ALIGN 16
|
|
aesni_ctr32_encrypt_blocks:
|
|
mov QWORD[8+rsp],rdi ;WIN64 prologue
|
|
mov QWORD[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[40+rsp]
|
|
|
|
|
|
|
|
cmp rdx,1
|
|
jne NEAR $L$ctr32_bulk
|
|
|
|
|
|
|
|
movups xmm2,XMMWORD[r8]
|
|
movups xmm3,XMMWORD[rdi]
|
|
mov edx,DWORD[240+rcx]
|
|
movups xmm0,XMMWORD[rcx]
|
|
movups xmm1,XMMWORD[16+rcx]
|
|
lea rcx,[32+rcx]
|
|
xorps xmm2,xmm0
|
|
$L$oop_enc1_3:
|
|
DB 102,15,56,220,209
|
|
dec edx
|
|
movups xmm1,XMMWORD[rcx]
|
|
lea rcx,[16+rcx]
|
|
jnz NEAR $L$oop_enc1_3
|
|
DB 102,15,56,221,209
|
|
pxor xmm0,xmm0
|
|
pxor xmm1,xmm1
|
|
xorps xmm2,xmm3
|
|
pxor xmm3,xmm3
|
|
movups XMMWORD[rsi],xmm2
|
|
xorps xmm2,xmm2
|
|
jmp NEAR $L$ctr32_epilogue
|
|
|
|
ALIGN 16
|
|
$L$ctr32_bulk:
|
|
lea r11,[rsp]
|
|
|
|
push rbp
|
|
|
|
sub rsp,288
|
|
and rsp,-16
|
|
movaps XMMWORD[(-168)+r11],xmm6
|
|
movaps XMMWORD[(-152)+r11],xmm7
|
|
movaps XMMWORD[(-136)+r11],xmm8
|
|
movaps XMMWORD[(-120)+r11],xmm9
|
|
movaps XMMWORD[(-104)+r11],xmm10
|
|
movaps XMMWORD[(-88)+r11],xmm11
|
|
movaps XMMWORD[(-72)+r11],xmm12
|
|
movaps XMMWORD[(-56)+r11],xmm13
|
|
movaps XMMWORD[(-40)+r11],xmm14
|
|
movaps XMMWORD[(-24)+r11],xmm15
|
|
$L$ctr32_body:
|
|
|
|
|
|
|
|
|
|
movdqu xmm2,XMMWORD[r8]
|
|
movdqu xmm0,XMMWORD[rcx]
|
|
mov r8d,DWORD[12+r8]
|
|
pxor xmm2,xmm0
|
|
mov ebp,DWORD[12+rcx]
|
|
movdqa XMMWORD[rsp],xmm2
|
|
bswap r8d
|
|
movdqa xmm3,xmm2
|
|
movdqa xmm4,xmm2
|
|
movdqa xmm5,xmm2
|
|
movdqa XMMWORD[64+rsp],xmm2
|
|
movdqa XMMWORD[80+rsp],xmm2
|
|
movdqa XMMWORD[96+rsp],xmm2
|
|
mov r10,rdx
|
|
movdqa XMMWORD[112+rsp],xmm2
|
|
|
|
lea rax,[1+r8]
|
|
lea rdx,[2+r8]
|
|
bswap eax
|
|
bswap edx
|
|
xor eax,ebp
|
|
xor edx,ebp
|
|
DB 102,15,58,34,216,3
|
|
lea rax,[3+r8]
|
|
movdqa XMMWORD[16+rsp],xmm3
|
|
DB 102,15,58,34,226,3
|
|
bswap eax
|
|
mov rdx,r10
|
|
lea r10,[4+r8]
|
|
movdqa XMMWORD[32+rsp],xmm4
|
|
xor eax,ebp
|
|
bswap r10d
|
|
DB 102,15,58,34,232,3
|
|
xor r10d,ebp
|
|
movdqa XMMWORD[48+rsp],xmm5
|
|
lea r9,[5+r8]
|
|
mov DWORD[((64+12))+rsp],r10d
|
|
bswap r9d
|
|
lea r10,[6+r8]
|
|
mov eax,DWORD[240+rcx]
|
|
xor r9d,ebp
|
|
bswap r10d
|
|
mov DWORD[((80+12))+rsp],r9d
|
|
xor r10d,ebp
|
|
lea r9,[7+r8]
|
|
mov DWORD[((96+12))+rsp],r10d
|
|
bswap r9d
|
|
; leaq OPENSSL_ia32cap_P(%rip),%r10
|
|
; mov 4(%r10),%r10d
|
|
xor r9d,ebp
|
|
; and $71303168,%r10d
|
|
mov DWORD[((112+12))+rsp],r9d
|
|
|
|
movups xmm1,XMMWORD[16+rcx]
|
|
|
|
movdqa xmm6,XMMWORD[64+rsp]
|
|
movdqa xmm7,XMMWORD[80+rsp]
|
|
|
|
cmp rdx,8
|
|
jb NEAR $L$ctr32_tail
|
|
|
|
sub rdx,6
|
|
; cmp $4194304,%r10d
|
|
; je .Lctr32_6x
|
|
|
|
lea rcx,[128+rcx]
|
|
sub rdx,2
|
|
jmp NEAR $L$ctr32_loop8
|
|
|
|
;.align 16
|
|
;.Lctr32_6x:
|
|
; shl $4,%eax
|
|
; mov $48,%r10d
|
|
; bswap %ebp
|
|
; lea 32(%rcx,%eax),%rcx
|
|
; sub %rax,%r10
|
|
; jmp .Lctr32_loop6
|
|
|
|
ALIGN 16
|
|
$L$ctr32_loop6:
|
|
add r8d,6
|
|
movups xmm0,XMMWORD[((-48))+r10*1+rcx]
|
|
DB 102,15,56,220,209
|
|
mov eax,r8d
|
|
xor eax,ebp
|
|
DB 102,15,56,220,217
|
|
DB 0x0f,0x38,0xf1,0x44,0x24,12
|
|
lea eax,[1+r8]
|
|
DB 102,15,56,220,225
|
|
xor eax,ebp
|
|
DB 0x0f,0x38,0xf1,0x44,0x24,28
|
|
DB 102,15,56,220,233
|
|
lea eax,[2+r8]
|
|
xor eax,ebp
|
|
DB 102,15,56,220,241
|
|
DB 0x0f,0x38,0xf1,0x44,0x24,44
|
|
lea eax,[3+r8]
|
|
DB 102,15,56,220,249
|
|
movups xmm1,XMMWORD[((-32))+r10*1+rcx]
|
|
xor eax,ebp
|
|
|
|
DB 102,15,56,220,208
|
|
DB 0x0f,0x38,0xf1,0x44,0x24,60
|
|
lea eax,[4+r8]
|
|
DB 102,15,56,220,216
|
|
xor eax,ebp
|
|
DB 0x0f,0x38,0xf1,0x44,0x24,76
|
|
DB 102,15,56,220,224
|
|
lea eax,[5+r8]
|
|
xor eax,ebp
|
|
DB 102,15,56,220,232
|
|
DB 0x0f,0x38,0xf1,0x44,0x24,92
|
|
mov rax,r10
|
|
DB 102,15,56,220,240
|
|
DB 102,15,56,220,248
|
|
movups xmm0,XMMWORD[((-16))+r10*1+rcx]
|
|
|
|
call $L$enc_loop6
|
|
|
|
movdqu xmm8,XMMWORD[rdi]
|
|
movdqu xmm9,XMMWORD[16+rdi]
|
|
movdqu xmm10,XMMWORD[32+rdi]
|
|
movdqu xmm11,XMMWORD[48+rdi]
|
|
movdqu xmm12,XMMWORD[64+rdi]
|
|
movdqu xmm13,XMMWORD[80+rdi]
|
|
lea rdi,[96+rdi]
|
|
movups xmm1,XMMWORD[((-64))+r10*1+rcx]
|
|
pxor xmm8,xmm2
|
|
movaps xmm2,XMMWORD[rsp]
|
|
pxor xmm9,xmm3
|
|
movaps xmm3,XMMWORD[16+rsp]
|
|
pxor xmm10,xmm4
|
|
movaps xmm4,XMMWORD[32+rsp]
|
|
pxor xmm11,xmm5
|
|
movaps xmm5,XMMWORD[48+rsp]
|
|
pxor xmm12,xmm6
|
|
movaps xmm6,XMMWORD[64+rsp]
|
|
pxor xmm13,xmm7
|
|
movaps xmm7,XMMWORD[80+rsp]
|
|
movdqu XMMWORD[rsi],xmm8
|
|
movdqu XMMWORD[16+rsi],xmm9
|
|
movdqu XMMWORD[32+rsi],xmm10
|
|
movdqu XMMWORD[48+rsi],xmm11
|
|
movdqu XMMWORD[64+rsi],xmm12
|
|
movdqu XMMWORD[80+rsi],xmm13
|
|
lea rsi,[96+rsi]
|
|
|
|
sub rdx,6
|
|
jnc NEAR $L$ctr32_loop6
|
|
|
|
add rdx,6
|
|
jz NEAR $L$ctr32_done
|
|
|
|
lea eax,[((-48))+r10]
|
|
lea rcx,[((-80))+r10*1+rcx]
|
|
neg eax
|
|
shr eax,4
|
|
jmp NEAR $L$ctr32_tail
|
|
|
|
ALIGN 32
|
|
$L$ctr32_loop8:
|
|
add r8d,8
|
|
movdqa xmm8,XMMWORD[96+rsp]
|
|
DB 102,15,56,220,209
|
|
mov r9d,r8d
|
|
movdqa xmm9,XMMWORD[112+rsp]
|
|
DB 102,15,56,220,217
|
|
bswap r9d
|
|
movups xmm0,XMMWORD[((32-128))+rcx]
|
|
DB 102,15,56,220,225
|
|
xor r9d,ebp
|
|
nop
|
|
DB 102,15,56,220,233
|
|
mov DWORD[((0+12))+rsp],r9d
|
|
lea r9,[1+r8]
|
|
DB 102,15,56,220,241
|
|
DB 102,15,56,220,249
|
|
DB 102,68,15,56,220,193
|
|
DB 102,68,15,56,220,201
|
|
movups xmm1,XMMWORD[((48-128))+rcx]
|
|
bswap r9d
|
|
DB 102,15,56,220,208
|
|
DB 102,15,56,220,216
|
|
xor r9d,ebp
|
|
DB 0x66,0x90
|
|
DB 102,15,56,220,224
|
|
DB 102,15,56,220,232
|
|
mov DWORD[((16+12))+rsp],r9d
|
|
lea r9,[2+r8]
|
|
DB 102,15,56,220,240
|
|
DB 102,15,56,220,248
|
|
DB 102,68,15,56,220,192
|
|
DB 102,68,15,56,220,200
|
|
movups xmm0,XMMWORD[((64-128))+rcx]
|
|
bswap r9d
|
|
DB 102,15,56,220,209
|
|
DB 102,15,56,220,217
|
|
xor r9d,ebp
|
|
DB 0x66,0x90
|
|
DB 102,15,56,220,225
|
|
DB 102,15,56,220,233
|
|
mov DWORD[((32+12))+rsp],r9d
|
|
lea r9,[3+r8]
|
|
DB 102,15,56,220,241
|
|
DB 102,15,56,220,249
|
|
DB 102,68,15,56,220,193
|
|
DB 102,68,15,56,220,201
|
|
movups xmm1,XMMWORD[((80-128))+rcx]
|
|
bswap r9d
|
|
DB 102,15,56,220,208
|
|
DB 102,15,56,220,216
|
|
xor r9d,ebp
|
|
DB 0x66,0x90
|
|
DB 102,15,56,220,224
|
|
DB 102,15,56,220,232
|
|
mov DWORD[((48+12))+rsp],r9d
|
|
lea r9,[4+r8]
|
|
DB 102,15,56,220,240
|
|
DB 102,15,56,220,248
|
|
DB 102,68,15,56,220,192
|
|
DB 102,68,15,56,220,200
|
|
movups xmm0,XMMWORD[((96-128))+rcx]
|
|
bswap r9d
|
|
DB 102,15,56,220,209
|
|
DB 102,15,56,220,217
|
|
xor r9d,ebp
|
|
DB 0x66,0x90
|
|
DB 102,15,56,220,225
|
|
DB 102,15,56,220,233
|
|
mov DWORD[((64+12))+rsp],r9d
|
|
lea r9,[5+r8]
|
|
DB 102,15,56,220,241
|
|
DB 102,15,56,220,249
|
|
DB 102,68,15,56,220,193
|
|
DB 102,68,15,56,220,201
|
|
movups xmm1,XMMWORD[((112-128))+rcx]
|
|
bswap r9d
|
|
DB 102,15,56,220,208
|
|
DB 102,15,56,220,216
|
|
xor r9d,ebp
|
|
DB 0x66,0x90
|
|
DB 102,15,56,220,224
|
|
DB 102,15,56,220,232
|
|
mov DWORD[((80+12))+rsp],r9d
|
|
lea r9,[6+r8]
|
|
DB 102,15,56,220,240
|
|
DB 102,15,56,220,248
|
|
DB 102,68,15,56,220,192
|
|
DB 102,68,15,56,220,200
|
|
movups xmm0,XMMWORD[((128-128))+rcx]
|
|
bswap r9d
|
|
DB 102,15,56,220,209
|
|
DB 102,15,56,220,217
|
|
xor r9d,ebp
|
|
DB 0x66,0x90
|
|
DB 102,15,56,220,225
|
|
DB 102,15,56,220,233
|
|
mov DWORD[((96+12))+rsp],r9d
|
|
lea r9,[7+r8]
|
|
DB 102,15,56,220,241
|
|
DB 102,15,56,220,249
|
|
DB 102,68,15,56,220,193
|
|
DB 102,68,15,56,220,201
|
|
movups xmm1,XMMWORD[((144-128))+rcx]
|
|
bswap r9d
|
|
DB 102,15,56,220,208
|
|
DB 102,15,56,220,216
|
|
DB 102,15,56,220,224
|
|
xor r9d,ebp
|
|
movdqu xmm10,XMMWORD[rdi]
|
|
DB 102,15,56,220,232
|
|
mov DWORD[((112+12))+rsp],r9d
|
|
cmp eax,11
|
|
DB 102,15,56,220,240
|
|
DB 102,15,56,220,248
|
|
DB 102,68,15,56,220,192
|
|
DB 102,68,15,56,220,200
|
|
movups xmm0,XMMWORD[((160-128))+rcx]
|
|
|
|
jb NEAR $L$ctr32_enc_done
|
|
|
|
DB 102,15,56,220,209
|
|
DB 102,15,56,220,217
|
|
DB 102,15,56,220,225
|
|
DB 102,15,56,220,233
|
|
DB 102,15,56,220,241
|
|
DB 102,15,56,220,249
|
|
DB 102,68,15,56,220,193
|
|
DB 102,68,15,56,220,201
|
|
movups xmm1,XMMWORD[((176-128))+rcx]
|
|
|
|
DB 102,15,56,220,208
|
|
DB 102,15,56,220,216
|
|
DB 102,15,56,220,224
|
|
DB 102,15,56,220,232
|
|
DB 102,15,56,220,240
|
|
DB 102,15,56,220,248
|
|
DB 102,68,15,56,220,192
|
|
DB 102,68,15,56,220,200
|
|
movups xmm0,XMMWORD[((192-128))+rcx]
|
|
je NEAR $L$ctr32_enc_done
|
|
|
|
DB 102,15,56,220,209
|
|
DB 102,15,56,220,217
|
|
DB 102,15,56,220,225
|
|
DB 102,15,56,220,233
|
|
DB 102,15,56,220,241
|
|
DB 102,15,56,220,249
|
|
DB 102,68,15,56,220,193
|
|
DB 102,68,15,56,220,201
|
|
movups xmm1,XMMWORD[((208-128))+rcx]
|
|
|
|
DB 102,15,56,220,208
|
|
DB 102,15,56,220,216
|
|
DB 102,15,56,220,224
|
|
DB 102,15,56,220,232
|
|
DB 102,15,56,220,240
|
|
DB 102,15,56,220,248
|
|
DB 102,68,15,56,220,192
|
|
DB 102,68,15,56,220,200
|
|
movups xmm0,XMMWORD[((224-128))+rcx]
|
|
jmp NEAR $L$ctr32_enc_done
|
|
|
|
ALIGN 16
|
|
$L$ctr32_enc_done:
|
|
movdqu xmm11,XMMWORD[16+rdi]
|
|
pxor xmm10,xmm0
|
|
movdqu xmm12,XMMWORD[32+rdi]
|
|
pxor xmm11,xmm0
|
|
movdqu xmm13,XMMWORD[48+rdi]
|
|
pxor xmm12,xmm0
|
|
movdqu xmm14,XMMWORD[64+rdi]
|
|
pxor xmm13,xmm0
|
|
movdqu xmm15,XMMWORD[80+rdi]
|
|
pxor xmm14,xmm0
|
|
pxor xmm15,xmm0
|
|
DB 102,15,56,220,209
|
|
DB 102,15,56,220,217
|
|
DB 102,15,56,220,225
|
|
DB 102,15,56,220,233
|
|
DB 102,15,56,220,241
|
|
DB 102,15,56,220,249
|
|
DB 102,68,15,56,220,193
|
|
DB 102,68,15,56,220,201
|
|
movdqu xmm1,XMMWORD[96+rdi]
|
|
lea rdi,[128+rdi]
|
|
|
|
DB 102,65,15,56,221,210
|
|
pxor xmm1,xmm0
|
|
movdqu xmm10,XMMWORD[((112-128))+rdi]
|
|
DB 102,65,15,56,221,219
|
|
pxor xmm10,xmm0
|
|
movdqa xmm11,XMMWORD[rsp]
|
|
DB 102,65,15,56,221,228
|
|
DB 102,65,15,56,221,237
|
|
movdqa xmm12,XMMWORD[16+rsp]
|
|
movdqa xmm13,XMMWORD[32+rsp]
|
|
DB 102,65,15,56,221,246
|
|
DB 102,65,15,56,221,255
|
|
movdqa xmm14,XMMWORD[48+rsp]
|
|
movdqa xmm15,XMMWORD[64+rsp]
|
|
DB 102,68,15,56,221,193
|
|
movdqa xmm0,XMMWORD[80+rsp]
|
|
movups xmm1,XMMWORD[((16-128))+rcx]
|
|
DB 102,69,15,56,221,202
|
|
|
|
movups XMMWORD[rsi],xmm2
|
|
movdqa xmm2,xmm11
|
|
movups XMMWORD[16+rsi],xmm3
|
|
movdqa xmm3,xmm12
|
|
movups XMMWORD[32+rsi],xmm4
|
|
movdqa xmm4,xmm13
|
|
movups XMMWORD[48+rsi],xmm5
|
|
movdqa xmm5,xmm14
|
|
movups XMMWORD[64+rsi],xmm6
|
|
movdqa xmm6,xmm15
|
|
movups XMMWORD[80+rsi],xmm7
|
|
movdqa xmm7,xmm0
|
|
movups XMMWORD[96+rsi],xmm8
|
|
movups XMMWORD[112+rsi],xmm9
|
|
lea rsi,[128+rsi]
|
|
|
|
sub rdx,8
|
|
jnc NEAR $L$ctr32_loop8
|
|
|
|
add rdx,8
|
|
jz NEAR $L$ctr32_done
|
|
lea rcx,[((-128))+rcx]
|
|
|
|
$L$ctr32_tail:
|
|
|
|
|
|
lea rcx,[16+rcx]
|
|
cmp rdx,4
|
|
jb NEAR $L$ctr32_loop3
|
|
je NEAR $L$ctr32_loop4
|
|
|
|
|
|
shl eax,4
|
|
movdqa xmm8,XMMWORD[96+rsp]
|
|
pxor xmm9,xmm9
|
|
|
|
movups xmm0,XMMWORD[16+rcx]
|
|
DB 102,15,56,220,209
|
|
DB 102,15,56,220,217
|
|
lea rcx,[((32-16))+rax*1+rcx]
|
|
neg rax
|
|
DB 102,15,56,220,225
|
|
add rax,16
|
|
movups xmm10,XMMWORD[rdi]
|
|
DB 102,15,56,220,233
|
|
DB 102,15,56,220,241
|
|
movups xmm11,XMMWORD[16+rdi]
|
|
movups xmm12,XMMWORD[32+rdi]
|
|
DB 102,15,56,220,249
|
|
DB 102,68,15,56,220,193
|
|
|
|
call $L$enc_loop8_enter
|
|
|
|
movdqu xmm13,XMMWORD[48+rdi]
|
|
pxor xmm2,xmm10
|
|
movdqu xmm10,XMMWORD[64+rdi]
|
|
pxor xmm3,xmm11
|
|
movdqu XMMWORD[rsi],xmm2
|
|
pxor xmm4,xmm12
|
|
movdqu XMMWORD[16+rsi],xmm3
|
|
pxor xmm5,xmm13
|
|
movdqu XMMWORD[32+rsi],xmm4
|
|
pxor xmm6,xmm10
|
|
movdqu XMMWORD[48+rsi],xmm5
|
|
movdqu XMMWORD[64+rsi],xmm6
|
|
cmp rdx,6
|
|
jb NEAR $L$ctr32_done
|
|
|
|
movups xmm11,XMMWORD[80+rdi]
|
|
xorps xmm7,xmm11
|
|
movups XMMWORD[80+rsi],xmm7
|
|
je NEAR $L$ctr32_done
|
|
|
|
movups xmm12,XMMWORD[96+rdi]
|
|
xorps xmm8,xmm12
|
|
movups XMMWORD[96+rsi],xmm8
|
|
jmp NEAR $L$ctr32_done
|
|
|
|
ALIGN 32
|
|
$L$ctr32_loop4:
|
|
DB 102,15,56,220,209
|
|
lea rcx,[16+rcx]
|
|
dec eax
|
|
DB 102,15,56,220,217
|
|
DB 102,15,56,220,225
|
|
DB 102,15,56,220,233
|
|
movups xmm1,XMMWORD[rcx]
|
|
jnz NEAR $L$ctr32_loop4
|
|
DB 102,15,56,221,209
|
|
DB 102,15,56,221,217
|
|
movups xmm10,XMMWORD[rdi]
|
|
movups xmm11,XMMWORD[16+rdi]
|
|
DB 102,15,56,221,225
|
|
DB 102,15,56,221,233
|
|
movups xmm12,XMMWORD[32+rdi]
|
|
movups xmm13,XMMWORD[48+rdi]
|
|
|
|
xorps xmm2,xmm10
|
|
movups XMMWORD[rsi],xmm2
|
|
xorps xmm3,xmm11
|
|
movups XMMWORD[16+rsi],xmm3
|
|
pxor xmm4,xmm12
|
|
movdqu XMMWORD[32+rsi],xmm4
|
|
pxor xmm5,xmm13
|
|
movdqu XMMWORD[48+rsi],xmm5
|
|
jmp NEAR $L$ctr32_done
|
|
|
|
ALIGN 32
|
|
$L$ctr32_loop3:
|
|
DB 102,15,56,220,209
|
|
lea rcx,[16+rcx]
|
|
dec eax
|
|
DB 102,15,56,220,217
|
|
DB 102,15,56,220,225
|
|
movups xmm1,XMMWORD[rcx]
|
|
jnz NEAR $L$ctr32_loop3
|
|
DB 102,15,56,221,209
|
|
DB 102,15,56,221,217
|
|
DB 102,15,56,221,225
|
|
|
|
movups xmm10,XMMWORD[rdi]
|
|
xorps xmm2,xmm10
|
|
movups XMMWORD[rsi],xmm2
|
|
cmp rdx,2
|
|
jb NEAR $L$ctr32_done
|
|
|
|
movups xmm11,XMMWORD[16+rdi]
|
|
xorps xmm3,xmm11
|
|
movups XMMWORD[16+rsi],xmm3
|
|
je NEAR $L$ctr32_done
|
|
|
|
movups xmm12,XMMWORD[32+rdi]
|
|
xorps xmm4,xmm12
|
|
movups XMMWORD[32+rsi],xmm4
|
|
|
|
$L$ctr32_done:
|
|
xorps xmm0,xmm0
|
|
xor ebp,ebp
|
|
pxor xmm1,xmm1
|
|
pxor xmm2,xmm2
|
|
pxor xmm3,xmm3
|
|
pxor xmm4,xmm4
|
|
pxor xmm5,xmm5
|
|
movaps xmm6,XMMWORD[((-168))+r11]
|
|
movaps XMMWORD[(-168)+r11],xmm0
|
|
movaps xmm7,XMMWORD[((-152))+r11]
|
|
movaps XMMWORD[(-152)+r11],xmm0
|
|
movaps xmm8,XMMWORD[((-136))+r11]
|
|
movaps XMMWORD[(-136)+r11],xmm0
|
|
movaps xmm9,XMMWORD[((-120))+r11]
|
|
movaps XMMWORD[(-120)+r11],xmm0
|
|
movaps xmm10,XMMWORD[((-104))+r11]
|
|
movaps XMMWORD[(-104)+r11],xmm0
|
|
movaps xmm11,XMMWORD[((-88))+r11]
|
|
movaps XMMWORD[(-88)+r11],xmm0
|
|
movaps xmm12,XMMWORD[((-72))+r11]
|
|
movaps XMMWORD[(-72)+r11],xmm0
|
|
movaps xmm13,XMMWORD[((-56))+r11]
|
|
movaps XMMWORD[(-56)+r11],xmm0
|
|
movaps xmm14,XMMWORD[((-40))+r11]
|
|
movaps XMMWORD[(-40)+r11],xmm0
|
|
movaps xmm15,XMMWORD[((-24))+r11]
|
|
movaps XMMWORD[(-24)+r11],xmm0
|
|
movaps XMMWORD[rsp],xmm0
|
|
movaps XMMWORD[16+rsp],xmm0
|
|
movaps XMMWORD[32+rsp],xmm0
|
|
movaps XMMWORD[48+rsp],xmm0
|
|
movaps XMMWORD[64+rsp],xmm0
|
|
movaps XMMWORD[80+rsp],xmm0
|
|
movaps XMMWORD[96+rsp],xmm0
|
|
movaps XMMWORD[112+rsp],xmm0
|
|
mov rbp,QWORD[((-8))+r11]
|
|
|
|
lea rsp,[r11]
|
|
|
|
$L$ctr32_epilogue:
|
|
mov rdi,QWORD[8+rsp] ;WIN64 epilogue
|
|
mov rsi,QWORD[16+rsp]
|
|
ret
|
|
|
|
$L$SEH_end_aesni_ctr32_encrypt_blocks:
|
|
global aesni_set_decrypt_key
|
|
|
|
ALIGN 16
|
|
aesni_set_decrypt_key:
|
|
|
|
DB 0x48,0x83,0xEC,0x08
|
|
|
|
call __aesni_set_encrypt_key
|
|
shl edx,4
|
|
test eax,eax
|
|
jnz NEAR $L$dec_key_ret
|
|
lea rcx,[16+rdx*1+r8]
|
|
|
|
movups xmm0,XMMWORD[r8]
|
|
movups xmm1,XMMWORD[rcx]
|
|
movups XMMWORD[rcx],xmm0
|
|
movups XMMWORD[r8],xmm1
|
|
lea r8,[16+r8]
|
|
lea rcx,[((-16))+rcx]
|
|
|
|
$L$dec_key_inverse:
|
|
movups xmm0,XMMWORD[r8]
|
|
movups xmm1,XMMWORD[rcx]
|
|
DB 102,15,56,219,192
|
|
DB 102,15,56,219,201
|
|
lea r8,[16+r8]
|
|
lea rcx,[((-16))+rcx]
|
|
movups XMMWORD[16+rcx],xmm0
|
|
movups XMMWORD[(-16)+r8],xmm1
|
|
cmp rcx,r8
|
|
ja NEAR $L$dec_key_inverse
|
|
|
|
movups xmm0,XMMWORD[r8]
|
|
DB 102,15,56,219,192
|
|
pxor xmm1,xmm1
|
|
movups XMMWORD[rcx],xmm0
|
|
pxor xmm0,xmm0
|
|
$L$dec_key_ret:
|
|
add rsp,8
|
|
|
|
ret
|
|
|
|
$L$SEH_end_set_decrypt_key:
|
|
|
|
global aesni_set_encrypt_key
|
|
|
|
ALIGN 16
|
|
aesni_set_encrypt_key:
|
|
__aesni_set_encrypt_key:
|
|
|
|
DB 0x48,0x83,0xEC,0x08
|
|
|
|
mov rax,-1
|
|
test rcx,rcx
|
|
jz NEAR $L$enc_key_ret
|
|
test r8,r8
|
|
jz NEAR $L$enc_key_ret
|
|
|
|
movups xmm0,XMMWORD[rcx]
|
|
xorps xmm4,xmm4
|
|
; leaq OPENSSL_ia32cap_P(%rip),%r10
|
|
; movl 4(%r10),%r10d
|
|
; and $268437504,%r10d
|
|
lea rax,[16+r8]
|
|
cmp edx,256
|
|
je NEAR $L$14rounds
|
|
cmp edx,192
|
|
je NEAR $L$12rounds
|
|
cmp edx,128
|
|
jne NEAR $L$bad_keybits
|
|
|
|
$L$10rounds:
|
|
mov edx,9
|
|
; cmp $268435456,%r10d
|
|
; je .L10rounds_alt
|
|
; jmp .L10rounds_alt
|
|
; movups %xmm0,(%r8)
|
|
; .byte 102,15,58,223,200,1
|
|
; call .Lkey_expansion_128_cold
|
|
; .byte 102,15,58,223,200,2
|
|
; call .Lkey_expansion_128
|
|
; .byte 102,15,58,223,200,4
|
|
; call .Lkey_expansion_128
|
|
; .byte 102,15,58,223,200,8
|
|
; call .Lkey_expansion_128
|
|
; .byte 102,15,58,223,200,16
|
|
; call .Lkey_expansion_128
|
|
; .byte 102,15,58,223,200,32
|
|
; call .Lkey_expansion_128
|
|
; .byte 102,15,58,223,200,64
|
|
; call .Lkey_expansion_128
|
|
; .byte 102,15,58,223,200,128
|
|
; call .Lkey_expansion_128
|
|
; .byte 102,15,58,223,200,27
|
|
; call .Lkey_expansion_128
|
|
; .byte 102,15,58,223,200,54
|
|
; call .Lkey_expansion_128
|
|
; movups %xmm0,(%rax)
|
|
; mov %edx,80(%rax)
|
|
; xor %eax,%eax
|
|
; jmp .Lenc_key_ret
|
|
|
|
;.align 16
|
|
;.L10rounds_alt:
|
|
movdqa xmm5,XMMWORD[$L$key_rotate]
|
|
mov r10d,8
|
|
movdqa xmm4,XMMWORD[$L$key_rcon1]
|
|
movdqa xmm2,xmm0
|
|
movdqu XMMWORD[r8],xmm0
|
|
jmp NEAR $L$oop_key128
|
|
|
|
ALIGN 16
|
|
$L$oop_key128:
|
|
pshufb xmm0,xmm5
|
|
DB 102,15,56,221,196
|
|
pslld xmm4,1
|
|
lea rax,[16+rax]
|
|
|
|
movdqa xmm3,xmm2
|
|
pslldq xmm2,4
|
|
pxor xmm3,xmm2
|
|
pslldq xmm2,4
|
|
pxor xmm3,xmm2
|
|
pslldq xmm2,4
|
|
pxor xmm2,xmm3
|
|
|
|
pxor xmm0,xmm2
|
|
movdqu XMMWORD[(-16)+rax],xmm0
|
|
movdqa xmm2,xmm0
|
|
|
|
dec r10d
|
|
jnz NEAR $L$oop_key128
|
|
|
|
movdqa xmm4,XMMWORD[$L$key_rcon1b]
|
|
|
|
pshufb xmm0,xmm5
|
|
DB 102,15,56,221,196
|
|
pslld xmm4,1
|
|
|
|
movdqa xmm3,xmm2
|
|
pslldq xmm2,4
|
|
pxor xmm3,xmm2
|
|
pslldq xmm2,4
|
|
pxor xmm3,xmm2
|
|
pslldq xmm2,4
|
|
pxor xmm2,xmm3
|
|
|
|
pxor xmm0,xmm2
|
|
movdqu XMMWORD[rax],xmm0
|
|
|
|
movdqa xmm2,xmm0
|
|
pshufb xmm0,xmm5
|
|
DB 102,15,56,221,196
|
|
|
|
movdqa xmm3,xmm2
|
|
pslldq xmm2,4
|
|
pxor xmm3,xmm2
|
|
pslldq xmm2,4
|
|
pxor xmm3,xmm2
|
|
pslldq xmm2,4
|
|
pxor xmm2,xmm3
|
|
|
|
pxor xmm0,xmm2
|
|
movdqu XMMWORD[16+rax],xmm0
|
|
|
|
mov DWORD[96+rax],edx
|
|
xor eax,eax
|
|
jmp NEAR $L$enc_key_ret
|
|
|
|
ALIGN 16
|
|
$L$12rounds:
|
|
movq xmm2,QWORD[16+rcx]
|
|
mov edx,11
|
|
; cmp $268435456,%r10d
|
|
; je .L12rounds_alt
|
|
|
|
; movups %xmm0,(%r8)
|
|
; .byte 102,15,58,223,202,1
|
|
; call .Lkey_expansion_192a_cold
|
|
; .byte 102,15,58,223,202,2
|
|
; call .Lkey_expansion_192b
|
|
; .byte 102,15,58,223,202,4
|
|
; call .Lkey_expansion_192a
|
|
; .byte 102,15,58,223,202,8
|
|
; call .Lkey_expansion_192b
|
|
; .byte 102,15,58,223,202,16
|
|
; call .Lkey_expansion_192a
|
|
; .byte 102,15,58,223,202,32
|
|
; call .Lkey_expansion_192b
|
|
; .byte 102,15,58,223,202,64
|
|
; call .Lkey_expansion_192a
|
|
; .byte 102,15,58,223,202,128
|
|
; call .Lkey_expansion_192b
|
|
; movups %xmm0,(%rax)
|
|
; mov %edx,48(%rax)
|
|
; xor %rax, %rax
|
|
; jmp .Lenc_key_ret
|
|
|
|
;.align 16
|
|
;.L12rounds_alt:
|
|
movdqa xmm5,XMMWORD[$L$key_rotate192]
|
|
movdqa xmm4,XMMWORD[$L$key_rcon1]
|
|
mov r10d,8
|
|
movdqu XMMWORD[r8],xmm0
|
|
jmp NEAR $L$oop_key192
|
|
|
|
ALIGN 16
|
|
$L$oop_key192:
|
|
movq QWORD[rax],xmm2
|
|
movdqa xmm1,xmm2
|
|
pshufb xmm2,xmm5
|
|
DB 102,15,56,221,212
|
|
pslld xmm4,1
|
|
lea rax,[24+rax]
|
|
|
|
movdqa xmm3,xmm0
|
|
pslldq xmm0,4
|
|
pxor xmm3,xmm0
|
|
pslldq xmm0,4
|
|
pxor xmm3,xmm0
|
|
pslldq xmm0,4
|
|
pxor xmm0,xmm3
|
|
|
|
pshufd xmm3,xmm0,0xff
|
|
pxor xmm3,xmm1
|
|
pslldq xmm1,4
|
|
pxor xmm3,xmm1
|
|
|
|
pxor xmm0,xmm2
|
|
pxor xmm2,xmm3
|
|
movdqu XMMWORD[(-16)+rax],xmm0
|
|
|
|
dec r10d
|
|
jnz NEAR $L$oop_key192
|
|
|
|
mov DWORD[32+rax],edx
|
|
xor eax,eax
|
|
jmp NEAR $L$enc_key_ret
|
|
|
|
ALIGN 16
|
|
$L$14rounds:
|
|
movups xmm2,XMMWORD[16+rcx]
|
|
mov edx,13
|
|
lea rax,[16+rax]
|
|
; cmp $268435456,%r10d
|
|
; je .L14rounds_alt
|
|
;
|
|
; movups %xmm0,(%r8)
|
|
; movups %xmm2,16(%r8)
|
|
; .byte 102,15,58,223,202,1
|
|
; call .Lkey_expansion_256a_cold
|
|
; .byte 102,15,58,223,200,1
|
|
; call .Lkey_expansion_256b
|
|
; .byte 102,15,58,223,202,2
|
|
; call .Lkey_expansion_256a
|
|
; .byte 102,15,58,223,200,2
|
|
; call .Lkey_expansion_256b
|
|
; .byte 102,15,58,223,202,4
|
|
; call .Lkey_expansion_256a
|
|
; .byte 102,15,58,223,200,4
|
|
; call .Lkey_expansion_256b
|
|
; .byte 102,15,58,223,202,8
|
|
; call .Lkey_expansion_256a
|
|
; .byte 102,15,58,223,200,8
|
|
; call .Lkey_expansion_256b
|
|
; .byte 102,15,58,223,202,16
|
|
; call .Lkey_expansion_256a
|
|
; .byte 102,15,58,223,200,16
|
|
; call .Lkey_expansion_256b
|
|
; .byte 102,15,58,223,202,32
|
|
; call .Lkey_expansion_256a
|
|
; .byte 102,15,58,223,200,32
|
|
; call .Lkey_expansion_256b
|
|
; .byte 102,15,58,223,202,64
|
|
; call .Lkey_expansion_256a
|
|
; movups %xmm0,(%rax)
|
|
; mov %edx,16(%rax)
|
|
; xor %rax,%rax
|
|
; jmp .Lenc_key_ret
|
|
|
|
;.align 16
|
|
;.L14rounds_alt:
|
|
movdqa xmm5,XMMWORD[$L$key_rotate]
|
|
movdqa xmm4,XMMWORD[$L$key_rcon1]
|
|
mov r10d,7
|
|
movdqu XMMWORD[r8],xmm0
|
|
movdqa xmm1,xmm2
|
|
movdqu XMMWORD[16+r8],xmm2
|
|
jmp NEAR $L$oop_key256
|
|
|
|
ALIGN 16
|
|
$L$oop_key256:
|
|
pshufb xmm2,xmm5
|
|
DB 102,15,56,221,212
|
|
|
|
movdqa xmm3,xmm0
|
|
pslldq xmm0,4
|
|
pxor xmm3,xmm0
|
|
pslldq xmm0,4
|
|
pxor xmm3,xmm0
|
|
pslldq xmm0,4
|
|
pxor xmm0,xmm3
|
|
pslld xmm4,1
|
|
|
|
pxor xmm0,xmm2
|
|
movdqu XMMWORD[rax],xmm0
|
|
|
|
dec r10d
|
|
jz NEAR $L$done_key256
|
|
|
|
pshufd xmm2,xmm0,0xff
|
|
pxor xmm3,xmm3
|
|
DB 102,15,56,221,211
|
|
|
|
movdqa xmm3,xmm1
|
|
pslldq xmm1,4
|
|
pxor xmm3,xmm1
|
|
pslldq xmm1,4
|
|
pxor xmm3,xmm1
|
|
pslldq xmm1,4
|
|
pxor xmm1,xmm3
|
|
|
|
pxor xmm2,xmm1
|
|
movdqu XMMWORD[16+rax],xmm2
|
|
lea rax,[32+rax]
|
|
movdqa xmm1,xmm2
|
|
|
|
jmp NEAR $L$oop_key256
|
|
|
|
$L$done_key256:
|
|
mov DWORD[16+rax],edx
|
|
xor eax,eax
|
|
jmp NEAR $L$enc_key_ret
|
|
|
|
ALIGN 16
|
|
$L$bad_keybits:
|
|
mov rax,-2
|
|
$L$enc_key_ret:
|
|
pxor xmm0,xmm0
|
|
pxor xmm1,xmm1
|
|
pxor xmm2,xmm2
|
|
pxor xmm3,xmm3
|
|
pxor xmm4,xmm4
|
|
pxor xmm5,xmm5
|
|
add rsp,8
|
|
|
|
ret
|
|
|
|
$L$SEH_end_set_encrypt_key:
|
|
|
|
;.align 16
|
|
;.Lkey_expansion_128:
|
|
; movups %xmm0,(%rax)
|
|
; lea 16(%rax),%rax
|
|
;.Lkey_expansion_128_cold:
|
|
; shufps $0b00010000,%xmm0,%xmm4
|
|
; xorps %xmm4, %xmm0
|
|
; shufps $0b10001100,%xmm0,%xmm4
|
|
; xorps %xmm4, %xmm0
|
|
; shufps $0b11111111,%xmm1,%xmm1
|
|
; xorps %xmm1,%xmm0
|
|
; ret
|
|
|
|
;.align 16
|
|
;.Lkey_expansion_192a:
|
|
; movups %xmm0,(%rax)
|
|
; lea 16(%rax),%rax
|
|
;.Lkey_expansion_192a_cold:
|
|
; movaps %xmm2, %xmm5
|
|
;.Lkey_expansion_192b_warm:
|
|
; shufps $0b00010000,%xmm0,%xmm4
|
|
; movdqa %xmm2,%xmm3
|
|
; xorps %xmm4,%xmm0
|
|
; shufps $0b10001100,%xmm0,%xmm4
|
|
; pslldq $4,%xmm3
|
|
; xorps %xmm4,%xmm0
|
|
; pshufd $0b01010101,%xmm1,%xmm1
|
|
; pxor %xmm3,%xmm2
|
|
; pxor %xmm1,%xmm0
|
|
; pshufd $0b11111111,%xmm0,%xmm3
|
|
; pxor %xmm3,%xmm2
|
|
; ret
|
|
;
|
|
;.align 16
|
|
;.Lkey_expansion_192b:
|
|
; movaps %xmm0,%xmm3
|
|
; shufps $0b01000100,%xmm0,%xmm5
|
|
; movups %xmm5,(%rax)
|
|
; shufps $0b01001110,%xmm2,%xmm3
|
|
; movups %xmm3,16(%rax)
|
|
; lea 32(%rax),%rax
|
|
; jmp .Lkey_expansion_192b_warm
|
|
;
|
|
;.align 16
|
|
;.Lkey_expansion_256a:
|
|
; movups %xmm2,(%rax)
|
|
; lea 16(%rax),%rax
|
|
;.Lkey_expansion_256a_cold:
|
|
; shufps $0b00010000,%xmm0,%xmm4
|
|
; xorps %xmm4,%xmm0
|
|
; shufps $0b10001100,%xmm0,%xmm4
|
|
; xorps %xmm4,%xmm0
|
|
; shufps $0b11111111,%xmm1,%xmm1
|
|
; xorps %xmm1,%xmm0
|
|
; ret
|
|
;
|
|
;.align 16
|
|
;.Lkey_expansion_256b:
|
|
; movups %xmm0,(%rax)
|
|
; lea 16(%rax),%rax
|
|
;
|
|
; shufps $0b00010000,%xmm2,%xmm4
|
|
; xorps %xmm4,%xmm2
|
|
; shufps $0b10001100,%xmm2,%xmm4
|
|
; xorps %xmm4,%xmm2
|
|
; shufps $0b10101010,%xmm1,%xmm1
|
|
; xorps %xmm1,%xmm2
|
|
; ret
|
|
|
|
|
|
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 0x87,0,1,0
|
|
$L$increment1:
|
|
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
|
|
$L$key_rotate:
|
|
DD 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d
|
|
$L$key_rotate192:
|
|
DD 0x04070605,0x04070605,0x04070605,0x04070605
|
|
$L$key_rcon1:
|
|
DD 1,1,1,1
|
|
$L$key_rcon1b:
|
|
DD 0x1b,0x1b,0x1b,0x1b
|
|
|
|
ALIGN 64
|
|
EXTERN __imp_RtlVirtualUnwind
|
|
|
|
ALIGN 16
|
|
ctr_xts_se_handler:
|
|
push rsi
|
|
push rdi
|
|
push rbx
|
|
push rbp
|
|
push r12
|
|
push r13
|
|
push r14
|
|
push r15
|
|
pushfq
|
|
sub rsp,64
|
|
|
|
mov rax,QWORD[120+r8]
|
|
mov rbx,QWORD[248+r8]
|
|
|
|
mov rsi,QWORD[8+r9]
|
|
mov r11,QWORD[56+r9]
|
|
|
|
mov r10d,DWORD[r11]
|
|
lea r10,[r10*1+rsi]
|
|
cmp rbx,r10
|
|
jb NEAR $L$common_seh_tail
|
|
|
|
mov rax,QWORD[152+r8]
|
|
|
|
mov r10d,DWORD[4+r11]
|
|
lea r10,[r10*1+rsi]
|
|
cmp rbx,r10
|
|
jae NEAR $L$common_seh_tail
|
|
|
|
mov rax,QWORD[208+r8]
|
|
|
|
lea rsi,[((-168))+rax]
|
|
lea rdi,[512+r8]
|
|
mov ecx,20
|
|
DD 0xa548f3fc
|
|
|
|
mov rbp,QWORD[((-8))+rax]
|
|
mov QWORD[160+r8],rbp
|
|
jmp NEAR $L$common_seh_tail
|
|
|
|
|
|
ALIGN 16
|
|
cbc_se_handler:
|
|
$L$common_seh_tail:
|
|
mov rdi,QWORD[8+rax]
|
|
mov rsi,QWORD[16+rax]
|
|
mov QWORD[152+r8],rax
|
|
mov QWORD[168+r8],rsi
|
|
mov QWORD[176+r8],rdi
|
|
|
|
mov rdi,QWORD[40+r9]
|
|
mov rsi,r8
|
|
mov ecx,154
|
|
DD 0xa548f3fc
|
|
|
|
mov rsi,r9
|
|
xor rcx,rcx
|
|
mov rdx,QWORD[8+rsi]
|
|
mov r8,QWORD[rsi]
|
|
mov r9,QWORD[16+rsi]
|
|
mov r10,QWORD[40+rsi]
|
|
lea r11,[56+rsi]
|
|
lea r12,[24+rsi]
|
|
mov QWORD[32+rsp],r10
|
|
mov QWORD[40+rsp],r11
|
|
mov QWORD[48+rsp],r12
|
|
mov QWORD[56+rsp],rcx
|
|
call QWORD[__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
|
|
ret
|
|
|
|
section .pdata rdata align=4
|
|
ALIGN 4
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DD $L$SEH_begin_aesni_ctr32_encrypt_blocks wrt ..imagebase
|
|
DD $L$SEH_end_aesni_ctr32_encrypt_blocks wrt ..imagebase
|
|
DD $L$SEH_info_ctr32 wrt ..imagebase
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DD aesni_set_decrypt_key wrt ..imagebase
|
|
DD $L$SEH_end_set_decrypt_key wrt ..imagebase
|
|
DD $L$SEH_info_key wrt ..imagebase
|
|
|
|
DD aesni_set_encrypt_key wrt ..imagebase
|
|
DD $L$SEH_end_set_encrypt_key wrt ..imagebase
|
|
DD $L$SEH_info_key wrt ..imagebase
|
|
section .xdata rdata align=8
|
|
ALIGN 8
|
|
;.LSEH_info_ecb:
|
|
; .byte 9,0,0,0
|
|
; .rva ecb_ccm64_se_handler
|
|
; .rva .Lecb_enc_body,.Lecb_enc_ret
|
|
;.LSEH_info_ccm64_enc:
|
|
; .byte 9,0,0,0
|
|
; .rva ecb_ccm64_se_handler
|
|
; .rva .Lccm64_enc_body,.Lccm64_enc_ret
|
|
;.LSEH_info_ccm64_dec:
|
|
; .byte 9,0,0,0
|
|
; .rva ecb_ccm64_se_handler
|
|
; .rva .Lccm64_dec_body,.Lccm64_dec_ret
|
|
$L$SEH_info_ctr32:
|
|
DB 9,0,0,0
|
|
DD ctr_xts_se_handler wrt ..imagebase
|
|
DD $L$ctr32_body wrt ..imagebase,$L$ctr32_epilogue wrt ..imagebase
|
|
;.LSEH_info_xts_enc:
|
|
; .byte 9,0,0,0
|
|
; .rva ctr_xts_se_handler
|
|
; .rva .Lxts_enc_body,.Lxts_enc_epilogue
|
|
;.LSEH_info_xts_dec:
|
|
; .byte 9,0,0,0
|
|
; .rva ctr_xts_se_handler
|
|
; .rva .Lxts_dec_body,.Lxts_dec_epilogue
|
|
;.LSEH_info_ocb_enc:
|
|
; .byte 9,0,0,0
|
|
; .rva ocb_se_handler
|
|
; .rva .Locb_enc_body,.Locb_enc_epilogue
|
|
; .rva .Locb_enc_pop
|
|
; .long 0
|
|
;.LSEH_info_ocb_dec:
|
|
; .byte 9,0,0,0
|
|
; .rva ocb_se_handler
|
|
; .rva .Locb_dec_body,.Locb_dec_epilogue
|
|
; .rva .Locb_dec_pop
|
|
; .long 0
|
|
;.LSEH_info_cbc:
|
|
; .byte 9,0,0,0
|
|
; .rva cbc_se_handler
|
|
$L$SEH_info_key:
|
|
DB 0x01,0x04,0x01,0x00
|
|
DB 0x04,0x02,0x00,0x00
|