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