www.pudn.com > QQ2005Pwd.rar > md5.asm


;Modify by binny at 2003.12. 
 
_MD5Trans1 MACRO 
	and ebx, eax	 
	not eax		 
	and eax, edx	 
	or eax, ebx	 
ENDM 
 
_MD5Trans2 MACRO 
	and eax, edx	; X & Z 
	not edx		; ~Z 
	and ebx, edx	; Y & Z 
	or eax, ebx	; X | Y 
ENDM 
 
_MD5Trans3 MACRO 
	xor eax, ebx	;X ^ Y 
	xor eax, edx	;X ^ Z 
ENDM 
 
_MD5Trans4 MACRO 
	not edx		; ~Z 
	or eax, edx	; X | Z 
	xor eax, ebx	; X ^ Y 
ENDM 
 
MD5Trans1 MACRO dwA, dwB, dwC, dwD, dwX, chS,  dwT 
	mov eax, dwB 
	mov ebx, dwC 
	mov edx, dwD 
	_MD5Trans1	; F ( B,C,D ) 
	mov ecx, dwX 
	add eax, ecx	; + X[?] 
	add eax, dwT	; + T 
	add eax, dwA	; + A 
	mov cl, chS	 
	rol eax, cl	;rol 
	add eax, dwB	; + B 
 
	mov dwA, eax 
ENDM 
 
MD5Trans2 MACRO	dwA, dwB, dwC, dwD, dwX, chS, dwT 
	mov eax, dwB 
	mov ebx, dwC 
	mov edx, dwD 
	_MD5Trans2 
	add eax, dwA 
	mov ecx, dwX 
	add eax, ecx 
	add eax, dwT 
	mov cl, chS 
	rol eax, cl 
	add eax, dwB 
	 
	mov dwA, eax 
ENDM 
 
MD5Trans3 MACRO	dwA, dwB, dwC, dwD, dwX, chS, dwT 
	mov eax, dwB 
	mov ebx, dwC 
	mov edx, dwD 
	_MD5Trans3 
	add eax, dwA 
	mov ecx, dwX 
	add eax, ecx 
	add eax, dwT 
	mov cl, chS 
	rol eax, cl 
	add eax, dwB 
	 
	mov dwA, eax 
ENDM 
 
MD5Trans4 MACRO dwA, dwB, dwC, dwD, dwX, chS, dwT 
	mov eax, dwB 
	mov ebx, dwC 
	mov edx, dwD 
	_MD5Trans4 
	add eax, dwA 
	mov ecx, dwX 
	add eax, ecx 
	add eax, dwT 
	mov cl, chS 
	rol eax, cl 
	add eax, dwB 
 
	mov dwA, eax 
ENDM 
 
MD5Finalize proc uses ecx edi \ 
		  lpSum:DWORD 
	mov edi, lpSum 
	mov ecx, 16 
Loop1: 
	mov eax, dword ptr [edi] 
	bswap eax 
	mov dword ptr [edi], eax 
	add edi, 4 
	sub ecx, 4 
	jnz Loop1 
EndLoop: 
	mov eax, ecx 
	ret 
MD5Finalize endp 
 
_CopyMemory proc uses edi esi edx ecx ebx dest:DWORD, src:DWORD, len:DWORD 
    mov edi, dest 
    mov esi, src 
    mov edx, len 
    mov ecx, edx 
    shr ecx, 2 
    mov ebx, ecx 
    shl ebx, 2 
    sub edx, ebx  
    rep movsd 
    mov ecx, edx 
    rep movsb 
    ret 
_CopyMemory endp 
 
 
MD5Pad proc	uses edi esi ecx ebx \ 
				lpData:DWORD, iLen:DWORD, iTLen:DWORD 
 
	mov ebx, iTLen 
	mov edi, ebx 
	mov esi, lpData 
	add esi, iLen	;esi = lpData+len 
	and ebx, 3fh	;计算需要填充的比特数 
	mov ecx, 56 
	sub ecx, ebx 
	jg	AboveZero ;如果大于0,则不用再补充 
	add ecx, 40h	;ecx = 需要填充的长度 
AboveZero: 
	;计算总长度 
	;下面代码保证ebx不超过2^29 bytes 
	mov ebx, edi 
	shr ebx, 29 
	shl edi, 3 
	mov dword ptr [qwLen], edi 
	mov dword ptr [qwlen+4], ebx 
	invoke _CopyMemory, esi, addr PADDING, ecx 
	add esi, ecx 
	invoke _CopyMemory, esi, addr qwLen, 8 
	lea eax, [ecx+8] 
	ret 
MD5Pad endp 
 
MD5Init proc uses esi MD5Ptr:DWORD 
	assume esi:ptr MD5Sum 
	mov esi, MD5Ptr 
	mov eax, 067452301h 
	mov [esi].dwSum1, eax 
	mov eax, 0efcdab89h 
	mov [esi].dwSum2, eax 
	mov eax, 098badcfeh 
	mov [esi].dwSum3, eax 
	mov eax, 010325476h 
	mov [esi].dwSum4, eax 
	ret 
MD5Init endp 
 
MD5Translate proc uses edi esi edx ecx ebx\ 
					lpData:DWORD, iLen:DWORD, MD5Ptr:DWORD 
	assume esi:ptr MD5Sum 
 
	LOCAL a:DWORD, b:DWORD 
	LOCAL _c:DWORD, d:DWORD 
	LOCAL x[16 * sizeof(DWORD)]:DWORD 
 
	lea edi, table 
	mov esi, MD5Ptr 
 
MD5Again: 
	lea eax, x 
	invoke _CopyMemory, eax, lpData, 64 
	add lpData, 64 
 
	mov eax, [esi].dwSum1 
	mov a, eax 
	mov eax, [esi].dwSum2 
	mov b, eax 
	mov eax, [esi].dwSum3 
	mov _c, eax 
	mov eax, [esi].dwSum4 
	mov d, eax 
 
	MD5Trans1 a, b, _c, d, x[ZERO],	 	MD5S11, [edi]  
	MD5Trans1 d, a, b, _c, x[ONE], 		MD5S12, [edi + 4] 
	MD5Trans1 _c, d, a, b, x[TWO], 		MD5S13, [edi + 8] 
	MD5Trans1 b, _c, d, a, x[THREE], 	MD5S14, [edi + 12] 
	MD5Trans1 a, b, _c, d, x[FOUR], 	MD5S11, [edi + 16] 
	MD5Trans1 d, a, b, _c, x[FIVE], 	MD5S12, [edi + 20] 
	MD5Trans1 _c, d, a, b, x[SIX], 		MD5S13, [edi + 24] 
	MD5Trans1 b, _c, d, a, x[SEVEN], 	MD5S14, [edi + 28] 
	MD5Trans1 a, b, _c, d, x[EIGHT], 	MD5S11, [edi + 32] 
	MD5Trans1 d, a, b, _c, x[NINE], 	MD5S12, [edi + 36] 
	MD5Trans1 _c, d, a, b, x[TEN], 		MD5S13, [edi + 40] 
	MD5Trans1 b, _c, d, a, x[ELEVEN], 	MD5S14, [edi + 44] 
	MD5Trans1 a, b, _c, d, x[TWELVE], 	MD5S11, [edi + 48] 
	MD5Trans1 d, a, b, _c, x[THIRT], 	MD5S12, [edi + 52] 
	MD5Trans1 _c, d, a, b, x[FOURT], 	MD5S13, [edi + 56] 
	MD5Trans1 b, _c, d, a, x[FIFT], 	MD5S14, [edi + 60] 
 
	MD5Trans2 a, b, _c, d, x[ONE], 		MD5S21, [edi + 64] 
	MD5Trans2 d, a, b, _c, x[SIX], 		MD5S22, [edi + 68] 
	MD5Trans2 _c, d, a, b, x[ELEVEN], 	MD5S23, [edi + 72] 
	MD5Trans2 b, _c, d, a, x[ZERO], 	MD5S24, [edi + 76] 
	MD5Trans2 a, b, _c, d, x[FIVE], 	MD5S21, [edi + 80] 
	MD5Trans2 d, a, b, _c, x[TEN], 		MD5S22, [edi + 84] 
	MD5Trans2 _c, d, a, b, x[FIFT], 	MD5S23, [edi + 88] 
	MD5Trans2 b, _c, d, a, x[FOUR], 	MD5S24, [edi + 92] 
	MD5Trans2 a, b, _c, d, x[NINE], 	MD5S21, [edi + 96] 
	MD5Trans2 d, a, b, _c, x[FOURT], 	MD5S22, [edi + 100] 
	MD5Trans2 _c, d, a, b, x[THREE], 	MD5S23, [edi + 104] 
	MD5Trans2 b, _c, d, a, x[EIGHT], 	MD5S24, [edi + 108] 
	MD5Trans2 a, b, _c, d, x[THIRT], 	MD5S21, [edi + 112] 
	MD5Trans2 d, a, b, _c, x[TWO], 		MD5S22, [edi + 116] 
	MD5Trans2 _c, d, a, b, x[SEVEN], 	MD5S23, [edi + 120] 
	MD5Trans2 b, _c, d, a, x[TWELVE], 	MD5S24, [edi + 124] 
 
	MD5Trans3 a, b, _c, d, x[FIVE], 	MD5S31, [edi + 128] 
	MD5Trans3 d, a, b, _c, x[EIGHT], 	MD5S32, [edi + 132] 
	MD5Trans3 _c, d, a, b, x[ELEVEN], 	MD5S33, [edi + 136] 
	MD5Trans3 b, _c, d, a, x[FOURT], 	MD5S34, [edi + 140] 
	MD5Trans3 a, b, _c, d, x[ONE], 		MD5S31, [edi + 144] 
	MD5Trans3 d, a, b, _c, x[FOUR], 	MD5S32, [edi + 148] 
	MD5Trans3 _c, d, a, b, x[SEVEN], 	MD5S33, [edi + 152] 
	MD5Trans3 b, _c, d, a, x[TEN], 		MD5S34, [edi + 156] 
	MD5Trans3 a, b, _c, d, x[THIRT], 	MD5S31, [edi + 160] 
	MD5Trans3 d, a, b, _c, x[ZERO], 	MD5S32, [edi + 164] 
	MD5Trans3 _c, d, a, b, x[THREE], 	MD5S33, [edi + 168] 
	MD5Trans3 b, _c, d, a, x[SIX], 		MD5S34, [edi + 172] 
	MD5Trans3 a, b, _c, d, x[NINE], 	MD5S31, [edi + 176] 
	MD5Trans3 d, a, b, _c, x[TWELVE], 	MD5S32, [edi + 180] 
	MD5Trans3 _c, d, a, b, x[FIFT], 	MD5S33, [edi + 184] 
	MD5Trans3 b, _c, d, a, x[TWO], 		MD5S34, [edi + 188] 
 
	MD5Trans4 a, b, _c, d, x[ZERO], 	MD5S41, [edi + 192] 
	MD5Trans4 d, a, b, _c, x[SEVEN], 	MD5S42, [edi + 196] 
	MD5Trans4 _c, d, a, b, x[FOURT], 	MD5S43, [edi + 200] 
	MD5Trans4 b, _c, d, a, x[FIVE], 	MD5S44, [edi + 204] 
	MD5Trans4 a, b, _c, d, x[TWELVE], 	MD5S41, [edi + 208] 
	MD5Trans4 d, a, b, _c, x[THREE], 	MD5S42, [edi + 212] 
	MD5Trans4 _c, d, a, b, x[TEN], 		MD5S43, [edi + 216] 
	MD5Trans4 b, _c, d, a, x[ONE], 		MD5S44, [edi + 220] 
	MD5Trans4 a, b, _c, d, x[EIGHT], 	MD5S41, [edi + 224] 
	MD5Trans4 d, a, b, _c, x[FIFT], 	MD5S42, [edi + 228] 
	MD5Trans4 _c, d, a, b, x[SIX], 		MD5S43, [edi + 232] 
	MD5Trans4 b, _c, d, a, x[THIRT], 	MD5S44, [edi + 236] 
	MD5Trans4 a, b, _c, d, x[FOUR], 	MD5S41, [edi + 240] 
	MD5Trans4 d, a, b, _c, x[ELEVEN], 	MD5S42, [edi + 244] 
	MD5Trans4 _c, d, a, b, x[TWO], 		MD5S43, [edi + 248] 
	MD5Trans4 b, _c, d, a, x[NINE], 	MD5S44, [edi + 252] 
 
	mov eax, a 
	add [esi].dwSum1, eax 
	mov eax, b 
	add [esi].dwSum2, eax 
	mov eax, _c 
	add [esi].dwSum3, eax 
	mov eax, d 
	add [esi].dwSum4, eax 
 
	sub iLen, 64 
	jg MD5Again 
 
	ret 
MD5Translate endp 
 
MD5 proc uses ebx ecx \ 
                      lpEWH:DWORD, iLen:DWORD, MD5Ptr:DWORD 
	mov ebx, iLen 
	invoke MD5Init, MD5Ptr 
	invoke MD5Pad, lpEWH, ebx, ebx 
	invoke MD5Translate, lpEWH, ebx, MD5Ptr 
	invoke MD5Finalize, MD5Ptr 
	ret 
MD5 endp 
 
;Create by Binny at 2005.1 
QQMD5 proc uses ebx esi ecx \ 
                            lpEWH:DWORD, iLen:DWORD, iAST:DWORD, MD5Ptr:DWORD 
	assume esi:ptr MD5Sum 
	mov ebx, iLen 
QQMD5Again: 
	invoke MD5Init, MD5Ptr 
	invoke MD5Pad, lpEWH, ebx, ebx 
	invoke MD5Translate, lpEWH, ebx, MD5Ptr 
	invoke _CopyMemory, lpEWH, MD5Ptr, 16 
	mov ebx,10h 
	sub iAST,1 
	jg QQMD5Again 
	invoke MD5Finalize, MD5Ptr 
	mov esi, MD5Ptr 
	mov ecx, 0EFEFEFEFh 
	xor [esi].dwSum1, ecx 
	xor [esi].dwSum2, ecx 
	xor [esi].dwSum3, ecx 
	xor [esi].dwSum4, ecx 
	ret 
QQMD5 endp