375 lines
6.8 KiB
NASM
375 lines
6.8 KiB
NASM
|
%ifidn __OUTPUT_FORMAT__,obj
|
||
|
section code use32 class=code align=64
|
||
|
%elifidn __OUTPUT_FORMAT__,win32
|
||
|
$@feat.00 equ 1
|
||
|
section .text code align=64
|
||
|
%else
|
||
|
section .text code
|
||
|
%endif
|
||
|
;extern _OPENSSL_ia32cap_P
|
||
|
global _RC4
|
||
|
align 16
|
||
|
_RC4:
|
||
|
L$_RC4_begin:
|
||
|
push ebp
|
||
|
push ebx
|
||
|
push esi
|
||
|
push edi
|
||
|
mov edi,DWORD [20+esp]
|
||
|
mov edx,DWORD [24+esp]
|
||
|
mov esi,DWORD [28+esp]
|
||
|
mov ebp,DWORD [32+esp]
|
||
|
xor eax,eax
|
||
|
xor ebx,ebx
|
||
|
cmp edx,0
|
||
|
je NEAR L$000abort
|
||
|
mov al,BYTE [edi]
|
||
|
mov bl,BYTE [4+edi]
|
||
|
add edi,8
|
||
|
lea ecx,[edx*1+esi]
|
||
|
sub ebp,esi
|
||
|
mov DWORD [24+esp],ecx
|
||
|
inc al
|
||
|
cmp DWORD [256+edi],-1
|
||
|
je NEAR L$001RC4_CHAR
|
||
|
mov ecx,DWORD [eax*4+edi]
|
||
|
and edx,-4
|
||
|
jz NEAR L$002loop1
|
||
|
mov DWORD [32+esp],ebp
|
||
|
test edx,-8
|
||
|
jz NEAR L$003go4loop4
|
||
|
lea ebp,[_OPENSSL_ia32cap_P]
|
||
|
bt DWORD [ebp],26
|
||
|
jnc NEAR L$003go4loop4
|
||
|
mov ebp,DWORD [32+esp]
|
||
|
and edx,-8
|
||
|
lea edx,[edx*1+esi-8]
|
||
|
mov DWORD [edi-4],edx
|
||
|
add bl,cl
|
||
|
mov edx,DWORD [ebx*4+edi]
|
||
|
mov DWORD [ebx*4+edi],ecx
|
||
|
mov DWORD [eax*4+edi],edx
|
||
|
inc eax
|
||
|
add edx,ecx
|
||
|
movzx eax,al
|
||
|
movzx edx,dl
|
||
|
movq mm0,[esi]
|
||
|
mov ecx,DWORD [eax*4+edi]
|
||
|
movd mm2,DWORD [edx*4+edi]
|
||
|
jmp NEAR L$004loop_mmx_enter
|
||
|
align 16
|
||
|
L$005loop_mmx:
|
||
|
add bl,cl
|
||
|
psllq mm1,56
|
||
|
mov edx,DWORD [ebx*4+edi]
|
||
|
mov DWORD [ebx*4+edi],ecx
|
||
|
mov DWORD [eax*4+edi],edx
|
||
|
inc eax
|
||
|
add edx,ecx
|
||
|
movzx eax,al
|
||
|
movzx edx,dl
|
||
|
pxor mm2,mm1
|
||
|
movq mm0,[esi]
|
||
|
movq [esi*1+ebp-8],mm2
|
||
|
mov ecx,DWORD [eax*4+edi]
|
||
|
movd mm2,DWORD [edx*4+edi]
|
||
|
L$004loop_mmx_enter:
|
||
|
add bl,cl
|
||
|
mov edx,DWORD [ebx*4+edi]
|
||
|
mov DWORD [ebx*4+edi],ecx
|
||
|
mov DWORD [eax*4+edi],edx
|
||
|
inc eax
|
||
|
add edx,ecx
|
||
|
movzx eax,al
|
||
|
movzx edx,dl
|
||
|
pxor mm2,mm0
|
||
|
mov ecx,DWORD [eax*4+edi]
|
||
|
movd mm1,DWORD [edx*4+edi]
|
||
|
add bl,cl
|
||
|
psllq mm1,8
|
||
|
mov edx,DWORD [ebx*4+edi]
|
||
|
mov DWORD [ebx*4+edi],ecx
|
||
|
mov DWORD [eax*4+edi],edx
|
||
|
inc eax
|
||
|
add edx,ecx
|
||
|
movzx eax,al
|
||
|
movzx edx,dl
|
||
|
pxor mm2,mm1
|
||
|
mov ecx,DWORD [eax*4+edi]
|
||
|
movd mm1,DWORD [edx*4+edi]
|
||
|
add bl,cl
|
||
|
psllq mm1,16
|
||
|
mov edx,DWORD [ebx*4+edi]
|
||
|
mov DWORD [ebx*4+edi],ecx
|
||
|
mov DWORD [eax*4+edi],edx
|
||
|
inc eax
|
||
|
add edx,ecx
|
||
|
movzx eax,al
|
||
|
movzx edx,dl
|
||
|
pxor mm2,mm1
|
||
|
mov ecx,DWORD [eax*4+edi]
|
||
|
movd mm1,DWORD [edx*4+edi]
|
||
|
add bl,cl
|
||
|
psllq mm1,24
|
||
|
mov edx,DWORD [ebx*4+edi]
|
||
|
mov DWORD [ebx*4+edi],ecx
|
||
|
mov DWORD [eax*4+edi],edx
|
||
|
inc eax
|
||
|
add edx,ecx
|
||
|
movzx eax,al
|
||
|
movzx edx,dl
|
||
|
pxor mm2,mm1
|
||
|
mov ecx,DWORD [eax*4+edi]
|
||
|
movd mm1,DWORD [edx*4+edi]
|
||
|
add bl,cl
|
||
|
psllq mm1,32
|
||
|
mov edx,DWORD [ebx*4+edi]
|
||
|
mov DWORD [ebx*4+edi],ecx
|
||
|
mov DWORD [eax*4+edi],edx
|
||
|
inc eax
|
||
|
add edx,ecx
|
||
|
movzx eax,al
|
||
|
movzx edx,dl
|
||
|
pxor mm2,mm1
|
||
|
mov ecx,DWORD [eax*4+edi]
|
||
|
movd mm1,DWORD [edx*4+edi]
|
||
|
add bl,cl
|
||
|
psllq mm1,40
|
||
|
mov edx,DWORD [ebx*4+edi]
|
||
|
mov DWORD [ebx*4+edi],ecx
|
||
|
mov DWORD [eax*4+edi],edx
|
||
|
inc eax
|
||
|
add edx,ecx
|
||
|
movzx eax,al
|
||
|
movzx edx,dl
|
||
|
pxor mm2,mm1
|
||
|
mov ecx,DWORD [eax*4+edi]
|
||
|
movd mm1,DWORD [edx*4+edi]
|
||
|
add bl,cl
|
||
|
psllq mm1,48
|
||
|
mov edx,DWORD [ebx*4+edi]
|
||
|
mov DWORD [ebx*4+edi],ecx
|
||
|
mov DWORD [eax*4+edi],edx
|
||
|
inc eax
|
||
|
add edx,ecx
|
||
|
movzx eax,al
|
||
|
movzx edx,dl
|
||
|
pxor mm2,mm1
|
||
|
mov ecx,DWORD [eax*4+edi]
|
||
|
movd mm1,DWORD [edx*4+edi]
|
||
|
mov edx,ebx
|
||
|
xor ebx,ebx
|
||
|
mov bl,dl
|
||
|
cmp esi,DWORD [edi-4]
|
||
|
lea esi,[8+esi]
|
||
|
jb NEAR L$005loop_mmx
|
||
|
psllq mm1,56
|
||
|
pxor mm2,mm1
|
||
|
movq [esi*1+ebp-8],mm2
|
||
|
emms
|
||
|
cmp esi,DWORD [24+esp]
|
||
|
je NEAR L$006done
|
||
|
jmp NEAR L$002loop1
|
||
|
align 16
|
||
|
L$003go4loop4:
|
||
|
lea edx,[edx*1+esi-4]
|
||
|
mov DWORD [28+esp],edx
|
||
|
L$007loop4:
|
||
|
add bl,cl
|
||
|
mov edx,DWORD [ebx*4+edi]
|
||
|
mov DWORD [ebx*4+edi],ecx
|
||
|
mov DWORD [eax*4+edi],edx
|
||
|
add edx,ecx
|
||
|
inc al
|
||
|
and edx,255
|
||
|
mov ecx,DWORD [eax*4+edi]
|
||
|
mov ebp,DWORD [edx*4+edi]
|
||
|
add bl,cl
|
||
|
mov edx,DWORD [ebx*4+edi]
|
||
|
mov DWORD [ebx*4+edi],ecx
|
||
|
mov DWORD [eax*4+edi],edx
|
||
|
add edx,ecx
|
||
|
inc al
|
||
|
and edx,255
|
||
|
ror ebp,8
|
||
|
mov ecx,DWORD [eax*4+edi]
|
||
|
or ebp,DWORD [edx*4+edi]
|
||
|
add bl,cl
|
||
|
mov edx,DWORD [ebx*4+edi]
|
||
|
mov DWORD [ebx*4+edi],ecx
|
||
|
mov DWORD [eax*4+edi],edx
|
||
|
add edx,ecx
|
||
|
inc al
|
||
|
and edx,255
|
||
|
ror ebp,8
|
||
|
mov ecx,DWORD [eax*4+edi]
|
||
|
or ebp,DWORD [edx*4+edi]
|
||
|
add bl,cl
|
||
|
mov edx,DWORD [ebx*4+edi]
|
||
|
mov DWORD [ebx*4+edi],ecx
|
||
|
mov DWORD [eax*4+edi],edx
|
||
|
add edx,ecx
|
||
|
inc al
|
||
|
and edx,255
|
||
|
ror ebp,8
|
||
|
mov ecx,DWORD [32+esp]
|
||
|
or ebp,DWORD [edx*4+edi]
|
||
|
ror ebp,8
|
||
|
xor ebp,DWORD [esi]
|
||
|
cmp esi,DWORD [28+esp]
|
||
|
mov DWORD [esi*1+ecx],ebp
|
||
|
lea esi,[4+esi]
|
||
|
mov ecx,DWORD [eax*4+edi]
|
||
|
jb NEAR L$007loop4
|
||
|
cmp esi,DWORD [24+esp]
|
||
|
je NEAR L$006done
|
||
|
mov ebp,DWORD [32+esp]
|
||
|
align 16
|
||
|
L$002loop1:
|
||
|
add bl,cl
|
||
|
mov edx,DWORD [ebx*4+edi]
|
||
|
mov DWORD [ebx*4+edi],ecx
|
||
|
mov DWORD [eax*4+edi],edx
|
||
|
add edx,ecx
|
||
|
inc al
|
||
|
and edx,255
|
||
|
mov edx,DWORD [edx*4+edi]
|
||
|
xor dl,BYTE [esi]
|
||
|
lea esi,[1+esi]
|
||
|
mov ecx,DWORD [eax*4+edi]
|
||
|
cmp esi,DWORD [24+esp]
|
||
|
mov BYTE [esi*1+ebp-1],dl
|
||
|
jb NEAR L$002loop1
|
||
|
jmp NEAR L$006done
|
||
|
align 16
|
||
|
L$001RC4_CHAR:
|
||
|
movzx ecx,BYTE [eax*1+edi]
|
||
|
L$008cloop1:
|
||
|
add bl,cl
|
||
|
movzx edx,BYTE [ebx*1+edi]
|
||
|
mov BYTE [ebx*1+edi],cl
|
||
|
mov BYTE [eax*1+edi],dl
|
||
|
add dl,cl
|
||
|
movzx edx,BYTE [edx*1+edi]
|
||
|
add al,1
|
||
|
xor dl,BYTE [esi]
|
||
|
lea esi,[1+esi]
|
||
|
movzx ecx,BYTE [eax*1+edi]
|
||
|
cmp esi,DWORD [24+esp]
|
||
|
mov BYTE [esi*1+ebp-1],dl
|
||
|
jb NEAR L$008cloop1
|
||
|
L$006done:
|
||
|
dec al
|
||
|
mov DWORD [edi-4],ebx
|
||
|
mov BYTE [edi-8],al
|
||
|
L$000abort:
|
||
|
pop edi
|
||
|
pop esi
|
||
|
pop ebx
|
||
|
pop ebp
|
||
|
ret
|
||
|
global _RC4_set_key
|
||
|
align 16
|
||
|
_RC4_set_key:
|
||
|
L$_RC4_set_key_begin:
|
||
|
push ebp
|
||
|
push ebx
|
||
|
push esi
|
||
|
push edi
|
||
|
mov edi,DWORD [20+esp]
|
||
|
mov ebp,DWORD [24+esp]
|
||
|
mov esi,DWORD [28+esp]
|
||
|
lea edx,[_OPENSSL_ia32cap_P]
|
||
|
lea edi,[8+edi]
|
||
|
lea esi,[ebp*1+esi]
|
||
|
neg ebp
|
||
|
xor eax,eax
|
||
|
mov DWORD [edi-4],ebp
|
||
|
bt DWORD [edx],20
|
||
|
jc NEAR L$009c1stloop
|
||
|
align 16
|
||
|
L$010w1stloop:
|
||
|
mov DWORD [eax*4+edi],eax
|
||
|
add al,1
|
||
|
jnc NEAR L$010w1stloop
|
||
|
xor ecx,ecx
|
||
|
xor edx,edx
|
||
|
align 16
|
||
|
L$011w2ndloop:
|
||
|
mov eax,DWORD [ecx*4+edi]
|
||
|
add dl,BYTE [ebp*1+esi]
|
||
|
add dl,al
|
||
|
add ebp,1
|
||
|
mov ebx,DWORD [edx*4+edi]
|
||
|
jnz NEAR L$012wnowrap
|
||
|
mov ebp,DWORD [edi-4]
|
||
|
L$012wnowrap:
|
||
|
mov DWORD [edx*4+edi],eax
|
||
|
mov DWORD [ecx*4+edi],ebx
|
||
|
add cl,1
|
||
|
jnc NEAR L$011w2ndloop
|
||
|
jmp NEAR L$013exit
|
||
|
align 16
|
||
|
L$009c1stloop:
|
||
|
mov BYTE [eax*1+edi],al
|
||
|
add al,1
|
||
|
jnc NEAR L$009c1stloop
|
||
|
xor ecx,ecx
|
||
|
xor edx,edx
|
||
|
xor ebx,ebx
|
||
|
align 16
|
||
|
L$014c2ndloop:
|
||
|
mov al,BYTE [ecx*1+edi]
|
||
|
add dl,BYTE [ebp*1+esi]
|
||
|
add dl,al
|
||
|
add ebp,1
|
||
|
mov bl,BYTE [edx*1+edi]
|
||
|
jnz NEAR L$015cnowrap
|
||
|
mov ebp,DWORD [edi-4]
|
||
|
L$015cnowrap:
|
||
|
mov BYTE [edx*1+edi],al
|
||
|
mov BYTE [ecx*1+edi],bl
|
||
|
add cl,1
|
||
|
jnc NEAR L$014c2ndloop
|
||
|
mov DWORD [256+edi],-1
|
||
|
L$013exit:
|
||
|
xor eax,eax
|
||
|
mov DWORD [edi-8],eax
|
||
|
mov DWORD [edi-4],eax
|
||
|
pop edi
|
||
|
pop esi
|
||
|
pop ebx
|
||
|
pop ebp
|
||
|
ret
|
||
|
global _RC4_options
|
||
|
align 16
|
||
|
_RC4_options:
|
||
|
L$_RC4_options_begin:
|
||
|
call L$016pic_point
|
||
|
L$016pic_point:
|
||
|
pop eax
|
||
|
lea eax,[(L$017opts-L$016pic_point)+eax]
|
||
|
lea edx,[_OPENSSL_ia32cap_P]
|
||
|
mov edx,DWORD [edx]
|
||
|
bt edx,20
|
||
|
jc NEAR L$0181xchar
|
||
|
bt edx,26
|
||
|
jnc NEAR L$019ret
|
||
|
add eax,25
|
||
|
ret
|
||
|
L$0181xchar:
|
||
|
add eax,12
|
||
|
L$019ret:
|
||
|
ret
|
||
|
align 64
|
||
|
L$017opts:
|
||
|
db 114,99,52,40,52,120,44,105,110,116,41,0
|
||
|
db 114,99,52,40,49,120,44,99,104,97,114,41,0
|
||
|
db 114,99,52,40,56,120,44,109,109,120,41,0
|
||
|
db 82,67,52,32,102,111,114,32,120,56,54,44,32,67,82,89
|
||
|
db 80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114
|
||
|
db 111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
|
||
|
align 64
|
||
|
segment .bss
|
||
|
common _OPENSSL_ia32cap_P 16
|