Собственно немогу никак найти исходник на масме для подсчета md5 суммы файла. Просьба ссылками из гугла не делиться, так как я полез туда в первую очередь
TransformMD5() основная, а её сишный компилятор собирает с оптимизацией, код получается линейный и все регистры используются, поэтому на масме, учитывая его малую гибкость нет смысла это собирать, просто дизассемблированный код скопировать из системного модуля к примеру.
Код (Text): TransformMD5 proc C mov eax,dword ptr ss:[esp + 4] push ebx mov ecx,dword ptr ss:[esp + 4*3] push esi push edi mov edx,dword ptr ds:[eax + 4] push ebp mov esi,dword ptr ds:[eax + 4*2] mov edi,dword ptr ds:[eax + 4*3] mov ebp,dword ptr ds:[ecx] mov ebx,edi xor ebx,esi and ebx,edx xor ebx,edi add ebx,ebp mov ebp,dword ptr ds:[eax] lea ebx,dword ptr ss:[ebp + ebx + 0D76AA478H] rol ebx,07H mov eax,esi add ebx,edx xor eax,edx and eax,ebx mov ebp,dword ptr ds:[ecx + 4] xor eax,esi add edi,ebp add eax,0E8C7B756H add edi,eax rol edi,0CH mov eax,edx add edi,ebx xor eax,ebx and eax,edi mov ebp,dword ptr ds:[ecx + 2*4] xor eax,edx add esi,ebp add eax,0242070DBH add esi,eax rol esi,11H mov eax,edi add esi,edi xor eax,ebx and eax,esi mov ebp,dword ptr ds:[ecx + 3*4] xor eax,ebx add edx,ebp add eax,0C1BDCEEEH add edx,eax rol edx,16H mov eax,edi add edx,esi xor eax,esi and eax,edx mov ebp,dword ptr ds:[ecx + 4*4] xor eax,edi add ebx,ebp add eax,0F57C0FAFH add ebx,eax rol ebx,07H mov eax,esi add ebx,edx xor eax,edx and eax,ebx mov ebp,dword ptr ds:[ecx + 4*5] xor eax,esi add edi,ebp add eax,04787C62AH add edi,eax rol edi,0CH mov eax,edx add edi,ebx xor eax,ebx and eax,edi mov ebp,dword ptr ds:[ecx + 4*6] xor eax,edx add esi,ebp add eax,0A8304613H add esi,eax rol esi,11H mov eax,edi add esi,edi xor eax,ebx and eax,esi mov ebp,dword ptr ds:[ecx + 4*7] xor eax,ebx add edx,ebp add eax,0FD469501H add edx,eax rol edx,16H mov eax,edi add edx,esi xor eax,esi and eax,edx mov ebp,dword ptr ds:[ecx + 4*8] xor eax,edi add ebx,ebp add eax,0698098D8H add ebx,eax rol ebx,07H mov eax,esi add ebx,edx xor eax,edx and eax,ebx mov ebp,dword ptr ds:[ecx + 4*9] xor eax,esi add edi,ebp add eax,08B44F7AFH add edi,eax rol edi,0CH mov eax,edx add edi,ebx xor eax,ebx and eax,edi mov ebp,dword ptr ds:[ecx + 4*10] xor eax,edx add esi,ebp add eax,0FFFF5BB1H add esi,eax rol esi,11H mov eax,edi add esi,edi xor eax,ebx and eax,esi mov ebp,dword ptr ds:[ecx + 4*11] xor eax,ebx add edx,ebp add eax,0895CD7BEH add edx,eax rol edx,16H mov eax,edi add edx,esi xor eax,esi and eax,edx mov ebp,dword ptr ds:[ecx + 4*12] xor eax,edi add ebx,ebp add eax,06B901122H add ebx,eax rol ebx,07H mov eax,esi add ebx,edx xor eax,edx and eax,ebx mov ebp,dword ptr ds:[ecx + 4*13] xor eax,esi add edi,ebp add eax,0FD987193H add edi,eax rol edi,0CH mov eax,edx add edi,ebx xor eax,ebx and eax,edi mov ebp,dword ptr ds:[ecx + 4*14] xor eax,edx add esi,ebp add eax,0A679438EH add esi,eax rol esi,11H mov eax,edi add esi,edi xor eax,ebx and eax,esi mov ebp,dword ptr ds:[ecx + 4*15] xor eax,ebx add edx,ebp add eax,049B40821H add edx,eax rol edx,16H mov eax,esi add edx,esi mov ebp,dword ptr ds:[ecx + 4] xor eax,edx and eax,edi xor eax,esi add ebx,ebp add eax,0F61E2562H add ebx,eax mov eax,edx rol ebx,05H mov ebp,dword ptr ds:[ecx + 18] add ebx,edx xor eax,ebx and eax,esi xor eax,edx add edi,ebp add eax,0C040B340H add edi,eax mov ebp,dword ptr ds:[ecx + 4*11] rol edi,09H add edi,ebx mov eax,edi xor eax,ebx and eax,edx xor eax,ebx add esi,ebp add eax,0265E5A51H add esi,eax mov eax,edi rol esi,0EH mov ebp,dword ptr ds:[ecx] add esi,edi xor eax,esi and eax,ebx xor eax,edi add edx,ebp add eax,0E9B6C7AAH add edx,eax mov eax,esi rol edx,14H mov ebp,dword ptr ds:[ecx + 4*5] add edx,esi xor eax,edx and eax,edi xor eax,esi add ebx,ebp add eax,0D62F105DH add ebx,eax mov eax,edx rol ebx,05H mov ebp,dword ptr ds:[ecx + 4*10] add ebx,edx xor eax,ebx and eax,esi xor eax,edx add edi,ebp add eax,02441453H add edi,eax rol edi,09H add edi,ebx mov ebp,dword ptr ds:[ecx + 4*15] mov eax,edi xor eax,ebx and eax,edx xor eax,ebx add esi,ebp add eax,0D8A1E681H add esi,eax mov eax,edi rol esi,0EH mov ebp,dword ptr ds:[ecx + 4*4] add esi,edi xor eax,esi and eax,ebx xor eax,edi add edx,ebp add eax,0E7D3FBC8H add edx,eax mov eax,esi rol edx,14H mov ebp,dword ptr ds:[ecx + 4*9] add edx,esi xor eax,edx and eax,edi xor eax,esi add ebx,ebp add eax,021E1CDE6H add ebx,eax mov eax,edx rol ebx,05H mov ebp,dword ptr ds:[ecx + 4*14] add ebx,edx xor eax,ebx and eax,esi xor eax,edx add edi,ebp add eax,0C33707D6H add edi,eax mov ebp,dword ptr ds:[ecx + 4*3] rol edi,09H add edi,ebx mov eax,edi xor eax,ebx and eax,edx xor eax,ebx add esi,ebp add eax,0F4D50D87H add esi,eax mov eax,edi rol esi,0EH mov ebp,dword ptr ds:[ecx + 4*8] add esi,edi xor eax,esi and eax,ebx xor eax,edi add edx,ebp add eax,0455A14EDH add edx,eax rol edx,14H add edx,esi mov eax,esi mov ebp,dword ptr ds:[ecx + 4*13] xor eax,edx and eax,edi xor eax,esi add ebx,ebp add eax,0A9E3E905H add ebx,eax mov eax,edx rol ebx,05H mov ebp,dword ptr ds:[ecx + 4*2] add ebx,edx xor eax,ebx and eax,esi xor eax,edx add edi,ebp add eax,0FCEFA3F8H add edi,eax mov ebp,dword ptr ds:[ecx + 4*7] rol edi,9H add edi,ebx mov eax,edi xor eax,ebx and eax,edx xor eax,ebx add esi,ebp add eax,0676F02D9H add esi,eax mov eax,edi rol esi,0EH add esi,edi xor eax,esi mov ebp,eax and ebp,ebx xor ebp,edi mov eax,dword ptr ds:[ecx + 4*12] add edx,ebp add eax,08D2A4C8AH add edx,eax rol edx,14H mov eax,edi add edx,esi xor eax,esi mov ebp,dword ptr ds:[ecx + 4*5] xor eax,edx add ebx,ebp add eax,0FFFA3942H add ebx,eax rol ebx,04H mov eax,esi add ebx,edx xor eax,edx mov ebp,dword ptr ds:[ecx + 4*8] xor eax,ebx add edi,ebp add eax,08771F681H add edi,eax rol edi,0BH mov ebp,dword ptr ds:[ecx + 4*11] add esi,ebp add edi,ebx mov eax,edi add esi,06D9D6122H xor eax,edx xor eax,ebx add esi,eax rol esi,10H mov eax,edi add esi,edi xor eax,esi mov ebp,dword ptr ds:[ecx + 4*14] add edx,ebp mov ebp,ebx xor ebp,eax add edx,0FDE5380CH add edx,ebp rol edx,17H mov ebp,dword ptr ds:[ecx + 4] add ebx,ebp add edx,esi mov ebp,edx add ebx,0A4BEEA44H xor ebp,eax add ebx,ebp rol ebx,4H mov eax,esi add ebx,edx xor eax,edx mov ebp,dword ptr ds:[ecx + 4*4] xor eax,ebx add edi,ebp add eax,04BDECFA9H add edi,eax rol edi,0BH mov ebp,dword ptr ds:[ecx + 4*7] add esi,ebp add edi,ebx mov eax,edi add esi,0F6BB4B60H xor eax,edx xor eax,ebx add esi,eax rol esi,10H mov eax,edi add esi,edi mov ebp,dword ptr ds:[ecx + 4*10] add edx,ebp mov ebp,ebx xor eax,esi add edx,0BEBFBC70H xor ebp,eax add edx,ebp rol edx,17H mov ebp,dword ptr ds:[ecx + 4*13] add ebx,ebp add edx,esi mov ebp,edx add ebx,0289B7EC6H xor ebp,eax add ebx,ebp rol ebx,04H mov eax,esi add ebx,edx xor eax,edx mov ebp,dword ptr ds:[ecx] xor eax,ebx add edi,ebp add eax,0EAA127FAH add edi,eax rol edi,0BH mov ebp,dword ptr ds:[ecx + 4*3] add esi,ebp add edi,ebx mov eax,edi add esi,0D4EF3085H xor eax,edx xor eax,ebx add esi,eax rol esi,10H mov eax,edi add esi,edi mov ebp,dword ptr ds:[ecx + 4*6] add edx,ebp mov ebp,ebx xor eax,esi add edx,04881D05H xor ebp,eax add edx,ebp rol edx,17H add edx,esi mov ebp,edx xor ebp,eax mov eax,dword ptr ds:[ecx + 4*9] add ebx,ebp add eax,0D9D4D039H add ebx,eax rol ebx,04H mov eax,esi add ebx,edx xor eax,edx mov ebp,dword ptr ds:[ecx + 4*12] xor eax,ebx add eax,0E6DB99E5H add edi,ebp add edi,eax rol edi,0BH mov ebp,dword ptr ds:[ecx + 4*15] add edi,ebx add esi,ebp mov eax,edi add esi,01FA27CF8H xor eax,edx xor eax,ebx add esi,eax rol esi,10H mov eax,edi add esi,edi mov ebp,dword ptr ds:[ecx + 4*2] xor eax,esi add edx,ebp xor eax,ebx add edx,0C4AC5665H add edx,eax rol edx,17H mov eax,edi not eax add edx,esi mov ebp,dword ptr ds:[ecx] or eax,edx xor eax,esi add ebx,ebp add eax,0F4292244H add ebx,eax rol ebx,06H mov eax,esi not eax add ebx,edx mov ebp,dword ptr ds:[ecx + 4*7] or eax,ebx xor eax,edx add edi,ebp add eax,0432AFF97H add edi,eax rol edi,0AH mov eax,edx not eax add edi,ebx mov ebp,dword ptr ds:[ecx + 4*14] or eax,edi xor eax,ebx add esi,ebp add eax,0AB9423A7H add esi,eax rol esi,0FH mov eax,ebx not eax add esi,edi mov ebp,dword ptr ds:[ecx + 4*5] or eax,esi xor eax,edi add edx,ebp add edx,0FC93A039H add edx,eax rol edx,15H mov eax,edi not eax add edx,esi mov ebp,dword ptr ds:[ecx + 4*12] or eax,edx xor eax,esi add ebx,ebp add eax,0655B59C3H add ebx,eax rol ebx,06H mov eax,esi not eax add ebx,edx mov ebp,dword ptr ds:[ecx + 4*3] or eax,ebx xor eax,edx add edi,ebp add eax,08F0CCC92H add edi,eax rol edi,0AH mov eax,edx not eax add edi,ebx mov ebp,dword ptr ds:[ecx + 4*10] or eax,edi xor eax,ebx add esi,ebp add eax,0FFEFF47DH add esi,eax rol esi,0FH mov eax,ebx not eax add esi,edi mov ebp,dword ptr ds:[ecx + 4] or eax,esi xor eax,edi add edx,ebp add eax,085845DD1H add edx,eax rol edx,15H mov eax,edi not eax add edx,esi mov ebp,dword ptr ds:[ecx + 4*8] or eax,edx xor eax,esi add ebx,ebp add eax,06FA87E4FH add ebx,eax rol ebx,06H mov eax,esi not eax add ebx,edx mov ebp,dword ptr ds:[ecx + 4*15] or eax,ebx xor eax,edx add edi,ebp add eax,0FE2CE6E0H add edi,eax rol edi,0AH mov eax,edx not eax add edi,ebx mov ebp,dword ptr ds:[ecx + 4*6] or eax,edi xor eax,ebx add esi,ebp add eax,0A3014314H add esi,eax rol esi,0FH mov eax,ebx not eax add esi,edi mov ebp,dword ptr ds:[ecx + 4*13] or eax,esi xor eax,edi add edx,ebp add eax,04E0811A1H add edx,eax rol edx,15H mov eax,edi not eax add edx,esi mov ebp,dword ptr ds:[ecx + 4*4] or eax,edx xor eax,esi add ebx,ebp add eax,0F7537E82H add ebx,eax rol ebx,06H mov eax,esi not eax add ebx,edx mov ebp,dword ptr ds:[ecx + 4*11] or eax,ebx xor eax,edx add edi,ebp add eax,0BD3AF235H add edi,eax rol edi,0AH mov eax,edx not eax add edi,ebx mov ebp,dword ptr ds:[ecx + 4*2] or eax,edi xor eax,ebx add esi,ebp add eax,02AD7D2BBH add esi,eax rol esi,0FH mov eax,ebx not eax add esi,edi mov ebp,dword ptr ds:[ecx + 4*6] or eax,esi xor eax,edi add edx,ebp add eax,00EB86D391H add edx,eax rol edx,15H mov eax,dword ptr ss:[esp + 4*5] add edx,esi mov ecx,dword ptr ds:[eax] add ebx,ecx mov ecx,dword ptr ds:[eax + 4] add edx,ecx mov dword ptr ds:[eax],ebx mov ecx,dword ptr ds:[eax + 2*4] mov dword ptr ds:[eax + 4],edx add esi,ecx pop ebp mov ecx,dword ptr ds:[eax + 3*4] mov dword ptr ds:[eax + 2*4],esi add edi,ecx mov dword ptr ds:[eax + 3*4],edi pop edi pop esi pop ebx ret TransformMD5 endp Надеюсь без опечаток.
Код (Text): /* *********************************************************************** ** md5.c ** ** RSA Data Security, Inc. MD5 Message-Digest Algorithm ** ** Created: 2/17/90 RLR ** ** Revised: 1/91 SRD,AJ,BSK,JT Reference C Version ** *********************************************************************** */ /* *********************************************************************** ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. ** ** ** ** License to copy and use this software is granted provided that ** ** it is identified as the "RSA Data Security, Inc. MD5 Message- ** ** Digest Algorithm" in all material mentioning or referencing this ** ** software or this function. ** ** ** ** License is also granted to make and use derivative works ** ** provided that such works are identified as "derived from the RSA ** ** Data Security, Inc. MD5 Message-Digest Algorithm" in all ** ** material mentioning or referencing the derived work. ** ** ** ** RSA Data Security, Inc. makes no representations concerning ** ** either the merchantability of this software or the suitability ** ** of this software for any particular purpose. It is provided "as ** ** is" without express or implied warranty of any kind. ** ** ** ** These notices must be retained in any copies of any part of this ** ** documentation and/or software. ** *********************************************************************** */ // Portions copyright (c) 1992 Microsoft Corp. // All rights reserved #include <nt.h> #define UINT4 ULONG #include "md5.h" /* Constants for Transform routine. */ #define S11 7 #define S12 12 #define S13 17 #define S14 22 #define S21 5 #define S22 9 #define S23 14 #define S24 20 #define S31 4 #define S32 11 #define S33 16 #define S34 23 #define S41 6 #define S42 10 #define S43 15 #define S44 21 static void TransformMD5 PROTO_LIST ((UINT4 *, UINT4 *)); static unsigned char PADDING[64] = { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; /* F, G and H are basic MD5 functions */ #define F(x, y, z) (((x) & (y)) | ((~x) & (z))) #define G(x, y, z) (((x) & (z)) | ((y) & (~z))) #define H(x, y, z) ((x) ^ (y) ^ (z)) #define I(x, y, z) ((y) ^ ((x) | (~z))) /* ROTATE_LEFT rotates x left n bits. */ #if CT_COMPILER == CT_MPW /* MPW doesn't compile the macro correctly, so use a procedure. */ static UINT4 RotateLeft (UINT4, unsigned int); #define ROTATE_LEFT RotateLeft #else #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) #endif /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4 */ /* Rotation is separate from addition to prevent recomputation */ #define FF(a, b, c, d, x, s, ac) \ {(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } #define GG(a, b, c, d, x, s, ac) \ {(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } #define HH(a, b, c, d, x, s, ac) \ {(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } #define II(a, b, c, d, x, s, ac) \ {(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } void MD5Init (mdContext) MD5_CTX *mdContext; { mdContext->i[0] = mdContext->i[1] = (UINT4)0; /* Load magic initialization constants. */ mdContext->buf[0] = (UINT4)0x67452301; mdContext->buf[1] = (UINT4)0xefcdab89; mdContext->buf[2] = (UINT4)0x98badcfe; mdContext->buf[3] = (UINT4)0x10325476; } void MD5Update (mdContext, inBuf, inLen) MD5_CTX *mdContext; const unsigned char *inBuf; unsigned int inLen; { UINT4 in[16]; int mdi; unsigned int i, ii; /* compute number of bytes mod 64 */ mdi = (int)((mdContext->i[0] >> 3) & 0x3f); /* update number of bits */ if ((mdContext->i[0] + ((UINT4)inLen << 3)) < mdContext->i[0]) mdContext->i[1]++; mdContext->i[0] += ((UINT4)inLen << 3); mdContext->i[1] += ((UINT4)inLen >> 29); while (inLen--) { /* add new character to buffer, increment mdi */ mdContext->in[mdi++] = *inBuf++; /* transform if necessary */ if (mdi == 0x40) { for (i = 0, ii = 0; i < 16; i++, ii += 4) in[i] = (((UINT4)mdContext->in[ii+3]) << 24) | (((UINT4)mdContext->in[ii+2]) << 16) | (((UINT4)mdContext->in[ii+1]) << 8) | ((UINT4)mdContext->in[ii]); TransformMD5 (mdContext->buf, in); mdi = 0; } } } void MD5Final (mdContext) MD5_CTX *mdContext; { UINT4 in[16]; int mdi; unsigned int i, ii; unsigned int padLen; /* save number of bits */ in[14] = mdContext->i[0]; in[15] = mdContext->i[1]; /* compute number of bytes mod 64 */ mdi = (int)((mdContext->i[0] >> 3) & 0x3f); /* pad out to 56 mod 64 */ padLen = (mdi < 56) ? (56 - mdi) : (120 - mdi); MD5Update (mdContext, PADDING, padLen); /* append length in bits and transform */ for (i = 0, ii = 0; i < 14; i++, ii += 4) in[i] = (((UINT4)mdContext->in[ii+3]) << 24) | (((UINT4)mdContext->in[ii+2]) << 16) | (((UINT4)mdContext->in[ii+1]) << 8) | ((UINT4)mdContext->in[ii]); TransformMD5 (mdContext->buf, in); /* store buffer in digest */ for (i = 0, ii = 0; i < 4; i++, ii += 4) { mdContext->digest[ii] = (unsigned char)(mdContext->buf[i] & 0xff); mdContext->digest[ii+1] = (unsigned char)((mdContext->buf[i] >> 8) & 0xff); mdContext->digest[ii+2] = (unsigned char)((mdContext->buf[i] >> 16) & 0xff); mdContext->digest[ii+3] = (unsigned char)((mdContext->buf[i] >> 24) & 0xff); } } /* Basic MD5 step. Transforms buf based on in. */ static void TransformMD5 (buf, in) UINT4 *buf; UINT4 *in; { UINT4 a = buf[0], b = buf[1], c = buf[2], d = buf[3]; /* Round 1 */ FF ( a, b, c, d, in[ 0], S11, 0xd76aa478); /* 1 */ FF ( d, a, b, c, in[ 1], S12, 0xe8c7b756); /* 2 */ FF ( c, d, a, b, in[ 2], S13, 0x242070db); /* 3 */ FF ( b, c, d, a, in[ 3], S14, 0xc1bdceee); /* 4 */ FF ( a, b, c, d, in[ 4], S11, 0xf57c0faf); /* 5 */ FF ( d, a, b, c, in[ 5], S12, 0x4787c62a); /* 6 */ FF ( c, d, a, b, in[ 6], S13, 0xa8304613); /* 7 */ FF ( b, c, d, a, in[ 7], S14, 0xfd469501); /* 8 */ FF ( a, b, c, d, in[ 8], S11, 0x698098d8); /* 9 */ FF ( d, a, b, c, in[ 9], S12, 0x8b44f7af); /* 10 */ FF ( c, d, a, b, in[10], S13, 0xffff5bb1); /* 11 */ FF ( b, c, d, a, in[11], S14, 0x895cd7be); /* 12 */ FF ( a, b, c, d, in[12], S11, 0x6b901122); /* 13 */ FF ( d, a, b, c, in[13], S12, 0xfd987193); /* 14 */ FF ( c, d, a, b, in[14], S13, 0xa679438e); /* 15 */ FF ( b, c, d, a, in[15], S14, 0x49b40821); /* 16 */ /* Round 2 */ GG ( a, b, c, d, in[ 1], S21, 0xf61e2562); /* 17 */ GG ( d, a, b, c, in[ 6], S22, 0xc040b340); /* 18 */ GG ( c, d, a, b, in[11], S23, 0x265e5a51); /* 19 */ GG ( b, c, d, a, in[ 0], S24, 0xe9b6c7aa); /* 20 */ GG ( a, b, c, d, in[ 5], S21, 0xd62f105d); /* 21 */ GG ( d, a, b, c, in[10], S22, 0x2441453); /* 22 */ GG ( c, d, a, b, in[15], S23, 0xd8a1e681); /* 23 */ GG ( b, c, d, a, in[ 4], S24, 0xe7d3fbc8); /* 24 */ GG ( a, b, c, d, in[ 9], S21, 0x21e1cde6); /* 25 */ GG ( d, a, b, c, in[14], S22, 0xc33707d6); /* 26 */ GG ( c, d, a, b, in[ 3], S23, 0xf4d50d87); /* 27 */ GG ( b, c, d, a, in[ 8], S24, 0x455a14ed); /* 28 */ GG ( a, b, c, d, in[13], S21, 0xa9e3e905); /* 29 */ GG ( d, a, b, c, in[ 2], S22, 0xfcefa3f8); /* 30 */ GG ( c, d, a, b, in[ 7], S23, 0x676f02d9); /* 31 */ GG ( b, c, d, a, in[12], S24, 0x8d2a4c8a); /* 32 */ /* Round 3 */ HH ( a, b, c, d, in[ 5], S31, 0xfffa3942); /* 33 */ HH ( d, a, b, c, in[ 8], S32, 0x8771f681); /* 34 */ HH ( c, d, a, b, in[11], S33, 0x6d9d6122); /* 35 */ HH ( b, c, d, a, in[14], S34, 0xfde5380c); /* 36 */ HH ( a, b, c, d, in[ 1], S31, 0xa4beea44); /* 37 */ HH ( d, a, b, c, in[ 4], S32, 0x4bdecfa9); /* 38 */ HH ( c, d, a, b, in[ 7], S33, 0xf6bb4b60); /* 39 */ HH ( b, c, d, a, in[10], S34, 0xbebfbc70); /* 40 */ HH ( a, b, c, d, in[13], S31, 0x289b7ec6); /* 41 */ HH ( d, a, b, c, in[ 0], S32, 0xeaa127fa); /* 42 */ HH ( c, d, a, b, in[ 3], S33, 0xd4ef3085); /* 43 */ HH ( b, c, d, a, in[ 6], S34, 0x4881d05); /* 44 */ HH ( a, b, c, d, in[ 9], S31, 0xd9d4d039); /* 45 */ HH ( d, a, b, c, in[12], S32, 0xe6db99e5); /* 46 */ HH ( c, d, a, b, in[15], S33, 0x1fa27cf8); /* 47 */ HH ( b, c, d, a, in[ 2], S34, 0xc4ac5665); /* 48 */ /* Round 4 */ II ( a, b, c, d, in[ 0], S41, 0xf4292244); /* 49 */ II ( d, a, b, c, in[ 7], S42, 0x432aff97); /* 50 */ II ( c, d, a, b, in[14], S43, 0xab9423a7); /* 51 */ II ( b, c, d, a, in[ 5], S44, 0xfc93a039); /* 52 */ II ( a, b, c, d, in[12], S41, 0x655b59c3); /* 53 */ II ( d, a, b, c, in[ 3], S42, 0x8f0ccc92); /* 54 */ II ( c, d, a, b, in[10], S43, 0xffeff47d); /* 55 */ II ( b, c, d, a, in[ 1], S44, 0x85845dd1); /* 56 */ II ( a, b, c, d, in[ 8], S41, 0x6fa87e4f); /* 57 */ II ( d, a, b, c, in[15], S42, 0xfe2ce6e0); /* 58 */ II ( c, d, a, b, in[ 6], S43, 0xa3014314); /* 59 */ II ( b, c, d, a, in[13], S44, 0x4e0811a1); /* 60 */ II ( a, b, c, d, in[ 4], S41, 0xf7537e82); /* 61 */ II ( d, a, b, c, in[11], S42, 0xbd3af235); /* 62 */ II ( c, d, a, b, in[ 2], S43, 0x2ad7d2bb); /* 63 */ II ( b, c, d, a, in[ 9], S44, 0xeb86d391); /* 64 */ buf[0] += a; buf[1] += b; buf[2] += c; buf[3] += d; } #if CT_COMPILER == CT_MPW static UINT4 RotateLeft (x, n) UINT4 x; unsigned int n; { return (((x) << (n)) | ((x) >> (32-(n)))); } #endif