1 #define MAGIC_A 0x67452301
2 #define MAGIC_B 0xefcdab89
3 #define MAGIC_C 0x98badcfe
4 #define MAGIC_D 0x10325476
6 #define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
7 #define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
8 #define H(x, y, z) ((x) ^ (y) ^ (z))
9 #define I(x, y, z) ((y) ^ ((x) | (~z)))
11 #define FF(a, b, c, d, x, s, ac) \
12 {(a) += F ((b), (c), (d)) + (x) + (ac); \
13 (a) = rotl32 ((a), (s)); \
16 #define GG(a, b, c, d, x, s, ac) \
17 {(a) += G ((b), (c), (d)) + (x) + (ac); \
18 (a) = rotl32 ((a), (s)); \
21 #define HH(a, b, c, d, x, s, ac) \
22 {(a) += H ((b), (c), (d)) + (x) + (ac); \
23 (a) = rotl32 ((a), (s)); \
26 #define II(a, b, c, d, x, s, ac) \
27 {(a) += I ((b), (c), (d)) + (x) + (ac); \
28 (a) = rotl32 ((a), (s)); \
32 void md5_64 (uint block
[16], uint digest
[4])
44 FF ( a
, b
, c
, d
, block
[ 0], S11
, 0xd76aa478);
45 FF ( d
, a
, b
, c
, block
[ 1], S12
, 0xe8c7b756);
46 FF ( c
, d
, a
, b
, block
[ 2], S13
, 0x242070db);
47 FF ( b
, c
, d
, a
, block
[ 3], S14
, 0xc1bdceee);
48 FF ( a
, b
, c
, d
, block
[ 4], S11
, 0xf57c0faf);
49 FF ( d
, a
, b
, c
, block
[ 5], S12
, 0x4787c62a);
50 FF ( c
, d
, a
, b
, block
[ 6], S13
, 0xa8304613);
51 FF ( b
, c
, d
, a
, block
[ 7], S14
, 0xfd469501);
52 FF ( a
, b
, c
, d
, block
[ 8], S11
, 0x698098d8);
53 FF ( d
, a
, b
, c
, block
[ 9], S12
, 0x8b44f7af);
54 FF ( c
, d
, a
, b
, block
[10], S13
, 0xffff5bb1);
55 FF ( b
, c
, d
, a
, block
[11], S14
, 0x895cd7be);
56 FF ( a
, b
, c
, d
, block
[12], S11
, 0x6b901122);
57 FF ( d
, a
, b
, c
, block
[13], S12
, 0xfd987193);
58 FF ( c
, d
, a
, b
, block
[14], S13
, 0xa679438e);
59 FF ( b
, c
, d
, a
, block
[15], S14
, 0x49b40821);
66 GG ( a
, b
, c
, d
, block
[ 1], S21
, 0xf61e2562);
67 GG ( d
, a
, b
, c
, block
[ 6], S22
, 0xc040b340);
68 GG ( c
, d
, a
, b
, block
[11], S23
, 0x265e5a51);
69 GG ( b
, c
, d
, a
, block
[ 0], S24
, 0xe9b6c7aa);
70 GG ( a
, b
, c
, d
, block
[ 5], S21
, 0xd62f105d);
71 GG ( d
, a
, b
, c
, block
[10], S22
, 0x02441453);
72 GG ( c
, d
, a
, b
, block
[15], S23
, 0xd8a1e681);
73 GG ( b
, c
, d
, a
, block
[ 4], S24
, 0xe7d3fbc8);
74 GG ( a
, b
, c
, d
, block
[ 9], S21
, 0x21e1cde6);
75 GG ( d
, a
, b
, c
, block
[14], S22
, 0xc33707d6);
76 GG ( c
, d
, a
, b
, block
[ 3], S23
, 0xf4d50d87);
77 GG ( b
, c
, d
, a
, block
[ 8], S24
, 0x455a14ed);
78 GG ( a
, b
, c
, d
, block
[13], S21
, 0xa9e3e905);
79 GG ( d
, a
, b
, c
, block
[ 2], S22
, 0xfcefa3f8);
80 GG ( c
, d
, a
, b
, block
[ 7], S23
, 0x676f02d9);
81 GG ( b
, c
, d
, a
, block
[12], S24
, 0x8d2a4c8a);
88 HH ( a
, b
, c
, d
, block
[ 5], S31
, 0xfffa3942);
89 HH ( d
, a
, b
, c
, block
[ 8], S32
, 0x8771f681);
90 HH ( c
, d
, a
, b
, block
[11], S33
, 0x6d9d6122);
91 HH ( b
, c
, d
, a
, block
[14], S34
, 0xfde5380c);
92 HH ( a
, b
, c
, d
, block
[ 1], S31
, 0xa4beea44);
93 HH ( d
, a
, b
, c
, block
[ 4], S32
, 0x4bdecfa9);
94 HH ( c
, d
, a
, b
, block
[ 7], S33
, 0xf6bb4b60);
95 HH ( b
, c
, d
, a
, block
[10], S34
, 0xbebfbc70);
96 HH ( a
, b
, c
, d
, block
[13], S31
, 0x289b7ec6);
97 HH ( d
, a
, b
, c
, block
[ 0], S32
, 0xeaa127fa);
98 HH ( c
, d
, a
, b
, block
[ 3], S33
, 0xd4ef3085);
99 HH ( b
, c
, d
, a
, block
[ 6], S34
, 0x04881d05);
100 HH ( a
, b
, c
, d
, block
[ 9], S31
, 0xd9d4d039);
101 HH ( d
, a
, b
, c
, block
[12], S32
, 0xe6db99e5);
102 HH ( c
, d
, a
, b
, block
[15], S33
, 0x1fa27cf8);
103 HH ( b
, c
, d
, a
, block
[ 2], S34
, 0xc4ac5665);
110 II ( a
, b
, c
, d
, block
[ 0], S41
, 0xf4292244);
111 II ( d
, a
, b
, c
, block
[ 7], S42
, 0x432aff97);
112 II ( c
, d
, a
, b
, block
[14], S43
, 0xab9423a7);
113 II ( b
, c
, d
, a
, block
[ 5], S44
, 0xfc93a039);
114 II ( a
, b
, c
, d
, block
[12], S41
, 0x655b59c3);
115 II ( d
, a
, b
, c
, block
[ 3], S42
, 0x8f0ccc92);
116 II ( c
, d
, a
, b
, block
[10], S43
, 0xffeff47d);
117 II ( b
, c
, d
, a
, block
[ 1], S44
, 0x85845dd1);
118 II ( a
, b
, c
, d
, block
[ 8], S41
, 0x6fa87e4f);
119 II ( d
, a
, b
, c
, block
[15], S42
, 0xfe2ce6e0);
120 II ( c
, d
, a
, b
, block
[ 6], S43
, 0xa3014314);
121 II ( b
, c
, d
, a
, block
[13], S44
, 0x4e0811a1);
122 II ( a
, b
, c
, d
, block
[ 4], S41
, 0xf7537e82);
123 II ( d
, a
, b
, c
, block
[11], S42
, 0xbd3af235);
124 II ( c
, d
, a
, b
, block
[ 2], S43
, 0x2ad7d2bb);
125 II ( b
, c
, d
, a
, block
[ 9], S44
, 0xeb86d391);
133 // only use this when really, really needed, SLOW
135 void md5_complete_no_limit (uint digest
[4], uint
*plain
, uint plain_len
)
147 uint r_a
= digest
[0];
148 uint r_b
= digest
[1];
149 uint r_c
= digest
[2];
150 uint r_d
= digest
[3];
153 int block_total_len
= 16 * 4; // sizeof (block)
155 char *block_ptr
= (char *) block
;
156 char *plain_ptr
= (char *) plain
;
160 int remaining_len
= plain_len
;
168 loop
= (remaining_len
> 55);
170 int cur_len
= MIN (block_total_len
, remaining_len
);
171 int copy_len
= MAX (cur_len
, 0); // should never be negative of course
173 memcpy (block_ptr
, plain_ptr
, copy_len
);
175 // clear the remaining bytes of the block
177 memset (block_ptr
+ copy_len
, 0, block_total_len
- copy_len
);
183 // set 0x80 if neeeded
187 if (cur_len
!= block_total_len
)
189 block_ptr
[copy_len
] = 0x80;
193 // set block[14] set to total_len
195 if (! loop
) block
[14] = plain_len
* 8;
206 FF ( a
, b
, c
, d
, block
[ 0], S11
, 0xd76aa478);
207 FF ( d
, a
, b
, c
, block
[ 1], S12
, 0xe8c7b756);
208 FF ( c
, d
, a
, b
, block
[ 2], S13
, 0x242070db);
209 FF ( b
, c
, d
, a
, block
[ 3], S14
, 0xc1bdceee);
210 FF ( a
, b
, c
, d
, block
[ 4], S11
, 0xf57c0faf);
211 FF ( d
, a
, b
, c
, block
[ 5], S12
, 0x4787c62a);
212 FF ( c
, d
, a
, b
, block
[ 6], S13
, 0xa8304613);
213 FF ( b
, c
, d
, a
, block
[ 7], S14
, 0xfd469501);
214 FF ( a
, b
, c
, d
, block
[ 8], S11
, 0x698098d8);
215 FF ( d
, a
, b
, c
, block
[ 9], S12
, 0x8b44f7af);
216 FF ( c
, d
, a
, b
, block
[10], S13
, 0xffff5bb1);
217 FF ( b
, c
, d
, a
, block
[11], S14
, 0x895cd7be);
218 FF ( a
, b
, c
, d
, block
[12], S11
, 0x6b901122);
219 FF ( d
, a
, b
, c
, block
[13], S12
, 0xfd987193);
220 FF ( c
, d
, a
, b
, block
[14], S13
, 0xa679438e);
221 FF ( b
, c
, d
, a
, block
[15], S14
, 0x49b40821);
228 GG ( a
, b
, c
, d
, block
[ 1], S21
, 0xf61e2562);
229 GG ( d
, a
, b
, c
, block
[ 6], S22
, 0xc040b340);
230 GG ( c
, d
, a
, b
, block
[11], S23
, 0x265e5a51);
231 GG ( b
, c
, d
, a
, block
[ 0], S24
, 0xe9b6c7aa);
232 GG ( a
, b
, c
, d
, block
[ 5], S21
, 0xd62f105d);
233 GG ( d
, a
, b
, c
, block
[10], S22
, 0x02441453);
234 GG ( c
, d
, a
, b
, block
[15], S23
, 0xd8a1e681);
235 GG ( b
, c
, d
, a
, block
[ 4], S24
, 0xe7d3fbc8);
236 GG ( a
, b
, c
, d
, block
[ 9], S21
, 0x21e1cde6);
237 GG ( d
, a
, b
, c
, block
[14], S22
, 0xc33707d6);
238 GG ( c
, d
, a
, b
, block
[ 3], S23
, 0xf4d50d87);
239 GG ( b
, c
, d
, a
, block
[ 8], S24
, 0x455a14ed);
240 GG ( a
, b
, c
, d
, block
[13], S21
, 0xa9e3e905);
241 GG ( d
, a
, b
, c
, block
[ 2], S22
, 0xfcefa3f8);
242 GG ( c
, d
, a
, b
, block
[ 7], S23
, 0x676f02d9);
243 GG ( b
, c
, d
, a
, block
[12], S24
, 0x8d2a4c8a);
250 HH ( a
, b
, c
, d
, block
[ 5], S31
, 0xfffa3942);
251 HH ( d
, a
, b
, c
, block
[ 8], S32
, 0x8771f681);
252 HH ( c
, d
, a
, b
, block
[11], S33
, 0x6d9d6122);
253 HH ( b
, c
, d
, a
, block
[14], S34
, 0xfde5380c);
254 HH ( a
, b
, c
, d
, block
[ 1], S31
, 0xa4beea44);
255 HH ( d
, a
, b
, c
, block
[ 4], S32
, 0x4bdecfa9);
256 HH ( c
, d
, a
, b
, block
[ 7], S33
, 0xf6bb4b60);
257 HH ( b
, c
, d
, a
, block
[10], S34
, 0xbebfbc70);
258 HH ( a
, b
, c
, d
, block
[13], S31
, 0x289b7ec6);
259 HH ( d
, a
, b
, c
, block
[ 0], S32
, 0xeaa127fa);
260 HH ( c
, d
, a
, b
, block
[ 3], S33
, 0xd4ef3085);
261 HH ( b
, c
, d
, a
, block
[ 6], S34
, 0x04881d05);
262 HH ( a
, b
, c
, d
, block
[ 9], S31
, 0xd9d4d039);
263 HH ( d
, a
, b
, c
, block
[12], S32
, 0xe6db99e5);
264 HH ( c
, d
, a
, b
, block
[15], S33
, 0x1fa27cf8);
265 HH ( b
, c
, d
, a
, block
[ 2], S34
, 0xc4ac5665);
272 II ( a
, b
, c
, d
, block
[ 0], S41
, 0xf4292244);
273 II ( d
, a
, b
, c
, block
[ 7], S42
, 0x432aff97);
274 II ( c
, d
, a
, b
, block
[14], S43
, 0xab9423a7);
275 II ( b
, c
, d
, a
, block
[ 5], S44
, 0xfc93a039);
276 II ( a
, b
, c
, d
, block
[12], S41
, 0x655b59c3);
277 II ( d
, a
, b
, c
, block
[ 3], S42
, 0x8f0ccc92);
278 II ( c
, d
, a
, b
, block
[10], S43
, 0xffeff47d);
279 II ( b
, c
, d
, a
, block
[ 1], S44
, 0x85845dd1);
280 II ( a
, b
, c
, d
, block
[ 8], S41
, 0x6fa87e4f);
281 II ( d
, a
, b
, c
, block
[15], S42
, 0xfe2ce6e0);
282 II ( c
, d
, a
, b
, block
[ 6], S43
, 0xa3014314);
283 II ( b
, c
, d
, a
, block
[13], S44
, 0x4e0811a1);
284 II ( a
, b
, c
, d
, block
[ 4], S41
, 0xf7537e82);
285 II ( d
, a
, b
, c
, block
[11], S42
, 0xbd3af235);
286 II ( c
, d
, a
, b
, block
[ 2], S43
, 0x2ad7d2bb);
287 II ( b
, c
, d
, a
, block
[ 9], S44
, 0xeb86d391);
289 remaining_len
-= block_total_len
;