1*4882a593Smuzhiyun // MD5Checksum.h: interface for the MD5Checksum class. 2*4882a593Smuzhiyun // 3*4882a593Smuzhiyun ////////////////////////////////////////////////////////////////////// 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #ifndef MD5CHECKSUM_HEADER 6*4882a593Smuzhiyun #define MD5CHECKSUM_HEADER 7*4882a593Smuzhiyun #include "DefineHeader.h" 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun /**************************************************************************************** 10*4882a593Smuzhiyun This software is derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm. 11*4882a593Smuzhiyun Incorporation of this statement is a condition of use; please see the RSA 12*4882a593Smuzhiyun Data Security Inc copyright notice below:- 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All 15*4882a593Smuzhiyun rights reserved. 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun RSA Data Security, Inc. makes no representations concerning either 18*4882a593Smuzhiyun the merchantability of this software or the suitability of this 19*4882a593Smuzhiyun software for any particular purpose. It is provided "as is" 20*4882a593Smuzhiyun without express or implied warranty of any kind. 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun These notices must be retained in any copies of any part of this 23*4882a593Smuzhiyun documentation and/or software. 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All 26*4882a593Smuzhiyun rights reserved. 27*4882a593Smuzhiyun License to copy and use this software is granted provided that it 28*4882a593Smuzhiyun is identified as the "RSA Data Security, Inc. MD5 Message-Digest 29*4882a593Smuzhiyun Algorithm" in all material mentioning or referencing this software 30*4882a593Smuzhiyun or this function. 31*4882a593Smuzhiyun License is also granted to make and use derivative works provided 32*4882a593Smuzhiyun that such works are identified as "derived from the RSA Data 33*4882a593Smuzhiyun Security, Inc. MD5 Message-Digest Algorithm" in all material 34*4882a593Smuzhiyun mentioning or referencing the derived work. 35*4882a593Smuzhiyun RSA Data Security, Inc. makes no representations concerning either 36*4882a593Smuzhiyun the merchantability of this software or the suitability of this 37*4882a593Smuzhiyun software for any particular purpose. It is provided "as is" 38*4882a593Smuzhiyun without express or implied warranty of any kind. 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun These notices must be retained in any copies of any part of this 41*4882a593Smuzhiyun documentation and/or software. 42*4882a593Smuzhiyun *****************************************************************************************/ 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun /**************************************************************************************** 45*4882a593Smuzhiyun This implementation of the RSA MD5 Algorithm was written by Langfine Ltd. 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun Langfine Ltd makes no representations concerning either 48*4882a593Smuzhiyun the merchantability of this software or the suitability of this 49*4882a593Smuzhiyun software for any particular purpose. It is provided "as is" 50*4882a593Smuzhiyun without express or implied warranty of any kind. 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun In addition to the above, Langfine make no warrant or assurances regarding the 53*4882a593Smuzhiyun accuracy of this implementation of the MD5 checksum algorithm nor any assurances regarding 54*4882a593Smuzhiyun its suitability for any purposes. 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun This implementation may be used freely provided that Langfine is credited 57*4882a593Smuzhiyun in a copyright or similar notices (eg, RSA MD5 Algorithm implemented by Langfine 58*4882a593Smuzhiyun Ltd.) and provided that the RSA Data Security notices are complied with. 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun Langfine may be contacted at mail@langfine.com 61*4882a593Smuzhiyun */ 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun /***************************************************************************************** 64*4882a593Smuzhiyun CLASS: CMD5Checksum 65*4882a593Smuzhiyun DESCRIPTION: Implements the "RSA Data Security, Inc. MD5 Message-Digest Algorithm". 66*4882a593Smuzhiyun NOTES: Calculates the RSA MD5 checksum for a file or congiguous array of data. 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun Below are extracts from a memo on The MD5 Message-Digest Algorithm by R. Rivest of MIT 69*4882a593Smuzhiyun Laboratory for Computer Science and RSA Data Security, Inc., April 1992. 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun 1. Executive Summary 72*4882a593Smuzhiyun This document describes the MD5 message-digest algorithm. The 73*4882a593Smuzhiyun algorithm takes as input a message of arbitrary length and produces 74*4882a593Smuzhiyun as output a 128-bit "fingerprint" or "message digest" of the input. 75*4882a593Smuzhiyun It is conjectured that it is computationally infeasible to produce 76*4882a593Smuzhiyun two messages having the same message digest, or to produce any 77*4882a593Smuzhiyun message having a given prespecified target message digest. The MD5 78*4882a593Smuzhiyun algorithm is intended for digital signature applications, where a 79*4882a593Smuzhiyun large file must be "compressed" in a secure manner before being 80*4882a593Smuzhiyun encrypted with a private (secret) key under a public-key cryptosystem 81*4882a593Smuzhiyun such as RSA. 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun The MD5 algorithm is designed to be quite fast on 32-bit machines. In 84*4882a593Smuzhiyun addition, the MD5 algorithm does not require any large substitution 85*4882a593Smuzhiyun tables; the algorithm can be coded quite compactly. 86*4882a593Smuzhiyun The MD5 algorithm is an extension of the MD4 message-digest algorithm 87*4882a593Smuzhiyun 1,2]. MD5 is slightly slower than MD4, but is more "conservative" in 88*4882a593Smuzhiyun design. MD5 was designed because it was felt that MD4 was perhaps 89*4882a593Smuzhiyun being adopted for use more quickly than justified by the existing 90*4882a593Smuzhiyun critical review; because MD4 was designed to be exceptionally fast, 91*4882a593Smuzhiyun it is "at the edge" in terms of risking successful cryptanalytic 92*4882a593Smuzhiyun attack. MD5 backs off a bit, giving up a little in speed for a much 93*4882a593Smuzhiyun greater likelihood of ultimate security. It incorporates some 94*4882a593Smuzhiyun suggestions made by various reviewers, and contains additional 95*4882a593Smuzhiyun optimizations. The MD5 algorithm is being placed in the public domain 96*4882a593Smuzhiyun for review and possible adoption as a standard. 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun 2. Terminology and Notation 100*4882a593Smuzhiyun In this document a "word" is a 32-bit quantity and a "byte" is an 101*4882a593Smuzhiyun eight-bit quantity. A sequence of bits can be interpreted in a 102*4882a593Smuzhiyun natural manner as a sequence of bytes, where each consecutive group 103*4882a593Smuzhiyun of eight bits is interpreted as a byte with the high-order (most 104*4882a593Smuzhiyun significant) bit of each byte listed first. Similarly, a sequence of 105*4882a593Smuzhiyun bytes can be interpreted as a sequence of 32-bit words, where each 106*4882a593Smuzhiyun consecutive group of four bytes is interpreted as a word with the 107*4882a593Smuzhiyun low-order (least significant) byte given first. 108*4882a593Smuzhiyun Let x_i denote "x sub i". If the subscript is an expression, we 109*4882a593Smuzhiyun surround it in braces, as in x_{i+1}. Similarly, we use ^ for 110*4882a593Smuzhiyun superscripts (exponentiation), so that x^i denotes x to the i-th power. 111*4882a593Smuzhiyun Let the symbol "+" denote addition of words (i.e., modulo-2^32 112*4882a593Smuzhiyun addition). Let X <<< s denote the 32-bit value obtained by circularly 113*4882a593Smuzhiyun shifting (rotating) X left by s bit positions. Let not(X) denote the 114*4882a593Smuzhiyun bit-wise complement of X, and let X v Y denote the bit-wise OR of X 115*4882a593Smuzhiyun and Y. Let X xor Y denote the bit-wise XOR of X and Y, and let XY 116*4882a593Smuzhiyun denote the bit-wise AND of X and Y. 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun 3. MD5 Algorithm Description 120*4882a593Smuzhiyun We begin by supposing that we have a b-bit message as input, and that 121*4882a593Smuzhiyun we wish to find its message digest. Here b is an arbitrary 122*4882a593Smuzhiyun nonnegative integer; b may be zero, it need not be a multiple of 123*4882a593Smuzhiyun eight, and it may be arbitrarily large. We imagine the bits of the 124*4882a593Smuzhiyun message written down as follows: m_0 m_1 ... m_{b-1} 125*4882a593Smuzhiyun The following five steps are performed to compute the message digest 126*4882a593Smuzhiyun of the message. 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun 3.1 Step 1. Append Padding Bits 129*4882a593Smuzhiyun The message is "padded" (extended) so that its length (in bits) is 130*4882a593Smuzhiyun congruent to 448, modulo 512. That is, the message is extended so 131*4882a593Smuzhiyun that it is just 64 bits shy of being a multiple of 512 bits long. 132*4882a593Smuzhiyun Padding is always performed, even if the length of the message is 133*4882a593Smuzhiyun already congruent to 448, modulo 512. 134*4882a593Smuzhiyun Padding is performed as follows: a single "1" bit is appended to the 135*4882a593Smuzhiyun message, and then "0" bits are appended so that the length in bits of 136*4882a593Smuzhiyun the padded message becomes congruent to 448, modulo 512. In all, at 137*4882a593Smuzhiyun least one bit and at most 512 bits are appended. 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun 3.2 Step 2. Append Length 140*4882a593Smuzhiyun A 64-bit representation of b (the length of the message before the 141*4882a593Smuzhiyun padding bits were added) is appended to the result of the previous 142*4882a593Smuzhiyun step. In the unlikely event that b is greater than 2^64, then only 143*4882a593Smuzhiyun the low-order 64 bits of b are used. (These bits are appended as two 144*4882a593Smuzhiyun 32-bit words and appended low-order word first in accordance with the 145*4882a593Smuzhiyun previous conventions.) 146*4882a593Smuzhiyun At this point the resulting message (after padding with bits and with 147*4882a593Smuzhiyun b) has a length that is an exact multiple of 512 bits. Equivalently, 148*4882a593Smuzhiyun this message has a length that is an exact multiple of 16 (32-bit) 149*4882a593Smuzhiyun words. Let M[0 ... N-1] denote the words of the resulting message, 150*4882a593Smuzhiyun where N is a multiple of 16. 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun 3.3 Step 3. Initialize MD Buffer 153*4882a593Smuzhiyun A four-word buffer (A,B,C,D) is used to compute the message digest. 154*4882a593Smuzhiyun Here each of A, B, C, D is a 32-bit register. These registers are 155*4882a593Smuzhiyun initialized to the following values in hexadecimal, low-order bytes first): 156*4882a593Smuzhiyun word A: 01 23 45 67 word B: 89 ab cd ef 157*4882a593Smuzhiyun word C: fe dc ba 98 word D: 76 54 32 10 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun 3.4 Step 4. Process Message in 16-Word Blocks 160*4882a593Smuzhiyun We first define four auxiliary functions that each take as input 161*4882a593Smuzhiyun three 32-bit words and produce as output one 32-bit word. 162*4882a593Smuzhiyun F(X,Y,Z) = XY v not(X) Z G(X,Y,Z) = XZ v Y not(Z) 163*4882a593Smuzhiyun H(X,Y,Z) = X xor Y xor Z I(X,Y,Z) = Y xor (X v not(Z)) 164*4882a593Smuzhiyun In each bit position F acts as a conditional: if X then Y else Z. 165*4882a593Smuzhiyun The function F could have been defined using + instead of v since XY 166*4882a593Smuzhiyun and not(X)Z will never have 1's in the same bit position.) It is 167*4882a593Smuzhiyun interesting to note that if the bits of X, Y, and Z are independent 168*4882a593Smuzhiyun and unbiased, the each bit of F(X,Y,Z) will be independent and unbiased. 169*4882a593Smuzhiyun The functions G, H, and I are similar to the function F, in that they 170*4882a593Smuzhiyun act in "bitwise parallel" to produce their output from the bits of X, 171*4882a593Smuzhiyun Y, and Z, in such a manner that if the corresponding bits of X, Y, 172*4882a593Smuzhiyun and Z are independent and unbiased, then each bit of G(X,Y,Z), 173*4882a593Smuzhiyun H(X,Y,Z), and I(X,Y,Z) will be independent and unbiased. Note that 174*4882a593Smuzhiyun the function H is the bit-wise "xor" or "parity" function of its inputs. 175*4882a593Smuzhiyun This step uses a 64-element table T[1 ... 64] constructed from the 176*4882a593Smuzhiyun sine function. Let T[i] denote the i-th element of the table, which 177*4882a593Smuzhiyun is equal to the integer part of 4294967296 times abs(sin(i)), where i 178*4882a593Smuzhiyun is in radians. The elements of the table are given in the appendix. 179*4882a593Smuzhiyun Do the following: 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun //Process each 16-word block. 182*4882a593Smuzhiyun For i = 0 to N/16-1 do // Copy block i into X. 183*4882a593Smuzhiyun For j = 0 to 15 do 184*4882a593Smuzhiyun Set X[j] to M[i*16+j]. 185*4882a593Smuzhiyun end //of loop on j 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun // Save A as AA, B as BB, C as CC, and D as DD. 188*4882a593Smuzhiyun AA = A BB = B 189*4882a593Smuzhiyun CC = C DD = D 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun // Round 1. 192*4882a593Smuzhiyun // Let [abcd k s i] denote the operation 193*4882a593Smuzhiyun // a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). 194*4882a593Smuzhiyun // Do the following 16 operations. 195*4882a593Smuzhiyun [ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4] 196*4882a593Smuzhiyun [ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8] 197*4882a593Smuzhiyun [ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12] 198*4882a593Smuzhiyun [ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16] 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun // Round 2. 201*4882a593Smuzhiyun // Let [abcd k s i] denote the operation 202*4882a593Smuzhiyun // a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). 203*4882a593Smuzhiyun // Do the following 16 operations. 204*4882a593Smuzhiyun [ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20] 205*4882a593Smuzhiyun [ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24] 206*4882a593Smuzhiyun [ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28] 207*4882a593Smuzhiyun [ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32] 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun // Round 3. 210*4882a593Smuzhiyun // Let [abcd k s t] denote the operation 211*4882a593Smuzhiyun // a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). 212*4882a593Smuzhiyun // Do the following 16 operations. 213*4882a593Smuzhiyun [ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36] 214*4882a593Smuzhiyun [ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40] 215*4882a593Smuzhiyun [ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44] 216*4882a593Smuzhiyun [ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48] 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun // Round 4. 219*4882a593Smuzhiyun // Let [abcd k s t] denote the operation 220*4882a593Smuzhiyun // a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). 221*4882a593Smuzhiyun // Do the following 16 operations. 222*4882a593Smuzhiyun [ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52] 223*4882a593Smuzhiyun [ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56] 224*4882a593Smuzhiyun [ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60] 225*4882a593Smuzhiyun [ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64] 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun // Then perform the following additions. (That is increment each 228*4882a593Smuzhiyun // of the four registers by the value it had before this block 229*4882a593Smuzhiyun // was started.) 230*4882a593Smuzhiyun A = A + AA B = B + BB C = C + CC D = D + DD 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun end // of loop on i 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun 3.5 Step 5. Output 235*4882a593Smuzhiyun The message digest produced as output is A, B, C, D. That is, we 236*4882a593Smuzhiyun begin with the low-order byte of A, and end with the high-order byte of D. 237*4882a593Smuzhiyun This completes the description of MD5. 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun Summary 240*4882a593Smuzhiyun The MD5 message-digest algorithm is simple to implement, and provides 241*4882a593Smuzhiyun a "fingerprint" or message digest of a message of arbitrary length. 242*4882a593Smuzhiyun It is conjectured that the difficulty of coming up with two messages 243*4882a593Smuzhiyun having the same message digest is on the order of 2^64 operations, 244*4882a593Smuzhiyun and that the difficulty of coming up with any message having a given 245*4882a593Smuzhiyun message digest is on the order of 2^128 operations. The MD5 algorithm 246*4882a593Smuzhiyun has been carefully scrutinized for weaknesses. It is, however, a 247*4882a593Smuzhiyun relatively new algorithm and further security analysis is of course 248*4882a593Smuzhiyun justified, as is the case with any new proposal of this sort. 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun 251*4882a593Smuzhiyun 5. Differences Between MD4 and MD5 252*4882a593Smuzhiyun The following are the differences between MD4 and MD5: 253*4882a593Smuzhiyun 1. A fourth round has been added. 254*4882a593Smuzhiyun 2. Each step now has a unique additive constant. 255*4882a593Smuzhiyun 3. The function g in round 2 was changed from (XY v XZ v YZ) to 256*4882a593Smuzhiyun (XZ v Y not(Z)) to make g less symmetric. 257*4882a593Smuzhiyun 4. Each step now adds in the result of the previous step. This 258*4882a593Smuzhiyun promotes a faster "avalanche effect". 259*4882a593Smuzhiyun 5. The order in which input words are accessed in rounds 2 and 260*4882a593Smuzhiyun 3 is changed, to make these patterns less like each other. 261*4882a593Smuzhiyun 6. The shift amounts in each round have been approximately 262*4882a593Smuzhiyun optimized, to yield a faster "avalanche effect." The shifts in 263*4882a593Smuzhiyun different rounds are distinct. 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun References 266*4882a593Smuzhiyun [1] Rivest, R., "The MD4 Message Digest Algorithm", RFC 1320, MIT and 267*4882a593Smuzhiyun RSA Data Security, Inc., April 1992. 268*4882a593Smuzhiyun [2] Rivest, R., "The MD4 message digest algorithm", in A.J. Menezes 269*4882a593Smuzhiyun and S.A. Vanstone, editors, Advances in Cryptology - CRYPTO '90 270*4882a593Smuzhiyun Proceedings, pages 303-311, Springer-Verlag, 1991. 271*4882a593Smuzhiyun [3] CCITT Recommendation X.509 (1988), "The Directory - 272*4882a593Smuzhiyun Authentication Framework."APPENDIX A - Reference Implementation 273*4882a593Smuzhiyun 274*4882a593Smuzhiyun 275*4882a593Smuzhiyun The level of security discussed in this memo is considered to be 276*4882a593Smuzhiyun sufficient for implementing very high security hybrid digital- 277*4882a593Smuzhiyun signature schemes based on MD5 and a public-key cryptosystem. 278*4882a593Smuzhiyun Author's Address 279*4882a593Smuzhiyun Ronald L. Rivest Massachusetts Institute of Technology 280*4882a593Smuzhiyun Laboratory for Computer Science NE43-324 545 Technology Square 281*4882a593Smuzhiyun Cambridge, MA 02139-1986 Phone: (617) 253-5880 282*4882a593Smuzhiyun EMail: rivest@theory.lcs.mit.edu 283*4882a593Smuzhiyun 284*4882a593Smuzhiyun 285*4882a593Smuzhiyun *****************************************************************************************/ 286*4882a593Smuzhiyun class CMD5Checksum 287*4882a593Smuzhiyun { 288*4882a593Smuzhiyun public: 289*4882a593Smuzhiyun //interface functions for the RSA MD5 calculation 290*4882a593Smuzhiyun static tstring GetMD5(BYTE *pBuf, UINT nLength); 291*4882a593Smuzhiyun static tstring GetMD5(FILE *File, long long nLength); 292*4882a593Smuzhiyun static tstring GetMD5(const tstring &strFilePath, long long nLength); 293*4882a593Smuzhiyun static unsigned char *_GetMD5(BYTE *pBuf, UINT nLength); 294*4882a593Smuzhiyun static unsigned char *_GetMD5(FILE *File, long long nLength); 295*4882a593Smuzhiyun static unsigned char *_GetMD5(const tstring &strFilePath, long long nLength); 296*4882a593Smuzhiyun protected: 297*4882a593Smuzhiyun //constructor/destructor 298*4882a593Smuzhiyun CMD5Checksum(); ~CMD5Checksum()299*4882a593Smuzhiyun virtual ~CMD5Checksum() 300*4882a593Smuzhiyun { 301*4882a593Smuzhiyun if (m_pBuffer) 302*4882a593Smuzhiyun { 303*4882a593Smuzhiyun delete []m_pBuffer; 304*4882a593Smuzhiyun m_pBuffer = NULL; 305*4882a593Smuzhiyun } 306*4882a593Smuzhiyun }; 307*4882a593Smuzhiyun 308*4882a593Smuzhiyun //RSA MD5 implementation 309*4882a593Smuzhiyun void Transform(BYTE Block[64]); 310*4882a593Smuzhiyun void Update(BYTE *Input, UINT nInputLen); 311*4882a593Smuzhiyun tstring Final(); 312*4882a593Smuzhiyun unsigned char *FinalChar(); 313*4882a593Smuzhiyun inline DWORD RotateLeft(DWORD x, int n); 314*4882a593Smuzhiyun inline void FF(DWORD &A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T); 315*4882a593Smuzhiyun inline void GG(DWORD &A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T); 316*4882a593Smuzhiyun inline void HH(DWORD &A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T); 317*4882a593Smuzhiyun inline void II(DWORD &A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T); 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun //utility functions 320*4882a593Smuzhiyun void DWordToByte(BYTE *Output, DWORD *Input, UINT nLength); 321*4882a593Smuzhiyun void ByteToDWord(DWORD *Output, BYTE *Input, UINT nLength); 322*4882a593Smuzhiyun 323*4882a593Smuzhiyun private: 324*4882a593Smuzhiyun PBYTE m_pBuffer; 325*4882a593Smuzhiyun BYTE m_lpszBuffer[64]; //input buffer 326*4882a593Smuzhiyun UINT m_nCount[2]; //number of bits, modulo 2^64 (lsb first) 327*4882a593Smuzhiyun UINT m_lMD5[4]; //MD5 checksum 328*4882a593Smuzhiyun }; 329*4882a593Smuzhiyun 330*4882a593Smuzhiyun #endif // !defined(AFX_MD5CHECKSUM_H__2BC7928E_4C15_11D3_B2EE_A4A60E20D2C3__INCLUDED_) 331*4882a593Smuzhiyun 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun 334*4882a593Smuzhiyun 335*4882a593Smuzhiyun 336*4882a593Smuzhiyun 337*4882a593Smuzhiyun 338*4882a593Smuzhiyun 339