You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

389 lines
7.6 KiB

TITLE rc4-586.asm
IF @Version LT 800
ECHO MASM version 8.00 or later is strongly recommended.
ENDIF
.686
.XMM
IF @Version LT 800
XMMWORD STRUCT 16
DQ 2 dup (?)
XMMWORD ENDS
ENDIF
.MODEL FLAT
OPTION DOTNAME
IF @Version LT 800
.text$ SEGMENT PAGE 'CODE'
ELSE
.text$ SEGMENT ALIGN(64) 'CODE'
ENDIF
;EXTERN _OPENSSL_ia32cap_P:NEAR
ALIGN 16
_RC4 PROC PUBLIC
$L_RC4_begin::
push ebp
push ebx
push esi
push edi
mov edi,DWORD PTR 20[esp]
mov edx,DWORD PTR 24[esp]
mov esi,DWORD PTR 28[esp]
mov ebp,DWORD PTR 32[esp]
xor eax,eax
xor ebx,ebx
cmp edx,0
je $L000abort
mov al,BYTE PTR [edi]
mov bl,BYTE PTR 4[edi]
add edi,8
lea ecx,DWORD PTR [edx*1+esi]
sub ebp,esi
mov DWORD PTR 24[esp],ecx
inc al
cmp DWORD PTR 256[edi],-1
je $L001RC4_CHAR
mov ecx,DWORD PTR [eax*4+edi]
and edx,-4
jz $L002loop1
test edx,-8
mov DWORD PTR 32[esp],ebp
jz $L003go4loop4
lea ebp,DWORD PTR _OPENSSL_ia32cap_P
bt DWORD PTR [ebp],26
jnc $L003go4loop4
mov ebp,DWORD PTR 32[esp]
and edx,-8
lea edx,DWORD PTR [edx*1+esi-8]
mov DWORD PTR [edi-4],edx
add bl,cl
mov edx,DWORD PTR [ebx*4+edi]
mov DWORD PTR [ebx*4+edi],ecx
mov DWORD PTR [eax*4+edi],edx
inc eax
add edx,ecx
movzx eax,al
movzx edx,dl
movq mm0,QWORD PTR [esi]
mov ecx,DWORD PTR [eax*4+edi]
movd mm2,DWORD PTR [edx*4+edi]
jmp $L004loop_mmx_enter
ALIGN 16
$L005loop_mmx:
add bl,cl
psllq mm1,56
mov edx,DWORD PTR [ebx*4+edi]
mov DWORD PTR [ebx*4+edi],ecx
mov DWORD PTR [eax*4+edi],edx
inc eax
add edx,ecx
movzx eax,al
movzx edx,dl
pxor mm2,mm1
movq mm0,QWORD PTR [esi]
movq QWORD PTR [esi*1+ebp-8],mm2
mov ecx,DWORD PTR [eax*4+edi]
movd mm2,DWORD PTR [edx*4+edi]
$L004loop_mmx_enter:
add bl,cl
mov edx,DWORD PTR [ebx*4+edi]
mov DWORD PTR [ebx*4+edi],ecx
mov DWORD PTR [eax*4+edi],edx
inc eax
add edx,ecx
movzx eax,al
movzx edx,dl
pxor mm2,mm0
mov ecx,DWORD PTR [eax*4+edi]
movd mm1,DWORD PTR [edx*4+edi]
add bl,cl
psllq mm1,8
mov edx,DWORD PTR [ebx*4+edi]
mov DWORD PTR [ebx*4+edi],ecx
mov DWORD PTR [eax*4+edi],edx
inc eax
add edx,ecx
movzx eax,al
movzx edx,dl
pxor mm2,mm1
mov ecx,DWORD PTR [eax*4+edi]
movd mm1,DWORD PTR [edx*4+edi]
add bl,cl
psllq mm1,16
mov edx,DWORD PTR [ebx*4+edi]
mov DWORD PTR [ebx*4+edi],ecx
mov DWORD PTR [eax*4+edi],edx
inc eax
add edx,ecx
movzx eax,al
movzx edx,dl
pxor mm2,mm1
mov ecx,DWORD PTR [eax*4+edi]
movd mm1,DWORD PTR [edx*4+edi]
add bl,cl
psllq mm1,24
mov edx,DWORD PTR [ebx*4+edi]
mov DWORD PTR [ebx*4+edi],ecx
mov DWORD PTR [eax*4+edi],edx
inc eax
add edx,ecx
movzx eax,al
movzx edx,dl
pxor mm2,mm1
mov ecx,DWORD PTR [eax*4+edi]
movd mm1,DWORD PTR [edx*4+edi]
add bl,cl
psllq mm1,32
mov edx,DWORD PTR [ebx*4+edi]
mov DWORD PTR [ebx*4+edi],ecx
mov DWORD PTR [eax*4+edi],edx
inc eax
add edx,ecx
movzx eax,al
movzx edx,dl
pxor mm2,mm1
mov ecx,DWORD PTR [eax*4+edi]
movd mm1,DWORD PTR [edx*4+edi]
add bl,cl
psllq mm1,40
mov edx,DWORD PTR [ebx*4+edi]
mov DWORD PTR [ebx*4+edi],ecx
mov DWORD PTR [eax*4+edi],edx
inc eax
add edx,ecx
movzx eax,al
movzx edx,dl
pxor mm2,mm1
mov ecx,DWORD PTR [eax*4+edi]
movd mm1,DWORD PTR [edx*4+edi]
add bl,cl
psllq mm1,48
mov edx,DWORD PTR [ebx*4+edi]
mov DWORD PTR [ebx*4+edi],ecx
mov DWORD PTR [eax*4+edi],edx
inc eax
add edx,ecx
movzx eax,al
movzx edx,dl
pxor mm2,mm1
mov ecx,DWORD PTR [eax*4+edi]
movd mm1,DWORD PTR [edx*4+edi]
mov edx,ebx
xor ebx,ebx
mov bl,dl
cmp esi,DWORD PTR [edi-4]
lea esi,DWORD PTR 8[esi]
jb $L005loop_mmx
psllq mm1,56
pxor mm2,mm1
movq QWORD PTR [esi*1+ebp-8],mm2
emms
cmp esi,DWORD PTR 24[esp]
je $L006done
jmp $L002loop1
ALIGN 16
$L003go4loop4:
lea edx,DWORD PTR [edx*1+esi-4]
mov DWORD PTR 28[esp],edx
$L007loop4:
add bl,cl
mov edx,DWORD PTR [ebx*4+edi]
mov DWORD PTR [ebx*4+edi],ecx
mov DWORD PTR [eax*4+edi],edx
add edx,ecx
inc al
and edx,255
mov ecx,DWORD PTR [eax*4+edi]
mov ebp,DWORD PTR [edx*4+edi]
add bl,cl
mov edx,DWORD PTR [ebx*4+edi]
mov DWORD PTR [ebx*4+edi],ecx
mov DWORD PTR [eax*4+edi],edx
add edx,ecx
inc al
and edx,255
ror ebp,8
mov ecx,DWORD PTR [eax*4+edi]
or ebp,DWORD PTR [edx*4+edi]
add bl,cl
mov edx,DWORD PTR [ebx*4+edi]
mov DWORD PTR [ebx*4+edi],ecx
mov DWORD PTR [eax*4+edi],edx
add edx,ecx
inc al
and edx,255
ror ebp,8
mov ecx,DWORD PTR [eax*4+edi]
or ebp,DWORD PTR [edx*4+edi]
add bl,cl
mov edx,DWORD PTR [ebx*4+edi]
mov DWORD PTR [ebx*4+edi],ecx
mov DWORD PTR [eax*4+edi],edx
add edx,ecx
inc al
and edx,255
ror ebp,8
mov ecx,DWORD PTR 32[esp]
or ebp,DWORD PTR [edx*4+edi]
ror ebp,8
xor ebp,DWORD PTR [esi]
cmp esi,DWORD PTR 28[esp]
mov DWORD PTR [esi*1+ecx],ebp
lea esi,DWORD PTR 4[esi]
mov ecx,DWORD PTR [eax*4+edi]
jb $L007loop4
cmp esi,DWORD PTR 24[esp]
je $L006done
mov ebp,DWORD PTR 32[esp]
ALIGN 16
$L002loop1:
add bl,cl
mov edx,DWORD PTR [ebx*4+edi]
mov DWORD PTR [ebx*4+edi],ecx
mov DWORD PTR [eax*4+edi],edx
add edx,ecx
inc al
and edx,255
mov edx,DWORD PTR [edx*4+edi]
xor dl,BYTE PTR [esi]
lea esi,DWORD PTR 1[esi]
mov ecx,DWORD PTR [eax*4+edi]
cmp esi,DWORD PTR 24[esp]
mov BYTE PTR [esi*1+ebp-1],dl
jb $L002loop1
jmp $L006done
ALIGN 16
$L001RC4_CHAR:
movzx ecx,BYTE PTR [eax*1+edi]
$L008cloop1:
add bl,cl
movzx edx,BYTE PTR [ebx*1+edi]
mov BYTE PTR [ebx*1+edi],cl
mov BYTE PTR [eax*1+edi],dl
add dl,cl
movzx edx,BYTE PTR [edx*1+edi]
add al,1
xor dl,BYTE PTR [esi]
lea esi,DWORD PTR 1[esi]
movzx ecx,BYTE PTR [eax*1+edi]
cmp esi,DWORD PTR 24[esp]
mov BYTE PTR [esi*1+ebp-1],dl
jb $L008cloop1
$L006done:
dec al
mov DWORD PTR [edi-4],ebx
mov BYTE PTR [edi-8],al
$L000abort:
pop edi
pop esi
pop ebx
pop ebp
ret
_RC4 ENDP
ALIGN 16
_private_RC4_set_key PROC PUBLIC
$L_private_RC4_set_key_begin::
push ebp
push ebx
push esi
push edi
mov edi,DWORD PTR 20[esp]
mov ebp,DWORD PTR 24[esp]
mov esi,DWORD PTR 28[esp]
lea edx,DWORD PTR _OPENSSL_ia32cap_P
lea edi,DWORD PTR 8[edi]
lea esi,DWORD PTR [ebp*1+esi]
neg ebp
xor eax,eax
mov DWORD PTR [edi-4],ebp
bt DWORD PTR [edx],20
jc $L009c1stloop
ALIGN 16
$L010w1stloop:
mov DWORD PTR [eax*4+edi],eax
add al,1
jnc $L010w1stloop
xor ecx,ecx
xor edx,edx
ALIGN 16
$L011w2ndloop:
mov eax,DWORD PTR [ecx*4+edi]
add dl,BYTE PTR [ebp*1+esi]
add dl,al
add ebp,1
mov ebx,DWORD PTR [edx*4+edi]
jnz $L012wnowrap
mov ebp,DWORD PTR [edi-4]
$L012wnowrap:
mov DWORD PTR [edx*4+edi],eax
mov DWORD PTR [ecx*4+edi],ebx
add cl,1
jnc $L011w2ndloop
jmp $L013exit
ALIGN 16
$L009c1stloop:
mov BYTE PTR [eax*1+edi],al
add al,1
jnc $L009c1stloop
xor ecx,ecx
xor edx,edx
xor ebx,ebx
ALIGN 16
$L014c2ndloop:
mov al,BYTE PTR [ecx*1+edi]
add dl,BYTE PTR [ebp*1+esi]
add dl,al
add ebp,1
mov bl,BYTE PTR [edx*1+edi]
jnz $L015cnowrap
mov ebp,DWORD PTR [edi-4]
$L015cnowrap:
mov BYTE PTR [edx*1+edi],al
mov BYTE PTR [ecx*1+edi],bl
add cl,1
jnc $L014c2ndloop
mov DWORD PTR 256[edi],-1
$L013exit:
xor eax,eax
mov DWORD PTR [edi-8],eax
mov DWORD PTR [edi-4],eax
pop edi
pop esi
pop ebx
pop ebp
ret
_private_RC4_set_key ENDP
ALIGN 16
_RC4_options PROC PUBLIC
$L_RC4_options_begin::
call $L016pic_point
$L016pic_point:
pop eax
lea eax,DWORD PTR ($L017opts-$L016pic_point)[eax]
lea edx,DWORD PTR _OPENSSL_ia32cap_P
mov edx,DWORD PTR [edx]
bt edx,20
jc $L0181xchar
bt edx,26
jnc $L019ret
add eax,25
ret
$L0181xchar:
add eax,12
$L019ret:
ret
ALIGN 64
$L017opts:
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
_RC4_options ENDP
.text$ ENDS
.bss SEGMENT 'BSS'
COMM _OPENSSL_ia32cap_P:QWORD
.bss ENDS
END