1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75#include "libbb.h"
76
77
78#if CONFIG_MD5_SIZE_VS_SPEED < 1
79# define MD5_SIZE_VS_SPEED 1
80#elif CONFIG_MD5_SIZE_VS_SPEED > 3
81# define MD5_SIZE_VS_SPEED 3
82#else
83# define MD5_SIZE_VS_SPEED CONFIG_MD5_SIZE_VS_SPEED
84#endif
85
86#if BB_LITTLE_ENDIAN
87#define memcpy32_cpu2le memcpy
88#define memcpy32_le2cpu memcpy
89#else
90
91
92static void
93memcpy32_cpu2le(unsigned char *output, uint32_t *input, unsigned len)
94{
95 unsigned i, j;
96 for (i = 0, j = 0; j < len; i++, j += 4) {
97 output[j] = input[i];
98 output[j+1] = (input[i] >> 8);
99 output[j+2] = (input[i] >> 16);
100 output[j+3] = (input[i] >> 24);
101 }
102}
103
104
105static void
106memcpy32_le2cpu(uint32_t *output, const unsigned char *input, unsigned len)
107{
108 unsigned i, j;
109 for (i = 0, j = 0; j < len; i++, j += 4)
110 output[i] = ((uint32_t)input[j])
111 | (((uint32_t)input[j+1]) << 8)
112 | (((uint32_t)input[j+2]) << 16)
113 | (((uint32_t)input[j+3]) << 24);
114}
115#endif
116
117
118#define F(x, y, z) (((x) & (y)) | (~(x) & (z)))
119#define G(x, y, z) (((x) & (z)) | ((y) & ~(z)))
120#define H(x, y, z) ((x) ^ (y) ^ (z))
121#define I(x, y, z) ((y) ^ ((x) | ~(z)))
122
123
124#define rotl32(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
125
126
127
128
129
130#define FF(a, b, c, d, x, s, ac) { \
131 (a) += F((b), (c), (d)) + (x) + (uint32_t)(ac); \
132 (a) = rotl32((a), (s)); \
133 (a) += (b); \
134 }
135#define GG(a, b, c, d, x, s, ac) { \
136 (a) += G((b), (c), (d)) + (x) + (uint32_t)(ac); \
137 (a) = rotl32((a), (s)); \
138 (a) += (b); \
139 }
140#define HH(a, b, c, d, x, s, ac) { \
141 (a) += H((b), (c), (d)) + (x) + (uint32_t)(ac); \
142 (a) = rotl32((a), (s)); \
143 (a) += (b); \
144 }
145#define II(a, b, c, d, x, s, ac) { \
146 (a) += I((b), (c), (d)) + (x) + (uint32_t)(ac); \
147 (a) = rotl32((a), (s)); \
148 (a) += (b); \
149 }
150
151
152static void md5_transform(uint32_t state[4], const unsigned char block[64])
153{
154 uint32_t a, b, c, d, x[16];
155#if MD5_SIZE_VS_SPEED > 1
156 uint32_t temp;
157 const unsigned char *ps;
158
159 static const unsigned char S[] = {
160 7, 12, 17, 22,
161 5, 9, 14, 20,
162 4, 11, 16, 23,
163 6, 10, 15, 21
164 };
165#endif
166
167#if MD5_SIZE_VS_SPEED > 0
168 const uint32_t *pc;
169 const unsigned char *pp;
170 int i;
171
172 static const uint32_t C[] = {
173
174 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,
175 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
176 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
177 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
178
179 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,
180 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8,
181 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,
182 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,
183
184 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,
185 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
186 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05,
187 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
188
189 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,
190 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
191 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
192 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391
193 };
194 static const unsigned char P[] = {
195 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
196 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12,
197 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2,
198 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9
199 };
200
201#endif
202
203 memcpy32_le2cpu(x, block, 64);
204
205 a = state[0];
206 b = state[1];
207 c = state[2];
208 d = state[3];
209
210#if MD5_SIZE_VS_SPEED > 2
211 pc = C;
212 pp = P;
213 ps = S - 4;
214 for (i = 0; i < 64; i++) {
215 if ((i & 0x0f) == 0) ps += 4;
216 temp = a;
217 switch (i>>4) {
218 case 0:
219 temp += F(b, c, d);
220 break;
221 case 1:
222 temp += G(b, c, d);
223 break;
224 case 2:
225 temp += H(b, c, d);
226 break;
227 case 3:
228 temp += I(b, c, d);
229 break;
230 }
231 temp += x[*pp++] + *pc++;
232 temp = rotl32(temp, ps[i & 3]);
233 temp += b;
234 a = d; d = c; c = b; b = temp;
235 }
236#elif MD5_SIZE_VS_SPEED > 1
237 pc = C;
238 pp = P;
239 ps = S;
240
241 for (i = 0; i < 16; i++) {
242 FF(a, b, c, d, x[*pp], ps[i & 0x3], *pc); pp++; pc++;
243 temp = d; d = c; c = b; b = a; a = temp;
244 }
245
246 ps += 4;
247 for (; i < 32; i++) {
248 GG(a, b, c, d, x[*pp], ps[i & 0x3], *pc); pp++; pc++;
249 temp = d; d = c; c = b; b = a; a = temp;
250 }
251
252 ps += 4;
253 for (; i < 48; i++) {
254 HH(a, b, c, d, x[*pp], ps[i & 0x3], *pc); pp++; pc++;
255 temp = d; d = c; c = b; b = a; a = temp;
256 }
257
258 ps += 4;
259 for (; i < 64; i++) {
260 II(a, b, c, d, x[*pp], ps[i & 0x3], *pc); pp++; pc++;
261 temp = d; d = c; c = b; b = a; a = temp;
262 }
263#elif MD5_SIZE_VS_SPEED > 0
264 pc = C;
265 pp = P;
266
267 for (i = 0; i < 4; i++) {
268 FF(a, b, c, d, x[*pp], 7, *pc); pp++; pc++;
269 FF(d, a, b, c, x[*pp], 12, *pc); pp++; pc++;
270 FF(c, d, a, b, x[*pp], 17, *pc); pp++; pc++;
271 FF(b, c, d, a, x[*pp], 22, *pc); pp++; pc++;
272 }
273
274 for (i = 0; i < 4; i++) {
275 GG(a, b, c, d, x[*pp], 5, *pc); pp++; pc++;
276 GG(d, a, b, c, x[*pp], 9, *pc); pp++; pc++;
277 GG(c, d, a, b, x[*pp], 14, *pc); pp++; pc++;
278 GG(b, c, d, a, x[*pp], 20, *pc); pp++; pc++;
279 }
280
281 for (i = 0; i < 4; i++) {
282 HH(a, b, c, d, x[*pp], 4, *pc); pp++; pc++;
283 HH(d, a, b, c, x[*pp], 11, *pc); pp++; pc++;
284 HH(c, d, a, b, x[*pp], 16, *pc); pp++; pc++;
285 HH(b, c, d, a, x[*pp], 23, *pc); pp++; pc++;
286 }
287
288 for (i = 0; i < 4; i++) {
289 II(a, b, c, d, x[*pp], 6, *pc); pp++; pc++;
290 II(d, a, b, c, x[*pp], 10, *pc); pp++; pc++;
291 II(c, d, a, b, x[*pp], 15, *pc); pp++; pc++;
292 II(b, c, d, a, x[*pp], 21, *pc); pp++; pc++;
293 }
294#else
295
296#define S11 7
297#define S12 12
298#define S13 17
299#define S14 22
300 FF(a, b, c, d, x[ 0], S11, 0xd76aa478);
301 FF(d, a, b, c, x[ 1], S12, 0xe8c7b756);
302 FF(c, d, a, b, x[ 2], S13, 0x242070db);
303 FF(b, c, d, a, x[ 3], S14, 0xc1bdceee);
304 FF(a, b, c, d, x[ 4], S11, 0xf57c0faf);
305 FF(d, a, b, c, x[ 5], S12, 0x4787c62a);
306 FF(c, d, a, b, x[ 6], S13, 0xa8304613);
307 FF(b, c, d, a, x[ 7], S14, 0xfd469501);
308 FF(a, b, c, d, x[ 8], S11, 0x698098d8);
309 FF(d, a, b, c, x[ 9], S12, 0x8b44f7af);
310 FF(c, d, a, b, x[10], S13, 0xffff5bb1);
311 FF(b, c, d, a, x[11], S14, 0x895cd7be);
312 FF(a, b, c, d, x[12], S11, 0x6b901122);
313 FF(d, a, b, c, x[13], S12, 0xfd987193);
314 FF(c, d, a, b, x[14], S13, 0xa679438e);
315 FF(b, c, d, a, x[15], S14, 0x49b40821);
316
317#define S21 5
318#define S22 9
319#define S23 14
320#define S24 20
321 GG(a, b, c, d, x[ 1], S21, 0xf61e2562);
322 GG(d, a, b, c, x[ 6], S22, 0xc040b340);
323 GG(c, d, a, b, x[11], S23, 0x265e5a51);
324 GG(b, c, d, a, x[ 0], S24, 0xe9b6c7aa);
325 GG(a, b, c, d, x[ 5], S21, 0xd62f105d);
326 GG(d, a, b, c, x[10], S22, 0x2441453);
327 GG(c, d, a, b, x[15], S23, 0xd8a1e681);
328 GG(b, c, d, a, x[ 4], S24, 0xe7d3fbc8);
329 GG(a, b, c, d, x[ 9], S21, 0x21e1cde6);
330 GG(d, a, b, c, x[14], S22, 0xc33707d6);
331 GG(c, d, a, b, x[ 3], S23, 0xf4d50d87);
332 GG(b, c, d, a, x[ 8], S24, 0x455a14ed);
333 GG(a, b, c, d, x[13], S21, 0xa9e3e905);
334 GG(d, a, b, c, x[ 2], S22, 0xfcefa3f8);
335 GG(c, d, a, b, x[ 7], S23, 0x676f02d9);
336 GG(b, c, d, a, x[12], S24, 0x8d2a4c8a);
337
338#define S31 4
339#define S32 11
340#define S33 16
341#define S34 23
342 HH(a, b, c, d, x[ 5], S31, 0xfffa3942);
343 HH(d, a, b, c, x[ 8], S32, 0x8771f681);
344 HH(c, d, a, b, x[11], S33, 0x6d9d6122);
345 HH(b, c, d, a, x[14], S34, 0xfde5380c);
346 HH(a, b, c, d, x[ 1], S31, 0xa4beea44);
347 HH(d, a, b, c, x[ 4], S32, 0x4bdecfa9);
348 HH(c, d, a, b, x[ 7], S33, 0xf6bb4b60);
349 HH(b, c, d, a, x[10], S34, 0xbebfbc70);
350 HH(a, b, c, d, x[13], S31, 0x289b7ec6);
351 HH(d, a, b, c, x[ 0], S32, 0xeaa127fa);
352 HH(c, d, a, b, x[ 3], S33, 0xd4ef3085);
353 HH(b, c, d, a, x[ 6], S34, 0x4881d05);
354 HH(a, b, c, d, x[ 9], S31, 0xd9d4d039);
355 HH(d, a, b, c, x[12], S32, 0xe6db99e5);
356 HH(c, d, a, b, x[15], S33, 0x1fa27cf8);
357 HH(b, c, d, a, x[ 2], S34, 0xc4ac5665);
358
359#define S41 6
360#define S42 10
361#define S43 15
362#define S44 21
363 II(a, b, c, d, x[ 0], S41, 0xf4292244);
364 II(d, a, b, c, x[ 7], S42, 0x432aff97);
365 II(c, d, a, b, x[14], S43, 0xab9423a7);
366 II(b, c, d, a, x[ 5], S44, 0xfc93a039);
367 II(a, b, c, d, x[12], S41, 0x655b59c3);
368 II(d, a, b, c, x[ 3], S42, 0x8f0ccc92);
369 II(c, d, a, b, x[10], S43, 0xffeff47d);
370 II(b, c, d, a, x[ 1], S44, 0x85845dd1);
371 II(a, b, c, d, x[ 8], S41, 0x6fa87e4f);
372 II(d, a, b, c, x[15], S42, 0xfe2ce6e0);
373 II(c, d, a, b, x[ 6], S43, 0xa3014314);
374 II(b, c, d, a, x[13], S44, 0x4e0811a1);
375 II(a, b, c, d, x[ 4], S41, 0xf7537e82);
376 II(d, a, b, c, x[11], S42, 0xbd3af235);
377 II(c, d, a, b, x[ 2], S43, 0x2ad7d2bb);
378 II(b, c, d, a, x[ 9], S44, 0xeb86d391);
379#endif
380
381 state[0] += a;
382 state[1] += b;
383 state[2] += c;
384 state[3] += d;
385
386
387 memset(x, 0, sizeof(x));
388}
389
390
391
392void FAST_FUNC md5_begin(md5_ctx_t *context)
393{
394 context->count[0] = context->count[1] = 0;
395
396 context->state[0] = 0x67452301;
397 context->state[1] = 0xefcdab89;
398 context->state[2] = 0x98badcfe;
399 context->state[3] = 0x10325476;
400}
401
402
403
404
405
406
407void FAST_FUNC md5_hash(const void *buffer, size_t inputLen, md5_ctx_t *context)
408{
409 unsigned i, idx, partLen;
410 const unsigned char *input = buffer;
411
412
413 idx = (context->count[0] >> 3) & 0x3F;
414
415
416 context->count[0] += (inputLen << 3);
417 if (context->count[0] < (inputLen << 3))
418 context->count[1]++;
419 context->count[1] += (inputLen >> 29);
420
421
422 i = 0;
423 partLen = 64 - idx;
424 if (inputLen >= partLen) {
425 memcpy(&context->buffer[idx], input, partLen);
426 md5_transform(context->state, context->buffer);
427 for (i = partLen; i + 63 < inputLen; i += 64)
428 md5_transform(context->state, &input[i]);
429 idx = 0;
430 }
431
432
433 memcpy(&context->buffer[idx], &input[i], inputLen - i);
434}
435
436
437
438
439
440void FAST_FUNC md5_end(void *digest, md5_ctx_t *context)
441{
442 unsigned idx, padLen;
443 unsigned char bits[8];
444 unsigned char padding[64];
445
446
447 memset(padding, 0, sizeof(padding));
448 padding[0] = 0x80;
449
450 memcpy32_cpu2le(bits, context->count, 8);
451
452 idx = (context->count[0] >> 3) & 0x3f;
453 padLen = (idx < 56) ? (56 - idx) : (120 - idx);
454 md5_hash(padding, padLen, context);
455
456 md5_hash(bits, 8, context);
457
458
459 memcpy32_cpu2le(digest, context->state, 16);
460}
461