| ; 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 |