Miscellany
public text v1 · immutable; 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