	; Don't even think of reading this code
	; It was automatically generated by cast-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	cast-586.asm
        .486
.model FLAT
_TEXT	SEGMENT
PUBLIC	_CAST_encrypt
EXTERN	_CAST_S_table0:DWORD
EXTERN	_CAST_S_table1:DWORD
EXTERN	_CAST_S_table2:DWORD
EXTERN	_CAST_S_table3:DWORD

_CAST_encrypt PROC NEAR
	; 
	push	ebp
	push	ebx
	mov	ebx,		DWORD PTR 12[esp]
	mov	ebp,		DWORD PTR 16[esp]
	push	esi
	push	edi
	; Load the 2 words
	mov	edi,		DWORD PTR [ebx]
	mov	esi,		DWORD PTR 4[ebx]
	; Get short key flag
	mov	eax,		DWORD PTR 128[ebp]
	push	eax
	xor	eax,		eax
	; round 0
	mov	edx,		DWORD PTR [ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	xor	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	sub	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	add	ecx,		ebx
	xor	edi,		ecx
	; round 1
	mov	edx,		DWORD PTR 8[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	sub	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	add	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	xor	ecx,		ebx
	xor	esi,		ecx
	; round 2
	mov	edx,		DWORD PTR 16[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	add	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	xor	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	sub	ecx,		ebx
	xor	edi,		ecx
	; round 3
	mov	edx,		DWORD PTR 24[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	xor	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	sub	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	add	ecx,		ebx
	xor	esi,		ecx
	; round 4
	mov	edx,		DWORD PTR 32[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	sub	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	add	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	xor	ecx,		ebx
	xor	edi,		ecx
	; round 5
	mov	edx,		DWORD PTR 40[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	add	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	xor	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	sub	ecx,		ebx
	xor	esi,		ecx
	; round 6
	mov	edx,		DWORD PTR 48[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	xor	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	sub	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	add	ecx,		ebx
	xor	edi,		ecx
	; round 7
	mov	edx,		DWORD PTR 56[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	sub	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	add	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	xor	ecx,		ebx
	xor	esi,		ecx
	; round 8
	mov	edx,		DWORD PTR 64[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	add	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	xor	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	sub	ecx,		ebx
	xor	edi,		ecx
	; round 9
	mov	edx,		DWORD PTR 72[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	xor	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	sub	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	add	ecx,		ebx
	xor	esi,		ecx
	; round 10
	mov	edx,		DWORD PTR 80[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	sub	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	add	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	xor	ecx,		ebx
	xor	edi,		ecx
	; round 11
	mov	edx,		DWORD PTR 88[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	add	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	xor	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	sub	ecx,		ebx
	xor	esi,		ecx
	; test short key flag
	pop	edx
	or	edx,		edx
	jnz	$L000cast_enc_done
	; round 12
	mov	edx,		DWORD PTR 96[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	xor	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	sub	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	add	ecx,		ebx
	xor	edi,		ecx
	; round 13
	mov	edx,		DWORD PTR 104[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	sub	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	add	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	xor	ecx,		ebx
	xor	esi,		ecx
	; round 14
	mov	edx,		DWORD PTR 112[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	add	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	xor	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	sub	ecx,		ebx
	xor	edi,		ecx
	; round 15
	mov	edx,		DWORD PTR 120[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	xor	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	sub	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	add	ecx,		ebx
	xor	esi,		ecx
$L000cast_enc_done:
	nop
	mov	eax,		DWORD PTR 20[esp]
	mov	DWORD PTR 4[eax],edi
	mov	DWORD PTR [eax],esi
	pop	edi
	pop	esi
	pop	ebx
	pop	ebp
	ret
_CAST_encrypt ENDP
_TEXT	ENDS
_TEXT	SEGMENT
PUBLIC	_CAST_decrypt
EXTERN	_CAST_S_table0:DWORD
EXTERN	_CAST_S_table1:DWORD
EXTERN	_CAST_S_table2:DWORD
EXTERN	_CAST_S_table3:DWORD

_CAST_decrypt PROC NEAR
	; 
	push	ebp
	push	ebx
	mov	ebx,		DWORD PTR 12[esp]
	mov	ebp,		DWORD PTR 16[esp]
	push	esi
	push	edi
	; Load the 2 words
	mov	edi,		DWORD PTR [ebx]
	mov	esi,		DWORD PTR 4[ebx]
	; Get short key flag
	mov	eax,		DWORD PTR 128[ebp]
	or	eax,		eax
	jnz	$L001cast_dec_skip
	xor	eax,		eax
	; round 15
	mov	edx,		DWORD PTR 120[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	xor	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	sub	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	add	ecx,		ebx
	xor	edi,		ecx
	; round 14
	mov	edx,		DWORD PTR 112[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	add	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	xor	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	sub	ecx,		ebx
	xor	esi,		ecx
	; round 13
	mov	edx,		DWORD PTR 104[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	sub	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	add	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	xor	ecx,		ebx
	xor	edi,		ecx
	; round 12
	mov	edx,		DWORD PTR 96[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	xor	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	sub	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	add	ecx,		ebx
	xor	esi,		ecx
$L001cast_dec_skip:
	; round 11
	mov	edx,		DWORD PTR 88[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	add	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	xor	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	sub	ecx,		ebx
	xor	edi,		ecx
	; round 10
	mov	edx,		DWORD PTR 80[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	sub	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	add	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	xor	ecx,		ebx
	xor	esi,		ecx
	; round 9
	mov	edx,		DWORD PTR 72[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	xor	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	sub	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	add	ecx,		ebx
	xor	edi,		ecx
	; round 8
	mov	edx,		DWORD PTR 64[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	add	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	xor	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	sub	ecx,		ebx
	xor	esi,		ecx
	; round 7
	mov	edx,		DWORD PTR 56[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	sub	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	add	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	xor	ecx,		ebx
	xor	edi,		ecx
	; round 6
	mov	edx,		DWORD PTR 48[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	xor	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	sub	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	add	ecx,		ebx
	xor	esi,		ecx
	; round 5
	mov	edx,		DWORD PTR 40[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	add	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	xor	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	sub	ecx,		ebx
	xor	edi,		ecx
	; round 4
	mov	edx,		DWORD PTR 32[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	sub	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	add	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	xor	ecx,		ebx
	xor	esi,		ecx
	; round 3
	mov	edx,		DWORD PTR 24[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	xor	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	sub	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	add	ecx,		ebx
	xor	edi,		ecx
	; round 2
	mov	edx,		DWORD PTR 16[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	add	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	xor	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	sub	ecx,		ebx
	xor	esi,		ecx
	; round 1
	mov	edx,		DWORD PTR 8[ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	sub	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	add	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	xor	ecx,		ebx
	xor	edi,		ecx
	; round 0
	mov	edx,		DWORD PTR [ebp]
	mov	ecx,		DWORD PTR 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 PTR _CAST_S_table0[ecx*4]
	mov	ebx,		DWORD PTR _CAST_S_table1[ebx*4]
	xor	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table2[eax*4]
	sub	ecx,		ebx
	mov	ebx,		DWORD PTR _CAST_S_table3[edx*4]
	add	ecx,		ebx
	xor	esi,		ecx
	nop
	mov	eax,		DWORD PTR 20[esp]
	mov	DWORD PTR 4[eax],edi
	mov	DWORD PTR [eax],esi
	pop	edi
	pop	esi
	pop	ebx
	pop	ebp
	ret
_CAST_decrypt ENDP
_TEXT	ENDS
_TEXT	SEGMENT
PUBLIC	_CAST_cbc_encrypt

_CAST_cbc_encrypt PROC NEAR
	; 
	push	ebp
	push	ebx
	push	esi
	push	edi
	mov	ebp,		DWORD PTR 28[esp]
	; getting iv ptr from parameter 4
	mov	ebx,		DWORD PTR 36[esp]
	mov	esi,		DWORD PTR [ebx]
	mov	edi,		DWORD PTR 4[ebx]
	push	edi
	push	esi
	push	edi
	push	esi
	mov	ebx,		esp
	mov	esi,		DWORD PTR 36[esp]
	mov	edi,		DWORD PTR 40[esp]
	; getting encrypt flag from parameter 5
	mov	ecx,		DWORD PTR 56[esp]
	; get and push parameter 3
	mov	eax,		DWORD PTR 48[esp]
	push	eax
	push	ebx
	cmp	ecx,		0
	jz	$L002decrypt
	and	ebp,		4294967288
	mov	eax,		DWORD PTR 8[esp]
	mov	ebx,		DWORD PTR 12[esp]
	jz	$L003encrypt_finish
L004encrypt_loop:
	mov	ecx,		DWORD PTR [esi]
	mov	edx,		DWORD PTR 4[esi]
	xor	eax,		ecx
	xor	ebx,		edx
	bswap	eax
	bswap	ebx
	mov	DWORD PTR 8[esp],eax
	mov	DWORD PTR 12[esp],ebx
	call	_CAST_encrypt
	mov	eax,		DWORD PTR 8[esp]
	mov	ebx,		DWORD PTR 12[esp]
	bswap	eax
	bswap	ebx
	mov	DWORD PTR [edi],eax
	mov	DWORD PTR 4[edi],ebx
	add	esi,		8
	add	edi,		8
	sub	ebp,		8
	jnz	L004encrypt_loop
$L003encrypt_finish:
	mov	ebp,		DWORD PTR 52[esp]
	and	ebp,		7
	jz	$L005finish
	xor	ecx,		ecx
	xor	edx,		edx
	mov	ebp,		DWORD PTR $L006cbc_enc_jmp_table[ebp*4]
	jmp	 ebp
L007ej7:
	xor	edx,		edx
	mov	dh,		BYTE PTR 6[esi]
	shl	edx,		8
L008ej6:
	mov	dh,		BYTE PTR 5[esi]
L009ej5:
	mov	dl,		BYTE PTR 4[esi]
L010ej4:
	mov	ecx,		DWORD PTR [esi]
	jmp	$L011ejend
L012ej3:
	mov	ch,		BYTE PTR 2[esi]
	xor	ecx,		ecx
	shl	ecx,		8
L013ej2:
	mov	ch,		BYTE PTR 1[esi]
L014ej1:
	mov	cl,		BYTE PTR [esi]
$L011ejend:
	xor	eax,		ecx
	xor	ebx,		edx
	bswap	eax
	bswap	ebx
	mov	DWORD PTR 8[esp],eax
	mov	DWORD PTR 12[esp],ebx
	call	_CAST_encrypt
	mov	eax,		DWORD PTR 8[esp]
	mov	ebx,		DWORD PTR 12[esp]
	bswap	eax
	bswap	ebx
	mov	DWORD PTR [edi],eax
	mov	DWORD PTR 4[edi],ebx
	jmp	$L005finish
$L002decrypt:
	and	ebp,		4294967288
	mov	eax,		DWORD PTR 16[esp]
	mov	ebx,		DWORD PTR 20[esp]
	jz	$L015decrypt_finish
L016decrypt_loop:
	mov	eax,		DWORD PTR [esi]
	mov	ebx,		DWORD PTR 4[esi]
	bswap	eax
	bswap	ebx
	mov	DWORD PTR 8[esp],eax
	mov	DWORD PTR 12[esp],ebx
	call	_CAST_decrypt
	mov	eax,		DWORD PTR 8[esp]
	mov	ebx,		DWORD PTR 12[esp]
	bswap	eax
	bswap	ebx
	mov	ecx,		DWORD PTR 16[esp]
	mov	edx,		DWORD PTR 20[esp]
	xor	ecx,		eax
	xor	edx,		ebx
	mov	eax,		DWORD PTR [esi]
	mov	ebx,		DWORD PTR 4[esi]
	mov	DWORD PTR [edi],ecx
	mov	DWORD PTR 4[edi],edx
	mov	DWORD PTR 16[esp],eax
	mov	DWORD PTR 20[esp],ebx
	add	esi,		8
	add	edi,		8
	sub	ebp,		8
	jnz	L016decrypt_loop
$L015decrypt_finish:
	mov	ebp,		DWORD PTR 52[esp]
	and	ebp,		7
	jz	$L005finish
	mov	eax,		DWORD PTR [esi]
	mov	ebx,		DWORD PTR 4[esi]
	bswap	eax
	bswap	ebx
	mov	DWORD PTR 8[esp],eax
	mov	DWORD PTR 12[esp],ebx
	call	_CAST_decrypt
	mov	eax,		DWORD PTR 8[esp]
	mov	ebx,		DWORD PTR 12[esp]
	bswap	eax
	bswap	ebx
	mov	ecx,		DWORD PTR 16[esp]
	mov	edx,		DWORD PTR 20[esp]
	xor	ecx,		eax
	xor	edx,		ebx
	mov	eax,		DWORD PTR [esi]
	mov	ebx,		DWORD PTR 4[esi]
L017dj7:
	ror	edx,		16
	mov	BYTE PTR 6[edi],dl
	shr	edx,		16
L018dj6:
	mov	BYTE PTR 5[edi],dh
L019dj5:
	mov	BYTE PTR 4[edi],dl
L020dj4:
	mov	DWORD PTR [edi],ecx
	jmp	$L021djend
L022dj3:
	ror	ecx,		16
	mov	BYTE PTR 2[edi],cl
	shl	ecx,		16
L023dj2:
	mov	BYTE PTR 1[esi],ch
L024dj1:
	mov	BYTE PTR [esi],	cl
$L021djend:
	jmp	$L005finish
$L005finish:
	mov	ecx,		DWORD PTR 60[esp]
	add	esp,		24
	mov	DWORD PTR [ecx],eax
	mov	DWORD PTR 4[ecx],ebx
	pop	edi
	pop	esi
	pop	ebx
	pop	ebp
	ret
$L006cbc_enc_jmp_table:
	DD	0
	DD	L014ej1
	DD	L013ej2
	DD	L012ej3
	DD	L010ej4
	DD	L009ej5
	DD	L008ej6
	DD	L007ej7
L025cbc_dec_jmp_table:
	DD	0
	DD	L024dj1
	DD	L023dj2
	DD	L022dj3
	DD	L020dj4
	DD	L019dj5
	DD	L018dj6
	DD	L017dj7
_CAST_cbc_encrypt ENDP
_TEXT	ENDS
END
