xref: /OK3568_Linux_fs/external/rkupdate/MD5Checksum.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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