4 "/* --- The MD5 routines --- */\n\n/* MD5 routines, after Ron R"
5 "ivest */\n/* Written by David Madore <david.madore@ens.fr>, w"
6 "ith code taken in\n * part from Colin Plumb. */\n/* Public dom"
7 "ain (1999/11/24) */\n\n/* Note: these routines do not depend o"
8 "n endianness. */\n\n/* === The header === */\n\n/* Put this in m"
9 "d5.h if you don't like having everything in one big\n * file."
10 " */\n\n#ifndef _DMADORE_MD5_H\n#define _DMADORE_MD5_H\n\nstruct m"
11 "d5_ctx {\n /* The four chaining variables */\n unsigned long"
12 " buf[4];\n /* Count number of message bits */\n unsigned lon"
13 "g bits[2];\n /* Data being fed in */\n unsigned long in[16];"
14 "\n /* Our position within the 512 bits (always between 0 and"
15 " 63) */\n int b;\n};\n\nvoid MD5_transform (unsigned long buf[4"
16 "], const unsigned long in[16]);\nvoid MD5_start (struct md5_c"
17 "tx *context);\nvoid MD5_feed (struct md5_ctx *context, unsign"
18 "ed char inb);\nvoid MD5_stop (struct md5_ctx *context, unsign"
19 "ed char digest[16]);\n\n#endif /* not defined _DMADORE_MD5_H *"
20 "/\n\n/* === The implementation === */\n\n#define F1(x, y, z) (z "
21 "^ (x & (y ^ z)))\n#define F2(x, y, z) F1(z, x, y)\n#define F3("
22 "x, y, z) (x ^ y ^ z)\n#define F4(x, y, z) (y ^ (x | ~z))\n\n#de"
23 "fine MD5STEP(f, w, x, y, z, data, s) \\\n\t{ w += f (x, y, z) +"
24 " data; w = w<<s | (w&0xffffffffUL)>>(32-s); \\\n\t w += x; }\n"
25 "\nvoid\nMD5_transform (unsigned long buf[4], const unsigned lo"
26 "ng in[16])\n{\n register unsigned long a, b, c, d;\n\n a = buf"
27 "[0]; b = buf[1]; c = buf[2]; d = buf[3];\n MD5STEP(F1, a,"
28 " b, c, d, in[0] + 0xd76aa478UL, 7);\n MD5STEP(F1, d, a, b, c"
29 ", in[1] + 0xe8c7b756UL, 12);\n MD5STEP(F1, c, d, a, b, in[2]"
30 " + 0x242070dbUL, 17);\n MD5STEP(F1, b, c, d, a, in[3] + 0xc1"
31 "bdceeeUL, 22);\n MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0fafU"
32 "L, 7);\n MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62aUL, 12);\n"
33 " MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613UL, 17);\n MD5ST"
34 "EP(F1, b, c, d, a, in[7] + 0xfd469501UL, 22);\n MD5STEP(F1, "
35 "a, b, c, d, in[8] + 0x698098d8UL, 7);\n MD5STEP(F1, d, a, b,"
36 " c, in[9] + 0x8b44f7afUL, 12);\n MD5STEP(F1, c, d, a, b, in["
37 "10] + 0xffff5bb1UL, 17);\n MD5STEP(F1, b, c, d, a, in[11] + "
38 "0x895cd7beUL, 22);\n MD5STEP(F1, a, b, c, d, in[12] + 0x6b90"
39 "1122UL, 7);\n MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193UL,"
40 " 12);\n MD5STEP(F1, c, d, a, b, in[14] + 0xa679438eUL, 17);\n"
41 " MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821UL, 22);\n MD5S"
42 "TEP(F2, a, b, c, d, in[1] + 0xf61e2562UL, 5);\n MD5STEP(F2, "
43 "d, a, b, c, in[6] + 0xc040b340UL, 9);\n MD5STEP(F2, c, d, a,"
44 " b, in[11] + 0x265e5a51UL, 14);\n MD5STEP(F2, b, c, d, a, in"
45 "[0] + 0xe9b6c7aaUL, 20);\n MD5STEP(F2, a, b, c, d, in[5] + 0"
46 "xd62f105dUL, 5);\n MD5STEP(F2, d, a, b, c, in[10] + 0x024414"
47 "53UL, 9);\n MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681UL, 1"
48 "4);\n MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8UL, 20);\n M"
49 "D5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6UL, 5);\n MD5STEP(F"
50 "2, d, a, b, c, in[14] + 0xc33707d6UL, 9);\n MD5STEP(F2, c, d"
51 ", a, b, in[3] + 0xf4d50d87UL, 14);\n MD5STEP(F2, b, c, d, a,"
52 " in[8] + 0x455a14edUL, 20);\n MD5STEP(F2, a, b, c, d, in[13]"
53 " + 0xa9e3e905UL, 5);\n MD5STEP(F2, d, a, b, c, in[2] + 0xfce"
54 "fa3f8UL, 9);\n MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9UL,"
55 " 14);\n MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8aUL, 20);\n"
56 " MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942UL, 4);\n MD5STE"
57 "P(F3, d, a, b, c, in[8] + 0x8771f681UL, 11);\n MD5STEP(F3, c"
58 ", d, a, b, in[11] + 0x6d9d6122UL, 16);\n MD5STEP(F3, b, c, d"
59 ", a, in[14] + 0xfde5380cUL, 23);\n MD5STEP(F3, a, b, c, d, i"
60 "n[1] + 0xa4beea44UL, 4);\n MD5STEP(F3, d, a, b, c, in[4] + 0"
61 "x4bdecfa9UL, 11);\n MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b"
62 "60UL, 16);\n MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70UL, "
63 "23);\n MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6UL, 4);\n "
64 "MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127faUL, 11);\n MD5STEP"
65 "(F3, c, d, a, b, in[3] + 0xd4ef3085UL, 16);\n MD5STEP(F3, b,"
66 " c, d, a, in[6] + 0x04881d05UL, 23);\n MD5STEP(F3, a, b, c, "
67 "d, in[9] + 0xd9d4d039UL, 4);\n MD5STEP(F3, d, a, b, c, in[12"
68 "] + 0xe6db99e5UL, 11);\n MD5STEP(F3, c, d, a, b, in[15] + 0x"
69 "1fa27cf8UL, 16);\n MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac566"
70 "5UL, 23);\n MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244UL, 6)"
71 ";\n MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97UL, 10);\n MD5"
72 "STEP(F4, c, d, a, b, in[14] + 0xab9423a7UL, 15);\n MD5STEP(F"
73 "4, b, c, d, a, in[5] + 0xfc93a039UL, 21);\n MD5STEP(F4, a, b"
74 ", c, d, in[12] + 0x655b59c3UL, 6);\n MD5STEP(F4, d, a, b, c,"
75 " in[3] + 0x8f0ccc92UL, 10);\n MD5STEP(F4, c, d, a, b, in[10]"
76 " + 0xffeff47dUL, 15);\n MD5STEP(F4, b, c, d, a, in[1] + 0x85"
77 "845dd1UL, 21);\n MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4fU"
78 "L, 6);\n MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0UL, 10);"
79 "\n MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314UL, 15);\n MD5S"
80 "TEP(F4, b, c, d, a, in[13] + 0x4e0811a1UL, 21);\n MD5STEP(F4"
81 ", a, b, c, d, in[4] + 0xf7537e82UL, 6);\n MD5STEP(F4, d, a, "
82 "b, c, in[11] + 0xbd3af235UL, 10);\n MD5STEP(F4, c, d, a, b, "
83 "in[2] + 0x2ad7d2bbUL, 15);\n MD5STEP(F4, b, c, d, a, in[9] +"
84 " 0xeb86d391UL, 21);\n buf[0] += a; buf[1] += b; buf[2] += "
85 "c; buf[3] += d;\n}\n\n#undef F1\n#undef F2\n#undef F3\n#undef F4\n"
86 "#undef MD5STEP\n\nvoid\nMD5_start (struct md5_ctx *ctx)\n{\n int"
87 " i;\n\n ctx->buf[0] = 0x67452301UL;\n ctx->buf[1] = 0xefcdab8"
88 "9UL;\n ctx->buf[2] = 0x98badcfeUL;\n ctx->buf[3] = 0x1032547"
89 "6UL;\n ctx->bits[0] = 0;\n ctx->bits[1] = 0;\n for ( i=0 ; i"
90 "<16 ; i++ )\n ctx->in[i] = 0;\n ctx->b = 0;\n}\n\nvoid\nMD5_fe"
91 "ed (struct md5_ctx *ctx, unsigned char inb)\n{\n int i;\n uns"
92 "igned long temp;\n\n ctx->in[ctx->b/4] |= ((unsigned long)inb"
93 ") << ((ctx->b%4)*8);\n if ( ++ctx->b >= 64 )\n {\n MD5"
94 "_transform (ctx->buf, ctx->in);\n ctx->b = 0;\n for "
95 "( i=0 ; i<16 ; i++ )\n\tctx->in[i] = 0;\n }\n temp = ctx->bi"
96 "ts[0];\n ctx->bits[0] += 8;\n if ( (temp&0xffffffffUL) > (ct"
97 "x->bits[0]&0xffffffffUL) )\n ctx->bits[1]++;\n}\n\nvoid\nMD5_s"
98 "top (struct md5_ctx *ctx, unsigned char digest[16])\n{\n int "
99 "i;\n unsigned long bits[2];\n\n for ( i=0 ; i<2 ; i++ )\n b"
100 "its[i] = ctx->bits[i];\n MD5_feed (ctx, 0x80);\n for ( ; ctx"
101 "->b!=56 ; )\n MD5_feed (ctx, 0);\n for ( i=0 ; i<2 ; i++ )"
102 "\n {\n MD5_feed (ctx, bits[i]&0xff);\n MD5_feed (c"
103 "tx, (bits[i]>>8)&0xff);\n MD5_feed (ctx, (bits[i]>>16)&0"
104 "xff);\n MD5_feed (ctx, (bits[i]>>24)&0xff);\n }\n for "
105 "( i=0 ; i<4 ; i++ )\n {\n digest[4*i] = ctx->buf[i]&0x"
106 "ff;\n digest[4*i+1] = (ctx->buf[i]>>8)&0xff;\n diges"
107 "t[4*i+2] = (ctx->buf[i]>>16)&0xff;\n digest[4*i+3] = (ct"
108 "x->buf[i]>>24)&0xff;\n }\n}\n\f\n/* --- The core of the progra"
109 "m --- */\n\n#include <stdio.h>\n#include <string.h>\n\n#define LA"
110 "RGE_ENOUGH 16384\n\nchar buffer[LARGE_ENOUGH];\n\nint\nmain (int "
111 "argc, char *argv[])\n{\n unsigned int i;\n\n buffer[0] = 0;\n "
112 "strcat (buffer, \"/* --- The data --- */\\n\\n\");\n strcat (buf"
113 "fer, \"const char data[] =\");\n for ( i=0 ; data[i] ; i++ )\n "
114 " {\n if ( i%60 == 0 )\n\tstrcat (buffer, \"\\n\\\"\");\n "
115 "switch ( data[i] )\n\t{\n\tcase '\\\\':\n\tcase '\"':\n\t strcat (buff"
116 "er, \"\\\\\");\n\t buffer[strlen(buffer)+1] = 0;\n\t buffer[strlen"
117 "(buffer)] = data[i];\n\t break;\n\tcase '\\n':\n\t strcat (buffer"
118 ", \"\\\\n\");\n\t break;\n\tcase '\\t':\n\t strcat (buffer, \"\\\\t\");\n\t"
119 " break;\n\tcase '\\f':\n\t strcat (buffer, \"\\\\f\");\n\t break;\n\td"
120 "efault:\n\t buffer[strlen(buffer)+1] = 0;\n\t buffer[strlen(bu"
121 "ffer)] = data[i];\n\t}\n if ( i%60 == 59 || !data[i+1] )\n\t"
122 "strcat (buffer, \"\\\"\");\n }\n strcat (buffer, \";\\n\\f\\n\");\n "
123 " strcat (buffer, data);\n if ( argc >= 2 && strcmp (argv[1],"
124 " \"xyzzy\") == 0 )\n printf (\"%s\", buffer);\n else\n {\n "
125 " struct md5_ctx ctx;\n unsigned char digest[16];\n\n "
126 " MD5_start (&ctx);\n for ( i=0 ; buffer[i] ; i++ )\n\tMD5"
127 "_feed (&ctx, buffer[i]);\n MD5_stop (&ctx, digest);\n "
128 " for ( i=0 ; i<16 ; i++ )\n\tprintf (\"%02x\", digest[i]);\n "
129 " printf (\"\\n\");\n }\n return 0;\n}\n";
133 #include "opensrf/md5.h"
136 /* --- The MD5 routines --- */
138 /* MD5 routines, after Ron Rivest */
139 /* Written by David Madore <david.madore@ens.fr>, with code taken in
140 * part from Colin Plumb. */
141 /* Public domain (1999/11/24) */
143 /* Note: these routines do not depend on endianness. */
145 /* === The header === */
147 /* Put this in md5.h if you don't like having everything in one big
151 #define F1(x, y, z) (z ^ (x & (y ^ z)))
152 #define F2(x, y, z) F1(z, x, y)
153 #define F3(x, y, z) (x ^ y ^ z)
154 #define F4(x, y, z) (y ^ (x | ~z))
156 #define MD5STEP(f, w, x, y, z, data, s) \
157 { w += f (x, y, z) + data; w = w<<s | (w&0xffffffffUL)>>(32-s); \
161 MD5_transform (unsigned long buf[4], const unsigned long in[16])
163 register unsigned long a, b, c, d;
165 a = buf[0]; b = buf[1]; c = buf[2]; d = buf[3];
166 MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478UL, 7);
167 MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756UL, 12);
168 MD5STEP(F1, c, d, a, b, in[2] + 0x242070dbUL, 17);
169 MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceeeUL, 22);
170 MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0fafUL, 7);
171 MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62aUL, 12);
172 MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613UL, 17);
173 MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501UL, 22);
174 MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8UL, 7);
175 MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7afUL, 12);
176 MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1UL, 17);
177 MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7beUL, 22);
178 MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122UL, 7);
179 MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193UL, 12);
180 MD5STEP(F1, c, d, a, b, in[14] + 0xa679438eUL, 17);
181 MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821UL, 22);
182 MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562UL, 5);
183 MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340UL, 9);
184 MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51UL, 14);
185 MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aaUL, 20);
186 MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105dUL, 5);
187 MD5STEP(F2, d, a, b, c, in[10] + 0x02441453UL, 9);
188 MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681UL, 14);
189 MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8UL, 20);
190 MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6UL, 5);
191 MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6UL, 9);
192 MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87UL, 14);
193 MD5STEP(F2, b, c, d, a, in[8] + 0x455a14edUL, 20);
194 MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905UL, 5);
195 MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8UL, 9);
196 MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9UL, 14);
197 MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8aUL, 20);
198 MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942UL, 4);
199 MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681UL, 11);
200 MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122UL, 16);
201 MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380cUL, 23);
202 MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44UL, 4);
203 MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9UL, 11);
204 MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60UL, 16);
205 MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70UL, 23);
206 MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6UL, 4);
207 MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127faUL, 11);
208 MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085UL, 16);
209 MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05UL, 23);
210 MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039UL, 4);
211 MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5UL, 11);
212 MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8UL, 16);
213 MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665UL, 23);
214 MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244UL, 6);
215 MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97UL, 10);
216 MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7UL, 15);
217 MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039UL, 21);
218 MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3UL, 6);
219 MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92UL, 10);
220 MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47dUL, 15);
221 MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1UL, 21);
222 MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4fUL, 6);
223 MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0UL, 10);
224 MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314UL, 15);
225 MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1UL, 21);
226 MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82UL, 6);
227 MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235UL, 10);
228 MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bbUL, 15);
229 MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391UL, 21);
230 buf[0] += a; buf[1] += b; buf[2] += c; buf[3] += d;
240 MD5_start (struct md5_ctx *ctx)
244 ctx->buf[0] = 0x67452301UL;
245 ctx->buf[1] = 0xefcdab89UL;
246 ctx->buf[2] = 0x98badcfeUL;
247 ctx->buf[3] = 0x10325476UL;
250 for ( i=0 ; i<16 ; i++ )
256 MD5_feed (struct md5_ctx *ctx, unsigned char inb)
261 ctx->in[ctx->b/4] |= ((unsigned long)inb) << ((ctx->b%4)*8);
262 if ( ++ctx->b >= 64 )
264 MD5_transform (ctx->buf, ctx->in);
266 for ( i=0 ; i<16 ; i++ )
271 if ( (temp&0xffffffffUL) > (ctx->bits[0]&0xffffffffUL) )
276 MD5_stop (struct md5_ctx *ctx, unsigned char digest[16])
279 unsigned long bits[2];
281 for ( i=0 ; i<2 ; i++ )
282 bits[i] = ctx->bits[i];
283 MD5_feed (ctx, 0x80);
284 for ( ; ctx->b!=56 ; )
286 for ( i=0 ; i<2 ; i++ )
288 MD5_feed (ctx, bits[i]&0xff);
289 MD5_feed (ctx, (bits[i]>>8)&0xff);
290 MD5_feed (ctx, (bits[i]>>16)&0xff);
291 MD5_feed (ctx, (bits[i]>>24)&0xff);
293 for ( i=0 ; i<4 ; i++ )
295 digest[4*i] = ctx->buf[i]&0xff;
296 digest[4*i+1] = (ctx->buf[i]>>8)&0xff;
297 digest[4*i+2] = (ctx->buf[i]>>16)&0xff;
298 digest[4*i+3] = (ctx->buf[i]>>24)&0xff;
302 /* --- The core of the program --- */
307 #define LARGE_ENOUGH 16384
309 char buffer[LARGE_ENOUGH];
313 main (int argc, char *argv[])
318 strcat (buffer, \n\n");
319 strcat (buffer, "const char data[] =");
320 for ( i=0 ; data[i] ; i++ )
323 strcat (buffer, "\n\"");
328 strcat (buffer, "\\");
329 buffer[strlen(buffer)+1] = 0;
330 buffer[strlen(buffer)] = data[i];
333 strcat (buffer, "\\n");
336 strcat (buffer, "\\t");
339 strcat (buffer, "\\f");
342 buffer[strlen(buffer)+1] = 0;
343 buffer[strlen(buffer)] = data[i];
345 if ( i%60 == 59 || !data[i+1] )
346 strcat (buffer, "\"");
348 strcat (buffer, ";\n\f\n");
349 strcat (buffer, data);
350 if ( argc >= 2 && strcmp (argv[1], "xyzzy") == 0 )
351 printf ("%s", buffer);
355 unsigned char digest[16];
358 for ( i=0 ; buffer[i] ; i++ )
359 MD5_feed (&ctx, buffer[i]);
360 MD5_stop (&ctx, digest);
361 for ( i=0 ; i<16 ; i++ )
362 printf ("%02x", digest[i]);