942 lines
17 KiB
NASM
942 lines
17 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 _CAST_S_table0
|
|
extern _CAST_S_table1
|
|
extern _CAST_S_table2
|
|
extern _CAST_S_table3
|
|
global _CAST_encrypt
|
|
align 16
|
|
_CAST_encrypt:
|
|
L$_CAST_encrypt_begin:
|
|
;
|
|
push ebp
|
|
push ebx
|
|
mov ebx,DWORD [12+esp]
|
|
mov ebp,DWORD [16+esp]
|
|
push esi
|
|
push edi
|
|
; Load the 2 words
|
|
mov edi,DWORD [ebx]
|
|
mov esi,DWORD [4+ebx]
|
|
; Get short key flag
|
|
mov eax,DWORD [128+ebp]
|
|
push eax
|
|
xor eax,eax
|
|
; round 0
|
|
mov edx,DWORD [ebp]
|
|
mov ecx,DWORD [4+ebp]
|
|
add edx,esi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
xor ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
sub ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
add ecx,ebx
|
|
xor edi,ecx
|
|
; round 1
|
|
mov edx,DWORD [8+ebp]
|
|
mov ecx,DWORD [12+ebp]
|
|
xor edx,edi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
sub ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
add ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
xor ecx,ebx
|
|
xor esi,ecx
|
|
; round 2
|
|
mov edx,DWORD [16+ebp]
|
|
mov ecx,DWORD [20+ebp]
|
|
sub edx,esi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
add ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
xor ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
sub ecx,ebx
|
|
xor edi,ecx
|
|
; round 3
|
|
mov edx,DWORD [24+ebp]
|
|
mov ecx,DWORD [28+ebp]
|
|
add edx,edi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
xor ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
sub ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
add ecx,ebx
|
|
xor esi,ecx
|
|
; round 4
|
|
mov edx,DWORD [32+ebp]
|
|
mov ecx,DWORD [36+ebp]
|
|
xor edx,esi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
sub ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
add ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
xor ecx,ebx
|
|
xor edi,ecx
|
|
; round 5
|
|
mov edx,DWORD [40+ebp]
|
|
mov ecx,DWORD [44+ebp]
|
|
sub edx,edi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
add ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
xor ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
sub ecx,ebx
|
|
xor esi,ecx
|
|
; round 6
|
|
mov edx,DWORD [48+ebp]
|
|
mov ecx,DWORD [52+ebp]
|
|
add edx,esi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
xor ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
sub ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
add ecx,ebx
|
|
xor edi,ecx
|
|
; round 7
|
|
mov edx,DWORD [56+ebp]
|
|
mov ecx,DWORD [60+ebp]
|
|
xor edx,edi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
sub ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
add ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
xor ecx,ebx
|
|
xor esi,ecx
|
|
; round 8
|
|
mov edx,DWORD [64+ebp]
|
|
mov ecx,DWORD [68+ebp]
|
|
sub edx,esi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
add ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
xor ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
sub ecx,ebx
|
|
xor edi,ecx
|
|
; round 9
|
|
mov edx,DWORD [72+ebp]
|
|
mov ecx,DWORD [76+ebp]
|
|
add edx,edi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
xor ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
sub ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
add ecx,ebx
|
|
xor esi,ecx
|
|
; round 10
|
|
mov edx,DWORD [80+ebp]
|
|
mov ecx,DWORD [84+ebp]
|
|
xor edx,esi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
sub ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
add ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
xor ecx,ebx
|
|
xor edi,ecx
|
|
; round 11
|
|
mov edx,DWORD [88+ebp]
|
|
mov ecx,DWORD [92+ebp]
|
|
sub edx,edi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
add ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
xor ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
sub ecx,ebx
|
|
xor esi,ecx
|
|
; test short key flag
|
|
pop edx
|
|
or edx,edx
|
|
jnz NEAR L$000cast_enc_done
|
|
; round 12
|
|
mov edx,DWORD [96+ebp]
|
|
mov ecx,DWORD [100+ebp]
|
|
add edx,esi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
xor ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
sub ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
add ecx,ebx
|
|
xor edi,ecx
|
|
; round 13
|
|
mov edx,DWORD [104+ebp]
|
|
mov ecx,DWORD [108+ebp]
|
|
xor edx,edi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
sub ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
add ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
xor ecx,ebx
|
|
xor esi,ecx
|
|
; round 14
|
|
mov edx,DWORD [112+ebp]
|
|
mov ecx,DWORD [116+ebp]
|
|
sub edx,esi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
add ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
xor ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
sub ecx,ebx
|
|
xor edi,ecx
|
|
; round 15
|
|
mov edx,DWORD [120+ebp]
|
|
mov ecx,DWORD [124+ebp]
|
|
add edx,edi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
xor ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
sub ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
add ecx,ebx
|
|
xor esi,ecx
|
|
L$000cast_enc_done:
|
|
nop
|
|
mov eax,DWORD [20+esp]
|
|
mov DWORD [4+eax],edi
|
|
mov DWORD [eax],esi
|
|
pop edi
|
|
pop esi
|
|
pop ebx
|
|
pop ebp
|
|
ret
|
|
extern _CAST_S_table0
|
|
extern _CAST_S_table1
|
|
extern _CAST_S_table2
|
|
extern _CAST_S_table3
|
|
global _CAST_decrypt
|
|
align 16
|
|
_CAST_decrypt:
|
|
L$_CAST_decrypt_begin:
|
|
;
|
|
push ebp
|
|
push ebx
|
|
mov ebx,DWORD [12+esp]
|
|
mov ebp,DWORD [16+esp]
|
|
push esi
|
|
push edi
|
|
; Load the 2 words
|
|
mov edi,DWORD [ebx]
|
|
mov esi,DWORD [4+ebx]
|
|
; Get short key flag
|
|
mov eax,DWORD [128+ebp]
|
|
or eax,eax
|
|
jnz NEAR L$001cast_dec_skip
|
|
xor eax,eax
|
|
; round 15
|
|
mov edx,DWORD [120+ebp]
|
|
mov ecx,DWORD [124+ebp]
|
|
add edx,esi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
xor ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
sub ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
add ecx,ebx
|
|
xor edi,ecx
|
|
; round 14
|
|
mov edx,DWORD [112+ebp]
|
|
mov ecx,DWORD [116+ebp]
|
|
sub edx,edi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
add ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
xor ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
sub ecx,ebx
|
|
xor esi,ecx
|
|
; round 13
|
|
mov edx,DWORD [104+ebp]
|
|
mov ecx,DWORD [108+ebp]
|
|
xor edx,esi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
sub ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
add ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
xor ecx,ebx
|
|
xor edi,ecx
|
|
; round 12
|
|
mov edx,DWORD [96+ebp]
|
|
mov ecx,DWORD [100+ebp]
|
|
add edx,edi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
xor ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
sub ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
add ecx,ebx
|
|
xor esi,ecx
|
|
L$001cast_dec_skip:
|
|
; round 11
|
|
mov edx,DWORD [88+ebp]
|
|
mov ecx,DWORD [92+ebp]
|
|
sub edx,esi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
add ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
xor ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
sub ecx,ebx
|
|
xor edi,ecx
|
|
; round 10
|
|
mov edx,DWORD [80+ebp]
|
|
mov ecx,DWORD [84+ebp]
|
|
xor edx,edi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
sub ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
add ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
xor ecx,ebx
|
|
xor esi,ecx
|
|
; round 9
|
|
mov edx,DWORD [72+ebp]
|
|
mov ecx,DWORD [76+ebp]
|
|
add edx,esi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
xor ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
sub ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
add ecx,ebx
|
|
xor edi,ecx
|
|
; round 8
|
|
mov edx,DWORD [64+ebp]
|
|
mov ecx,DWORD [68+ebp]
|
|
sub edx,edi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
add ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
xor ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
sub ecx,ebx
|
|
xor esi,ecx
|
|
; round 7
|
|
mov edx,DWORD [56+ebp]
|
|
mov ecx,DWORD [60+ebp]
|
|
xor edx,esi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
sub ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
add ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
xor ecx,ebx
|
|
xor edi,ecx
|
|
; round 6
|
|
mov edx,DWORD [48+ebp]
|
|
mov ecx,DWORD [52+ebp]
|
|
add edx,edi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
xor ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
sub ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
add ecx,ebx
|
|
xor esi,ecx
|
|
; round 5
|
|
mov edx,DWORD [40+ebp]
|
|
mov ecx,DWORD [44+ebp]
|
|
sub edx,esi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
add ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
xor ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
sub ecx,ebx
|
|
xor edi,ecx
|
|
; round 4
|
|
mov edx,DWORD [32+ebp]
|
|
mov ecx,DWORD [36+ebp]
|
|
xor edx,edi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
sub ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
add ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
xor ecx,ebx
|
|
xor esi,ecx
|
|
; round 3
|
|
mov edx,DWORD [24+ebp]
|
|
mov ecx,DWORD [28+ebp]
|
|
add edx,esi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
xor ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
sub ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
add ecx,ebx
|
|
xor edi,ecx
|
|
; round 2
|
|
mov edx,DWORD [16+ebp]
|
|
mov ecx,DWORD [20+ebp]
|
|
sub edx,edi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
add ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
xor ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
sub ecx,ebx
|
|
xor esi,ecx
|
|
; round 1
|
|
mov edx,DWORD [8+ebp]
|
|
mov ecx,DWORD [12+ebp]
|
|
xor edx,esi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
sub ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
add ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
xor ecx,ebx
|
|
xor edi,ecx
|
|
; round 0
|
|
mov edx,DWORD [ebp]
|
|
mov ecx,DWORD [4+ebp]
|
|
add edx,edi
|
|
rol edx,cl
|
|
mov ebx,edx
|
|
xor ecx,ecx
|
|
mov cl,dh
|
|
and ebx,255
|
|
shr edx,16
|
|
xor eax,eax
|
|
mov al,dh
|
|
and edx,255
|
|
mov ecx,DWORD [_CAST_S_table0+ecx*4]
|
|
mov ebx,DWORD [_CAST_S_table1+ebx*4]
|
|
xor ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table2+eax*4]
|
|
sub ecx,ebx
|
|
mov ebx,DWORD [_CAST_S_table3+edx*4]
|
|
add ecx,ebx
|
|
xor esi,ecx
|
|
nop
|
|
mov eax,DWORD [20+esp]
|
|
mov DWORD [4+eax],edi
|
|
mov DWORD [eax],esi
|
|
pop edi
|
|
pop esi
|
|
pop ebx
|
|
pop ebp
|
|
ret
|
|
global _CAST_cbc_encrypt
|
|
align 16
|
|
_CAST_cbc_encrypt:
|
|
L$_CAST_cbc_encrypt_begin:
|
|
;
|
|
push ebp
|
|
push ebx
|
|
push esi
|
|
push edi
|
|
mov ebp,DWORD [28+esp]
|
|
; getting iv ptr from parameter 4
|
|
mov ebx,DWORD [36+esp]
|
|
mov esi,DWORD [ebx]
|
|
mov edi,DWORD [4+ebx]
|
|
push edi
|
|
push esi
|
|
push edi
|
|
push esi
|
|
mov ebx,esp
|
|
mov esi,DWORD [36+esp]
|
|
mov edi,DWORD [40+esp]
|
|
; getting encrypt flag from parameter 5
|
|
mov ecx,DWORD [56+esp]
|
|
; get and push parameter 3
|
|
mov eax,DWORD [48+esp]
|
|
push eax
|
|
push ebx
|
|
cmp ecx,0
|
|
jz NEAR L$002decrypt
|
|
and ebp,4294967288
|
|
mov eax,DWORD [8+esp]
|
|
mov ebx,DWORD [12+esp]
|
|
jz NEAR L$003encrypt_finish
|
|
L$004encrypt_loop:
|
|
mov ecx,DWORD [esi]
|
|
mov edx,DWORD [4+esi]
|
|
xor eax,ecx
|
|
xor ebx,edx
|
|
bswap eax
|
|
bswap ebx
|
|
mov DWORD [8+esp],eax
|
|
mov DWORD [12+esp],ebx
|
|
call L$_CAST_encrypt_begin
|
|
mov eax,DWORD [8+esp]
|
|
mov ebx,DWORD [12+esp]
|
|
bswap eax
|
|
bswap ebx
|
|
mov DWORD [edi],eax
|
|
mov DWORD [4+edi],ebx
|
|
add esi,8
|
|
add edi,8
|
|
sub ebp,8
|
|
jnz NEAR L$004encrypt_loop
|
|
L$003encrypt_finish:
|
|
mov ebp,DWORD [52+esp]
|
|
and ebp,7
|
|
jz NEAR L$005finish
|
|
call L$006PIC_point
|
|
L$006PIC_point:
|
|
pop edx
|
|
lea ecx,[(L$007cbc_enc_jmp_table-L$006PIC_point)+edx]
|
|
mov ebp,DWORD [ebp*4+ecx]
|
|
add ebp,edx
|
|
xor ecx,ecx
|
|
xor edx,edx
|
|
jmp ebp
|
|
L$008ej7:
|
|
mov dh,BYTE [6+esi]
|
|
shl edx,8
|
|
L$009ej6:
|
|
mov dh,BYTE [5+esi]
|
|
L$010ej5:
|
|
mov dl,BYTE [4+esi]
|
|
L$011ej4:
|
|
mov ecx,DWORD [esi]
|
|
jmp NEAR L$012ejend
|
|
L$013ej3:
|
|
mov ch,BYTE [2+esi]
|
|
shl ecx,8
|
|
L$014ej2:
|
|
mov ch,BYTE [1+esi]
|
|
L$015ej1:
|
|
mov cl,BYTE [esi]
|
|
L$012ejend:
|
|
xor eax,ecx
|
|
xor ebx,edx
|
|
bswap eax
|
|
bswap ebx
|
|
mov DWORD [8+esp],eax
|
|
mov DWORD [12+esp],ebx
|
|
call L$_CAST_encrypt_begin
|
|
mov eax,DWORD [8+esp]
|
|
mov ebx,DWORD [12+esp]
|
|
bswap eax
|
|
bswap ebx
|
|
mov DWORD [edi],eax
|
|
mov DWORD [4+edi],ebx
|
|
jmp NEAR L$005finish
|
|
L$002decrypt:
|
|
and ebp,4294967288
|
|
mov eax,DWORD [16+esp]
|
|
mov ebx,DWORD [20+esp]
|
|
jz NEAR L$016decrypt_finish
|
|
L$017decrypt_loop:
|
|
mov eax,DWORD [esi]
|
|
mov ebx,DWORD [4+esi]
|
|
bswap eax
|
|
bswap ebx
|
|
mov DWORD [8+esp],eax
|
|
mov DWORD [12+esp],ebx
|
|
call L$_CAST_decrypt_begin
|
|
mov eax,DWORD [8+esp]
|
|
mov ebx,DWORD [12+esp]
|
|
bswap eax
|
|
bswap ebx
|
|
mov ecx,DWORD [16+esp]
|
|
mov edx,DWORD [20+esp]
|
|
xor ecx,eax
|
|
xor edx,ebx
|
|
mov eax,DWORD [esi]
|
|
mov ebx,DWORD [4+esi]
|
|
mov DWORD [edi],ecx
|
|
mov DWORD [4+edi],edx
|
|
mov DWORD [16+esp],eax
|
|
mov DWORD [20+esp],ebx
|
|
add esi,8
|
|
add edi,8
|
|
sub ebp,8
|
|
jnz NEAR L$017decrypt_loop
|
|
L$016decrypt_finish:
|
|
mov ebp,DWORD [52+esp]
|
|
and ebp,7
|
|
jz NEAR L$005finish
|
|
mov eax,DWORD [esi]
|
|
mov ebx,DWORD [4+esi]
|
|
bswap eax
|
|
bswap ebx
|
|
mov DWORD [8+esp],eax
|
|
mov DWORD [12+esp],ebx
|
|
call L$_CAST_decrypt_begin
|
|
mov eax,DWORD [8+esp]
|
|
mov ebx,DWORD [12+esp]
|
|
bswap eax
|
|
bswap ebx
|
|
mov ecx,DWORD [16+esp]
|
|
mov edx,DWORD [20+esp]
|
|
xor ecx,eax
|
|
xor edx,ebx
|
|
mov eax,DWORD [esi]
|
|
mov ebx,DWORD [4+esi]
|
|
L$018dj7:
|
|
ror edx,16
|
|
mov BYTE [6+edi],dl
|
|
shr edx,16
|
|
L$019dj6:
|
|
mov BYTE [5+edi],dh
|
|
L$020dj5:
|
|
mov BYTE [4+edi],dl
|
|
L$021dj4:
|
|
mov DWORD [edi],ecx
|
|
jmp NEAR L$022djend
|
|
L$023dj3:
|
|
ror ecx,16
|
|
mov BYTE [2+edi],cl
|
|
shl ecx,16
|
|
L$024dj2:
|
|
mov BYTE [1+esi],ch
|
|
L$025dj1:
|
|
mov BYTE [esi],cl
|
|
L$022djend:
|
|
jmp NEAR L$005finish
|
|
L$005finish:
|
|
mov ecx,DWORD [60+esp]
|
|
add esp,24
|
|
mov DWORD [ecx],eax
|
|
mov DWORD [4+ecx],ebx
|
|
pop edi
|
|
pop esi
|
|
pop ebx
|
|
pop ebp
|
|
ret
|
|
align 64
|
|
L$007cbc_enc_jmp_table:
|
|
dd 0
|
|
dd L$015ej1-L$006PIC_point
|
|
dd L$014ej2-L$006PIC_point
|
|
dd L$013ej3-L$006PIC_point
|
|
dd L$011ej4-L$006PIC_point
|
|
dd L$010ej5-L$006PIC_point
|
|
dd L$009ej6-L$006PIC_point
|
|
dd L$008ej7-L$006PIC_point
|
|
align 64
|