Initial commit
[pwdhash.git] / md5-cl.c
1 #include <stdint.h>
2 #include <stdio.h>
3 #include <sys/types.h>
4 #include <string.h>
5
6 #include "md5-cl.h"
7
8 #define MD5_STEP(f,a,b,c,d,x,K,s) \
9 { \
10 a += K; \
11 a += x; \
12 a += f (b, c, d); \
13 a = rotl32 (a, s); \
14 a += b; \
15 }
16
17 #define MD5_F(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))
18 #define MD5_G(x,y,z) ((y) ^ ((z) & ((x) ^ (y))))
19 #define MD5_H(x,y,z) ((x) ^ (y) ^ (z))
20 #define MD5_I(x,y,z) ((y) ^ ((x) | ~(z)))
21 #define MD5_Fo(x,y,z) (MD5_F((x), (y), (z)))
22 #define MD5_Go(x,y,z) (MD5_G((x), (y), (z)))
23
24 #define MD5S00 7u
25 #define MD5S01 12u
26 #define MD5S02 17u
27 #define MD5S03 22u
28 #define MD5S10 5u
29 #define MD5S11 9u
30 #define MD5S12 14u
31 #define MD5S13 20u
32 #define MD5S20 4u
33 #define MD5S21 11u
34 #define MD5S22 16u
35 #define MD5S23 23u
36 #define MD5S30 6u
37 #define MD5S31 10u
38 #define MD5S32 15u
39 #define MD5S33 21u
40
41 #define MD5C00 0xd76aa478u
42 #define MD5C01 0xe8c7b756u
43 #define MD5C02 0x242070dbu
44 #define MD5C03 0xc1bdceeeu
45 #define MD5C04 0xf57c0fafu
46 #define MD5C05 0x4787c62au
47 #define MD5C06 0xa8304613u
48 #define MD5C07 0xfd469501u
49 #define MD5C08 0x698098d8u
50 #define MD5C09 0x8b44f7afu
51 #define MD5C0a 0xffff5bb1u
52 #define MD5C0b 0x895cd7beu
53 #define MD5C0c 0x6b901122u
54 #define MD5C0d 0xfd987193u
55 #define MD5C0e 0xa679438eu
56 #define MD5C0f 0x49b40821u
57 #define MD5C10 0xf61e2562u
58 #define MD5C11 0xc040b340u
59 #define MD5C12 0x265e5a51u
60 #define MD5C13 0xe9b6c7aau
61 #define MD5C14 0xd62f105du
62 #define MD5C15 0x02441453u
63 #define MD5C16 0xd8a1e681u
64 #define MD5C17 0xe7d3fbc8u
65 #define MD5C18 0x21e1cde6u
66 #define MD5C19 0xc33707d6u
67 #define MD5C1a 0xf4d50d87u
68 #define MD5C1b 0x455a14edu
69 #define MD5C1c 0xa9e3e905u
70 #define MD5C1d 0xfcefa3f8u
71 #define MD5C1e 0x676f02d9u
72 #define MD5C1f 0x8d2a4c8au
73 #define MD5C20 0xfffa3942u
74 #define MD5C21 0x8771f681u
75 #define MD5C22 0x6d9d6122u
76 #define MD5C23 0xfde5380cu
77 #define MD5C24 0xa4beea44u
78 #define MD5C25 0x4bdecfa9u
79 #define MD5C26 0xf6bb4b60u
80 #define MD5C27 0xbebfbc70u
81 #define MD5C28 0x289b7ec6u
82 #define MD5C29 0xeaa127fau
83 #define MD5C2a 0xd4ef3085u
84 #define MD5C2b 0x04881d05u
85 #define MD5C2c 0xd9d4d039u
86 #define MD5C2d 0xe6db99e5u
87 #define MD5C2e 0x1fa27cf8u
88 #define MD5C2f 0xc4ac5665u
89 #define MD5C30 0xf4292244u
90 #define MD5C31 0x432aff97u
91 #define MD5C32 0xab9423a7u
92 #define MD5C33 0xfc93a039u
93 #define MD5C34 0x655b59c3u
94 #define MD5C35 0x8f0ccc92u
95 #define MD5C36 0xffeff47du
96 #define MD5C37 0x85845dd1u
97 #define MD5C38 0x6fa87e4fu
98 #define MD5C39 0xfe2ce6e0u
99 #define MD5C3a 0xa3014314u
100 #define MD5C3b 0x4e0811a1u
101 #define MD5C3c 0xf7537e82u
102 #define MD5C3d 0xbd3af235u
103 #define MD5C3e 0x2ad7d2bbu
104 #define MD5C3f 0xeb86d391u
105
106 u32x rotl32 (const u32x a, const u32 n)
107 {
108 u32x result;
109
110 result = a << n;
111 result |= a >> (32 - n);
112
113 return result;
114 // return rotate (a, n);
115 }
116
117 void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4])
118 {
119 u32x a = digest[0];
120 u32x b = digest[1];
121 u32x c = digest[2];
122 u32x d = digest[3];
123
124 u32x w0_t = w0[0];
125 u32x w1_t = w0[1];
126 u32x w2_t = w0[2];
127 u32x w3_t = w0[3];
128 u32x w4_t = w1[0];
129 u32x w5_t = w1[1];
130 u32x w6_t = w1[2];
131 u32x w7_t = w1[3];
132 u32x w8_t = w2[0];
133 u32x w9_t = w2[1];
134 u32x wa_t = w2[2];
135 u32x wb_t = w2[3];
136 u32x wc_t = w3[0];
137 u32x wd_t = w3[1];
138 u32x we_t = w3[2];
139 u32x wf_t = w3[3];
140
141 MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00);
142 MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01);
143 MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02);
144 MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03);
145 MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00);
146 MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01);
147 MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02);
148 MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03);
149 MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00);
150 MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01);
151 MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02);
152 MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03);
153 MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00);
154 MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01);
155 MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02);
156 MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03);
157
158 MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10);
159 MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11);
160 MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12);
161 MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13);
162 MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10);
163 MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11);
164 MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12);
165 MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13);
166 MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10);
167 MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11);
168 MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12);
169 MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13);
170 MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10);
171 MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11);
172 MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12);
173 MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13);
174
175 MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20);
176 MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21);
177 MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22);
178 MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23);
179 MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20);
180 MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21);
181 MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22);
182 MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23);
183 MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20);
184 MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21);
185 MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22);
186 MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23);
187 MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20);
188 MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21);
189 MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22);
190 MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23);
191
192 MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30);
193 MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31);
194 MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32);
195 MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33);
196 MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30);
197 MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31);
198 MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32);
199 MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33);
200 MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30);
201 MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31);
202 MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32);
203 MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33);
204 MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30);
205 MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31);
206 MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32);
207 MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33);
208
209 digest[0] += a;
210 digest[1] += b;
211 digest[2] += c;
212 digest[3] += d;
213 }
214
215 void append_0x80_2x4_S (u32 w0[4], u32 w1[4], const u32 offset)
216 {
217 switch (offset)
218 {
219 case 0:
220 w0[0] = 0x80;
221 break;
222
223 case 1:
224 w0[0] = w0[0] | 0x8000;
225 break;
226
227 case 2:
228 w0[0] = w0[0] | 0x800000;
229 break;
230
231 case 3:
232 w0[0] = w0[0] | 0x80000000;
233 break;
234
235 case 4:
236 w0[1] = 0x80;
237 break;
238
239 case 5:
240 w0[1] = w0[1] | 0x8000;
241 break;
242
243 case 6:
244 w0[1] = w0[1] | 0x800000;
245 break;
246
247 case 7:
248 w0[1] = w0[1] | 0x80000000;
249 break;
250
251 case 8:
252 w0[2] = 0x80;
253 break;
254
255 case 9:
256 w0[2] = w0[2] | 0x8000;
257 break;
258
259 case 10:
260 w0[2] = w0[2] | 0x800000;
261 break;
262
263 case 11:
264 w0[2] = w0[2] | 0x80000000;
265 break;
266
267 case 12:
268 w0[3] = 0x80;
269 break;
270
271 case 13:
272 w0[3] = w0[3] | 0x8000;
273 break;
274
275 case 14:
276 w0[3] = w0[3] | 0x800000;
277 break;
278
279 case 15:
280 w0[3] = w0[3] | 0x80000000;
281 break;
282
283 case 16:
284 w1[0] = 0x80;
285 break;
286
287 case 17:
288 w1[0] = w1[0] | 0x8000;
289 break;
290
291 case 18:
292 w1[0] = w1[0] | 0x800000;
293 break;
294
295 case 19:
296 w1[0] = w1[0] | 0x80000000;
297 break;
298
299 case 20:
300 w1[1] = 0x80;
301 break;
302
303 case 21:
304 w1[1] = w1[1] | 0x8000;
305 break;
306
307 case 22:
308 w1[1] = w1[1] | 0x800000;
309 break;
310
311 case 23:
312 w1[1] = w1[1] | 0x80000000;
313 break;
314
315 case 24:
316 w1[2] = 0x80;
317 break;
318
319 case 25:
320 w1[2] = w1[2] | 0x8000;
321 break;
322
323 case 26:
324 w1[2] = w1[2] | 0x800000;
325 break;
326
327 case 27:
328 w1[2] = w1[2] | 0x80000000;
329 break;
330
331 case 28:
332 w1[3] = 0x80;
333 break;
334
335 case 29:
336 w1[3] = w1[3] | 0x8000;
337 break;
338
339 case 30:
340 w1[3] = w1[3] | 0x800000;
341 break;
342
343 case 31:
344 w1[3] = w1[3] | 0x80000000;
345 break;
346 }
347 }
348
349 void append_0x80_2x4_VV (u32x w0[4], u32x w1[4], const u32x offset)
350 {
351 append_0x80_2x4_S (w0, w1, offset);
352 }
353
354
355 // HMAC MD5 ///////////////////////////////////////////////////////
356
357 void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4])
358 {
359 w0[0] = w0[0] ^ 0x36363636;
360 w0[1] = w0[1] ^ 0x36363636;
361 w0[2] = w0[2] ^ 0x36363636;
362 w0[3] = w0[3] ^ 0x36363636;
363 w1[0] = w1[0] ^ 0x36363636;
364 w1[1] = w1[1] ^ 0x36363636;
365 w1[2] = w1[2] ^ 0x36363636;
366 w1[3] = w1[3] ^ 0x36363636;
367 w2[0] = w2[0] ^ 0x36363636;
368 w2[1] = w2[1] ^ 0x36363636;
369 w2[2] = w2[2] ^ 0x36363636;
370 w2[3] = w2[3] ^ 0x36363636;
371 w3[0] = w3[0] ^ 0x36363636;
372 w3[1] = w3[1] ^ 0x36363636;
373 w3[2] = w3[2] ^ 0x36363636;
374 w3[3] = w3[3] ^ 0x36363636;
375
376 ipad[0] = MD5M_A;
377 ipad[1] = MD5M_B;
378 ipad[2] = MD5M_C;
379 ipad[3] = MD5M_D;
380
381 md5_transform (w0, w1, w2, w3, ipad);
382
383 w0[0] = w0[0] ^ 0x6a6a6a6a;
384 w0[1] = w0[1] ^ 0x6a6a6a6a;
385 w0[2] = w0[2] ^ 0x6a6a6a6a;
386 w0[3] = w0[3] ^ 0x6a6a6a6a;
387 w1[0] = w1[0] ^ 0x6a6a6a6a;
388 w1[1] = w1[1] ^ 0x6a6a6a6a;
389 w1[2] = w1[2] ^ 0x6a6a6a6a;
390 w1[3] = w1[3] ^ 0x6a6a6a6a;
391 w2[0] = w2[0] ^ 0x6a6a6a6a;
392 w2[1] = w2[1] ^ 0x6a6a6a6a;
393 w2[2] = w2[2] ^ 0x6a6a6a6a;
394 w2[3] = w2[3] ^ 0x6a6a6a6a;
395 w3[0] = w3[0] ^ 0x6a6a6a6a;
396 w3[1] = w3[1] ^ 0x6a6a6a6a;
397 w3[2] = w3[2] ^ 0x6a6a6a6a;
398 w3[3] = w3[3] ^ 0x6a6a6a6a;
399
400 opad[0] = MD5M_A;
401 opad[1] = MD5M_B;
402 opad[2] = MD5M_C;
403 opad[3] = MD5M_D;
404
405 md5_transform (w0, w1, w2, w3, opad);
406 }
407
408 void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4])
409 {
410 digest[0] = ipad[0];
411 digest[1] = ipad[1];
412 digest[2] = ipad[2];
413 digest[3] = ipad[3];
414
415 md5_transform (w0, w1, w2, w3, digest);
416
417 w0[0] = digest[0];
418 w0[1] = digest[1];
419 w0[2] = digest[2];
420 w0[3] = digest[3];
421 w1[0] = 0x80;
422 w1[1] = 0;
423 w1[2] = 0;
424 w1[3] = 0;
425 w2[0] = 0;
426 w2[1] = 0;
427 w2[2] = 0;
428 w2[3] = 0;
429 w3[0] = 0;
430 w3[1] = 0;
431 w3[2] = (64 + 16) * 8;
432 w3[3] = 0;
433
434 digest[0] = opad[0];
435 digest[1] = opad[1];
436 digest[2] = opad[2];
437 digest[3] = opad[3];
438
439 md5_transform (w0, w1, w2, w3, digest);
440 }
441
442 void md5hmac_cl(u8 * inKey, u32 key_len, u8 * inData, u32 pw_len, u8 outDigest[DIGEST_SIZE])
443 {
444 u32 pos;
445
446 /**
447 * data
448 */
449
450 u32 data_buf[16];
451
452 for (pos = 0; pos < pw_len; pos++) {
453 ((u8 *)data_buf)[pos] = inData[pos];
454 }
455 for (pos = pw_len; pos < 64; pos++) {
456 ((u8 *)data_buf)[pos] = 0;
457 }
458
459 /**
460 * key
461 */
462
463 u32 key_buf[16];
464
465 for (pos = 0; pos < key_len; pos++) {
466 ((u8 *)key_buf)[pos] = inKey[pos];
467 }
468 for (pos = key_len; pos < 64; pos++) {
469 ((u8 *)key_buf)[pos] = 0;
470 }
471
472 /**
473 * pads
474 */
475
476 u32x ipad[4];
477 u32x opad[4];
478
479 hmac_md5_pad (key_buf, key_buf + 4, key_buf + 8, key_buf + 12, ipad, opad);
480
481 /**
482 * loop
483 */
484
485 append_0x80_2x4_VV (data_buf, data_buf + 4, pw_len);
486
487 data_buf[14] = (64 + pw_len) * 8;
488
489 hmac_md5_run (data_buf, data_buf + 4, data_buf + 8, data_buf + 12, ipad, opad, (u32x *)outDigest);
490 }
491
492
493
494