Advertisement
Guest User

Blowfish CBC Mode for MASM

a guest
Jan 26th, 2011
268
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Blowfish_EncryptCBC proc dataIn:DWORD, dataOut:DWORD, dataLen:DWORD, ivPtr:DWORD
  2.     LOCAL ivHI:DWORD
  3.     LOCAL ivLO:DWORD
  4.     LOCAL decryptSize:DWORD
  5.    
  6.     ;load IV into local vars
  7.     mov eax, ivPtr
  8.     push [eax]
  9.     pop ivHI
  10.     push [eax+4]
  11.     pop ivLO
  12.    
  13.    
  14.     ;calculate number of blocks
  15.     mov eax, dataLen
  16.     sar eax, 3
  17.     xchg eax, ecx
  18.     mov esi, dataIn
  19.     mov edi, dataOut
  20.     xor ebx,ebx
  21.    
  22.     .while ecx != 0
  23.        
  24.         ;xor input
  25.         mov eax, ivHI
  26.         mov edx, [esi+ebx]
  27.         bswap edx
  28.         xor edx,eax
  29.         mov [esi+ebx], edx
  30.        
  31.         mov eax, ivLO
  32.         mov edx, [esi+ebx+4]
  33.         bswap edx
  34.         xor edx,eax
  35.         mov [esi+ebx+4], edx
  36.  
  37.         lea edx, [esi +ebx]
  38.         push edx
  39.         lea edx, [edi +ebx]
  40.         push edx
  41.        
  42.         call Blowfish_Encrypt
  43.        
  44.         ;update CV
  45.         push [edi+ebx]
  46.         pop ivHI
  47.        
  48.         push [edi+ebx+4]
  49.         pop ivLO
  50.        
  51.         ;adjust output
  52.         mov eax, [edi+ebx]
  53.         bswap eax
  54.         mov [edi+ebx], eax
  55.  
  56.         mov eax, [edi+ebx +4]
  57.         bswap eax
  58.         mov [edi+ebx +4], eax
  59.        
  60.         add ebx, 8
  61.         dec ecx
  62.     .endw
  63.    
  64.     mov eax, dataLen    ;check for valid size
  65.     and eax, 80000007h
  66.     .if eax > 0
  67.         lea eax, ivLO
  68.         ;flip them here!
  69.         push ivLO
  70.         push ivHI
  71.         pop ivLO
  72.         pop ivHI
  73.         invoke Blowfish_Encrypt,eax,eax
  74.         mov esi, dataIn     ;esi holds pointer to encrypted data
  75.         mov edi, dataOut    ;edi holds pointer to decrypt buffer
  76.        
  77.         mov edx, [esi+ebx]      ;load decrypted result HI
  78.         bswap edx
  79.         xor edx, ivLO           ;XOR with IV HI
  80.         bswap edx
  81.         mov [edi+ebx], edx      ;store result HI
  82.  
  83.         mov edx, [esi+ebx +4]   ;load decrypted result LO
  84.         bswap edx
  85.         xor edx, ivHI           ;XOR with IV LO
  86.         bswap edx
  87.         mov [edi+ebx +4], edx;store result LO
  88.     .endif
  89.    
  90.     ret
  91. Blowfish_EncryptCBC endp
  92.  
  93.  
  94. Blowfish_DecryptCBC proc dataIn:DWORD, dataOut:DWORD, dataLen:DWORD, ivPtr:DWORD
  95.     LOCAL ivHI:DWORD
  96.     LOCAL ivLO:DWORD
  97.     LOCAL ivNextHI:DWORD
  98.     LOCAL ivNextLO:DWORD
  99.     LOCAL decryptSize:DWORD
  100.    
  101.     mov eax, ivPtr
  102.     push [eax]
  103.     pop ivHI
  104.     push [eax + 4]
  105.     pop ivLO
  106.    
  107.     mov eax, dataLen    ;check for valid size
  108.  
  109.     sar eax, 3
  110.    
  111.     xchg eax, ecx       ;move number of chunks to ECX
  112.     mov esi, dataIn     ;esi holds pointer to encrypted data
  113.     mov edi, dataOut    ;edi holds pointer to decrypt buffer
  114.     xor ebx,ebx         ;current offset
  115.    
  116.     .while ecx != 0
  117.         lea eax, [esi+ebx]      ;get source offset
  118.         push ecx                ;save ECX
  119.         mov ecx, [eax]
  120.         bswap ecx
  121.         push ecx
  122.         pop ivNextHI            ;save next IV HI
  123.         mov ecx, [eax+4]
  124.         bswap ecx
  125.         push ecx
  126.         pop ivNextLO            ;save next IV LO
  127.         pop ecx                 ;restore ECX
  128.         push eax                ;push source offset
  129.         push ecx                ;save ecx
  130.         mov ecx, [eax]
  131.         bswap ecx
  132.         mov [eax], ecx
  133.         mov ecx, [eax+4]
  134.         bswap ecx
  135.         mov [eax+4], ecx
  136.         pop ecx                 ;restore ECX
  137.         lea eax, [edi+ebx]      ;load dest offset
  138.         push eax                ;push dest offset
  139.        
  140.         call Blowfish_Decrypt   ;decrypt
  141.        
  142.         mov edx, [edi+ebx]      ;load decrypted result HI
  143.         xor edx, ivHI           ;XOR with IV HI
  144.         bswap edx
  145.         mov [edi+ebx], edx      ;store result HI
  146.  
  147.         mov edx, [edi+ebx +4]   ;load decrypted result LO
  148.         xor edx, ivLO           ;XOR with IV LO
  149.         bswap edx
  150.         mov [edi+ebx +4], edx;store result LO
  151.  
  152.         push ivNextLO
  153.         pop ivLO
  154.         push ivNextHI
  155.         pop ivHI
  156.        
  157.         add ebx, 8              ;increment pointer by 8
  158.         dec ecx                 ;decrement remaining blocks
  159.     .endw
  160.    
  161.     mov eax, dataLen    ;check for valid size
  162.     and eax, 80000007h
  163.     .if eax > 0
  164.         lea eax, ivLO
  165.         ;flip them here!
  166.         push ivLO
  167.         push ivHI
  168.         pop ivLO
  169.         pop ivHI
  170.         invoke Blowfish_Encrypt,eax,eax
  171.         mov esi, dataIn     ;esi holds pointer to encrypted data
  172.         mov edi, dataOut    ;edi holds pointer to decrypt buffer
  173.        
  174.         mov edx, [esi+ebx]      ;load decrypted result HI
  175.         bswap edx
  176.         xor edx, ivLO           ;XOR with IV HI
  177.         bswap edx
  178.         mov [edi+ebx], edx      ;store result HI
  179.  
  180.         mov edx, [esi+ebx +4]   ;load decrypted result LO
  181.         bswap edx
  182.         xor edx, ivHI           ;XOR with IV LO
  183.         bswap edx
  184.         mov [edi+ebx +4], edx;store result LO
  185.     .endif
  186.    
  187.    
  188.     ret
  189. Blowfish_DecryptCBC endp
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement