2 * Author......: Jens Steube <jens.steube@gmail.com>
8 #include "include/constants.h"
9 #include "include/kernel_vendor.h"
24 #include "include/kernel_functions.c"
26 #include "common_nv.c"
29 #define VECT_COMPARE_S "check_single_vect1_comp4.c"
30 #define VECT_COMPARE_M "check_multi_vect1_comp4.c"
34 #define VECT_COMPARE_S "check_single_vect2_comp4.c"
35 #define VECT_COMPARE_M "check_multi_vect2_comp4.c"
39 #define VECT_COMPARE_S "check_single_vect4_comp4.c"
40 #define VECT_COMPARE_M "check_multi_vect4_comp4.c"
44 #define uint_to_hex_lower8(i) l_bin2asc[(i)]
48 #define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y])
52 #define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w])
55 __device__ static u32 memcat32 (u32x block0[16], u32x block1[16], const u32 block_len, const u32x append0[4], const u32x append1[4], const u32x append2[4], const u32x append3[4], const u32 append_len)
57 const u32 mod = block_len & 3;
58 const u32 div = block_len / 4;
60 const int offset_minus_4 = 4 - mod;
62 const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff;
66 append0_t[0] = __byte_perm ( 0, append0[0], selector);
67 append0_t[1] = __byte_perm (append0[0], append0[1], selector);
68 append0_t[2] = __byte_perm (append0[1], append0[2], selector);
69 append0_t[3] = __byte_perm (append0[2], append0[3], selector);
73 append1_t[0] = __byte_perm (append0[3], append1[0], selector);
74 append1_t[1] = __byte_perm (append1[0], append1[1], selector);
75 append1_t[2] = __byte_perm (append1[1], append1[2], selector);
76 append1_t[3] = __byte_perm (append1[2], append1[3], selector);
80 append2_t[0] = __byte_perm (append1[3], append2[0], selector);
81 append2_t[1] = __byte_perm (append2[0], append2[1], selector);
82 append2_t[2] = __byte_perm (append2[1], append2[2], selector);
83 append2_t[3] = __byte_perm (append2[2], append2[3], selector);
87 append3_t[0] = __byte_perm (append2[3], append3[0], selector);
88 append3_t[1] = __byte_perm (append3[0], append3[1], selector);
89 append3_t[2] = __byte_perm (append3[1], append3[2], selector);
90 append3_t[3] = __byte_perm (append3[2], append3[3], selector);
94 append4_t[0] = __byte_perm (append3[3], 0, selector);
101 case 0: block0[ 0] |= append0_t[0];
102 block0[ 1] = append0_t[1];
103 block0[ 2] = append0_t[2];
104 block0[ 3] = append0_t[3];
106 block0[ 4] = append1_t[0];
107 block0[ 5] = append1_t[1];
108 block0[ 6] = append1_t[2];
109 block0[ 7] = append1_t[3];
111 block0[ 8] = append2_t[0];
112 block0[ 9] = append2_t[1];
113 block0[10] = append2_t[2];
114 block0[11] = append2_t[3];
116 block0[12] = append3_t[0];
117 block0[13] = append3_t[1];
118 block0[14] = append3_t[2];
119 block0[15] = append3_t[3];
121 block1[ 0] = append4_t[0];
122 block1[ 1] = append4_t[1];
123 block1[ 2] = append4_t[2];
124 block1[ 3] = append4_t[3];
127 case 1: block0[ 1] |= append0_t[0];
128 block0[ 2] = append0_t[1];
129 block0[ 3] = append0_t[2];
130 block0[ 4] = append0_t[3];
132 block0[ 5] = append1_t[0];
133 block0[ 6] = append1_t[1];
134 block0[ 7] = append1_t[2];
135 block0[ 8] = append1_t[3];
137 block0[ 9] = append2_t[0];
138 block0[10] = append2_t[1];
139 block0[11] = append2_t[2];
140 block0[12] = append2_t[3];
142 block0[13] = append3_t[0];
143 block0[14] = append3_t[1];
144 block0[15] = append3_t[2];
145 block1[ 0] = append3_t[3];
147 block1[ 1] = append4_t[0];
148 block1[ 2] = append4_t[1];
149 block1[ 3] = append4_t[2];
150 block1[ 4] = append4_t[3];
153 case 2: block0[ 2] |= append0_t[0];
154 block0[ 3] = append0_t[1];
155 block0[ 4] = append0_t[2];
156 block0[ 5] = append0_t[3];
158 block0[ 6] = append1_t[0];
159 block0[ 7] = append1_t[1];
160 block0[ 8] = append1_t[2];
161 block0[ 9] = append1_t[3];
163 block0[10] = append2_t[0];
164 block0[11] = append2_t[1];
165 block0[12] = append2_t[2];
166 block0[13] = append2_t[3];
168 block0[14] = append3_t[0];
169 block0[15] = append3_t[1];
170 block1[ 0] = append3_t[2];
171 block1[ 1] = append3_t[3];
173 block1[ 2] = append4_t[0];
174 block1[ 3] = append4_t[1];
175 block1[ 4] = append4_t[2];
176 block1[ 5] = append4_t[3];
179 case 3: block0[ 3] |= append0_t[0];
180 block0[ 4] = append0_t[1];
181 block0[ 5] = append0_t[2];
182 block0[ 6] = append0_t[3];
184 block0[ 7] = append1_t[0];
185 block0[ 8] = append1_t[1];
186 block0[ 9] = append1_t[2];
187 block0[10] = append1_t[3];
189 block0[11] = append2_t[0];
190 block0[12] = append2_t[1];
191 block0[13] = append2_t[2];
192 block0[14] = append2_t[3];
194 block0[15] = append3_t[0];
195 block1[ 0] = append3_t[1];
196 block1[ 1] = append3_t[2];
197 block1[ 2] = append3_t[3];
199 block1[ 3] = append4_t[0];
200 block1[ 4] = append4_t[1];
201 block1[ 5] = append4_t[2];
202 block1[ 6] = append4_t[3];
205 case 4: block0[ 4] |= append0_t[0];
206 block0[ 5] = append0_t[1];
207 block0[ 6] = append0_t[2];
208 block0[ 7] = append0_t[3];
210 block0[ 8] = append1_t[0];
211 block0[ 9] = append1_t[1];
212 block0[10] = append1_t[2];
213 block0[11] = append1_t[3];
215 block0[12] = append2_t[0];
216 block0[13] = append2_t[1];
217 block0[14] = append2_t[2];
218 block0[15] = append2_t[3];
220 block1[ 0] = append3_t[0];
221 block1[ 1] = append3_t[1];
222 block1[ 2] = append3_t[2];
223 block1[ 3] = append3_t[3];
225 block1[ 4] = append4_t[0];
226 block1[ 5] = append4_t[1];
227 block1[ 6] = append4_t[2];
228 block1[ 7] = append4_t[3];
231 case 5: block0[ 5] |= append0_t[0];
232 block0[ 6] = append0_t[1];
233 block0[ 7] = append0_t[2];
234 block0[ 8] = append0_t[3];
236 block0[ 9] = append1_t[0];
237 block0[10] = append1_t[1];
238 block0[11] = append1_t[2];
239 block0[12] = append1_t[3];
241 block0[13] = append2_t[0];
242 block0[14] = append2_t[1];
243 block0[15] = append2_t[2];
244 block1[ 0] = append2_t[3];
246 block1[ 1] = append3_t[0];
247 block1[ 2] = append3_t[1];
248 block1[ 3] = append3_t[2];
249 block1[ 4] = append3_t[3];
251 block1[ 5] = append4_t[0];
252 block1[ 6] = append4_t[1];
253 block1[ 7] = append4_t[2];
254 block1[ 8] = append4_t[3];
257 case 6: block0[ 6] |= append0_t[0];
258 block0[ 7] = append0_t[1];
259 block0[ 8] = append0_t[2];
260 block0[ 9] = append0_t[3];
262 block0[10] = append1_t[0];
263 block0[11] = append1_t[1];
264 block0[12] = append1_t[2];
265 block0[13] = append1_t[3];
267 block0[14] = append2_t[0];
268 block0[15] = append2_t[1];
269 block1[ 0] = append2_t[2];
270 block1[ 1] = append2_t[3];
272 block1[ 2] = append3_t[0];
273 block1[ 3] = append3_t[1];
274 block1[ 4] = append3_t[2];
275 block1[ 5] = append3_t[3];
277 block1[ 6] = append4_t[0];
278 block1[ 7] = append4_t[1];
279 block1[ 8] = append4_t[2];
280 block1[ 9] = append4_t[3];
283 case 7: block0[ 7] |= append0_t[0];
284 block0[ 8] = append0_t[1];
285 block0[ 9] = append0_t[2];
286 block0[10] = append0_t[3];
288 block0[11] = append1_t[0];
289 block0[12] = append1_t[1];
290 block0[13] = append1_t[2];
291 block0[14] = append1_t[3];
293 block0[15] = append2_t[0];
294 block1[ 0] = append2_t[1];
295 block1[ 1] = append2_t[2];
296 block1[ 2] = append2_t[3];
298 block1[ 3] = append3_t[0];
299 block1[ 4] = append3_t[1];
300 block1[ 5] = append3_t[2];
301 block1[ 6] = append3_t[3];
303 block1[ 7] = append4_t[0];
304 block1[ 8] = append4_t[1];
305 block1[ 9] = append4_t[2];
306 block1[10] = append4_t[3];
309 case 8: block0[ 8] |= append0_t[0];
310 block0[ 9] = append0_t[1];
311 block0[10] = append0_t[2];
312 block0[11] = append0_t[3];
314 block0[12] = append1_t[0];
315 block0[13] = append1_t[1];
316 block0[14] = append1_t[2];
317 block0[15] = append1_t[3];
319 block1[ 0] = append2_t[0];
320 block1[ 1] = append2_t[1];
321 block1[ 2] = append2_t[2];
322 block1[ 3] = append2_t[3];
324 block1[ 4] = append3_t[0];
325 block1[ 5] = append3_t[1];
326 block1[ 6] = append3_t[2];
327 block1[ 7] = append3_t[3];
329 block1[ 8] = append4_t[0];
330 block1[ 9] = append4_t[1];
331 block1[10] = append4_t[2];
332 block1[11] = append4_t[3];
335 case 9: block0[ 9] |= append0_t[0];
336 block0[10] = append0_t[1];
337 block0[11] = append0_t[2];
338 block0[12] = append0_t[3];
340 block0[13] = append1_t[0];
341 block0[14] = append1_t[1];
342 block0[15] = append1_t[2];
343 block1[ 0] = append1_t[3];
345 block1[ 1] = append2_t[0];
346 block1[ 2] = append2_t[1];
347 block1[ 3] = append2_t[2];
348 block1[ 4] = append2_t[3];
350 block1[ 5] = append3_t[0];
351 block1[ 6] = append3_t[1];
352 block1[ 7] = append3_t[2];
353 block1[ 8] = append3_t[3];
355 block1[ 9] = append4_t[0];
356 block1[10] = append4_t[1];
357 block1[11] = append4_t[2];
358 block1[12] = append4_t[3];
361 case 10: block0[10] |= append0_t[0];
362 block0[11] = append0_t[1];
363 block0[12] = append0_t[2];
364 block0[13] = append0_t[3];
366 block0[14] = append1_t[0];
367 block0[15] = append1_t[1];
368 block1[ 0] = append1_t[2];
369 block1[ 1] = append1_t[3];
371 block1[ 2] = append2_t[0];
372 block1[ 3] = append2_t[1];
373 block1[ 4] = append2_t[2];
374 block1[ 5] = append2_t[3];
376 block1[ 6] = append3_t[0];
377 block1[ 7] = append3_t[1];
378 block1[ 8] = append3_t[2];
379 block1[ 9] = append3_t[3];
381 block1[10] = append4_t[0];
382 block1[11] = append4_t[1];
383 block1[12] = append4_t[2];
384 block1[13] = append4_t[3];
387 case 11: block0[11] |= append0_t[0];
388 block0[12] = append0_t[1];
389 block0[13] = append0_t[2];
390 block0[14] = append0_t[3];
392 block0[15] = append1_t[0];
393 block1[ 0] = append1_t[1];
394 block1[ 1] = append1_t[2];
395 block1[ 2] = append1_t[3];
397 block1[ 3] = append2_t[0];
398 block1[ 4] = append2_t[1];
399 block1[ 5] = append2_t[2];
400 block1[ 6] = append2_t[3];
402 block1[ 7] = append3_t[0];
403 block1[ 8] = append3_t[1];
404 block1[ 9] = append3_t[2];
405 block1[10] = append3_t[3];
407 block1[11] = append4_t[0];
408 block1[12] = append4_t[1];
409 block1[13] = append4_t[2];
410 block1[14] = append4_t[3];
413 case 12: block0[12] |= append0_t[0];
414 block0[13] = append0_t[1];
415 block0[14] = append0_t[2];
416 block0[15] = append0_t[3];
418 block1[ 0] = append1_t[0];
419 block1[ 1] = append1_t[1];
420 block1[ 2] = append1_t[2];
421 block1[ 3] = append1_t[3];
423 block1[ 4] = append2_t[0];
424 block1[ 5] = append2_t[1];
425 block1[ 6] = append2_t[2];
426 block1[ 7] = append2_t[3];
428 block1[ 8] = append3_t[0];
429 block1[ 9] = append3_t[1];
430 block1[10] = append3_t[2];
431 block1[11] = append3_t[3];
433 block1[12] = append4_t[0];
434 block1[13] = append4_t[1];
435 block1[14] = append4_t[2];
436 block1[15] = append4_t[3];
439 case 13: block0[13] |= append0_t[0];
440 block0[14] = append0_t[1];
441 block0[15] = append0_t[2];
442 block1[ 0] = append0_t[3];
444 block1[ 1] = append1_t[0];
445 block1[ 2] = append1_t[1];
446 block1[ 3] = append1_t[2];
447 block1[ 4] = append1_t[3];
449 block1[ 5] = append2_t[0];
450 block1[ 6] = append2_t[1];
451 block1[ 7] = append2_t[2];
452 block1[ 8] = append2_t[3];
454 block1[ 9] = append3_t[0];
455 block1[10] = append3_t[1];
456 block1[11] = append3_t[2];
457 block1[12] = append3_t[3];
459 block1[13] = append4_t[0];
460 block1[14] = append4_t[1];
461 block1[15] = append4_t[2];
464 case 14: block0[14] |= append0_t[0];
465 block0[15] = append0_t[1];
466 block1[ 0] = append0_t[2];
467 block1[ 1] = append0_t[3];
469 block1[ 2] = append1_t[0];
470 block1[ 3] = append1_t[1];
471 block1[ 4] = append1_t[2];
472 block1[ 5] = append1_t[3];
474 block1[ 6] = append2_t[0];
475 block1[ 7] = append2_t[1];
476 block1[ 8] = append2_t[2];
477 block1[ 9] = append2_t[3];
479 block1[10] = append3_t[0];
480 block1[11] = append3_t[1];
481 block1[12] = append3_t[2];
482 block1[13] = append3_t[3];
484 block1[14] = append4_t[0];
485 block1[15] = append4_t[1];
488 case 15: block0[15] |= append0_t[0];
489 block1[ 0] = append0_t[1];
490 block1[ 1] = append0_t[2];
491 block1[ 2] = append0_t[3];
493 block1[ 3] = append1_t[1];
494 block1[ 4] = append1_t[2];
495 block1[ 5] = append1_t[3];
496 block1[ 6] = append1_t[0];
498 block1[ 7] = append2_t[0];
499 block1[ 8] = append2_t[1];
500 block1[ 9] = append2_t[2];
501 block1[10] = append2_t[3];
503 block1[11] = append3_t[0];
504 block1[12] = append3_t[1];
505 block1[13] = append3_t[2];
506 block1[14] = append3_t[3];
508 block1[15] = append4_t[0];
511 case 16: block1[ 0] |= append0_t[0];
512 block1[ 1] = append0_t[1];
513 block1[ 2] = append0_t[2];
514 block1[ 3] = append0_t[3];
516 block1[ 4] = append1_t[0];
517 block1[ 5] = append1_t[1];
518 block1[ 6] = append1_t[2];
519 block1[ 7] = append1_t[3];
521 block1[ 8] = append2_t[0];
522 block1[ 9] = append2_t[1];
523 block1[10] = append2_t[2];
524 block1[11] = append2_t[3];
526 block1[12] = append3_t[0];
527 block1[13] = append3_t[1];
528 block1[14] = append3_t[2];
529 block1[15] = append3_t[3];
532 case 17: block1[ 1] |= append0_t[0];
533 block1[ 2] = append0_t[1];
534 block1[ 3] = append0_t[2];
535 block1[ 4] = append0_t[3];
537 block1[ 5] = append1_t[0];
538 block1[ 6] = append1_t[1];
539 block1[ 7] = append1_t[2];
540 block1[ 8] = append1_t[3];
542 block1[ 9] = append2_t[0];
543 block1[10] = append2_t[1];
544 block1[11] = append2_t[2];
545 block1[12] = append2_t[3];
547 block1[13] = append3_t[0];
548 block1[14] = append3_t[1];
549 block1[15] = append3_t[2];
552 case 18: block1[ 2] |= append0_t[0];
553 block1[ 3] = append0_t[1];
554 block1[ 4] = append0_t[2];
555 block1[ 5] = append0_t[3];
557 block1[ 6] = append1_t[0];
558 block1[ 7] = append1_t[1];
559 block1[ 8] = append1_t[2];
560 block1[ 9] = append1_t[3];
562 block1[10] = append2_t[0];
563 block1[11] = append2_t[1];
564 block1[12] = append2_t[2];
565 block1[13] = append2_t[3];
567 block1[14] = append3_t[0];
568 block1[15] = append3_t[1];
571 case 19: block1[ 3] |= append0_t[0];
572 block1[ 4] = append0_t[1];
573 block1[ 5] = append0_t[2];
574 block1[ 6] = append0_t[3];
576 block1[ 7] = append1_t[0];
577 block1[ 8] = append1_t[1];
578 block1[ 9] = append1_t[2];
579 block1[10] = append1_t[3];
581 block1[11] = append2_t[0];
582 block1[12] = append2_t[1];
583 block1[13] = append2_t[2];
584 block1[14] = append2_t[3];
586 block1[15] = append3_t[0];
589 case 20: block1[ 4] |= append0_t[0];
590 block1[ 5] = append0_t[1];
591 block1[ 6] = append0_t[2];
592 block1[ 7] = append0_t[3];
594 block1[ 8] = append1_t[0];
595 block1[ 9] = append1_t[1];
596 block1[10] = append1_t[2];
597 block1[11] = append1_t[3];
599 block1[12] = append2_t[0];
600 block1[13] = append2_t[1];
601 block1[14] = append2_t[2];
602 block1[15] = append2_t[3];
605 case 21: block1[ 5] |= append0_t[0];
606 block1[ 6] = append0_t[1];
607 block1[ 7] = append0_t[2];
608 block1[ 8] = append0_t[3];
610 block1[ 9] = append1_t[0];
611 block1[10] = append1_t[1];
612 block1[11] = append1_t[2];
613 block1[12] = append1_t[3];
615 block1[13] = append2_t[0];
616 block1[14] = append2_t[1];
617 block1[15] = append2_t[2];
620 case 22: block1[ 6] |= append0_t[0];
621 block1[ 7] = append0_t[1];
622 block1[ 8] = append0_t[2];
623 block1[ 9] = append0_t[3];
625 block1[10] = append1_t[0];
626 block1[11] = append1_t[1];
627 block1[12] = append1_t[2];
628 block1[13] = append1_t[3];
630 block1[14] = append2_t[0];
631 block1[15] = append2_t[1];
634 case 23: block1[ 7] |= append0_t[0];
635 block1[ 8] = append0_t[1];
636 block1[ 9] = append0_t[2];
637 block1[10] = append0_t[3];
639 block1[11] = append1_t[0];
640 block1[12] = append1_t[1];
641 block1[13] = append1_t[2];
642 block1[14] = append1_t[3];
644 block1[15] = append2_t[0];
647 case 24: block1[ 8] |= append0_t[0];
648 block1[ 9] = append0_t[1];
649 block1[10] = append0_t[2];
650 block1[11] = append0_t[3];
652 block1[12] = append1_t[0];
653 block1[13] = append1_t[1];
654 block1[14] = append1_t[2];
655 block1[15] = append1_t[3];
658 case 25: block1[ 9] |= append0_t[0];
659 block1[10] = append0_t[1];
660 block1[11] = append0_t[2];
661 block1[12] = append0_t[3];
663 block1[13] = append1_t[0];
664 block1[14] = append1_t[1];
665 block1[15] = append1_t[2];
668 case 26: block1[10] |= append0_t[0];
669 block1[11] = append0_t[1];
670 block1[12] = append0_t[2];
671 block1[13] = append0_t[3];
673 block1[14] = append1_t[0];
674 block1[15] = append1_t[1];
677 case 27: block1[11] |= append0_t[0];
678 block1[12] = append0_t[1];
679 block1[13] = append0_t[2];
680 block1[14] = append0_t[3];
682 block1[15] = append1_t[0];
685 case 28: block1[12] |= append0_t[0];
686 block1[13] = append0_t[1];
687 block1[14] = append0_t[2];
688 block1[15] = append0_t[3];
691 case 29: block1[13] |= append0_t[0];
692 block1[14] = append0_t[1];
693 block1[15] = append0_t[2];
696 case 30: block1[14] |= append0_t[0];
697 block1[15] = append0_t[1];
701 u32 new_len = block_len + append_len;
706 __device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
708 __device__ __shared__ short l_bin2asc[256];
710 __device__ __constant__ comb_t c_combs[1024];
712 extern "C" __global__ void __launch_bounds__ (256, 1) m11400_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
718 const u32 lid = threadIdx.x;
724 const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x;
728 wordl0[0] = pws[gid].i[ 0];
729 wordl0[1] = pws[gid].i[ 1];
730 wordl0[2] = pws[gid].i[ 2];
731 wordl0[3] = pws[gid].i[ 3];
735 wordl1[0] = pws[gid].i[ 4];
736 wordl1[1] = pws[gid].i[ 5];
737 wordl1[2] = pws[gid].i[ 6];
738 wordl1[3] = pws[gid].i[ 7];
758 l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8
759 | c_bin2asc[(lid >> 4) & 15] << 0;
763 if (gid >= gid_max) return;
765 const u32 pw_l_len = pws[gid].pw_len;
767 if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
769 append_0x80_2 (wordl0, wordl1, pw_l_len);
771 switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len);
778 const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt
782 salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0];
783 salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1];
784 salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2];
785 salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3];
786 salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4];
787 salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5];
788 salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6];
789 salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7];
790 salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8];
791 salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9];
792 salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10];
793 salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11];
794 salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12];
795 salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13];
796 salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14];
797 salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15];
801 salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16];
802 salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17];
803 salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18];
804 salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19];
805 salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20];
806 salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21];
807 salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22];
808 salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23];
809 salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24];
810 salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25];
811 salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26];
812 salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27];
813 salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28];
814 salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29];
822 const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
826 esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0];
827 esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1];
828 esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2];
829 esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3];
830 esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4];
831 esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5];
832 esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6];
833 esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7];
834 esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8];
835 esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9];
836 esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10];
837 esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11];
838 esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12];
839 esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13];
840 esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14];
841 esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15];
845 esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16];
846 esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17];
847 esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18];
848 esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19];
849 esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20];
850 esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21];
851 esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22];
852 esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23];
853 esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24];
854 esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25];
855 esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26];
856 esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27];
857 esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28];
858 esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29];
859 esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30];
860 esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31];
864 esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32];
865 esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33];
866 esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34];
867 esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35];
868 esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36];
869 esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37];
881 const u32 digest_esalt_len = 32 + esalt_len;
882 const u32 remaining_bytes = digest_esalt_len + 1 - 64; // substract previous block
888 for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++)
890 const u32 pw_r_len = c_combs[il_pos].pw_len;
892 const u32 pw_len = pw_l_len + pw_r_len;
896 wordr0[0] = c_combs[il_pos].i[0];
897 wordr0[1] = c_combs[il_pos].i[1];
898 wordr0[2] = c_combs[il_pos].i[2];
899 wordr0[3] = c_combs[il_pos].i[3];
903 wordr1[0] = c_combs[il_pos].i[4];
904 wordr1[1] = c_combs[il_pos].i[5];
905 wordr1[2] = c_combs[il_pos].i[6];
906 wordr1[3] = c_combs[il_pos].i[7];
922 if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
924 switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len);
929 w0[0] = wordl0[0] | wordr0[0];
930 w0[1] = wordl0[1] | wordr0[1];
931 w0[2] = wordl0[2] | wordr0[2];
932 w0[3] = wordl0[3] | wordr0[3];
936 w1[0] = wordl1[0] | wordr1[0];
937 w1[1] = wordl1[1] | wordr1[1];
938 w1[2] = wordl1[2] | wordr1[2];
939 w1[3] = wordl1[3] | wordr1[3];
943 w2[0] = wordl2[0] | wordr2[0];
944 w2[1] = wordl2[1] | wordr2[1];
945 w2[2] = wordl2[2] | wordr2[2];
946 w2[3] = wordl2[3] | wordr2[3];
950 w3[0] = wordl3[0] | wordr3[0];
951 w3[1] = wordl3[1] | wordr3[1];
952 w3[2] = wordl3[2] | wordr3[2];
953 w3[3] = wordl3[3] | wordr3[3];
955 const u32 pw_salt_len = salt_len + pw_len;
958 * HA1 = md5 ($salt . $pass)
961 // append the pass to the salt
965 block0[ 0] = salt_buf0[ 0];
966 block0[ 1] = salt_buf0[ 1];
967 block0[ 2] = salt_buf0[ 2];
968 block0[ 3] = salt_buf0[ 3];
969 block0[ 4] = salt_buf0[ 4];
970 block0[ 5] = salt_buf0[ 5];
971 block0[ 6] = salt_buf0[ 6];
972 block0[ 7] = salt_buf0[ 7];
973 block0[ 8] = salt_buf0[ 8];
974 block0[ 9] = salt_buf0[ 9];
975 block0[10] = salt_buf0[10];
976 block0[11] = salt_buf0[11];
977 block0[12] = salt_buf0[12];
978 block0[13] = salt_buf0[13];
979 block0[14] = salt_buf0[14];
980 block0[15] = salt_buf0[15];
984 block1[ 0] = salt_buf1[ 0];
985 block1[ 1] = salt_buf1[ 1];
986 block1[ 2] = salt_buf1[ 2];
987 block1[ 3] = salt_buf1[ 3];
988 block1[ 4] = salt_buf1[ 4];
989 block1[ 5] = salt_buf1[ 5];
990 block1[ 6] = salt_buf1[ 6];
991 block1[ 7] = salt_buf1[ 7];
992 block1[ 8] = salt_buf1[ 8];
993 block1[ 9] = salt_buf1[ 9];
994 block1[10] = salt_buf1[10];
995 block1[11] = salt_buf1[11];
996 block1[12] = salt_buf1[12];
997 block1[13] = salt_buf1[13];
998 block1[14] = salt_buf1[14];
999 block1[15] = salt_buf1[15];
1003 block_len = memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len);
1007 w0_t[0] = block0[ 0];
1008 w0_t[1] = block0[ 1];
1009 w0_t[2] = block0[ 2];
1010 w0_t[3] = block0[ 3];
1014 w1_t[0] = block0[ 4];
1015 w1_t[1] = block0[ 5];
1016 w1_t[2] = block0[ 6];
1017 w1_t[3] = block0[ 7];
1021 w2_t[0] = block0[ 8];
1022 w2_t[1] = block0[ 9];
1023 w2_t[2] = block0[10];
1024 w2_t[3] = block0[11];
1028 w3_t[0] = block0[12];
1029 w3_t[1] = block0[13];
1030 w3_t[2] = block0[14];
1031 w3_t[3] = block0[15];
1035 w3_t[2] = pw_salt_len * 8;
1047 MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1048 MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1049 MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1050 MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1051 MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1052 MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1053 MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1054 MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1055 MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1056 MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1057 MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1058 MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1059 MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1060 MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1061 MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1062 MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1064 MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1065 MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1066 MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1067 MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1068 MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1069 MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1070 MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1071 MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1072 MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1073 MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1074 MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1075 MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1076 MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1077 MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1078 MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1079 MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1081 MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
1082 MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
1083 MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
1084 MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
1085 MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
1086 MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
1087 MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
1088 MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
1089 MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
1090 MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
1091 MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1092 MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1093 MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1094 MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1095 MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1096 MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1098 MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1099 MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1100 MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1101 MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1102 MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1103 MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1104 MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1105 MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1106 MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1107 MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1108 MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1109 MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1110 MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1111 MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1112 MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1113 MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1127 w0_t[0] = block1[ 0];
1128 w0_t[1] = block1[ 1];
1129 w0_t[2] = block1[ 2];
1130 w0_t[3] = block1[ 3];
1132 w1_t[0] = block1[ 4];
1133 w1_t[1] = block1[ 5];
1134 w1_t[2] = block1[ 6];
1135 w1_t[3] = block1[ 7];
1137 w2_t[0] = block1[ 8];
1138 w2_t[1] = block1[ 9];
1139 w2_t[2] = block1[10];
1140 w2_t[3] = block1[11];
1142 w3_t[0] = block1[12];
1143 w3_t[1] = block1[13];
1144 w3_t[2] = pw_salt_len * 8;
1147 MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1148 MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1149 MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1150 MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1151 MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1152 MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1153 MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1154 MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1155 MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1156 MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1157 MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1158 MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1159 MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1160 MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1161 MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1162 MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1164 MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1165 MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1166 MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1167 MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1168 MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1169 MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1170 MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1171 MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1172 MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1173 MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1174 MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1175 MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1176 MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1177 MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1178 MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1179 MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1181 MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
1182 MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
1183 MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
1184 MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
1185 MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
1186 MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
1187 MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
1188 MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
1189 MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
1190 MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
1191 MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1192 MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1193 MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1194 MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1195 MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1196 MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1198 MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1199 MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1200 MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1201 MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1202 MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1203 MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1204 MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1205 MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1206 MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1207 MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1208 MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1209 MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1210 MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1211 MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1212 MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1213 MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1222 * final = md5 ($HA1 . $esalt)
1223 * we have at least 2 MD5 blocks/transformations, but we might need 3
1226 w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0
1227 | uint_to_hex_lower8 ((a >> 8) & 255) << 16;
1228 w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0
1229 | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
1230 w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0
1231 | uint_to_hex_lower8 ((b >> 8) & 255) << 16;
1232 w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0
1233 | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
1234 w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0
1235 | uint_to_hex_lower8 ((c >> 8) & 255) << 16;
1236 w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0
1237 | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
1238 w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0
1239 | uint_to_hex_lower8 ((d >> 8) & 255) << 16;
1240 w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0
1241 | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
1243 w2_t[0] = esalt_buf0[0];
1244 w2_t[1] = esalt_buf0[1];
1245 w2_t[2] = esalt_buf0[2];
1246 w2_t[3] = esalt_buf0[3];
1248 w3_t[0] = esalt_buf0[4];
1249 w3_t[1] = esalt_buf0[5];
1250 w3_t[2] = esalt_buf0[6];
1251 w3_t[3] = esalt_buf0[7];
1261 MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1262 MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1263 MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1264 MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1265 MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1266 MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1267 MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1268 MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1269 MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1270 MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1271 MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1272 MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1273 MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1274 MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1275 MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1276 MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1278 MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1279 MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1280 MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1281 MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1282 MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1283 MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1284 MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1285 MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1286 MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1287 MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1288 MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1289 MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1290 MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1291 MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1292 MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1293 MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1295 MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
1296 MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
1297 MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
1298 MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
1299 MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
1300 MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
1301 MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
1302 MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
1303 MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
1304 MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
1305 MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1306 MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1307 MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1308 MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1309 MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1310 MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1312 MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1313 MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1314 MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1315 MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1316 MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1317 MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1318 MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1319 MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1320 MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1321 MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1322 MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1323 MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1324 MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1325 MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1326 MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1327 MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1341 w0_t[0] = esalt_buf0[ 8];
1342 w0_t[1] = esalt_buf0[ 9];
1343 w0_t[2] = esalt_buf0[10];
1344 w0_t[3] = esalt_buf0[11];
1346 w1_t[0] = esalt_buf0[12];
1347 w1_t[1] = esalt_buf0[13];
1348 w1_t[2] = esalt_buf0[14];
1349 w1_t[3] = esalt_buf0[15];
1351 w2_t[0] = esalt_buf1[ 0];
1352 w2_t[1] = esalt_buf1[ 1];
1353 w2_t[2] = esalt_buf1[ 2];
1354 w2_t[3] = esalt_buf1[ 3];
1356 w3_t[0] = esalt_buf1[ 4];
1357 w3_t[1] = esalt_buf1[ 5];
1358 w3_t[2] = esalt_buf1[ 6];
1359 w3_t[3] = esalt_buf1[ 7];
1361 // it is the final block when no more than 55 bytes left
1363 if (remaining_bytes < 56)
1365 // it is the last block !
1367 w3_t[2] = digest_esalt_len * 8;
1370 MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1371 MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1372 MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1373 MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1374 MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1375 MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1376 MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1377 MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1378 MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1379 MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1380 MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1381 MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1382 MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1383 MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1384 MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1385 MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1387 MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1388 MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1389 MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1390 MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1391 MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1392 MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1393 MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1394 MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1395 MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1396 MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1397 MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1398 MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1399 MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1400 MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1401 MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1402 MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1404 MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
1405 MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
1406 MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
1407 MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
1408 MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
1409 MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
1410 MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
1411 MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
1412 MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
1413 MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
1414 MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1415 MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1416 MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1417 MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1418 MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1419 MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1421 MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1422 MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1423 MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1424 MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1425 MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1426 MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1427 MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1428 MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1429 MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1430 MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1431 MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1432 MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1433 MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1434 MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1435 MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1436 MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1438 // sometimes (not rare at all) we need a third block :(
1440 if (remaining_bytes > 55)
1442 // this is for sure the final block
1454 w0_t[0] = esalt_buf1[ 8];
1455 w0_t[1] = esalt_buf1[ 9];
1456 w0_t[2] = esalt_buf1[10];
1457 w0_t[3] = esalt_buf1[11];
1459 w1_t[0] = esalt_buf1[12];
1460 w1_t[1] = esalt_buf1[13];
1461 w1_t[2] = esalt_buf1[14];
1462 w1_t[3] = esalt_buf1[15];
1464 w2_t[0] = esalt_buf2[ 0];
1465 w2_t[1] = esalt_buf2[ 1];
1466 w2_t[2] = esalt_buf2[ 2];
1467 w2_t[3] = esalt_buf2[ 3];
1469 w3_t[0] = esalt_buf2[ 4];
1470 w3_t[1] = esalt_buf2[ 5];
1471 w3_t[2] = digest_esalt_len * 8;
1474 MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1475 MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1476 MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1477 MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1478 MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1479 MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1480 MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1481 MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1482 MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1483 MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1484 MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1485 MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1486 MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1487 MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1488 MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1489 MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1491 MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1492 MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1493 MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1494 MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1495 MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1496 MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1497 MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1498 MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1499 MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1500 MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1501 MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1502 MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1503 MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1504 MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1505 MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1506 MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1508 MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
1509 MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
1510 MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
1511 MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
1512 MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
1513 MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
1514 MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
1515 MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
1516 MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
1517 MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
1518 MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1519 MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1520 MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1521 MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1522 MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1523 MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1525 MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1526 MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1527 MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1528 MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1529 MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1530 MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1531 MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1532 MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1533 MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1534 MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1535 MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1536 MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1537 MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1538 MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1539 MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1540 MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1553 #include VECT_COMPARE_M
1557 extern "C" __global__ void __launch_bounds__ (256, 1) m11400_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1561 extern "C" __global__ void __launch_bounds__ (256, 1) m11400_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1565 extern "C" __global__ void __launch_bounds__ (256, 1) m11400_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
1571 const u32 lid = threadIdx.x;
1577 const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x;
1581 wordl0[0] = pws[gid].i[ 0];
1582 wordl0[1] = pws[gid].i[ 1];
1583 wordl0[2] = pws[gid].i[ 2];
1584 wordl0[3] = pws[gid].i[ 3];
1588 wordl1[0] = pws[gid].i[ 4];
1589 wordl1[1] = pws[gid].i[ 5];
1590 wordl1[2] = pws[gid].i[ 6];
1591 wordl1[3] = pws[gid].i[ 7];
1611 l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8
1612 | c_bin2asc[(lid >> 4) & 15] << 0;
1616 if (gid >= gid_max) return;
1618 const u32 pw_l_len = pws[gid].pw_len;
1620 if (combs_mode == COMBINATOR_MODE_BASE_RIGHT)
1622 append_0x80_2 (wordl0, wordl1, pw_l_len);
1624 switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len);
1631 const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt
1635 salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0];
1636 salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1];
1637 salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2];
1638 salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3];
1639 salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4];
1640 salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5];
1641 salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6];
1642 salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7];
1643 salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8];
1644 salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9];
1645 salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10];
1646 salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11];
1647 salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12];
1648 salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13];
1649 salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14];
1650 salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15];
1654 salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16];
1655 salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17];
1656 salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18];
1657 salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19];
1658 salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20];
1659 salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21];
1660 salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22];
1661 salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23];
1662 salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24];
1663 salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25];
1664 salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26];
1665 salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27];
1666 salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28];
1667 salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29];
1675 const u32 esalt_len = esalt_bufs[salt_pos].esalt_len;
1679 esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0];
1680 esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1];
1681 esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2];
1682 esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3];
1683 esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4];
1684 esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5];
1685 esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6];
1686 esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7];
1687 esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8];
1688 esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9];
1689 esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10];
1690 esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11];
1691 esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12];
1692 esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13];
1693 esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14];
1694 esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15];
1698 esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16];
1699 esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17];
1700 esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18];
1701 esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19];
1702 esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20];
1703 esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21];
1704 esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22];
1705 esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23];
1706 esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24];
1707 esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25];
1708 esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26];
1709 esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27];
1710 esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28];
1711 esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29];
1712 esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30];
1713 esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31];
1717 esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32];
1718 esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33];
1719 esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34];
1720 esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35];
1721 esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36];
1722 esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37];
1734 const u32 digest_esalt_len = 32 + esalt_len;
1735 const u32 remaining_bytes = digest_esalt_len + 1 - 64; // substract previous block
1741 const u32 search[4] =
1743 digests_buf[digests_offset].digest_buf[DGST_R0],
1744 digests_buf[digests_offset].digest_buf[DGST_R1],
1745 digests_buf[digests_offset].digest_buf[DGST_R2],
1746 digests_buf[digests_offset].digest_buf[DGST_R3]
1753 for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++)
1755 const u32 pw_r_len = c_combs[il_pos].pw_len;
1757 const u32 pw_len = pw_l_len + pw_r_len;
1761 wordr0[0] = c_combs[il_pos].i[0];
1762 wordr0[1] = c_combs[il_pos].i[1];
1763 wordr0[2] = c_combs[il_pos].i[2];
1764 wordr0[3] = c_combs[il_pos].i[3];
1768 wordr1[0] = c_combs[il_pos].i[4];
1769 wordr1[1] = c_combs[il_pos].i[5];
1770 wordr1[2] = c_combs[il_pos].i[6];
1771 wordr1[3] = c_combs[il_pos].i[7];
1787 if (combs_mode == COMBINATOR_MODE_BASE_LEFT)
1789 switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len);
1794 w0[0] = wordl0[0] | wordr0[0];
1795 w0[1] = wordl0[1] | wordr0[1];
1796 w0[2] = wordl0[2] | wordr0[2];
1797 w0[3] = wordl0[3] | wordr0[3];
1801 w1[0] = wordl1[0] | wordr1[0];
1802 w1[1] = wordl1[1] | wordr1[1];
1803 w1[2] = wordl1[2] | wordr1[2];
1804 w1[3] = wordl1[3] | wordr1[3];
1808 w2[0] = wordl2[0] | wordr2[0];
1809 w2[1] = wordl2[1] | wordr2[1];
1810 w2[2] = wordl2[2] | wordr2[2];
1811 w2[3] = wordl2[3] | wordr2[3];
1815 w3[0] = wordl3[0] | wordr3[0];
1816 w3[1] = wordl3[1] | wordr3[1];
1817 w3[2] = wordl3[2] | wordr3[2];
1818 w3[3] = wordl3[3] | wordr3[3];
1820 const u32 pw_salt_len = salt_len + pw_len;
1823 * HA1 = md5 ($salt . $pass)
1826 // append the pass to the salt
1830 block0[ 0] = salt_buf0[ 0];
1831 block0[ 1] = salt_buf0[ 1];
1832 block0[ 2] = salt_buf0[ 2];
1833 block0[ 3] = salt_buf0[ 3];
1834 block0[ 4] = salt_buf0[ 4];
1835 block0[ 5] = salt_buf0[ 5];
1836 block0[ 6] = salt_buf0[ 6];
1837 block0[ 7] = salt_buf0[ 7];
1838 block0[ 8] = salt_buf0[ 8];
1839 block0[ 9] = salt_buf0[ 9];
1840 block0[10] = salt_buf0[10];
1841 block0[11] = salt_buf0[11];
1842 block0[12] = salt_buf0[12];
1843 block0[13] = salt_buf0[13];
1844 block0[14] = salt_buf0[14];
1845 block0[15] = salt_buf0[15];
1849 block1[ 0] = salt_buf1[ 0];
1850 block1[ 1] = salt_buf1[ 1];
1851 block1[ 2] = salt_buf1[ 2];
1852 block1[ 3] = salt_buf1[ 3];
1853 block1[ 4] = salt_buf1[ 4];
1854 block1[ 5] = salt_buf1[ 5];
1855 block1[ 6] = salt_buf1[ 6];
1856 block1[ 7] = salt_buf1[ 7];
1857 block1[ 8] = salt_buf1[ 8];
1858 block1[ 9] = salt_buf1[ 9];
1859 block1[10] = salt_buf1[10];
1860 block1[11] = salt_buf1[11];
1861 block1[12] = salt_buf1[12];
1862 block1[13] = salt_buf1[13];
1863 block1[14] = salt_buf1[14];
1864 block1[15] = salt_buf1[15];
1868 block_len = memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len);
1872 w0_t[0] = block0[ 0];
1873 w0_t[1] = block0[ 1];
1874 w0_t[2] = block0[ 2];
1875 w0_t[3] = block0[ 3];
1879 w1_t[0] = block0[ 4];
1880 w1_t[1] = block0[ 5];
1881 w1_t[2] = block0[ 6];
1882 w1_t[3] = block0[ 7];
1886 w2_t[0] = block0[ 8];
1887 w2_t[1] = block0[ 9];
1888 w2_t[2] = block0[10];
1889 w2_t[3] = block0[11];
1893 w3_t[0] = block0[12];
1894 w3_t[1] = block0[13];
1895 w3_t[2] = block0[14];
1896 w3_t[3] = block0[15];
1900 w3_t[2] = pw_salt_len * 8;
1912 MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
1913 MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
1914 MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
1915 MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
1916 MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
1917 MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
1918 MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
1919 MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
1920 MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
1921 MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
1922 MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
1923 MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
1924 MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
1925 MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
1926 MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
1927 MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
1929 MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
1930 MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
1931 MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
1932 MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
1933 MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
1934 MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
1935 MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
1936 MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
1937 MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
1938 MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
1939 MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
1940 MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
1941 MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
1942 MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
1943 MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
1944 MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
1946 MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
1947 MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
1948 MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
1949 MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
1950 MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
1951 MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
1952 MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
1953 MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
1954 MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
1955 MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
1956 MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
1957 MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
1958 MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
1959 MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
1960 MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
1961 MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
1963 MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
1964 MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
1965 MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
1966 MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
1967 MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
1968 MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
1969 MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
1970 MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
1971 MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
1972 MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
1973 MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
1974 MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
1975 MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
1976 MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
1977 MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
1978 MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
1992 w0_t[0] = block1[ 0];
1993 w0_t[1] = block1[ 1];
1994 w0_t[2] = block1[ 2];
1995 w0_t[3] = block1[ 3];
1997 w1_t[0] = block1[ 4];
1998 w1_t[1] = block1[ 5];
1999 w1_t[2] = block1[ 6];
2000 w1_t[3] = block1[ 7];
2002 w2_t[0] = block1[ 8];
2003 w2_t[1] = block1[ 9];
2004 w2_t[2] = block1[10];
2005 w2_t[3] = block1[11];
2007 w3_t[0] = block1[12];
2008 w3_t[1] = block1[13];
2009 w3_t[2] = pw_salt_len * 8;
2012 MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2013 MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2014 MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2015 MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2016 MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2017 MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2018 MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2019 MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2020 MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2021 MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2022 MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2023 MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2024 MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2025 MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2026 MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2027 MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2029 MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2030 MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2031 MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2032 MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2033 MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2034 MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2035 MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2036 MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2037 MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2038 MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2039 MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2040 MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2041 MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2042 MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2043 MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2044 MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2046 MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
2047 MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
2048 MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
2049 MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
2050 MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
2051 MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
2052 MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
2053 MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
2054 MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
2055 MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
2056 MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2057 MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2058 MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2059 MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2060 MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2061 MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2063 MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2064 MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2065 MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2066 MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2067 MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2068 MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2069 MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2070 MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2071 MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2072 MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2073 MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2074 MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2075 MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2076 MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2077 MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2078 MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2087 * final = md5 ($HA1 . $esalt)
2088 * we have at least 2 MD5 blocks/transformations, but we might need 3
2091 w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0
2092 | uint_to_hex_lower8 ((a >> 8) & 255) << 16;
2093 w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0
2094 | uint_to_hex_lower8 ((a >> 24) & 255) << 16;
2095 w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0
2096 | uint_to_hex_lower8 ((b >> 8) & 255) << 16;
2097 w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0
2098 | uint_to_hex_lower8 ((b >> 24) & 255) << 16;
2099 w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0
2100 | uint_to_hex_lower8 ((c >> 8) & 255) << 16;
2101 w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0
2102 | uint_to_hex_lower8 ((c >> 24) & 255) << 16;
2103 w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0
2104 | uint_to_hex_lower8 ((d >> 8) & 255) << 16;
2105 w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0
2106 | uint_to_hex_lower8 ((d >> 24) & 255) << 16;
2108 w2_t[0] = esalt_buf0[0];
2109 w2_t[1] = esalt_buf0[1];
2110 w2_t[2] = esalt_buf0[2];
2111 w2_t[3] = esalt_buf0[3];
2113 w3_t[0] = esalt_buf0[4];
2114 w3_t[1] = esalt_buf0[5];
2115 w3_t[2] = esalt_buf0[6];
2116 w3_t[3] = esalt_buf0[7];
2126 MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2127 MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2128 MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2129 MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2130 MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2131 MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2132 MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2133 MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2134 MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2135 MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2136 MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2137 MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2138 MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2139 MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2140 MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2141 MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2143 MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2144 MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2145 MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2146 MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2147 MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2148 MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2149 MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2150 MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2151 MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2152 MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2153 MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2154 MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2155 MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2156 MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2157 MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2158 MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2160 MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
2161 MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
2162 MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
2163 MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
2164 MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
2165 MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
2166 MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
2167 MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
2168 MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
2169 MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
2170 MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2171 MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2172 MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2173 MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2174 MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2175 MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2177 MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2178 MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2179 MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2180 MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2181 MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2182 MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2183 MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2184 MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2185 MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2186 MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2187 MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2188 MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2189 MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2190 MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2191 MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2192 MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2206 w0_t[0] = esalt_buf0[ 8];
2207 w0_t[1] = esalt_buf0[ 9];
2208 w0_t[2] = esalt_buf0[10];
2209 w0_t[3] = esalt_buf0[11];
2211 w1_t[0] = esalt_buf0[12];
2212 w1_t[1] = esalt_buf0[13];
2213 w1_t[2] = esalt_buf0[14];
2214 w1_t[3] = esalt_buf0[15];
2216 w2_t[0] = esalt_buf1[ 0];
2217 w2_t[1] = esalt_buf1[ 1];
2218 w2_t[2] = esalt_buf1[ 2];
2219 w2_t[3] = esalt_buf1[ 3];
2221 w3_t[0] = esalt_buf1[ 4];
2222 w3_t[1] = esalt_buf1[ 5];
2223 w3_t[2] = esalt_buf1[ 6];
2224 w3_t[3] = esalt_buf1[ 7];
2226 // it is the final block when no more than 55 bytes left
2228 if (remaining_bytes < 56)
2230 // it is the last block !
2232 w3_t[2] = digest_esalt_len * 8;
2235 MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2236 MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2237 MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2238 MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2239 MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2240 MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2241 MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2242 MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2243 MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2244 MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2245 MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2246 MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2247 MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2248 MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2249 MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2250 MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2252 MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2253 MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2254 MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2255 MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2256 MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2257 MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2258 MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2259 MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2260 MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2261 MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2262 MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2263 MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2264 MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2265 MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2266 MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2267 MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2269 MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
2270 MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
2271 MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
2272 MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
2273 MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
2274 MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
2275 MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
2276 MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
2277 MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
2278 MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
2279 MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2280 MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2281 MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2282 MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2283 MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2284 MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2286 MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2287 MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2288 MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2289 MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2290 MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2291 MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2292 MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2293 MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2294 MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2295 MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2296 MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2297 MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2298 MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2299 MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2300 MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2301 MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2303 // sometimes (not rare at all) we need a third block :(
2305 if (remaining_bytes > 55)
2307 // this is for sure the final block
2319 w0_t[0] = esalt_buf1[ 8];
2320 w0_t[1] = esalt_buf1[ 9];
2321 w0_t[2] = esalt_buf1[10];
2322 w0_t[3] = esalt_buf1[11];
2324 w1_t[0] = esalt_buf1[12];
2325 w1_t[1] = esalt_buf1[13];
2326 w1_t[2] = esalt_buf1[14];
2327 w1_t[3] = esalt_buf1[15];
2329 w2_t[0] = esalt_buf2[ 0];
2330 w2_t[1] = esalt_buf2[ 1];
2331 w2_t[2] = esalt_buf2[ 2];
2332 w2_t[3] = esalt_buf2[ 3];
2334 w3_t[0] = esalt_buf2[ 4];
2335 w3_t[1] = esalt_buf2[ 5];
2336 w3_t[2] = digest_esalt_len * 8;
2339 MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00);
2340 MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01);
2341 MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02);
2342 MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03);
2343 MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00);
2344 MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01);
2345 MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02);
2346 MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03);
2347 MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00);
2348 MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01);
2349 MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02);
2350 MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03);
2351 MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00);
2352 MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01);
2353 MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02);
2354 MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03);
2356 MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10);
2357 MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11);
2358 MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12);
2359 MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13);
2360 MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10);
2361 MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11);
2362 MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12);
2363 MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13);
2364 MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10);
2365 MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11);
2366 MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12);
2367 MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13);
2368 MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10);
2369 MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11);
2370 MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12);
2371 MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13);
2373 MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20);
2374 MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21);
2375 MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22);
2376 MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23);
2377 MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20);
2378 MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21);
2379 MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22);
2380 MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23);
2381 MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20);
2382 MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21);
2383 MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22);
2384 MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23);
2385 MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20);
2386 MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21);
2387 MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22);
2388 MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23);
2390 MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30);
2391 MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31);
2392 MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32);
2393 MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33);
2394 MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30);
2395 MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31);
2396 MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32);
2397 MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33);
2398 MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30);
2399 MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31);
2400 MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32);
2401 MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33);
2402 MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30);
2403 MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31);
2404 MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32);
2405 MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33);
2418 #include VECT_COMPARE_S
2422 extern "C" __global__ void __launch_bounds__ (256, 1) m11400_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)
2426 extern "C" __global__ void __launch_bounds__ (256, 1) m11400_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max)