1use super::md5;
9use crate::encoding::binary::{self, ByteOrder};
10use crate::math::bits;
11
12pub(super) fn block_generic(state: &mut md5::State, p: &[u8]) {
13 let mut a = state[0];
15 let mut b = state[1];
16 let mut c = state[2];
17 let mut d = state[3];
18
19 let mut i = 0;
20 while i <= p.len() - md5::BLOCK_SIZE {
21 let q = &p[i..i + md5::BLOCK_SIZE];
22
23 let (aa, bb, cc, dd) = (a, b, c, d);
25
26 let x0 = binary::LITTLE_ENDIAN.uint32(&q[0..]);
28 let x1 = binary::LITTLE_ENDIAN.uint32(&q[4..]);
29 let x2 = binary::LITTLE_ENDIAN.uint32(&q[4 * 0x2..]);
30 let x3 = binary::LITTLE_ENDIAN.uint32(&q[4 * 0x3..]);
31 let x4 = binary::LITTLE_ENDIAN.uint32(&q[4 * 0x4..]);
32 let x5 = binary::LITTLE_ENDIAN.uint32(&q[4 * 0x5..]);
33 let x6 = binary::LITTLE_ENDIAN.uint32(&q[4 * 0x6..]);
34 let x7 = binary::LITTLE_ENDIAN.uint32(&q[4 * 0x7..]);
35 let x8 = binary::LITTLE_ENDIAN.uint32(&q[4 * 0x8..]);
36 let x9 = binary::LITTLE_ENDIAN.uint32(&q[4 * 0x9..]);
37 let xa = binary::LITTLE_ENDIAN.uint32(&q[4 * 0xa..]);
38 let xb = binary::LITTLE_ENDIAN.uint32(&q[4 * 0xb..]);
39 let xc = binary::LITTLE_ENDIAN.uint32(&q[4 * 0xc..]);
40 let xd = binary::LITTLE_ENDIAN.uint32(&q[4 * 0xd..]);
41 let xe = binary::LITTLE_ENDIAN.uint32(&q[4 * 0xe..]);
42 let xf = binary::LITTLE_ENDIAN.uint32(&q[4 * 0xf..]);
43
44 a = b.wrapping_add(bits::rotate_left32(
46 (((c ^ d) & b) ^ d)
47 .wrapping_add(a)
48 .wrapping_add(x0)
49 .wrapping_add(0xd76aa478),
50 7,
51 ));
52 d = a.wrapping_add(bits::rotate_left32(
53 (((b ^ c) & a) ^ c)
54 .wrapping_add(d)
55 .wrapping_add(x1)
56 .wrapping_add(0xe8c7b756),
57 12,
58 ));
59 c = d.wrapping_add(bits::rotate_left32(
60 (((a ^ b) & d) ^ b)
61 .wrapping_add(c)
62 .wrapping_add(x2)
63 .wrapping_add(0x242070db),
64 17,
65 ));
66 b = c.wrapping_add(bits::rotate_left32(
67 (((d ^ a) & c) ^ a)
68 .wrapping_add(b)
69 .wrapping_add(x3)
70 .wrapping_add(0xc1bdceee),
71 22,
72 ));
73 a = b.wrapping_add(bits::rotate_left32(
74 (((c ^ d) & b) ^ d)
75 .wrapping_add(a)
76 .wrapping_add(x4)
77 .wrapping_add(0xf57c0faf),
78 7,
79 ));
80 d = a.wrapping_add(bits::rotate_left32(
81 (((b ^ c) & a) ^ c)
82 .wrapping_add(d)
83 .wrapping_add(x5)
84 .wrapping_add(0x4787c62a),
85 12,
86 ));
87 c = d.wrapping_add(bits::rotate_left32(
88 (((a ^ b) & d) ^ b)
89 .wrapping_add(c)
90 .wrapping_add(x6)
91 .wrapping_add(0xa8304613),
92 17,
93 ));
94 b = c.wrapping_add(bits::rotate_left32(
95 (((d ^ a) & c) ^ a)
96 .wrapping_add(b)
97 .wrapping_add(x7)
98 .wrapping_add(0xfd469501),
99 22,
100 ));
101 a = b.wrapping_add(bits::rotate_left32(
102 (((c ^ d) & b) ^ d)
103 .wrapping_add(a)
104 .wrapping_add(x8)
105 .wrapping_add(0x698098d8),
106 7,
107 ));
108 d = a.wrapping_add(bits::rotate_left32(
109 (((b ^ c) & a) ^ c)
110 .wrapping_add(d)
111 .wrapping_add(x9)
112 .wrapping_add(0x8b44f7af),
113 12,
114 ));
115 c = d.wrapping_add(bits::rotate_left32(
116 (((a ^ b) & d) ^ b)
117 .wrapping_add(c)
118 .wrapping_add(xa)
119 .wrapping_add(0xffff5bb1),
120 17,
121 ));
122 b = c.wrapping_add(bits::rotate_left32(
123 (((d ^ a) & c) ^ a)
124 .wrapping_add(b)
125 .wrapping_add(xb)
126 .wrapping_add(0x895cd7be),
127 22,
128 ));
129 a = b.wrapping_add(bits::rotate_left32(
130 (((c ^ d) & b) ^ d)
131 .wrapping_add(a)
132 .wrapping_add(xc)
133 .wrapping_add(0x6b901122),
134 7,
135 ));
136 d = a.wrapping_add(bits::rotate_left32(
137 (((b ^ c) & a) ^ c)
138 .wrapping_add(d)
139 .wrapping_add(xd)
140 .wrapping_add(0xfd987193),
141 12,
142 ));
143 c = d.wrapping_add(bits::rotate_left32(
144 (((a ^ b) & d) ^ b)
145 .wrapping_add(c)
146 .wrapping_add(xe)
147 .wrapping_add(0xa679438e),
148 17,
149 ));
150 b = c.wrapping_add(bits::rotate_left32(
151 (((d ^ a) & c) ^ a)
152 .wrapping_add(b)
153 .wrapping_add(xf)
154 .wrapping_add(0x49b40821),
155 22,
156 ));
157
158 a = b.wrapping_add(bits::rotate_left32(
160 (((b ^ c) & d) ^ c)
161 .wrapping_add(a)
162 .wrapping_add(x1)
163 .wrapping_add(0xf61e2562),
164 5,
165 ));
166 d = a.wrapping_add(bits::rotate_left32(
167 (((a ^ b) & c) ^ b)
168 .wrapping_add(d)
169 .wrapping_add(x6)
170 .wrapping_add(0xc040b340),
171 9,
172 ));
173 c = d.wrapping_add(bits::rotate_left32(
174 (((d ^ a) & b) ^ a)
175 .wrapping_add(c)
176 .wrapping_add(xb)
177 .wrapping_add(0x265e5a51),
178 14,
179 ));
180 b = c.wrapping_add(bits::rotate_left32(
181 (((c ^ d) & a) ^ d)
182 .wrapping_add(b)
183 .wrapping_add(x0)
184 .wrapping_add(0xe9b6c7aa),
185 20,
186 ));
187 a = b.wrapping_add(bits::rotate_left32(
188 (((b ^ c) & d) ^ c)
189 .wrapping_add(a)
190 .wrapping_add(x5)
191 .wrapping_add(0xd62f105d),
192 5,
193 ));
194 d = a.wrapping_add(bits::rotate_left32(
195 (((a ^ b) & c) ^ b)
196 .wrapping_add(d)
197 .wrapping_add(xa)
198 .wrapping_add(0x02441453),
199 9,
200 ));
201 c = d.wrapping_add(bits::rotate_left32(
202 (((d ^ a) & b) ^ a)
203 .wrapping_add(c)
204 .wrapping_add(xf)
205 .wrapping_add(0xd8a1e681),
206 14,
207 ));
208 b = c.wrapping_add(bits::rotate_left32(
209 (((c ^ d) & a) ^ d)
210 .wrapping_add(b)
211 .wrapping_add(x4)
212 .wrapping_add(0xe7d3fbc8),
213 20,
214 ));
215 a = b.wrapping_add(bits::rotate_left32(
216 (((b ^ c) & d) ^ c)
217 .wrapping_add(a)
218 .wrapping_add(x9)
219 .wrapping_add(0x21e1cde6),
220 5,
221 ));
222 d = a.wrapping_add(bits::rotate_left32(
223 (((a ^ b) & c) ^ b)
224 .wrapping_add(d)
225 .wrapping_add(xe)
226 .wrapping_add(0xc33707d6),
227 9,
228 ));
229 c = d.wrapping_add(bits::rotate_left32(
230 (((d ^ a) & b) ^ a)
231 .wrapping_add(c)
232 .wrapping_add(x3)
233 .wrapping_add(0xf4d50d87),
234 14,
235 ));
236 b = c.wrapping_add(bits::rotate_left32(
237 (((c ^ d) & a) ^ d)
238 .wrapping_add(b)
239 .wrapping_add(x8)
240 .wrapping_add(0x455a14ed),
241 20,
242 ));
243 a = b.wrapping_add(bits::rotate_left32(
244 (((b ^ c) & d) ^ c)
245 .wrapping_add(a)
246 .wrapping_add(xd)
247 .wrapping_add(0xa9e3e905),
248 5,
249 ));
250 d = a.wrapping_add(bits::rotate_left32(
251 (((a ^ b) & c) ^ b)
252 .wrapping_add(d)
253 .wrapping_add(x2)
254 .wrapping_add(0xfcefa3f8),
255 9,
256 ));
257 c = d.wrapping_add(bits::rotate_left32(
258 (((d ^ a) & b) ^ a)
259 .wrapping_add(c)
260 .wrapping_add(x7)
261 .wrapping_add(0x676f02d9),
262 14,
263 ));
264 b = c.wrapping_add(bits::rotate_left32(
265 (((c ^ d) & a) ^ d)
266 .wrapping_add(b)
267 .wrapping_add(xc)
268 .wrapping_add(0x8d2a4c8a),
269 20,
270 ));
271
272 a = b.wrapping_add(bits::rotate_left32(
274 (b ^ c ^ d)
275 .wrapping_add(a)
276 .wrapping_add(x5)
277 .wrapping_add(0xfffa3942),
278 4,
279 ));
280 d = a.wrapping_add(bits::rotate_left32(
281 (a ^ b ^ c)
282 .wrapping_add(d)
283 .wrapping_add(x8)
284 .wrapping_add(0x8771f681),
285 11,
286 ));
287 c = d.wrapping_add(bits::rotate_left32(
288 (d ^ a ^ b)
289 .wrapping_add(c)
290 .wrapping_add(xb)
291 .wrapping_add(0x6d9d6122),
292 16,
293 ));
294 b = c.wrapping_add(bits::rotate_left32(
295 (c ^ d ^ a)
296 .wrapping_add(b)
297 .wrapping_add(xe)
298 .wrapping_add(0xfde5380c),
299 23,
300 ));
301 a = b.wrapping_add(bits::rotate_left32(
302 (b ^ c ^ d)
303 .wrapping_add(a)
304 .wrapping_add(x1)
305 .wrapping_add(0xa4beea44),
306 4,
307 ));
308 d = a.wrapping_add(bits::rotate_left32(
309 (a ^ b ^ c)
310 .wrapping_add(d)
311 .wrapping_add(x4)
312 .wrapping_add(0x4bdecfa9),
313 11,
314 ));
315 c = d.wrapping_add(bits::rotate_left32(
316 (d ^ a ^ b)
317 .wrapping_add(c)
318 .wrapping_add(x7)
319 .wrapping_add(0xf6bb4b60),
320 16,
321 ));
322 b = c.wrapping_add(bits::rotate_left32(
323 (c ^ d ^ a)
324 .wrapping_add(b)
325 .wrapping_add(xa)
326 .wrapping_add(0xbebfbc70),
327 23,
328 ));
329 a = b.wrapping_add(bits::rotate_left32(
330 (b ^ c ^ d)
331 .wrapping_add(a)
332 .wrapping_add(xd)
333 .wrapping_add(0x289b7ec6),
334 4,
335 ));
336 d = a.wrapping_add(bits::rotate_left32(
337 (a ^ b ^ c)
338 .wrapping_add(d)
339 .wrapping_add(x0)
340 .wrapping_add(0xeaa127fa),
341 11,
342 ));
343 c = d.wrapping_add(bits::rotate_left32(
344 (d ^ a ^ b)
345 .wrapping_add(c)
346 .wrapping_add(x3)
347 .wrapping_add(0xd4ef3085),
348 16,
349 ));
350 b = c.wrapping_add(bits::rotate_left32(
351 (c ^ d ^ a)
352 .wrapping_add(b)
353 .wrapping_add(x6)
354 .wrapping_add(0x04881d05),
355 23,
356 ));
357 a = b.wrapping_add(bits::rotate_left32(
358 (b ^ c ^ d)
359 .wrapping_add(a)
360 .wrapping_add(x9)
361 .wrapping_add(0xd9d4d039),
362 4,
363 ));
364 d = a.wrapping_add(bits::rotate_left32(
365 (a ^ b ^ c)
366 .wrapping_add(d)
367 .wrapping_add(xc)
368 .wrapping_add(0xe6db99e5),
369 11,
370 ));
371 c = d.wrapping_add(bits::rotate_left32(
372 (d ^ a ^ b)
373 .wrapping_add(c)
374 .wrapping_add(xf)
375 .wrapping_add(0x1fa27cf8),
376 16,
377 ));
378 b = c.wrapping_add(bits::rotate_left32(
379 (c ^ d ^ a)
380 .wrapping_add(b)
381 .wrapping_add(x2)
382 .wrapping_add(0xc4ac5665),
383 23,
384 ));
385
386 a = b.wrapping_add(bits::rotate_left32(
388 (c ^ (b | !d))
389 .wrapping_add(a)
390 .wrapping_add(x0)
391 .wrapping_add(0xf4292244),
392 6,
393 ));
394 d = a.wrapping_add(bits::rotate_left32(
395 (b ^ (a | !c))
396 .wrapping_add(d)
397 .wrapping_add(x7)
398 .wrapping_add(0x432aff97),
399 10,
400 ));
401 c = d.wrapping_add(bits::rotate_left32(
402 (a ^ (d | !b))
403 .wrapping_add(c)
404 .wrapping_add(xe)
405 .wrapping_add(0xab9423a7),
406 15,
407 ));
408 b = c.wrapping_add(bits::rotate_left32(
409 (d ^ (c | !a))
410 .wrapping_add(b)
411 .wrapping_add(x5)
412 .wrapping_add(0xfc93a039),
413 21,
414 ));
415 a = b.wrapping_add(bits::rotate_left32(
416 (c ^ (b | !d))
417 .wrapping_add(a)
418 .wrapping_add(xc)
419 .wrapping_add(0x655b59c3),
420 6,
421 ));
422 d = a.wrapping_add(bits::rotate_left32(
423 (b ^ (a | !c))
424 .wrapping_add(d)
425 .wrapping_add(x3)
426 .wrapping_add(0x8f0ccc92),
427 10,
428 ));
429 c = d.wrapping_add(bits::rotate_left32(
430 (a ^ (d | !b))
431 .wrapping_add(c)
432 .wrapping_add(xa)
433 .wrapping_add(0xffeff47d),
434 15,
435 ));
436 b = c.wrapping_add(bits::rotate_left32(
437 (d ^ (c | !a))
438 .wrapping_add(b)
439 .wrapping_add(x1)
440 .wrapping_add(0x85845dd1),
441 21,
442 ));
443 a = b.wrapping_add(bits::rotate_left32(
444 (c ^ (b | !d))
445 .wrapping_add(a)
446 .wrapping_add(x8)
447 .wrapping_add(0x6fa87e4f),
448 6,
449 ));
450 d = a.wrapping_add(bits::rotate_left32(
451 (b ^ (a | !c))
452 .wrapping_add(d)
453 .wrapping_add(xf)
454 .wrapping_add(0xfe2ce6e0),
455 10,
456 ));
457 c = d.wrapping_add(bits::rotate_left32(
458 (a ^ (d | !b))
459 .wrapping_add(c)
460 .wrapping_add(x6)
461 .wrapping_add(0xa3014314),
462 15,
463 ));
464 b = c.wrapping_add(bits::rotate_left32(
465 (d ^ (c | !a))
466 .wrapping_add(b)
467 .wrapping_add(xd)
468 .wrapping_add(0x4e0811a1),
469 21,
470 ));
471 a = b.wrapping_add(bits::rotate_left32(
472 (c ^ (b | !d))
473 .wrapping_add(a)
474 .wrapping_add(x4)
475 .wrapping_add(0xf7537e82),
476 6,
477 ));
478 d = a.wrapping_add(bits::rotate_left32(
479 (b ^ (a | !c))
480 .wrapping_add(d)
481 .wrapping_add(xb)
482 .wrapping_add(0xbd3af235),
483 10,
484 ));
485 c = d.wrapping_add(bits::rotate_left32(
486 (a ^ (d | !b))
487 .wrapping_add(c)
488 .wrapping_add(x2)
489 .wrapping_add(0x2ad7d2bb),
490 15,
491 ));
492 b = c.wrapping_add(bits::rotate_left32(
493 (d ^ (c | !a))
494 .wrapping_add(b)
495 .wrapping_add(x9)
496 .wrapping_add(0xeb86d391),
497 21,
498 ));
499
500 a = a.wrapping_add(aa);
502 b = b.wrapping_add(bb);
503 c = c.wrapping_add(cc);
504 d = d.wrapping_add(dd);
505 i += md5::BLOCK_SIZE;
506 }
507
508 (state[0], state[1], state[2], state[3]) = (a, b, c, d);
510}