md5c.c
上传用户:hepax88
上传日期:2007-01-03
资源大小:1101k
文件大小:18k
源码类别:

TCP/IP协议栈

开发平台:

Visual C++

  1. /* MD5.C - RSA Data Security, Inc., MD5 message-digest algorithm */
  2. #include <mem.h>
  3. #ifdef CPU386
  4. #pragma inline
  5. #endif
  6. #ifndef NULL
  7. #define NULL (void *)0
  8. #endif
  9. /* This version taken from RSAREF 2.0 and modified for use
  10.  * under Borland C++ with DOS by Phil Karn, KA9Q, September 1994.
  11.  * The changes include the replacement of MD5_memset() and MD5_memcpy()
  12.  * with calls to memset() and memcpy(), and the inclusion of an optional
  13.  * 386/486 inline assembler version of MD5Transform().
  14.  *
  15.  * The 386/486 assembler version of MD5Transform() included here was previously
  16.  * released on 22 Feb 1992 with an earlier version of md5.c from RSA;
  17.  * it has been modified here to suit the different
  18.  * internal calling conventions subsequently adopted by RSA.
  19.  */
  20. /* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
  21.    rights reserved.
  22.    License to copy and use this software is granted provided that it
  23.    is identified as the "RSA Data Security, Inc. MD5 Message-Digest
  24.    Algorithm" in all material mentioning or referencing this software
  25.    or this function.
  26.    License is also granted to make and use derivative works provided
  27.    that such works are identified as "derived from the RSA Data
  28.    Security, Inc. MD5 Message-Digest Algorithm" in all material
  29.    mentioning or referencing the derived work.  
  30.                                                                     
  31.    RSA Data Security, Inc. makes no representations concerning either
  32.    the merchantability of this software or the suitability of this
  33.    software for any particular purpose. It is provided "as is"
  34.    without express or implied warranty of any kind.  
  35.                                                                     
  36.    These notices must be retained in any copies of any part of this
  37.    documentation and/or software.  
  38.  */
  39. /*#include "global.h" */
  40. #include "md5.h"
  41. /* Constants for MD5Transform routine.
  42.  */
  43. #define S11 7
  44. #define S12 12
  45. #define S13 17
  46. #define S14 22
  47. #define S21 5
  48. #define S22 9
  49. #define S23 14
  50. #define S24 20
  51. #define S31 4
  52. #define S32 11
  53. #define S33 16
  54. #define S34 23
  55. #define S41 6
  56. #define S42 10
  57. #define S43 15
  58. #define S44 21
  59. static void MD5Transform PROTO_LIST ((UINT4 [4], unsigned char [64]));
  60. static void Encode PROTO_LIST
  61.   ((unsigned char *, UINT4 *, unsigned int));
  62. #ifndef CPU386
  63. static void Decode PROTO_LIST
  64.   ((UINT4 *, unsigned char *, unsigned int));
  65. #endif
  66. static unsigned char PADDING[64] = {
  67.   0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  68.   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  69.   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  70. };
  71. #ifndef CPU386
  72. /* F, G, H and I are basic MD5 functions.
  73.  */
  74. #define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
  75. #define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
  76. #define H(x, y, z) ((x) ^ (y) ^ (z))
  77. #define I(x, y, z) ((y) ^ ((x) | (~z)))
  78. /* ROTATE_LEFT rotates x left n bits.
  79.  */
  80. #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
  81. /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
  82.    Rotation is separate from addition to prevent recomputation.
  83.  */
  84. #define FF(a, b, c, d, x, s, ac) { 
  85.     (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); 
  86.     (a) = ROTATE_LEFT ((a), (s)); 
  87.     (a) += (b); 
  88.   }
  89. #define GG(a, b, c, d, x, s, ac) { 
  90.     (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); 
  91.     (a) = ROTATE_LEFT ((a), (s)); 
  92.     (a) += (b); 
  93.   }
  94. #define HH(a, b, c, d, x, s, ac) { 
  95.     (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); 
  96.     (a) = ROTATE_LEFT ((a), (s)); 
  97.     (a) += (b); 
  98.   }
  99. #define II(a, b, c, d, x, s, ac) { 
  100.     (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); 
  101.     (a) = ROTATE_LEFT ((a), (s)); 
  102.     (a) += (b); 
  103.   }
  104. #endif
  105. /* MD5 initialization. Begins an MD5 operation, writing a new context.
  106.  */
  107. void MD5Init (context)
  108. MD5_CTX *context;                                        /* context */
  109. {
  110.   context->count[0] = context->count[1] = 0;
  111.   /* Load magic initialization constants.
  112.    */
  113.   context->state[0] = 0x67452301;
  114.   context->state[1] = 0xefcdab89;
  115.   context->state[2] = 0x98badcfe;
  116.   context->state[3] = 0x10325476;
  117. }
  118. /* MD5 block update operation. Continues an MD5 message-digest
  119.      operation, processing another message block, and updating the
  120.      context.
  121.  * Rewritten to better optimize the common case when MD5Update()
  122.  * is only called with multiples of 64 bytes (e.g., when hashing
  123.  * a stdio buffer) - PRK
  124.  */
  125. void MD5Update (context, input, inputLen)
  126. MD5_CTX *context;                                        /* context */
  127. unsigned char *input;                                /* input block */
  128. unsigned int inputLen;                     /* length of input block */
  129. {
  130.   unsigned int i, index, partLen;
  131.   /* Compute number of bytes mod 64 */
  132.   index = (unsigned int)((context->count[0] >> 3) & 0x3F);
  133.   /* Update number of bits */
  134.   if ((context->count[0] += ((UINT4)inputLen << 3))
  135.       < ((UINT4)inputLen << 3))
  136.     context->count[1]++;
  137.   context->count[1] += ((UINT4)inputLen >> 29);
  138.   
  139.   if(index != 0){
  140. /* Complete the partial buffer first */
  141. partLen = 64 - index; /* room left in buffer */
  142. i = inputLen > partLen ? partLen : inputLen; /* min(room,data) */
  143. memcpy(&context->buffer[index],input,i);
  144. input += i;
  145. inputLen -= i;
  146. if(i == partLen){
  147. /* Buffer now full, hash it */
  148. MD5Transform(context->state,context->buffer);
  149. } else
  150. return; /* Not yet full */
  151.   }
  152.   /* Now do as many 64 byte chunks direct from the input as possible */
  153.   while(inputLen >= 64){
  154. MD5Transform(context->state,input);
  155. input += 64;
  156. inputLen -= 64;
  157.   }
  158.   /* Now buffer any remaining input */
  159.   if(inputLen > 0)
  160. memcpy(context->buffer,input,inputLen);
  161. }
  162. /* MD5 finalization. Ends an MD5 message-digest operation, writing the
  163.      the message digest and zeroizing the context.
  164.  */
  165. void MD5Final (digest, context)
  166. unsigned char digest[16];                         /* message digest */
  167. MD5_CTX *context;                                       /* context */
  168. {
  169.   unsigned char bits[8];
  170.   unsigned int index, padLen;
  171.   /* Save number of bits */
  172.   Encode (bits, context->count, 8);
  173.   /* Pad out to 56 mod 64.
  174.    */
  175.   index = (unsigned int)((context->count[0] >> 3) & 0x3f);
  176.   padLen = (index < 56) ? (56 - index) : (120 - index);
  177.   MD5Update (context, PADDING, padLen);
  178.   
  179.   /* Append length (before padding) */
  180.   MD5Update (context, bits, 8);
  181.   if(digest != NULL){ /* Bill Simpson's change to simplify AH */
  182.   /* Store state in digest */
  183.   Encode (digest, context->state, 16);
  184.   
  185.   /* Zeroize sensitive information. */
  186.   memset ((POINTER)context, 0, sizeof (*context));
  187.   }
  188. }
  189. #ifndef CPU386 /* Not used; an asm version is available for the 386/486 */
  190. /* MD5 basic transformation. Transforms state based on block.
  191.  */
  192. static void MD5Transform (state, block)
  193. UINT4 state[4];
  194. unsigned char block[64];
  195. {
  196.   UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
  197.   
  198.   Decode (x, block, 64);
  199.   /* Round 1 */
  200.   FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
  201.   FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
  202.   FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
  203.   FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
  204.   FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
  205.   FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
  206.   FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
  207.   FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
  208.   FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
  209.   FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
  210.   FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
  211.   FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
  212.   FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
  213.   FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
  214.   FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
  215.   FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
  216.   /* Round 2 */
  217.   GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
  218.   GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
  219.   GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
  220.   GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
  221.   GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
  222.   GG (d, a, b, c, x[10], S22,  0x2441453); /* 22 */
  223.   GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
  224.   GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
  225.   GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
  226.   GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
  227.   GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
  228.   GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
  229.   GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
  230.   GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
  231.   GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
  232.   GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
  233.   /* Round 3 */
  234.   HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
  235.   HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
  236.   HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
  237.   HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
  238.   HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
  239.   HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
  240.   HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
  241.   HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
  242.   HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
  243.   HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
  244.   HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
  245.   HH (b, c, d, a, x[ 6], S34,  0x4881d05); /* 44 */
  246.   HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
  247.   HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
  248.   HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
  249.   HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
  250.   /* Round 4 */
  251.   II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
  252.   II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
  253.   II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
  254.   II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
  255.   II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
  256.   II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
  257.   II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
  258.   II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
  259.   II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
  260.   II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
  261.   II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
  262.   II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
  263.   II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
  264.   II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
  265.   II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
  266.   II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
  267.   state[0] += a;
  268.   state[1] += b;
  269.   state[2] += c;
  270.   state[3] += d;
  271.   
  272.   /* Zeroize sensitive information.
  273.    */
  274.   memset ((POINTER)x, 0, sizeof (x));
  275. }
  276. #endif
  277. /* Encodes input (UINT4) into output (unsigned char). Assumes len is
  278.      a multiple of 4.
  279.  */
  280. static void Encode (output, input, len)
  281. unsigned char *output;
  282. UINT4 *input;
  283. unsigned int len;
  284. {
  285.   unsigned int i, j;
  286.   for (i = 0, j = 0; j < len; i++, j += 4) {
  287.     output[j] = (unsigned char)(input[i] & 0xff);
  288.     output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
  289.     output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
  290.     output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
  291.   }
  292. }
  293. #ifndef CPU386 /* Not needed in assembler version */
  294. /* Decodes input (unsigned char) into output (UINT4). Assumes len is
  295.      a multiple of 4.
  296.  */
  297. static void Decode (output, input, len)
  298. UINT4 *output;
  299. unsigned char *input;
  300. unsigned int len;
  301. {
  302.   unsigned int i, j;
  303.   for (i = 0, j = 0; j < len; i++, j += 4)
  304.     output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) |
  305.       (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24);
  306. }
  307. #else /* CPU386 */
  308. /* Fast 386 Borland C inline assembler version of the transform() function
  309.  * from the RSA Data Security, Inc, MD5 Message Digest Algorithm.
  310.  *
  311.  * This version uses native 32 bit registers, so it needs a 386 or 486 CPU.
  312.  * It also assumes large model (-ml)
  313.  *
  314.  * Because this function does *lots* of 32-bit operations, this version is
  315.  * MUCH faster than the reference C version compiled with a garden-
  316.  * variety 16-bit MS-DOS C compiler.
  317.  *
  318.  * Originally written and placed into the public domain on
  319.  * 22 February 1992 by Phil Karn, KA9Q
  320.  *
  321.  * Updated 1 Sept 1994 by Phil Karn to match newer version of MD5.C released
  322.  * in the RSAREF package. Also changed some register assignments to get rid
  323.  * of the segment override prefixes on memory references
  324.  */
  325. /* Code sequence common to all four rounds.
  326.  * evaluates a = b + (a + edi + x + t) <<< s
  327.  * where it is assumed a and b are registers, x is a memory location,
  328.  * edi is the edi register, and s and t are integer constants
  329.  */
  330. #define COM(a,b,x,s,t)
  331. lea a,t[a+edi];
  332. add a,x;
  333. rol a,s;
  334. add a,b;
  335. /* Round 1 functions */
  336. /* edi = F(x,y,z) = (x & y) | (~x & z) */
  337. #define F(x,y,z)
  338. mov edi,x;
  339. and edi,y;
  340. mov ebp,x;
  341. not ebp;
  342. and ebp,z;
  343. or edi,ebp
  344. /* a = b + ((a + F(b,c,d) + x + t) <<< s); */
  345. #define FF(a,b,c,d,x,s,t)
  346. F(b,c,d);
  347. COM(a,b,x,s,t)
  348. /* Round 2 functions */
  349. /* edi = G(x,y,z) = F(z,x,y) = (x & z) | (y & ~z) */
  350. #define G(x,y,z) F(z,x,y)
  351. /* a = b + ((a + G(b,c,d) + x + t) <<< s) */
  352. #define GG(a,b,c,d,x,s,t)
  353. G(b,c,d);
  354. COM(a,b,x,s,t)
  355. /* Round 3 functions */
  356. /* edi = H(x,y,z) = x ^ y ^ z */
  357. #define H(x,y,z)
  358. mov edi,x;
  359. xor edi,y;
  360. xor edi,z
  361. /* a = b + ((a + H(b,c,d) + x + t) <<< s) */
  362. #define HH(a,b,c,d,x,s,t)
  363. H(b,c,d);
  364. COM(a,b,x,s,t)
  365. /* Round 4 functions */
  366. /* edi = I(x,y,z) = y ^ (x | ~z) */
  367. #define I(x,y,z)
  368. mov edi,z;
  369. not edi;
  370. or edi,x;
  371. xor edi,y
  372. /* a = b + ((a + I(b,c,d) + x + t) <<< s) */
  373. #define II(a,b,c,d,x,s,t)
  374. I(b,c,d);
  375. COM(a,b,x,s,t)
  376. /* Register assignments */
  377. #define A eax
  378. #define B ebx
  379. #define C ecx
  380. #define D edx
  381. static void
  382. MD5Transform (state, block)
  383. UINT4 state[4];
  384. unsigned char block[64];
  385. {
  386. asm {
  387. /* Save caller's registers */
  388. push si;
  389. push edi;
  390. push ds;
  391. lds si,state; /* Read input state */
  392. mov A,dword ptr si[0*4]; /* A = state[0] */
  393. mov B,dword ptr si[1*4]; /* B = state[1] */
  394. mov C,dword ptr si[2*4]; /* C = state[2] */
  395. mov D,dword ptr si[3*4]; /* D = state[3] */
  396. lds si,block; /* Set up for data block read */
  397. /* The FF macro uses ebp as scratch. This makes our args
  398.  * inaccessible until it is restored!
  399.  */
  400. push ebp;
  401. /* Round 1. The *4 factors in the subscripts to si account for the
  402.  * byte offsets of each long element in the input array. The input
  403.  * is actually a byte array, but we can treat it directly as a long
  404.  * array because MD5 is little-endian, like the 386/486.
  405.  *
  406.  * The only hazard is if the input buffer isn't 32-bit aligned,
  407.  * things will run a little more slowly.
  408.  */
  409. FF(A,B,C,D,si[ 0*4],S11,3614090360); /* 1 */
  410. FF(D,A,B,C,si[ 1*4],S12,3905402710); /* 2 */
  411. FF(C,D,A,B,si[ 2*4],S13, 606105819); /* 3 */
  412. FF(B,C,D,A,si[ 3*4],S14,3250441966); /* 4 */
  413. FF(A,B,C,D,si[ 4*4],S11,4118548399); /* 5 */
  414. FF(D,A,B,C,si[ 5*4],S12,1200080426); /* 6 */
  415. FF(C,D,A,B,si[ 6*4],S13,2821735955); /* 7 */
  416. FF(B,C,D,A,si[ 7*4],S14,4249261313); /* 8 */
  417. FF(A,B,C,D,si[ 8*4],S11,1770035416); /* 9 */
  418. FF(D,A,B,C,si[ 9*4],S12,2336552879); /* 10 */
  419. FF(C,D,A,B,si[10*4],S13,4294925233); /* 11 */
  420. FF(B,C,D,A,si[11*4],S14,2304563134); /* 12 */
  421. FF(A,B,C,D,si[12*4],S11,1804603682); /* 13 */
  422. FF(D,A,B,C,si[13*4],S12,4254626195); /* 14 */
  423. FF(C,D,A,B,si[14*4],S13,2792965006); /* 15 */
  424. FF(B,C,D,A,si[15*4],S14,1236535329); /* 16 */
  425. /* Round 2 */
  426. GG(A,B,C,D,si[ 1*4],S21,4129170786); /* 17 */
  427. GG(D,A,B,C,si[ 6*4],S22,3225465664); /* 18 */
  428. GG(C,D,A,B,si[11*4],S23, 643717713); /* 19 */
  429. GG(B,C,D,A,si[ 0*4],S24,3921069994); /* 20 */
  430. GG(A,B,C,D,si[ 5*4],S21,3593408605); /* 21 */
  431. GG(D,A,B,C,si[10*4],S22,  38016083); /* 22 */
  432. GG(C,D,A,B,si[15*4],S23,3634488961); /* 23 */
  433. GG(B,C,D,A,si[ 4*4],S24,3889429448); /* 24 */
  434. GG(A,B,C,D,si[ 9*4],S21, 568446438); /* 25 */
  435. GG(D,A,B,C,si[14*4],S22,3275163606); /* 26 */
  436. GG(C,D,A,B,si[ 3*4],S23,4107603335); /* 27 */
  437. GG(B,C,D,A,si[ 8*4],S24,1163531501); /* 28 */
  438. GG(A,B,C,D,si[13*4],S21,2850285829); /* 29 */
  439. GG(D,A,B,C,si[ 2*4],S22,4243563512); /* 30 */
  440. GG(C,D,A,B,si[ 7*4],S23,1735328473); /* 31 */
  441. GG(B,C,D,A,si[12*4],S24,2368359562); /* 32 */
  442. /* Round 3 */
  443. HH(A,B,C,D,si[ 5*4],S31,4294588738); /* 33 */
  444. HH(D,A,B,C,si[ 8*4],S32,2272392833); /* 34 */
  445. HH(C,D,A,B,si[11*4],S33,1839030562); /* 35 */
  446. HH(B,C,D,A,si[14*4],S34,4259657740); /* 36 */
  447. HH(A,B,C,D,si[ 1*4],S31,2763975236); /* 37 */
  448. HH(D,A,B,C,si[ 4*4],S32,1272893353); /* 38 */
  449. HH(C,D,A,B,si[ 7*4],S33,4139469664); /* 39 */
  450. HH(B,C,D,A,si[10*4],S34,3200236656); /* 40 */
  451. HH(A,B,C,D,si[13*4],S31, 681279174); /* 41 */
  452. HH(D,A,B,C,si[ 0*4],S32,3936430074); /* 42 */
  453. HH(C,D,A,B,si[ 3*4],S33,3572445317); /* 43 */
  454. HH(B,C,D,A,si[ 6*4],S34,  76029189); /* 44 */
  455. HH(A,B,C,D,si[ 9*4],S31,3654602809); /* 45 */
  456. HH(D,A,B,C,si[12*4],S32,3873151461); /* 46 */
  457. HH(C,D,A,B,si[15*4],S33, 530742520); /* 47 */
  458. HH(B,C,D,A,si[ 2*4],S34,3299628645); /* 48 */
  459. /* Round 4 */
  460. II(A,B,C,D,si[ 0*4],S41,4096336452); /* 49 */
  461. II(D,A,B,C,si[ 7*4],S42,1126891415); /* 50 */
  462. II(C,D,A,B,si[14*4],S43,2878612391); /* 51 */
  463. II(B,C,D,A,si[ 5*4],S44,4237533241); /* 52 */
  464. II(A,B,C,D,si[12*4],S41,1700485571); /* 53 */
  465. II(D,A,B,C,si[ 3*4],S42,2399980690); /* 54 */
  466. II(C,D,A,B,si[10*4],S43,4293915773); /* 55 */
  467. II(B,C,D,A,si[ 1*4],S44,2240044497); /* 56 */
  468. II(A,B,C,D,si[ 8*4],S41,1873313359); /* 57 */
  469. II(D,A,B,C,si[15*4],S42,4264355552); /* 58 */
  470. II(C,D,A,B,si[ 6*4],S43,2734768916); /* 59 */
  471. II(B,C,D,A,si[13*4],S44,1309151649); /* 60 */
  472. II(A,B,C,D,si[ 4*4],S41,4149444226); /* 61 */
  473. II(D,A,B,C,si[11*4],S42,3174756917); /* 62 */
  474. II(C,D,A,B,si[ 2*4],S43, 718787259); /* 63 */
  475. II(B,C,D,A,si[ 9*4],S44,3951481745); /* 64 */
  476. pop ebp; /* We can address our args again */
  477. lds si,state; /* Update the caller's state */
  478. add dword ptr si[0*4],A; /* state[0] += A */
  479. add dword ptr si[1*4],B; /* state[1] += B */
  480. add dword ptr si[2*4],C; /* state[2] += C */
  481. add dword ptr si[3*4],D; /* state[3] += D */
  482. /* Restore caller's registers */
  483. pop ds;
  484. pop edi;
  485. pop si;
  486. }
  487. }
  488. #endif /* CPU386 */