8 #define MD5_STEP(f,a,b,c,d,x,K,s) \
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)))
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
106 u32x
rotl32 (const u32x a
, const u32 n
)
111 result
|= a
>> (32 - n
);
114 // return rotate (a, n);
117 void md5_transform (const u32x w0
[4], const u32x w1
[4], const u32x w2
[4], const u32x w3
[4], u32x digest
[4])
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
);
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
);
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
);
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
);
215 void append_0x80_2x4_S (u32 w0
[4], u32 w1
[4], const u32 offset
)
224 w0
[0] = w0
[0] | 0x8000;
228 w0
[0] = w0
[0] | 0x800000;
232 w0
[0] = w0
[0] | 0x80000000;
240 w0
[1] = w0
[1] | 0x8000;
244 w0
[1] = w0
[1] | 0x800000;
248 w0
[1] = w0
[1] | 0x80000000;
256 w0
[2] = w0
[2] | 0x8000;
260 w0
[2] = w0
[2] | 0x800000;
264 w0
[2] = w0
[2] | 0x80000000;
272 w0
[3] = w0
[3] | 0x8000;
276 w0
[3] = w0
[3] | 0x800000;
280 w0
[3] = w0
[3] | 0x80000000;
288 w1
[0] = w1
[0] | 0x8000;
292 w1
[0] = w1
[0] | 0x800000;
296 w1
[0] = w1
[0] | 0x80000000;
304 w1
[1] = w1
[1] | 0x8000;
308 w1
[1] = w1
[1] | 0x800000;
312 w1
[1] = w1
[1] | 0x80000000;
320 w1
[2] = w1
[2] | 0x8000;
324 w1
[2] = w1
[2] | 0x800000;
328 w1
[2] = w1
[2] | 0x80000000;
336 w1
[3] = w1
[3] | 0x8000;
340 w1
[3] = w1
[3] | 0x800000;
344 w1
[3] = w1
[3] | 0x80000000;
349 void append_0x80_2x4_VV (u32x w0
[4], u32x w1
[4], const u32x offset
)
351 append_0x80_2x4_S (w0
, w1
, offset
);
355 // HMAC MD5 ///////////////////////////////////////////////////////
357 void hmac_md5_pad (u32x w0
[4], u32x w1
[4], u32x w2
[4], u32x w3
[4], u32x ipad
[4], u32x opad
[4])
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;
381 md5_transform (w0
, w1
, w2
, w3
, ipad
);
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;
405 md5_transform (w0
, w1
, w2
, w3
, opad
);
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])
415 md5_transform (w0
, w1
, w2
, w3
, digest
);
431 w3
[2] = (64 + 16) * 8;
439 md5_transform (w0
, w1
, w2
, w3
, digest
);
442 void md5hmac_cl(u8
* inKey
, u32 key_len
, u8
* inData
, u32 pw_len
, u8 outDigest
[DIGEST_SIZE
])
452 for (pos
= 0; pos
< pw_len
; pos
++) {
453 ((u8
*)data_buf
)[pos
] = inData
[pos
];
455 for (pos
= pw_len
; pos
< 64; pos
++) {
456 ((u8
*)data_buf
)[pos
] = 0;
465 for (pos
= 0; pos
< key_len
; pos
++) {
466 ((u8
*)key_buf
)[pos
] = inKey
[pos
];
468 for (pos
= key_len
; pos
< 64; pos
++) {
469 ((u8
*)key_buf
)[pos
] = 0;
479 hmac_md5_pad (key_buf
, key_buf
+ 4, key_buf
+ 8, key_buf
+ 12, ipad
, opad
);
485 append_0x80_2x4_VV (data_buf
, data_buf
+ 4, pw_len
);
487 data_buf
[14] = (64 + pw_len
) * 8;
489 hmac_md5_run (data_buf
, data_buf
+ 4, data_buf
+ 8, data_buf
+ 12, ipad
, opad
, (u32x
*)outDigest
);