1 #include <stdio.h>
2 #include <stdlib.h>
3 #include<string.h>
4 #include "md5.h"
5 //
6 // char digest[16]
digest_md5(unsigned char * buffer,int buffer_len,unsigned char * digest)7 void digest_md5(unsigned char* buffer,int buffer_len,unsigned char* digest)
8 {
9 	MD5_CTX ctx;
10 	MD5Init(&ctx);
11 	MD5Update(&ctx,buffer,buffer_len);
12 	MD5Final(&ctx);
13 	memcpy(digest,ctx.digest,sizeof(ctx.digest));
14 }
15 
16 /*
17 
18 md5.c -- the source code for MD5 routines
19 
20 RSA Data Security, Inc. MD5 Message-Digest Algorithm
21 Created: 2/17/90 RLR
22 Revised: 1/91 SRD,AJ,BSK,JT Reference C Version
23 */
24 
25 
26 
27 /*
28 
29 Message-digest routines:
30 
31 To form the message digest for a message M
32 
33 (1) Initialize a context buffer mdContext using MD5Init
34 (2) Call MD5Update on mdContext and M
35 (3) Call MD5Final on mdContext
36 The message digest is now in mdContext->digest[0...15]
37 
38 */
39 
40 static unsigned char PADDING[64] = {
41   0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
42   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
43   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
44   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
45   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
46   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
47   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
48   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
49 };
50 
51 /* F, G, H and I are basic MD5 functions */
52 #define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
53 #define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
54 #define H(x, y, z) ((x) ^ (y) ^ (z))
55 #define I(x, y, z) ((y) ^ ((x) | (~z)))
56 
57 /* ROTATE_LEFT rotates x left n bits */
58 #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
59 
60 /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4 */
61 /* Rotation is separate from addition to prevent recomputation */
62 #define FF(a, b, c, d, x, s, ac) \
63   {(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
64    (a) = ROTATE_LEFT ((a), (s)); \
65    (a) += (b); \
66   }
67 #define GG(a, b, c, d, x, s, ac) \
68   {(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
69    (a) = ROTATE_LEFT ((a), (s)); \
70    (a) += (b); \
71   }
72 #define HH(a, b, c, d, x, s, ac) \
73   {(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
74    (a) = ROTATE_LEFT ((a), (s)); \
75    (a) += (b); \
76   }
77 #define II(a, b, c, d, x, s, ac) \
78   {(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
79    (a) = ROTATE_LEFT ((a), (s)); \
80    (a) += (b); \
81   }
82 
83 /* The routine MD5Init initializes the message-digest context
84    mdContext. All fields are set to zero.
85  */
MD5Init(MD5_CTX * mdContext)86 void MD5Init ( MD5_CTX *mdContext)
87 {
88   mdContext->i[0] = mdContext->i[1] = (UINT4)0;
89 
90   /* Load magic initialization constants.
91    */
92   mdContext->buf[0] = (UINT4)0x67452301L;
93   mdContext->buf[1] = (UINT4)0xefcdab89L;
94   mdContext->buf[2] = (UINT4)0x98badcfeL;
95   mdContext->buf[3] = (UINT4)0x10325476L;
96 }
97 
98 /*
99 The routine MD5Update updates the message-digest context to
100 account for the presence of each of the characters
101 inBuf[0..inLen-1]
102 in the message whose digest is being computed.
103 */
104 
MD5Update(register MD5_CTX * mdContext,unsigned char * inBuf,unsigned int inLen)105 void MD5Update (register MD5_CTX *mdContext, unsigned char *inBuf,
106     unsigned int inLen)
107 {
108   register int i, ii;
109   int mdi;
110   UINT4 in[16];
111 
112   /* compute number of bytes mod 64 */
113   mdi = (int)((mdContext->i[0] >> 3) & 0x3F);
114 
115   /* update number of bits */
116   if ((mdContext->i[0] + ((UINT4)inLen << 3)) < mdContext->i[0])
117     mdContext->i[1]++;
118   mdContext->i[0] += ((UINT4)inLen << 3);
119   mdContext->i[1] += ((UINT4)inLen >> 29);
120 
121   while (inLen--) {
122     /* add new character to buffer, increment mdi */
123     mdContext->in[mdi++] = *inBuf++;
124 
125     /* transform if necessary */
126     if (mdi == 0x40) {
127       for (i = 0, ii = 0; i < 16; i++, ii += 4)
128         in[i] = (((UINT4)mdContext->in[ii+3]) << 24) |
129                 (((UINT4)mdContext->in[ii+2]) << 16) |
130                 (((UINT4)mdContext->in[ii+1]) << 8) |
131                 ((UINT4)mdContext->in[ii]);
132       Transform (mdContext->buf, in);
133       mdi = 0;
134     }
135   }
136 }
137 
138 /*
139 The routine MD5Final terminates the message-digest computation and
140 ends with the desired message digest in mdContext->digest[0...15].
141 */
MD5Final(MD5_CTX * mdContext)142 void MD5Final (MD5_CTX *mdContext)
143 {
144   UINT4 in[16];
145   int mdi;
146   unsigned int i, ii;
147   unsigned int padLen;
148 
149   /* save number of bits */
150   in[14] = mdContext->i[0];
151   in[15] = mdContext->i[1];
152 
153   /* compute number of bytes mod 64 */
154   mdi = (int)((mdContext->i[0] >> 3) & 0x3F);
155 
156   /* pad out to 56 mod 64 */
157   padLen = (mdi < 56) ? (56 - mdi) : (120 - mdi);
158   MD5Update (mdContext, PADDING, padLen);
159 
160   /* append length in bits and transform */
161   for (i = 0, ii = 0; i < 14; i++, ii += 4)
162     in[i] = (((UINT4)mdContext->in[ii+3]) << 24) |
163             (((UINT4)mdContext->in[ii+2]) << 16) |
164             (((UINT4)mdContext->in[ii+1]) << 8) |
165             ((UINT4)mdContext->in[ii]);
166   Transform (mdContext->buf, in);
167 
168   /* store buffer in digest */
169   for (i = 0, ii = 0; i < 4; i++, ii += 4) {
170     mdContext->digest[ii] = (unsigned char)(mdContext->buf[i] &
171 0xFF);
172     mdContext->digest[ii+1] =
173       (unsigned char)((mdContext->buf[i] >> 8) & 0xFF);
174     mdContext->digest[ii+2] =
175       (unsigned char)((mdContext->buf[i] >> 16) & 0xFF);
176     mdContext->digest[ii+3] =
177       (unsigned char)((mdContext->buf[i] >> 24) & 0xFF);
178   }
179 }
180 
181 /*
182 Basic MD5 step. Transforms buf based on in.  Note that if the
183 Mysterious Constants are arranged backwards in little-endian order
184 and decrypted with the DES they produce OCCULT MESSAGES!
185 */
Transform(register UINT4 * buf,register UINT4 * in)186 void Transform(register UINT4 *buf,register UINT4 *in)
187 {
188 register UINT4 a = buf[0], b = buf[1], c = buf[2], d = buf[3];
189 
190   /* Round 1 */
191 #define S11 7
192 #define S12 12
193 #define S13 17
194 #define S14 22
195   FF ( a, b, c, d, in[ 0], S11, 0xD76AA478L); /* 1 */
196   FF ( d, a, b, c, in[ 1], S12, 0xE8C7B756L); /* 2 */
197   FF ( c, d, a, b, in[ 2], S13, 0x242070DBL); /* 3 */
198   FF ( b, c, d, a, in[ 3], S14, 0xC1BDCEEEL); /* 4 */
199   FF ( a, b, c, d, in[ 4], S11, 0xF57C0FAFL); /* 5 */
200   FF ( d, a, b, c, in[ 5], S12, 0x4787C62AL); /* 6 */
201   FF ( c, d, a, b, in[ 6], S13, 0xA8304613L); /* 7 */
202   FF ( b, c, d, a, in[ 7], S14, 0xFD469501L); /* 8 */
203   FF ( a, b, c, d, in[ 8], S11, 0x698098D8L); /* 9 */
204   FF ( d, a, b, c, in[ 9], S12, 0x8B44F7AFL); /* 10 */
205   FF ( c, d, a, b, in[10], S13, 0xFFFF5BB1L); /* 11 */
206   FF ( b, c, d, a, in[11], S14, 0x895CD7BEL); /* 12 */
207   FF ( a, b, c, d, in[12], S11, 0x6B901122L); /* 13 */
208   FF ( d, a, b, c, in[13], S12, 0xFD987193L); /* 14 */
209   FF ( c, d, a, b, in[14], S13, 0xA679438EL); /* 15 */
210   FF ( b, c, d, a, in[15], S14, 0x49B40821L); /* 16 */
211 
212   /* Round 2 */
213 #define S21 5
214 #define S22 9
215 #define S23 14
216 #define S24 20
217   GG ( a, b, c, d, in[ 1], S21, 0xF61E2562L); /* 17 */
218   GG ( d, a, b, c, in[ 6], S22, 0xC040B340L); /* 18 */
219   GG ( c, d, a, b, in[11], S23, 0x265E5A51L); /* 19 */
220   GG ( b, c, d, a, in[ 0], S24, 0xE9B6C7AAL); /* 20 */
221   GG ( a, b, c, d, in[ 5], S21, 0xD62F105DL); /* 21 */
222   GG ( d, a, b, c, in[10], S22, 0x02441453L); /* 22 */
223   GG ( c, d, a, b, in[15], S23, 0xD8A1E681L); /* 23 */
224   GG ( b, c, d, a, in[ 4], S24, 0xE7D3FBC8L); /* 24 */
225   GG ( a, b, c, d, in[ 9], S21, 0x21E1CDE6L); /* 25 */
226   GG ( d, a, b, c, in[14], S22, 0xC33707D6L); /* 26 */
227   GG ( c, d, a, b, in[ 3], S23, 0xF4D50D87L); /* 27 */
228   GG ( b, c, d, a, in[ 8], S24, 0x455A14EDL); /* 28 */
229   GG ( a, b, c, d, in[13], S21, 0xA9E3E905L); /* 29 */
230   GG ( d, a, b, c, in[ 2], S22, 0xFCEFA3F8L); /* 30 */
231   GG ( c, d, a, b, in[ 7], S23, 0x676F02D9L); /* 31 */
232   GG ( b, c, d, a, in[12], S24, 0x8D2A4C8AL); /* 32 */
233 
234   /* Round 3 */
235 #define S31 4
236 #define S32 11
237 #define S33 16
238 #define S34 23
239   HH ( a, b, c, d, in[ 5], S31, 0xFFFA3942L); /* 33 */
240   HH ( d, a, b, c, in[ 8], S32, 0x8771F681L); /* 34 */
241   HH ( c, d, a, b, in[11], S33, 0x6D9D6122L); /* 35 */
242   HH ( b, c, d, a, in[14], S34, 0xFDE5380CL); /* 36 */
243   HH ( a, b, c, d, in[ 1], S31, 0xA4BEEA44L); /* 37 */
244   HH ( d, a, b, c, in[ 4], S32, 0x4BDECFA9L); /* 38 */
245   HH ( c, d, a, b, in[ 7], S33, 0xF6BB4B60L); /* 39 */
246   HH ( b, c, d, a, in[10], S34, 0xBEBFBC70L); /* 40 */
247   HH ( a, b, c, d, in[13], S31, 0x289B7EC6L); /* 41 */
248   HH ( d, a, b, c, in[ 0], S32, 0xEAA127FAL); /* 42 */
249   HH ( c, d, a, b, in[ 3], S33, 0xD4EF3085L); /* 43 */
250   HH ( b, c, d, a, in[ 6], S34, 0x04881D05L); /* 44 */
251   HH ( a, b, c, d, in[ 9], S31, 0xD9D4D039L); /* 45 */
252   HH ( d, a, b, c, in[12], S32, 0xE6DB99E5L); /* 46 */
253   HH ( c, d, a, b, in[15], S33, 0x1FA27CF8L); /* 47 */
254   HH ( b, c, d, a, in[ 2], S34, 0xC4AC5665L); /* 48 */
255 
256   /* Round 4 */
257 #define S41 6
258 #define S42 10
259 #define S43 15
260 #define S44 21
261   II ( a, b, c, d, in[ 0], S41, 0xF4292244L); /* 49 */
262   II ( d, a, b, c, in[ 7], S42, 0x432AFF97L); /* 50 */
263   II ( c, d, a, b, in[14], S43, 0xAB9423A7L); /* 51 */
264   II ( b, c, d, a, in[ 5], S44, 0xFC93A039L); /* 52 */
265   II ( a, b, c, d, in[12], S41, 0x655B59C3L); /* 53 */
266   II ( d, a, b, c, in[ 3], S42, 0x8F0CCC92L); /* 54 */
267   II ( c, d, a, b, in[10], S43, 0xFFEFF47DL); /* 55 */
268   II ( b, c, d, a, in[ 1], S44, 0x85845DD1L); /* 56 */
269   II ( a, b, c, d, in[ 8], S41, 0x6FA87E4FL); /* 57 */
270   II ( d, a, b, c, in[15], S42, 0xFE2CE6E0L); /* 58 */
271   II ( c, d, a, b, in[ 6], S43, 0xA3014314L); /* 59 */
272   II ( b, c, d, a, in[13], S44, 0x4E0811A1L); /* 60 */
273   II ( a, b, c, d, in[ 4], S41, 0xF7537E82L); /* 61 */
274   II ( d, a, b, c, in[11], S42, 0xBD3AF235L); /* 62 */
275   II ( c, d, a, b, in[ 2], S43, 0x2AD7D2BBL); /* 63 */
276   II ( b, c, d, a, in[ 9], S44, 0xEB86D391L); /* 64 */
277 
278   buf[0] += a;
279   buf[1] += b;
280   buf[2] += c;
281   buf[3] += d;
282 }
283 
284 
285 /*
286 
287 MD5 test vectors:
288 d41d8cd98f00b204e9800998ecf8427e ""
289 0cc175b9c0f1b6a831c399e269772661 "a"
290 900150983cd24fb0d6963f7d28e17f72 "abc"
291 f96b697d7cb7938d525a2f31aaf161d0 "message digest"
292 c3fcd3d76192e4007dfb496cca67e13b "abcdefghijklmnopqrstuvwxyz"
293 d174ab98d277d9f5a5611c2c9f419d9f
294 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijk\
295 lmnopqrstuvwxyz0123456789"
296 57edf4a22be3c955ac49da2e2107b67a
297 "1234567890123456789012345678901234567\
298 8901234567890123456789012345678901234567890"
299 900150983cd24fb0d6963f7d28e17f72 foo
300 
301 */
302