314 lines
6.1 KiB
NASM
314 lines
6.1 KiB
NASM
; Don't even think of reading this code
|
|
; It was automatically generated by rc4-586.pl
|
|
; Which is a perl program used to generate the x86 assember for
|
|
; any of elf, a.out, BSDI,Win32, or Solaris
|
|
; eric <eay@cryptsoft.com>
|
|
;
|
|
TITLE rc4-586.asm
|
|
.386
|
|
.model FLAT
|
|
_TEXT SEGMENT
|
|
PUBLIC _RC4
|
|
|
|
_RC4 PROC NEAR
|
|
;
|
|
push ebp
|
|
push ebx
|
|
mov ebp, DWORD PTR 12[esp]
|
|
mov ebx, DWORD PTR 16[esp]
|
|
push esi
|
|
push edi
|
|
mov ecx, DWORD PTR [ebp]
|
|
mov edx, DWORD PTR 4[ebp]
|
|
mov esi, DWORD PTR 28[esp]
|
|
inc ecx
|
|
sub esp, 12
|
|
add ebp, 8
|
|
and ecx, 255
|
|
lea ebx, DWORD PTR [esi+ebx-8]
|
|
mov edi, DWORD PTR 44[esp]
|
|
mov DWORD PTR 8[esp],ebx
|
|
mov eax, DWORD PTR [ecx*4+ebp]
|
|
cmp ebx, esi
|
|
jl $L000end
|
|
L001start:
|
|
add esi, 8
|
|
; Round 0
|
|
add edx, eax
|
|
and edx, 255
|
|
inc ecx
|
|
mov ebx, DWORD PTR [edx*4+ebp]
|
|
mov DWORD PTR [ecx*4+ebp-4],ebx
|
|
add ebx, eax
|
|
and ecx, 255
|
|
and ebx, 255
|
|
mov DWORD PTR [edx*4+ebp],eax
|
|
nop
|
|
mov ebx, DWORD PTR [ebx*4+ebp]
|
|
mov eax, DWORD PTR [ecx*4+ebp]
|
|
mov BYTE PTR [esp], bl
|
|
; Round 1
|
|
add edx, eax
|
|
and edx, 255
|
|
inc ecx
|
|
mov ebx, DWORD PTR [edx*4+ebp]
|
|
mov DWORD PTR [ecx*4+ebp-4],ebx
|
|
add ebx, eax
|
|
and ecx, 255
|
|
and ebx, 255
|
|
mov DWORD PTR [edx*4+ebp],eax
|
|
nop
|
|
mov ebx, DWORD PTR [ebx*4+ebp]
|
|
mov eax, DWORD PTR [ecx*4+ebp]
|
|
mov BYTE PTR 1[esp],bl
|
|
; Round 2
|
|
add edx, eax
|
|
and edx, 255
|
|
inc ecx
|
|
mov ebx, DWORD PTR [edx*4+ebp]
|
|
mov DWORD PTR [ecx*4+ebp-4],ebx
|
|
add ebx, eax
|
|
and ecx, 255
|
|
and ebx, 255
|
|
mov DWORD PTR [edx*4+ebp],eax
|
|
nop
|
|
mov ebx, DWORD PTR [ebx*4+ebp]
|
|
mov eax, DWORD PTR [ecx*4+ebp]
|
|
mov BYTE PTR 2[esp],bl
|
|
; Round 3
|
|
add edx, eax
|
|
and edx, 255
|
|
inc ecx
|
|
mov ebx, DWORD PTR [edx*4+ebp]
|
|
mov DWORD PTR [ecx*4+ebp-4],ebx
|
|
add ebx, eax
|
|
and ecx, 255
|
|
and ebx, 255
|
|
mov DWORD PTR [edx*4+ebp],eax
|
|
nop
|
|
mov ebx, DWORD PTR [ebx*4+ebp]
|
|
mov eax, DWORD PTR [ecx*4+ebp]
|
|
mov BYTE PTR 3[esp],bl
|
|
; Round 4
|
|
add edx, eax
|
|
and edx, 255
|
|
inc ecx
|
|
mov ebx, DWORD PTR [edx*4+ebp]
|
|
mov DWORD PTR [ecx*4+ebp-4],ebx
|
|
add ebx, eax
|
|
and ecx, 255
|
|
and ebx, 255
|
|
mov DWORD PTR [edx*4+ebp],eax
|
|
nop
|
|
mov ebx, DWORD PTR [ebx*4+ebp]
|
|
mov eax, DWORD PTR [ecx*4+ebp]
|
|
mov BYTE PTR 4[esp],bl
|
|
; Round 5
|
|
add edx, eax
|
|
and edx, 255
|
|
inc ecx
|
|
mov ebx, DWORD PTR [edx*4+ebp]
|
|
mov DWORD PTR [ecx*4+ebp-4],ebx
|
|
add ebx, eax
|
|
and ecx, 255
|
|
and ebx, 255
|
|
mov DWORD PTR [edx*4+ebp],eax
|
|
nop
|
|
mov ebx, DWORD PTR [ebx*4+ebp]
|
|
mov eax, DWORD PTR [ecx*4+ebp]
|
|
mov BYTE PTR 5[esp],bl
|
|
; Round 6
|
|
add edx, eax
|
|
and edx, 255
|
|
inc ecx
|
|
mov ebx, DWORD PTR [edx*4+ebp]
|
|
mov DWORD PTR [ecx*4+ebp-4],ebx
|
|
add ebx, eax
|
|
and ecx, 255
|
|
and ebx, 255
|
|
mov DWORD PTR [edx*4+ebp],eax
|
|
nop
|
|
mov ebx, DWORD PTR [ebx*4+ebp]
|
|
mov eax, DWORD PTR [ecx*4+ebp]
|
|
mov BYTE PTR 6[esp],bl
|
|
; Round 7
|
|
add edx, eax
|
|
and edx, 255
|
|
inc ecx
|
|
mov ebx, DWORD PTR [edx*4+ebp]
|
|
mov DWORD PTR [ecx*4+ebp-4],ebx
|
|
add ebx, eax
|
|
and ecx, 255
|
|
and ebx, 255
|
|
mov DWORD PTR [edx*4+ebp],eax
|
|
nop
|
|
mov ebx, DWORD PTR [ebx*4+ebp]
|
|
add edi, 8
|
|
mov BYTE PTR 7[esp],bl
|
|
; apply the cipher text
|
|
mov eax, DWORD PTR [esp]
|
|
mov ebx, DWORD PTR [esi-8]
|
|
xor eax, ebx
|
|
mov ebx, DWORD PTR [esi-4]
|
|
mov DWORD PTR [edi-8],eax
|
|
mov eax, DWORD PTR 4[esp]
|
|
xor eax, ebx
|
|
mov ebx, DWORD PTR 8[esp]
|
|
mov DWORD PTR [edi-4],eax
|
|
mov eax, DWORD PTR [ecx*4+ebp]
|
|
cmp esi, ebx
|
|
jle L001start
|
|
$L000end:
|
|
; Round 0
|
|
add ebx, 8
|
|
inc esi
|
|
cmp ebx, esi
|
|
jl $L002finished
|
|
mov DWORD PTR 8[esp],ebx
|
|
add edx, eax
|
|
and edx, 255
|
|
inc ecx
|
|
mov ebx, DWORD PTR [edx*4+ebp]
|
|
mov DWORD PTR [ecx*4+ebp-4],ebx
|
|
add ebx, eax
|
|
and ecx, 255
|
|
and ebx, 255
|
|
mov DWORD PTR [edx*4+ebp],eax
|
|
nop
|
|
mov ebx, DWORD PTR [ebx*4+ebp]
|
|
mov eax, DWORD PTR [ecx*4+ebp]
|
|
mov bh, BYTE PTR [esi-1]
|
|
xor bl, bh
|
|
mov BYTE PTR [edi], bl
|
|
; Round 1
|
|
mov ebx, DWORD PTR 8[esp]
|
|
cmp ebx, esi
|
|
jle $L002finished
|
|
inc esi
|
|
add edx, eax
|
|
and edx, 255
|
|
inc ecx
|
|
mov ebx, DWORD PTR [edx*4+ebp]
|
|
mov DWORD PTR [ecx*4+ebp-4],ebx
|
|
add ebx, eax
|
|
and ecx, 255
|
|
and ebx, 255
|
|
mov DWORD PTR [edx*4+ebp],eax
|
|
nop
|
|
mov ebx, DWORD PTR [ebx*4+ebp]
|
|
mov eax, DWORD PTR [ecx*4+ebp]
|
|
mov bh, BYTE PTR [esi-1]
|
|
xor bl, bh
|
|
mov BYTE PTR 1[edi],bl
|
|
; Round 2
|
|
mov ebx, DWORD PTR 8[esp]
|
|
cmp ebx, esi
|
|
jle $L002finished
|
|
inc esi
|
|
add edx, eax
|
|
and edx, 255
|
|
inc ecx
|
|
mov ebx, DWORD PTR [edx*4+ebp]
|
|
mov DWORD PTR [ecx*4+ebp-4],ebx
|
|
add ebx, eax
|
|
and ecx, 255
|
|
and ebx, 255
|
|
mov DWORD PTR [edx*4+ebp],eax
|
|
nop
|
|
mov ebx, DWORD PTR [ebx*4+ebp]
|
|
mov eax, DWORD PTR [ecx*4+ebp]
|
|
mov bh, BYTE PTR [esi-1]
|
|
xor bl, bh
|
|
mov BYTE PTR 2[edi],bl
|
|
; Round 3
|
|
mov ebx, DWORD PTR 8[esp]
|
|
cmp ebx, esi
|
|
jle $L002finished
|
|
inc esi
|
|
add edx, eax
|
|
and edx, 255
|
|
inc ecx
|
|
mov ebx, DWORD PTR [edx*4+ebp]
|
|
mov DWORD PTR [ecx*4+ebp-4],ebx
|
|
add ebx, eax
|
|
and ecx, 255
|
|
and ebx, 255
|
|
mov DWORD PTR [edx*4+ebp],eax
|
|
nop
|
|
mov ebx, DWORD PTR [ebx*4+ebp]
|
|
mov eax, DWORD PTR [ecx*4+ebp]
|
|
mov bh, BYTE PTR [esi-1]
|
|
xor bl, bh
|
|
mov BYTE PTR 3[edi],bl
|
|
; Round 4
|
|
mov ebx, DWORD PTR 8[esp]
|
|
cmp ebx, esi
|
|
jle $L002finished
|
|
inc esi
|
|
add edx, eax
|
|
and edx, 255
|
|
inc ecx
|
|
mov ebx, DWORD PTR [edx*4+ebp]
|
|
mov DWORD PTR [ecx*4+ebp-4],ebx
|
|
add ebx, eax
|
|
and ecx, 255
|
|
and ebx, 255
|
|
mov DWORD PTR [edx*4+ebp],eax
|
|
nop
|
|
mov ebx, DWORD PTR [ebx*4+ebp]
|
|
mov eax, DWORD PTR [ecx*4+ebp]
|
|
mov bh, BYTE PTR [esi-1]
|
|
xor bl, bh
|
|
mov BYTE PTR 4[edi],bl
|
|
; Round 5
|
|
mov ebx, DWORD PTR 8[esp]
|
|
cmp ebx, esi
|
|
jle $L002finished
|
|
inc esi
|
|
add edx, eax
|
|
and edx, 255
|
|
inc ecx
|
|
mov ebx, DWORD PTR [edx*4+ebp]
|
|
mov DWORD PTR [ecx*4+ebp-4],ebx
|
|
add ebx, eax
|
|
and ecx, 255
|
|
and ebx, 255
|
|
mov DWORD PTR [edx*4+ebp],eax
|
|
nop
|
|
mov ebx, DWORD PTR [ebx*4+ebp]
|
|
mov eax, DWORD PTR [ecx*4+ebp]
|
|
mov bh, BYTE PTR [esi-1]
|
|
xor bl, bh
|
|
mov BYTE PTR 5[edi],bl
|
|
; Round 6
|
|
mov ebx, DWORD PTR 8[esp]
|
|
cmp ebx, esi
|
|
jle $L002finished
|
|
inc esi
|
|
add edx, eax
|
|
and edx, 255
|
|
inc ecx
|
|
mov ebx, DWORD PTR [edx*4+ebp]
|
|
mov DWORD PTR [ecx*4+ebp-4],ebx
|
|
add ebx, eax
|
|
and ecx, 255
|
|
and ebx, 255
|
|
mov DWORD PTR [edx*4+ebp],eax
|
|
nop
|
|
mov ebx, DWORD PTR [ebx*4+ebp]
|
|
mov bh, BYTE PTR [esi-1]
|
|
xor bl, bh
|
|
mov BYTE PTR 6[edi],bl
|
|
$L002finished:
|
|
dec ecx
|
|
add esp, 12
|
|
mov DWORD PTR [ebp-4],edx
|
|
mov BYTE PTR [ebp-8],cl
|
|
pop edi
|
|
pop esi
|
|
pop ebx
|
|
pop ebp
|
|
ret
|
|
_RC4 ENDP
|
|
_TEXT ENDS
|
|
END
|