Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Blowfish_EncryptCBC proc dataIn:DWORD, dataOut:DWORD, dataLen:DWORD, ivPtr:DWORD
- LOCAL ivHI:DWORD
- LOCAL ivLO:DWORD
- LOCAL decryptSize:DWORD
- ;load IV into local vars
- mov eax, ivPtr
- push [eax]
- pop ivHI
- push [eax+4]
- pop ivLO
- ;calculate number of blocks
- mov eax, dataLen
- sar eax, 3
- xchg eax, ecx
- mov esi, dataIn
- mov edi, dataOut
- xor ebx,ebx
- .while ecx != 0
- ;xor input
- mov eax, ivHI
- mov edx, [esi+ebx]
- bswap edx
- xor edx,eax
- mov [esi+ebx], edx
- mov eax, ivLO
- mov edx, [esi+ebx+4]
- bswap edx
- xor edx,eax
- mov [esi+ebx+4], edx
- lea edx, [esi +ebx]
- push edx
- lea edx, [edi +ebx]
- push edx
- call Blowfish_Encrypt
- ;update CV
- push [edi+ebx]
- pop ivHI
- push [edi+ebx+4]
- pop ivLO
- ;adjust output
- mov eax, [edi+ebx]
- bswap eax
- mov [edi+ebx], eax
- mov eax, [edi+ebx +4]
- bswap eax
- mov [edi+ebx +4], eax
- add ebx, 8
- dec ecx
- .endw
- mov eax, dataLen ;check for valid size
- and eax, 80000007h
- .if eax > 0
- lea eax, ivLO
- ;flip them here!
- push ivLO
- push ivHI
- pop ivLO
- pop ivHI
- invoke Blowfish_Encrypt,eax,eax
- mov esi, dataIn ;esi holds pointer to encrypted data
- mov edi, dataOut ;edi holds pointer to decrypt buffer
- mov edx, [esi+ebx] ;load decrypted result HI
- bswap edx
- xor edx, ivLO ;XOR with IV HI
- bswap edx
- mov [edi+ebx], edx ;store result HI
- mov edx, [esi+ebx +4] ;load decrypted result LO
- bswap edx
- xor edx, ivHI ;XOR with IV LO
- bswap edx
- mov [edi+ebx +4], edx;store result LO
- .endif
- ret
- Blowfish_EncryptCBC endp
- Blowfish_DecryptCBC proc dataIn:DWORD, dataOut:DWORD, dataLen:DWORD, ivPtr:DWORD
- LOCAL ivHI:DWORD
- LOCAL ivLO:DWORD
- LOCAL ivNextHI:DWORD
- LOCAL ivNextLO:DWORD
- LOCAL decryptSize:DWORD
- mov eax, ivPtr
- push [eax]
- pop ivHI
- push [eax + 4]
- pop ivLO
- mov eax, dataLen ;check for valid size
- sar eax, 3
- xchg eax, ecx ;move number of chunks to ECX
- mov esi, dataIn ;esi holds pointer to encrypted data
- mov edi, dataOut ;edi holds pointer to decrypt buffer
- xor ebx,ebx ;current offset
- .while ecx != 0
- lea eax, [esi+ebx] ;get source offset
- push ecx ;save ECX
- mov ecx, [eax]
- bswap ecx
- push ecx
- pop ivNextHI ;save next IV HI
- mov ecx, [eax+4]
- bswap ecx
- push ecx
- pop ivNextLO ;save next IV LO
- pop ecx ;restore ECX
- push eax ;push source offset
- push ecx ;save ecx
- mov ecx, [eax]
- bswap ecx
- mov [eax], ecx
- mov ecx, [eax+4]
- bswap ecx
- mov [eax+4], ecx
- pop ecx ;restore ECX
- lea eax, [edi+ebx] ;load dest offset
- push eax ;push dest offset
- call Blowfish_Decrypt ;decrypt
- mov edx, [edi+ebx] ;load decrypted result HI
- xor edx, ivHI ;XOR with IV HI
- bswap edx
- mov [edi+ebx], edx ;store result HI
- mov edx, [edi+ebx +4] ;load decrypted result LO
- xor edx, ivLO ;XOR with IV LO
- bswap edx
- mov [edi+ebx +4], edx;store result LO
- push ivNextLO
- pop ivLO
- push ivNextHI
- pop ivHI
- add ebx, 8 ;increment pointer by 8
- dec ecx ;decrement remaining blocks
- .endw
- mov eax, dataLen ;check for valid size
- and eax, 80000007h
- .if eax > 0
- lea eax, ivLO
- ;flip them here!
- push ivLO
- push ivHI
- pop ivLO
- pop ivHI
- invoke Blowfish_Encrypt,eax,eax
- mov esi, dataIn ;esi holds pointer to encrypted data
- mov edi, dataOut ;edi holds pointer to decrypt buffer
- mov edx, [esi+ebx] ;load decrypted result HI
- bswap edx
- xor edx, ivLO ;XOR with IV HI
- bswap edx
- mov [edi+ebx], edx ;store result HI
- mov edx, [esi+ebx +4] ;load decrypted result LO
- bswap edx
- xor edx, ivHI ;XOR with IV LO
- bswap edx
- mov [edi+ebx +4], edx;store result LO
- .endif
- ret
- Blowfish_DecryptCBC endp
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement