All pastes #2103879 Raw Edit

Miscellany

public text v1 · immutable
#2103879 ·published 2012-01-18 19:11 UTC
rendered paste body
; algorytm haszujacy MD5
; dwie podstawowe procedury:
;		MD5Init(var stan) - procedura okreslajaca stan poczatkowy, przyjmuje strukture md5_state_s jako parametr
;		MD5Process(var dane, var dane) - procedura haszujaca, parametry: struktura md5_state_s oraz 64 bakjtowy blok danych

	                    .586 
 
						.MODEL FLAT, STDCALL
						
						.DATA

; zmienne pomocnicze przechowujace biezaca wartosc sumy md5

AA						dword ?
BB						dword ?
DDD						dword ?
EE                      dword ?
 
						.CODE

; makro kopiujace wartosc ze zmiennej zrodlowej do zmiennej docelowej
						
save                    macro   dest,			src 
                        mov     EAX,			src 
                        mov     dest,			EAX 
                        endm 

; makro dodajace dwie zmienne
 
addd                    macro   i,j 
                        mov     EAX,			j 
                        add     i,              EAX 
                        endm 
						
; wskazniki na 4 czesci stanu sumy MD5

A                       equ     dword ptr [EDI+8]
B                       equ     dword ptr [EDI+12]
D                       equ     dword ptr [EDI+16]
E                       equ     dword ptr [EDI+20]

; wskaznik na 64 bajtowy blok danych wejsciowych

X                       equ     dword ptr [ESI]
 
; stale o wartosciach: floor(abs(sin(i + 1)) × (2 pow 32)) 

T1						equ		3614090360
T2 						equ		3905402710 
T3						equ		606105819
T4 						equ		3250441966 
T5 						equ		4118548399  
T6 						equ		1200080426
T7 						equ		2821735955  
T8 						equ		4249261313 
T9 						equ		1770035416
T10 					equ		2336552879  
T11  					equ		4294925233  
T12  					equ		2304563134  
T13  					equ		1804603682
T14  					equ		4254626195  
T15  					equ		2792965006  
T16  					equ		1236535329
T17  					equ		4129170786  
T18  					equ		3225465664  
T19  					equ		643717713
T20  					equ		3921069994 
T21  					equ		3593408605 
T22  					equ		38016083
T23  					equ		3634488961 
T24  					equ		3889429448 
T25  					equ		568446438
T26  					equ		3275163606
T27  					equ		4107603335
T28  					equ		1163531501
T29  					equ		2850285829 
T30  					equ		4243563512 
T31  					equ		1735328473
T32  					equ		2368359562 
T33  					equ		4294588738 
T34  					equ		2272392833
T35  					equ		1839030562
T36  					equ		4259657740 
T37  					equ		2763975236 
T38  					equ		1272893353
T39  					equ		4139469664 
T40  					equ		3200236656
T41  					equ		681279174 
T42  					equ		3936430074
T43  					equ		3572445317 
T44  					equ		76029189 
T45  					equ		3654602809
T46  					equ		3873151461 
T47  					equ		 530742520  
T48  					equ		3299628645
T49  					equ		4096336452 
T50  					equ		1126891415
T51  					equ		2878612391 
T52  					equ		4237533241
T53  					equ		1700485571  
T54  					equ		2399980690  
T55  					equ		4293915773 
T56  					equ		2240044497 
T57  					equ		1873313359
T58  					equ		4264355552
T59  					equ		2734768916 
T60  					equ		1309151649 
T61  					equ		4149444226  
T62  					equ		3174756917 
T63  					equ		718787259
T64  					equ		3951481745 
 
; stale przesuniecia bitowe stosowane w makrach FF, GG, HH oraz II
 
S11                     equ     7 
S12                     equ     12 
S13                     equ     17 
S14                     equ     22 
S21                     equ     5 
S22                     equ     9 
S23                     equ     14 
S24                     equ     20 
S31                     equ     4 
S32                     equ     11 
S33                     equ     16 
S34                     equ     23
S41                     equ     6 
S42                     equ     10 
S43                     equ     15 
S44                     equ     21 
 
; makro FF(a,b,d,e,X[k],s,t) oznacza funkcje a = b + ((a + F(b,d,e) + X[k] + t) <<< s) 

FF                      macro   a,b,d,e,X,s,t 
                        mov     EBX,            b 
                        mov     ECX,            d 
                        mov     EDX,            e 
                        call    F 
                        add     EAX,            a 
                        add     EAX,            X 
                        add     EAX,            t 
                        rol     EAX,            s 
                        add     EAX,            b 
                        mov     a,              EAX 
                        endm
 
; makro GG(a,b,d,e,X[k],s,t) oznacza funkcje a = b + ((a + G(b,d,e) + X[k] + t) <<< s) 

GG                      macro   a,b,d,e,X,s,t 
                        mov     EBX,            b 
                        mov     ECX,            d 
                        mov     EDX,            e 
                        call    G 
                        add     EAX,            a 
                        add     EAX,            X 
                        add     EAX,            t 
                        rol     EAX,            s 
                        add     EAX,            b 
                        mov     a,              EAX 
                        endm

; makro HH(a,b,d,e,X[k],s,t) oznacza funkcje a = b + ((a + H(b,d,e) + X[k] + t) <<< s) 

HH                      macro   a,b,d,e,X,s,t 
                        mov     EBX,            b 
                        mov     ECX,            d 
                        mov     EDX,            e 
                        call    H 
                        add     EAX,            a 
                        add     EAX,            X 
                        add     EAX,            t 
                        rol     EAX,            s 
                        add     EAX,            b 
                        mov     a,              EAX 
                        endm 
  
; makro II(a,b,d,e,X[k],s,t) oznacza funkcje a = b + ((a + I(b,d,e) + X[k] + t) <<< s) 

II                      macro   a,b,d,e,X,s,t 
                        mov     EBX,            b 
                        mov     ECX,            d 
                        mov     EDX,            e 
                        call    I 
                        add     EAX,            a 
                        add     EAX,            X 
                        add     EAX,            t 
                        rol     EAX,            s 
                        add     EAX,            b 
                        mov     a,              EAX 
                        endm 
 
; funkcja pomocnicza F(X,Y,Z)=XY v not(X) Z 
; X = EBX, Y = ECX, Z = EDX, wynik = EAX 

F                       proc    near 
                        mov     EAX,            EBX 
                        and     EAX,            ECX 
                        push    EBX 
                        not     EBX 
                        and     EBX,            EDX 
                        or      EAX,            EBX 
                        pop     EBX 
                        ret 
F                       endp 

; funkcja pomocnicza G(X,Y,Z)=XZ v Y not(Z) 
; X = EBX, Y = ECX, Z = EDX, wynik = EAX 

G                       proc    near 
                        mov     EAX,            EBX 
                        and     EAX,            EDX 
                        push    EDX 
                        not     EDX 
                        and     EDX,            ECX 
                        or      EAX,            EDX 
                        pop     EDX 
                        ret 
G                       endp 

; funckja pomocnicza H(X,Y,Z)=X xor Y xor Z 
; X = EBX, Y = ECX, Z = EDX, wynik = EAX 

H                       proc    near 
                        mov     EAX,            EBX 
                        xor     EAX,            ECX 
                        xor     EAX,            EDX 
                        ret 
H                       endp 

; funkcja pomocnicza I(X,Y,Z)=Y xor (X v not(Z)) 
; X = EBX, Y = ECX, Z = EDX, wynik = EAX 

I                       proc    near 
                        mov     EAX,            EDX 
                        not     EAX 
                        or      EAX,            EBX 
                        xor     EAX,            ECX 
                        ret 
I                       endp 
 
; procedura MD5Init(var hash), okresla stan poczatkowy sumy MD5

                        public  MD5Init 
MD5Init                 proc	var1:ptr

	                    mov		edi,			var1	; wskaznik na poczatek tablicy stanu
	                    
	                    ; wielkosc danych wejsciowych 
	                    	 
	                    mov		dword ptr [edi], 0		; lsw	                       
	                    mov		dword ptr [edi+4], 0	; msw
	                    
	                    ; ustawiamy stan początkowy na 0123456789abcdeffedcba9876543210
	                    
                        mov     A,				67452301h 
                        mov     B,				0efcdab89h 
                        mov     D,				98badcfeh  
                        mov     E,				10325476h 
                                            
                        ret
                        
MD5Init                 endp 

; procedura MD5Process(var dane; var hash), glowna procedura calego algorytmu haszowania
; przetwarzajaca dane wejsciowe, modyfikuje stan sumy MD5                   
 
                        public  MD5Process
MD5Process              proc	uses EDI ESI, var1:ptr, var2:ptr
 
						mov     EDI,			var1   ; wskaznik na poczatek struktury stanu
                        mov     ESI,			var2   ; wskaznik na blok danych (64 bajty) 
                        
                        save    AA,				A      ; przechowujemy poprzedni stan sumy MD5
                        save    BB,				B 
                        save    DDD,			D 
                        save    EE,				E 

						; runda 1 

                        FF      a,b,d,e, X[4*0], S11, T1  
                        FF      e,a,b,d, X[4*1], S12, T2  
                        FF      d,e,a,b, X[4*2], S13, T3
                        FF      b,d,e,a, X[4*3], S14, T4  
                        FF      a,b,d,e, X[4*4], S11, T5  
                        FF      e,a,b,d, X[4*5], S12, T6
                        FF      d,e,a,b, X[4*6], S13, T7 
                        FF      b,d,e,a, X[4*7], S14, T8 
                        FF      a,b,d,e, X[4*8], S11, T9
                        FF      e,a,b,d, X[4*9], S12, T10
                        FF      d,e,a,b, X[4*10],S13, T11
                        FF      b,d,e,a, X[4*11],S14, T12
                        FF      a,b,d,e, X[4*12],S11, T13
                        FF      e,a,b,d, X[4*13],S12, T14
                        FF      d,e,a,b, X[4*14],S13, T15
                        FF      b,d,e,a, X[4*15],S14, T16
                        
                        ; runda 2

                        GG      a,b,d,e, X[4*1], S21, T17
                        GG      e,a,b,d, X[4*6], S22, T18
                        GG      d,e,a,b, X[4*11],S23, T19 
                        GG      b,d,e,a, X[4*0], S24, T20
                        GG      a,b,d,e, X[4*5], S21, T21
                        GG      e,a,b,d, X[4*10],S22, T22  
                        GG      d,e,a,b, X[4*15],S23, T23
                        GG      b,d,e,a, X[4*4], S24, T24
                        GG      a,b,d,e, X[4*9], S21, T25
                        GG      e,a,b,d, X[4*14],S22, T26
                        GG      d,e,a,b, X[4*3], S23, T27
                        GG      b,d,e,a, X[4*8], S24, T28
                        GG      a,b,d,e, X[4*13],S21, T29
                        GG      e,a,b,d, X[4*2], S22, T30
                        GG      d,e,a,b, X[4*7], S23, T31
                        GG      b,d,e,a, X[4*12],S24, T32
                        
                        ; runda 3

                        HH      a,b,d,e, X[4*5], S31, T33
                        HH      e,a,b,d, X[4*8], S32, T34
                        HH      d,e,a,b, X[4*11],S33, T35
                        HH      b,d,e,a, X[4*14],S34, T36
                        HH      a,b,d,e, X[4*1], S31, T37
                        HH      e,a,b,d, X[4*4], S32, T38
                        HH      d,e,a,b, X[4*7], S33, T39
                        HH      b,d,e,a, X[4*10],S34, T40
                        HH      a,b,d,e, X[4*13],S31, T41 
                        HH      e,a,b,d, X[4*0], S32, T42
                        HH      d,e,a,b, X[4*3], S33, T43
                        HH      b,d,e,a, X[4*6], S34, T44
                        HH      a,b,d,e, X[4*9], S31, T45
                        HH      e,a,b,d, X[4*12],S32, T46
                        HH      d,e,a,b, X[4*15],S33, T47 
                        HH      b,d,e,a, X[4*2], S34, T48
                        
                        ; runda 4

                        II      a,b,d,e, X[4*0], S41, T49
                        II      e,a,b,d, X[4*7], S42, T50
                        II      d,e,a,b, X[4*14],S43, T51
                        II      b,d,e,a, X[4*5], S44, T52
                        II      a,b,d,e, X[4*12],S41, T53
                        II      e,a,b,d, X[4*3], S42, T54
                        II      d,e,a,b, X[4*10],S43, T55
                        II      b,d,e,a, X[4*1], S44, T56
                        II      a,b,d,e, X[4*8], S41, T57
                        II      e,a,b,d, X[4*15],S42, T58
                        II      d,e,a,b, X[4*6], S43, T59
                        II      b,d,e,a, X[4*13],S44, T60
                        II      a,b,d,e, X[4*4], S41, T61
                        II      e,a,b,d, X[4*11],S42, T62
                        II      d,e,a,b, X[4*2], S43, T63
                        II      b,d,e,a, X[4*9], S44, T64  

						; sumowanie biezacych wartosci z suma powstala w poprzednich przebiegach funkcji

                        addd    A,              AA       
                        addd    B,              BB 
                        addd    D,              DDD 
                        addd    E,              EE
                         
                        ret
 
MD5Process              endp 
                    
                        end