md5block.c - 9base - revived minimalist port of Plan 9 userland to Unix | |
git clone git://git.suckless.org/9base | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
md5block.c (5015B) | |
--- | |
1 #include "os.h" | |
2 #include <libsec.h> | |
3 | |
4 /* | |
5 * rfc1321 requires that I include this. The code is new. The constan… | |
6 * all come from the rfc (hence the copyright). We trade a table for t… | |
7 * macros in rfc. The total size is a lot less. -- presotto | |
8 * | |
9 * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All | |
10 * rights reserved. | |
11 * | |
12 * License to copy and use this software is granted provided that… | |
13 * is identified as the "RSA Data Security, Inc. MD5 Message-Dige… | |
14 * Algorithm" in all material mentioning or referencing this soft… | |
15 * or this function. | |
16 * | |
17 * License is also granted to make and use derivative works provi… | |
18 * that such works are identified as "derived from the RSA Data | |
19 * Security, Inc. MD5 Message-Digest Algorithm" in all material | |
20 * mentioning or referencing the derived work. | |
21 * | |
22 * RSA Data Security, Inc. makes no representations concerning ei… | |
23 * the merchantability of this software or the suitability of this | |
24 * software forany particular purpose. It is provided "as is" | |
25 * without express or implied warranty of any kind. | |
26 * These notices must be retained in any copies of any part of th… | |
27 * documentation and/or software. | |
28 */ | |
29 | |
30 /* | |
31 * Rotate ammounts used in the algorithm | |
32 */ | |
33 enum | |
34 { | |
35 S11= 7, | |
36 S12= 12, | |
37 S13= 17, | |
38 S14= 22, | |
39 | |
40 S21= 5, | |
41 S22= 9, | |
42 S23= 14, | |
43 S24= 20, | |
44 | |
45 S31= 4, | |
46 S32= 11, | |
47 S33= 16, | |
48 S34= 23, | |
49 | |
50 S41= 6, | |
51 S42= 10, | |
52 S43= 15, | |
53 S44= 21, | |
54 }; | |
55 | |
56 static u32int md5tab[] = | |
57 { | |
58 /* round 1 */ | |
59 /*[0]*/ 0xd76aa478, | |
60 0xe8c7b756, | |
61 0x242070db, | |
62 0xc1bdceee, | |
63 0xf57c0faf, | |
64 0x4787c62a, | |
65 0xa8304613, | |
66 0xfd469501, | |
67 0x698098d8, | |
68 0x8b44f7af, | |
69 0xffff5bb1, | |
70 0x895cd7be, | |
71 0x6b901122, | |
72 0xfd987193, | |
73 0xa679438e, | |
74 0x49b40821, | |
75 | |
76 /* round 2 */ | |
77 /*[16]*/0xf61e2562, | |
78 0xc040b340, | |
79 0x265e5a51, | |
80 0xe9b6c7aa, | |
81 0xd62f105d, | |
82 0x2441453, | |
83 0xd8a1e681, | |
84 0xe7d3fbc8, | |
85 0x21e1cde6, | |
86 0xc33707d6, | |
87 0xf4d50d87, | |
88 0x455a14ed, | |
89 0xa9e3e905, | |
90 0xfcefa3f8, | |
91 0x676f02d9, | |
92 0x8d2a4c8a, | |
93 | |
94 /* round 3 */ | |
95 /*[32]*/0xfffa3942, | |
96 0x8771f681, | |
97 0x6d9d6122, | |
98 0xfde5380c, | |
99 0xa4beea44, | |
100 0x4bdecfa9, | |
101 0xf6bb4b60, | |
102 0xbebfbc70, | |
103 0x289b7ec6, | |
104 0xeaa127fa, | |
105 0xd4ef3085, | |
106 0x4881d05, | |
107 0xd9d4d039, | |
108 0xe6db99e5, | |
109 0x1fa27cf8, | |
110 0xc4ac5665, | |
111 | |
112 /* round 4 */ | |
113 /*[48]*/0xf4292244, | |
114 0x432aff97, | |
115 0xab9423a7, | |
116 0xfc93a039, | |
117 0x655b59c3, | |
118 0x8f0ccc92, | |
119 0xffeff47d, | |
120 0x85845dd1, | |
121 0x6fa87e4f, | |
122 0xfe2ce6e0, | |
123 0xa3014314, | |
124 0x4e0811a1, | |
125 0xf7537e82, | |
126 0xbd3af235, | |
127 0x2ad7d2bb, | |
128 0xeb86d391, | |
129 }; | |
130 | |
131 static void decode(u32int*, uchar*, ulong); | |
132 extern void _md5block(uchar *p, ulong len, u32int *s); | |
133 | |
134 void | |
135 _md5block(uchar *p, ulong len, u32int *s) | |
136 { | |
137 u32int a, b, c, d, sh; | |
138 u32int *t; | |
139 uchar *end; | |
140 u32int x[16]; | |
141 | |
142 for(end = p+len; p < end; p += 64){ | |
143 a = s[0]; | |
144 b = s[1]; | |
145 c = s[2]; | |
146 d = s[3]; | |
147 | |
148 decode(x, p, 64); | |
149 | |
150 t = md5tab; | |
151 sh = 0; | |
152 for(; sh != 16; t += 4){ | |
153 a += ((c ^ d) & b) ^ d; | |
154 a += x[sh] + t[0]; | |
155 a = (a << S11) | (a >> (32 - S11)); | |
156 a += b; | |
157 | |
158 d += ((b ^ c) & a) ^ c; | |
159 d += x[sh + 1] + t[1]; | |
160 d = (d << S12) | (d >> (32 - S12)); | |
161 d += a; | |
162 | |
163 c += ((a ^ b) & d) ^ b; | |
164 c += x[sh + 2] + t[2]; | |
165 c = (c << S13) | (c >> (32 - S13)); | |
166 c += d; | |
167 | |
168 b += ((d ^ a) & c) ^ a; | |
169 b += x[sh + 3] + t[3]; | |
170 b = (b << S14) | (b >> (32 - S14)); | |
171 b += c; | |
172 | |
173 sh += 4; | |
174 } | |
175 sh = 1; | |
176 for(; sh != 1+20*4; t += 4){ | |
177 a += ((b ^ c) & d) ^ c; | |
178 a += x[sh & 0xf] + t[0]; | |
179 a = (a << S21) | (a >> (32 - S21)); | |
180 a += b; | |
181 | |
182 d += ((a ^ b) & c) ^ b; | |
183 d += x[(sh + 5) & 0xf] + t[1]; | |
184 d = (d << S22) | (d >> (32 - S22)); | |
185 d += a; | |
186 | |
187 c += ((d ^ a) & b) ^ a; | |
188 c += x[(sh + 10) & 0xf] + t[2]; | |
189 c = (c << S23) | (c >> (32 - S23)); | |
190 c += d; | |
191 | |
192 b += ((c ^ d) & a) ^ d; | |
193 b += x[(sh + 15) & 0xf] + t[3]; | |
194 b = (b << S24) | (b >> (32 - S24)); | |
195 b += c; | |
196 | |
197 sh += 20; | |
198 } | |
199 sh = 5; | |
200 for(; sh != 5+12*4; t += 4){ | |
201 a += b ^ c ^ d; | |
202 a += x[sh & 0xf] + t[0]; | |
203 a = (a << S31) | (a >> (32 - S31)); | |
204 a += b; | |
205 | |
206 d += a ^ b ^ c; | |
207 d += x[(sh + 3) & 0xf] + t[1]; | |
208 d = (d << S32) | (d >> (32 - S32)); | |
209 d += a; | |
210 | |
211 c += d ^ a ^ b; | |
212 c += x[(sh + 6) & 0xf] + t[2]; | |
213 c = (c << S33) | (c >> (32 - S33)); | |
214 c += d; | |
215 | |
216 b += c ^ d ^ a; | |
217 b += x[(sh + 9) & 0xf] + t[3]; | |
218 b = (b << S34) | (b >> (32 - S34)); | |
219 b += c; | |
220 | |
221 sh += 12; | |
222 } | |
223 sh = 0; | |
224 for(; sh != 28*4; t += 4){ | |
225 a += c ^ (b | ~d); | |
226 a += x[sh & 0xf] + t[0]; | |
227 a = (a << S41) | (a >> (32 - S41)); | |
228 a += b; | |
229 | |
230 d += b ^ (a | ~c); | |
231 d += x[(sh + 7) & 0xf] + t[1]; | |
232 d = (d << S42) | (d >> (32 - S42)); | |
233 d += a; | |
234 | |
235 c += a ^ (d | ~b); | |
236 c += x[(sh + 14) & 0xf] + t[2]; | |
237 c = (c << S43) | (c >> (32 - S43)); | |
238 c += d; | |
239 | |
240 b += d ^ (c | ~a); | |
241 b += x[(sh + 21) & 0xf] + t[3]; | |
242 b = (b << S44) | (b >> (32 - S44)); | |
243 b += c; | |
244 | |
245 sh += 28; | |
246 } | |
247 | |
248 s[0] += a; | |
249 s[1] += b; | |
250 s[2] += c; | |
251 s[3] += d; | |
252 } | |
253 } | |
254 | |
255 /* | |
256 * decodes input (uchar) into output (u32int). Assumes len is | |
257 * a multiple of 4. | |
258 */ | |
259 static void | |
260 decode(u32int *output, uchar *input, ulong len) | |
261 { | |
262 uchar *e; | |
263 | |
264 for(e = input+len; input < e; input += 4) | |
265 *output++ = input[0] | (input[1] << 8) | | |
266 (input[2] << 16) | (input[3] << 24); | |
267 } |