4 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the project nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 #include <sys/param.h>
41 #define SHIFT(X, s) (((X) << (s)) | ((X) >> (32 - (s))))
43 #define F(X, Y, Z) (((X) & (Y)) | ((~X) & (Z)))
44 #define G(X, Y, Z) (((X) & (Z)) | ((Y) & (~Z)))
45 #define H(X, Y, Z) ((X) ^ (Y) ^ (Z))
46 #define I(X, Y, Z) ((Y) ^ ((X) | (~Z)))
48 #define ROUND1(a, b, c, d, k, s, i) \
50 (a) = (a) + F((b), (c), (d)) + X[(k)] + T[(i)]; \
51 (a) = SHIFT((a), (s)); \
55 #define ROUND2(a, b, c, d, k, s, i) \
57 (a) = (a) + G((b), (c), (d)) + X[(k)] + T[(i)]; \
58 (a) = SHIFT((a), (s)); \
62 #define ROUND3(a, b, c, d, k, s, i) \
64 (a) = (a) + H((b), (c), (d)) + X[(k)] + T[(i)]; \
65 (a) = SHIFT((a), (s)); \
69 #define ROUND4(a, b, c, d, k, s, i) \
71 (a) = (a) + I((b), (c), (d)) + X[(k)] + T[(i)]; \
72 (a) = SHIFT((a), (s)); \
96 #define MD5_A0 0x67452301
97 #define MD5_B0 0xefcdab89
98 #define MD5_C0 0x98badcfe
99 #define MD5_D0 0x10325476
101 /* Integer part of 4294967296 times abs(sin(i)), where i is in radians. */
102 static const uint32 T
[65] = {
104 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,
105 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
106 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
107 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
109 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,
110 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8,
111 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,
112 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,
114 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,
115 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
116 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05,
117 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
119 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,
120 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
121 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
122 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391,
125 static const uint8 md5_paddat
[MD5_BUFLEN
] = {
126 0x80, 0, 0, 0, 0, 0, 0, 0,
127 0, 0, 0, 0, 0, 0, 0, 0,
128 0, 0, 0, 0, 0, 0, 0, 0,
129 0, 0, 0, 0, 0, 0, 0, 0,
130 0, 0, 0, 0, 0, 0, 0, 0,
131 0, 0, 0, 0, 0, 0, 0, 0,
132 0, 0, 0, 0, 0, 0, 0, 0,
133 0, 0, 0, 0, 0, 0, 0, 0,
136 static void md5_calc(uint8
*, md5_ctxt
*);
139 md5_init(md5_ctxt
* ctxt
)
143 ctxt
->md5_sta
= MD5_A0
;
144 ctxt
->md5_stb
= MD5_B0
;
145 ctxt
->md5_stc
= MD5_C0
;
146 ctxt
->md5_std
= MD5_D0
;
147 memset(ctxt
->md5_buf
, 0, sizeof(ctxt
->md5_buf
));
151 md5_loop(md5_ctxt
* ctxt
, const uint8
*input
, unsigned len
)
156 ctxt
->md5_n
+= len
* 8; /* byte to bit */
157 gap
= MD5_BUFLEN
- ctxt
->md5_i
;
161 memmove(ctxt
->md5_buf
+ ctxt
->md5_i
, input
, gap
);
162 md5_calc(ctxt
->md5_buf
, ctxt
);
164 for (i
= gap
; i
+ MD5_BUFLEN
<= len
; i
+= MD5_BUFLEN
)
165 md5_calc((uint8
*) (input
+ i
), ctxt
);
167 ctxt
->md5_i
= len
- i
;
168 memmove(ctxt
->md5_buf
, input
+ i
, ctxt
->md5_i
);
172 memmove(ctxt
->md5_buf
+ ctxt
->md5_i
, input
, len
);
178 md5_pad(md5_ctxt
* ctxt
)
182 /* Don't count up padding. Keep md5_n. */
183 gap
= MD5_BUFLEN
- ctxt
->md5_i
;
186 memmove(ctxt
->md5_buf
+ ctxt
->md5_i
, md5_paddat
,
187 gap
- sizeof(ctxt
->md5_n
));
191 /* including gap == 8 */
192 memmove(ctxt
->md5_buf
+ ctxt
->md5_i
, md5_paddat
, gap
);
193 md5_calc(ctxt
->md5_buf
, ctxt
);
194 memmove(ctxt
->md5_buf
, md5_paddat
+ gap
,
195 MD5_BUFLEN
- sizeof(ctxt
->md5_n
));
199 #ifndef WORDS_BIGENDIAN
200 memmove(&ctxt
->md5_buf
[56], &ctxt
->md5_n8
[0], 8);
202 ctxt
->md5_buf
[56] = ctxt
->md5_n8
[7];
203 ctxt
->md5_buf
[57] = ctxt
->md5_n8
[6];
204 ctxt
->md5_buf
[58] = ctxt
->md5_n8
[5];
205 ctxt
->md5_buf
[59] = ctxt
->md5_n8
[4];
206 ctxt
->md5_buf
[60] = ctxt
->md5_n8
[3];
207 ctxt
->md5_buf
[61] = ctxt
->md5_n8
[2];
208 ctxt
->md5_buf
[62] = ctxt
->md5_n8
[1];
209 ctxt
->md5_buf
[63] = ctxt
->md5_n8
[0];
212 md5_calc(ctxt
->md5_buf
, ctxt
);
216 md5_result(uint8
*digest
, md5_ctxt
* ctxt
)
219 #ifndef WORDS_BIGENDIAN
220 memmove(digest
, &ctxt
->md5_st8
[0], 16);
222 digest
[0] = ctxt
->md5_st8
[3];
223 digest
[1] = ctxt
->md5_st8
[2];
224 digest
[2] = ctxt
->md5_st8
[1];
225 digest
[3] = ctxt
->md5_st8
[0];
226 digest
[4] = ctxt
->md5_st8
[7];
227 digest
[5] = ctxt
->md5_st8
[6];
228 digest
[6] = ctxt
->md5_st8
[5];
229 digest
[7] = ctxt
->md5_st8
[4];
230 digest
[8] = ctxt
->md5_st8
[11];
231 digest
[9] = ctxt
->md5_st8
[10];
232 digest
[10] = ctxt
->md5_st8
[9];
233 digest
[11] = ctxt
->md5_st8
[8];
234 digest
[12] = ctxt
->md5_st8
[15];
235 digest
[13] = ctxt
->md5_st8
[14];
236 digest
[14] = ctxt
->md5_st8
[13];
237 digest
[15] = ctxt
->md5_st8
[12];
241 #ifdef WORDS_BIGENDIAN
246 md5_calc(uint8
*b64
, md5_ctxt
* ctxt
)
248 uint32 A
= ctxt
->md5_sta
;
249 uint32 B
= ctxt
->md5_stb
;
250 uint32 C
= ctxt
->md5_stc
;
251 uint32 D
= ctxt
->md5_std
;
253 #ifndef WORDS_BIGENDIAN
254 uint32
*X
= (uint32
*) b64
;
257 /* what a brute force but fast! */
258 uint8
*y
= (uint8
*) X
;
326 ROUND1(A
, B
, C
, D
, 0, Sa
, 1);
327 ROUND1(D
, A
, B
, C
, 1, Sb
, 2);
328 ROUND1(C
, D
, A
, B
, 2, Sc
, 3);
329 ROUND1(B
, C
, D
, A
, 3, Sd
, 4);
330 ROUND1(A
, B
, C
, D
, 4, Sa
, 5);
331 ROUND1(D
, A
, B
, C
, 5, Sb
, 6);
332 ROUND1(C
, D
, A
, B
, 6, Sc
, 7);
333 ROUND1(B
, C
, D
, A
, 7, Sd
, 8);
334 ROUND1(A
, B
, C
, D
, 8, Sa
, 9);
335 ROUND1(D
, A
, B
, C
, 9, Sb
, 10);
336 ROUND1(C
, D
, A
, B
, 10, Sc
, 11);
337 ROUND1(B
, C
, D
, A
, 11, Sd
, 12);
338 ROUND1(A
, B
, C
, D
, 12, Sa
, 13);
339 ROUND1(D
, A
, B
, C
, 13, Sb
, 14);
340 ROUND1(C
, D
, A
, B
, 14, Sc
, 15);
341 ROUND1(B
, C
, D
, A
, 15, Sd
, 16);
343 ROUND2(A
, B
, C
, D
, 1, Se
, 17);
344 ROUND2(D
, A
, B
, C
, 6, Sf
, 18);
345 ROUND2(C
, D
, A
, B
, 11, Sg
, 19);
346 ROUND2(B
, C
, D
, A
, 0, Sh
, 20);
347 ROUND2(A
, B
, C
, D
, 5, Se
, 21);
348 ROUND2(D
, A
, B
, C
, 10, Sf
, 22);
349 ROUND2(C
, D
, A
, B
, 15, Sg
, 23);
350 ROUND2(B
, C
, D
, A
, 4, Sh
, 24);
351 ROUND2(A
, B
, C
, D
, 9, Se
, 25);
352 ROUND2(D
, A
, B
, C
, 14, Sf
, 26);
353 ROUND2(C
, D
, A
, B
, 3, Sg
, 27);
354 ROUND2(B
, C
, D
, A
, 8, Sh
, 28);
355 ROUND2(A
, B
, C
, D
, 13, Se
, 29);
356 ROUND2(D
, A
, B
, C
, 2, Sf
, 30);
357 ROUND2(C
, D
, A
, B
, 7, Sg
, 31);
358 ROUND2(B
, C
, D
, A
, 12, Sh
, 32);
360 ROUND3(A
, B
, C
, D
, 5, Si
, 33);
361 ROUND3(D
, A
, B
, C
, 8, Sj
, 34);
362 ROUND3(C
, D
, A
, B
, 11, Sk
, 35);
363 ROUND3(B
, C
, D
, A
, 14, Sl
, 36);
364 ROUND3(A
, B
, C
, D
, 1, Si
, 37);
365 ROUND3(D
, A
, B
, C
, 4, Sj
, 38);
366 ROUND3(C
, D
, A
, B
, 7, Sk
, 39);
367 ROUND3(B
, C
, D
, A
, 10, Sl
, 40);
368 ROUND3(A
, B
, C
, D
, 13, Si
, 41);
369 ROUND3(D
, A
, B
, C
, 0, Sj
, 42);
370 ROUND3(C
, D
, A
, B
, 3, Sk
, 43);
371 ROUND3(B
, C
, D
, A
, 6, Sl
, 44);
372 ROUND3(A
, B
, C
, D
, 9, Si
, 45);
373 ROUND3(D
, A
, B
, C
, 12, Sj
, 46);
374 ROUND3(C
, D
, A
, B
, 15, Sk
, 47);
375 ROUND3(B
, C
, D
, A
, 2, Sl
, 48);
377 ROUND4(A
, B
, C
, D
, 0, Sm
, 49);
378 ROUND4(D
, A
, B
, C
, 7, Sn
, 50);
379 ROUND4(C
, D
, A
, B
, 14, So
, 51);
380 ROUND4(B
, C
, D
, A
, 5, Sp
, 52);
381 ROUND4(A
, B
, C
, D
, 12, Sm
, 53);
382 ROUND4(D
, A
, B
, C
, 3, Sn
, 54);
383 ROUND4(C
, D
, A
, B
, 10, So
, 55);
384 ROUND4(B
, C
, D
, A
, 1, Sp
, 56);
385 ROUND4(A
, B
, C
, D
, 8, Sm
, 57);
386 ROUND4(D
, A
, B
, C
, 15, Sn
, 58);
387 ROUND4(C
, D
, A
, B
, 6, So
, 59);
388 ROUND4(B
, C
, D
, A
, 13, Sp
, 60);
389 ROUND4(A
, B
, C
, D
, 4, Sm
, 61);
390 ROUND4(D
, A
, B
, C
, 11, Sn
, 62);
391 ROUND4(C
, D
, A
, B
, 2, So
, 63);
392 ROUND4(B
, C
, D
, A
, 9, Sp
, 64);