patch #7318
[mldonkey.git] / src / networks / fasttrack / enc_type_20.c
blob096af045f65653bd1a1656b973cb0c38edba4a1b
1 /*
2 * $Id$
4 * Copyright (C) 2003 giFT-FastTrack project
5 * http://developer.berlios.de/projects/gift-fasttrack
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2, or (at your option) any
10 * later version.
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
19 * This is the most recent pad mingling code for FastTrack as of 03/04/28
20 * Used for encryption version 0x20
23 typedef unsigned int u32;
25 /* our crude SEH replacement */
27 #define TRY(x) if((x) & 1) return;
29 /* some helper funcs */
31 #ifndef __GNUC__
32 #define __attribute__(x)
33 #endif
35 /* my_cos() and my_sin() are equal to cos()<0 and sin()<0. */
36 static int __attribute__ ((const)) my_cos (unsigned char i)
38 return (i * 39 + 61) % 245 > 122;
41 static int __attribute__ ((const)) my_sin (unsigned char i)
43 return (i * 46) % 289 > 144;
46 /* this is (unsigned int) floor(sqrt(((double)(((unsigned char)(i))))+1) + 0.001). */
47 static int __attribute__ ((const)) my_sqrt (unsigned char i)
49 int j, k;
51 for (j = 0, k = 0; j++ <= i; j += ++k << 1);
52 return k;
55 #define ROR(value, count) ((value) >> ((count) & 0x1f) | ((value) << (32 - (((count) & 0x1f)))))
56 #define ROL(value, count) ((value) << ((count) & 0x1f) | ((value) >> (32 - (((count) & 0x1f)))))
58 #define ROREQ(value, count) value = ROR(value, count)
59 #define ROLEQ(value, count) value = ROL(value, count)
61 /* the entry point of this mess */
62 /* this all works on unsigned ints so endianess is not an issue */
64 static void mix (u32 *pad, u32 seed);
66 void enc_type_20 (u32 *pad, u32 seed)
68 mix (pad, seed);
71 /* major functions which make calls to other funcs */
73 static void major_1 (u32 *pad, u32 seed);
74 static void major_2 (u32 *pad, u32 seed);
75 static void major_3 (u32 *pad, u32 seed);
76 static void major_4 (u32 *pad, u32 seed);
77 static void major_5 (u32 *pad, u32 seed);
78 static void major_6 (u32 *pad, u32 seed);
79 static void major_7 (u32 *pad, u32 seed);
80 static void major_8 (u32 *pad, u32 seed);
81 static void major_9 (u32 *pad, u32 seed);
82 static void major_10 (u32 *pad, u32 seed);
83 static void major_11 (u32 *pad, u32 seed);
84 static void major_12 (u32 *pad, u32 seed);
85 static void major_13 (u32 *pad, u32 seed);
86 static void major_14 (u32 *pad, u32 seed);
87 static void major_15 (u32 *pad, u32 seed);
88 static void major_16 (u32 *pad, u32 seed);
89 static void major_17 (u32 *pad, u32 seed);
90 static void major_18 (u32 *pad, u32 seed);
91 static void major_19 (u32 *pad, u32 seed);
92 static void major_21 (u32 *pad, u32 seed);
93 static void major_22 (u32 *pad, u32 seed);
94 static void major_23 (u32 *pad, u32 seed);
95 static void major_24 (u32 *pad, u32 seed);
96 static void major_25 (u32 *pad, u32 seed);
98 /* simple pad manipulation functions */
100 static void minor_36 (u32 *pad);
101 static void minor_37 (u32 *pad);
104 /* minor_ implementation details below this line ;) */
106 #define minor_1(x) pad[8] += my_sin(x&255) ? 0x4f0cf8d : x
107 #define minor_2(x) pad[2] += pad[2] < 0x36def3e1 ? pad[2] : x
108 #define minor_3 pad[10] ^= ROL(pad[1], 20)
109 #define minor_4 pad[16] -= pad[6]
110 #define minor_5 pad[10] -= pad[9] * 0x55
111 #define minor_6 ROLEQ(pad[0], pad[19] ^ 0xc)
112 #define minor_7 pad[17] += pad[8] * 0xf6084c92
113 #define minor_8 pad[12] ^= pad[10] & 0x28acec82
114 #define minor_9(x) pad[12] *= pad[12] < 0x12d7bed ? pad[12] : x
115 #define minor_10(x) pad[18] += pad[5] < 0xfd0aa3f ? pad[5] : x
116 #define minor_12(x) pad[11] &= my_cos(pad[18]) ? 0x146a49cc : x
117 #define minor_13 pad[2] &= my_cos(pad[2]) ? 0x7ebbfde : pad[11]
118 #define minor_17 pad[19] ^= pad[7] * 0x3a
119 #define minor_19 ROLEQ(pad[6], ROR(pad[8], 14))
120 #define minor_20 pad[0] &= ROR(pad[18], 31)
121 #define minor_22 ROREQ(pad[3], pad[11] ^ 0x7)
122 #define minor_26 pad[0] |= my_cos(pad[1]) ? 0x56e0e99 : pad[8]
123 #define minor_27 pad[18] += my_cos(pad[15]) ? 0x10d11d00 : pad[9]
124 #define minor_28 pad[10] -= my_cos(pad[15]) ? 0x268cca84 : pad[9]
125 #define minor_29 pad[3] -= my_cos(pad[6]) ? 0x2031618a : pad[8]
126 #define minor_30 ROLEQ(pad[1], my_sin(pad[5]) ? 4 : pad[6])
127 #define minor_31(x) ROREQ(pad[17], my_sin(pad[6]) ? 29 : x)
128 #define minor_32(x) pad[15] ^= my_sin(pad[14]) ? 0x40a33fd4 : x
129 #define minor_34 pad[7] ^= my_sqrt(pad[11])
130 #define minor_35 pad[5] += my_sqrt(pad[7])
132 static void minor_36 (u32 *pad)
134 pad[3] ^= pad[11] * 0xeef27425;
135 pad[3] += my_sqrt (pad[0]);
136 pad[15] *= pad[1] ^ 0xd89b4a;
137 ROREQ (pad[16], pad[16] & 0x11);
138 pad[18] *= pad[19] + 0xa0d8c0cf;
139 pad[7] *= pad[0] < 0x6765080e ? pad[0] : pad[18];
141 if (pad[5] < 0xe848f43c)
142 ROLEQ (pad[9], pad[5]);
144 pad[2] ^= pad[5] < 0xa0d8c0cf ? pad[5] : pad[9] - 0xe848f43c;
145 ROLEQ (pad[12], ROL (pad[9] - 0xe848f43c, 11));
148 static void minor_37 (u32 *pad)
150 ROLEQ (pad[2], pad[7] + 0x1b);
151 pad[2] ^= pad[9] * 0x7941955;
152 pad[2] -= 0x796fa0af;
153 pad[3] *= my_sin (pad[19]) ? 0x5ea67f83 : pad[5];
154 pad[4] -= pad[4] ^ 0x692c9ef9;
155 pad[10] += pad[1] ^ 0xc43baf0b;
156 pad[12] *= pad[7] - 0xc43baf0b;
157 pad[13] ^= 0xd;
158 pad[17] ^= pad[17] - 0x1259dbb;
159 ROREQ (pad[17], 10);
160 pad[18] += pad[0] ^ 0x3cf1856;
163 static void major_1 (u32 *pad, u32 seed)
165 int branch = (pad[17] ^ pad[4] ^ pad[13]) % 13;
167 if (branch == 9)
169 pad[7] |= 0x3e73450d;
170 minor_31 (0x9);
171 minor_36 (pad);
174 pad[11] &= pad[19] & 0x170b54ed;
176 if (branch == 10)
178 pad[12] ^= pad[15] - 0xf5cfde0;
179 minor_27;
180 major_23 (pad, pad[8]);
183 ROREQ (pad[1], pad[14] < 0x164d8d96 ? pad[14] : pad[4]);
185 if (branch == 12)
187 TRY (minor_1 (0xc0948cf0));
188 minor_28;
189 major_24 (pad, pad[18]);
192 if (branch == 0)
194 pad[12] ^= pad[15] - 0xf5cfde0;
195 minor_31 (0x15);
196 major_19 (pad, pad[12]);
199 ROLEQ (pad[6], pad[13] ^ 0x2);
201 if (branch == 6)
203 TRY (ROREQ (pad[1], 0x4));
204 pad[9] ^= pad[7] * 0x44;
205 major_25 (pad, seed);
208 if (branch == 3)
210 pad[2] ^= my_sin (pad[13]) ? 0xfd08092 : pad[10];
211 pad[13] *= ROR (pad[3], 5);
212 major_17 (pad, pad[15]);
215 if (branch == 0)
217 minor_19;
218 pad[13] *= ROR (pad[3], 5);
219 major_4 (pad, pad[8]);
222 seed += my_sin (seed) ? 0x160df35d : seed;
223 seed &= pad[19] | 0xe00682c6;
225 if (branch == 1)
227 pad[7] &= pad[13] ^ 0x21aaf758;
228 pad[9] |= pad[7] ^ 0x2a19119f;
229 major_18 (pad, pad[12]);
232 pad[16] += my_sin (seed) ? 0xe00682c6 : pad[7];
234 if (branch == 2)
236 pad[13] += pad[15] < 0x137bffeb ? pad[15] : pad[11];
237 pad[19] ^= my_cos (pad[9]) ? 0x57337b8 : pad[14];
238 major_15 (pad, seed);
241 if (branch == 7)
243 pad[4] -= pad[17] ^ 0x2217cf47;
244 pad[13] *= ROR (pad[3], 5);
245 major_3 (pad, pad[14]);
248 if (branch == 4)
250 pad[19] ^= my_cos (pad[9]) ? 0x57337b8 : pad[14];
251 minor_34;
252 major_21 (pad, pad[18]);
255 pad[5] *= my_sqrt (pad[9]);
257 if (branch == 11)
259 ROREQ (pad[4], 0x2);
260 minor_32 (0x8517ae30);
261 major_16 (pad, pad[4]);
264 pad[13] &= pad[18] - 0xeb6dee4;
266 if (branch == 5)
268 minor_30;
269 TRY (minor_3);
270 minor_36 (pad);
273 if (branch == 8)
275 pad[7] |= 0x7de964ed;
276 TRY (minor_4);
277 major_23 (pad, pad[3]);
281 static void major_2 (u32 *pad, u32 seed)
283 int branch = pad[10] & 15;
285 if (branch == 5)
287 minor_27;
288 pad[7] &= pad[13] ^ 0x21aaf758;
289 major_25 (pad, pad[0]);
292 pad[0] -= seed * 0x36;
294 if (branch == 13)
296 pad[2] *= pad[3] + 0xd6863a6;
297 pad[6] += 0xfe07af0e - pad[3];
298 major_17 (pad, seed);
301 if (branch == 12)
303 pad[6] ^= 0x9374c368;
304 pad[7] &= 0xc45b99ee;
305 major_4 (pad, pad[14]);
308 pad[7] -= pad[8] | 0x1a1a9407;
310 if (branch == 6)
312 ROREQ (pad[9], 12);
313 pad[3] -= pad[0] ^ 0x185f3b0d;
314 major_18 (pad, pad[14]);
317 pad[2] += pad[0] + 0x19259d5;
319 if (branch == 8)
321 pad[9] ^= pad[7] * 0x44;
322 pad[2] ^= pad[15] << 5;
323 major_15 (pad, seed);
326 if (branch == 11)
328 minor_34;
329 pad[3] -= pad[0] ^ 0x185f3b0d;
330 major_3 (pad, pad[15]);
333 pad[16] &= seed - 0x1badcb5;
335 if (branch == 15)
337 pad[14] |= pad[3] ^ 0x4345732;
338 ROREQ (pad[4], 0x1);
339 major_21 (pad, pad[3]);
342 pad[5] -= my_cos (pad[4]) ? 0xffcdb92f : pad[14];
344 if (branch == 1)
346 pad[13] -= pad[1];
347 pad[7] |= 0x45e184c5;
348 major_16 (pad, pad[9]);
349 TRY (minor_1 (0x149a97a0));
350 TRY (minor_10 (0xd87d888e));
351 major_1 (pad, pad[9]);
354 pad[5] *= pad[8] + 0xffcdb92f;
356 if (branch == 4)
358 TRY (minor_10 (0x130aa218));
359 pad[13] *= ROR (pad[3], 5);
360 major_14 (pad, pad[6]);
363 ROLEQ (pad[1], pad[15] < 0xbdc3f45b ? pad[15] : pad[9]);
365 if (branch == 14)
367 minor_30;
368 pad[13] *= 0x7f0d5ead;
369 major_6 (pad, pad[5]);
372 if (branch == 0)
374 pad[6] += pad[19] - 0x3f5675d6;
375 TRY (minor_5);
376 major_9 (pad, seed);
379 pad[6] += pad[3] * 0x79;
381 if (branch == 9)
383 pad[9] &= 0x3eb4ed97;
384 minor_30;
385 major_25 (pad, pad[6]);
388 pad[16] ^= my_cos (pad[7]) ? 0x2d36f243 : pad[13];
390 if (branch == 0)
392 pad[0] += pad[18] ^ 0x4ac16b8d;
393 minor_28;
394 major_17 (pad, pad[2]);
397 if (branch == 7)
399 pad[10] += 0x8958821;
400 TRY (minor_1 (0x115e64d4));
401 major_4 (pad, pad[19]);
404 pad[14] &= pad[3] ^ 0xb8eb772d;
406 if (branch == 10)
408 pad[13] -= pad[1];
409 pad[2] ^= pad[15] << 5;
410 major_18 (pad, pad[8]);
413 ROREQ (pad[1], pad[12] * 0x5);
415 if (branch == 3)
417 pad[2] ^= my_sin (pad[13]) ? 0xfd08092 : pad[10];
418 pad[2] ^= my_sin (pad[13]) ? 0xfd08092 : pad[10];
419 major_15 (pad, pad[15]);
422 if (branch == 2)
424 pad[7] &= 0x5cf54b9a;
425 pad[13] *= 0xa02fe00;
426 major_3 (pad, pad[14]);
429 pad[12] ^= my_sin (pad[0]) ? 0x96d5a5a4 : pad[5];
432 static void major_3 (u32 *pad, u32 seed)
434 int branch = (pad[5] ^ seed ^ pad[12]) % 10;
436 seed *= pad[6] | 0x4723b25;
438 if (branch == 0)
440 minor_22;
441 TRY (minor_5);
442 minor_37 (pad);
445 pad[2] -= pad[4] * 0xd;
447 if (branch == 5)
449 pad[7] ^= 0x414517ea;
450 minor_29;
451 minor_36 (pad);
454 seed += pad[12] * 0x19;
456 if (branch == 1)
458 pad[13] += pad[15] < 0x137bffeb ? pad[15] : pad[11];
459 minor_19;
460 major_23 (pad, seed);
463 seed += pad[7] + 0xbd42ff0;
465 if (branch == 2)
467 minor_29;
468 pad[16] += 0x1f5b0c59;
469 major_24 (pad, seed);
472 pad[15] -= pad[0] ^ 0x16bee8c4;
474 if (branch == 4)
476 TRY (minor_7);
477 minor_28;
478 major_19 (pad, seed);
481 pad[18] ^= pad[11] + 0x9fd1847f;
483 if (branch == 6)
485 pad[6] += pad[19] - 0x3f5675d6;
486 pad[6] += pad[19] - 0x3f5675d6;
487 major_25 (pad, seed);
490 ROLEQ (pad[14], pad[19]);
492 if (branch == 8)
494 minor_30;
495 pad[12] += pad[6] + 0x21d7bf61;
496 major_17 (pad, seed);
499 ROREQ (pad[0], pad[13] * 0x13);
501 if (branch == 9)
503 TRY (minor_2 (0x70da1d6f));
504 minor_29;
505 major_4 (pad, seed);
508 if (branch == 7)
510 minor_22;
511 TRY (minor_3);
512 major_18 (pad, pad[5]);
515 if (branch == 3)
517 minor_17;
518 pad[2] ^= pad[15] << 5;
519 major_15 (pad, pad[19]);
523 static void major_4 (u32 *pad, u32 seed)
525 int branch = pad[6] % 7;
527 seed ^= ROL (pad[3], 18);
529 if (branch == 6)
531 pad[6] += pad[19] - 0x3f5675d6;
532 TRY (minor_5);
533 minor_37 (pad);
536 pad[15] += seed * 0x32;
537 pad[5] += 0xc93495e4 - pad[14];
539 if (branch == 2)
541 TRY (minor_10 (0x10db4a9d));
542 pad[6] += 0xfe07af0e - pad[3];
543 minor_36 (pad);
546 pad[12] *= my_cos (pad[14]) ? 0xf5a79f2a : pad[17];
548 if (branch == 0)
550 minor_17;
551 pad[9] |= pad[7] ^ 0x2a19119f;
552 major_23 (pad, pad[8]);
555 pad[6] &= pad[7] | 0xe02b5b1a;
556 pad[11] ^= my_cos (pad[0]) ? 0x3a2c762b : seed;
558 if (branch == 4)
560 TRY (minor_3);
561 TRY (ROREQ (pad[1], 0x1c));
562 major_24 (pad, seed);
565 pad[3] -= my_sqrt (pad[9]);
567 if (branch == 5)
569 pad[6] ^= 0x47a791f;
570 pad[0] += pad[18] ^ 0x4ac16b8d;
571 major_19 (pad, pad[18]);
574 seed &= my_cos (pad[7]) ? 0xcdef2bf0 : pad[3];
575 pad[0] -= pad[15] * 0x43;
577 if (branch == 1)
579 minor_19;
580 pad[6] ^= 0x424d4b7d;
581 major_25 (pad, pad[3]);
584 pad[1] -= ROR (pad[18], 19);
585 pad[17] ^= my_sin (pad[14]) ? 0x69eaf2fd : pad[16];
587 if (branch == 0)
589 pad[3] -= pad[0] ^ 0x185f3b0d;
590 pad[2] *= pad[3] + 0xd6863a6;
591 major_17 (pad, pad[14]);
595 static void major_5 (u32 *pad, u32 seed)
597 int branch = (pad[13] ^ pad[6] ^ pad[16]) & 15;
599 if (branch == 7)
601 minor_20;
602 pad[9] += ROL (pad[4], 9);
603 major_17 (pad, pad[15]);
606 pad[2] ^= pad[15] - 0xe09f62af;
608 if (branch == 15)
610 minor_31 (0x7);
611 pad[9] |= pad[7] ^ 0x2a19119f;
612 major_4 (pad, pad[10]);
615 if (branch == 14)
617 pad[9] ^= 0x19b844e;
618 pad[5] -= pad[15];
619 major_18 (pad, seed);
622 pad[5] += pad[8] * 0x49;
624 if (branch == 4)
626 pad[14] |= pad[3] ^ 0x4345732;
627 TRY (minor_8);
628 major_15 (pad, pad[19]);
631 if (branch == 1)
633 minor_27;
634 minor_17;
635 major_3 (pad, pad[4]);
638 seed += pad[16] < 0x4dfe57f8 ? pad[16] : pad[17];
640 if (branch == 2)
642 pad[13] *= 0x7ae310dc;
643 pad[12] ^= pad[15] - 0xf5cfde0;
644 major_21 (pad, pad[11]);
645 pad[13] *= ROR (pad[3], 5);
646 minor_20;
647 major_16 (pad, pad[10]);
650 pad[5] += pad[6] + 0xd5c1b299;
652 if (branch == 10)
654 pad[19] ^= my_cos (pad[9]) ? 0x57337b8 : pad[14];
655 pad[9] |= pad[7] ^ 0x2a19119f;
656 major_1 (pad, pad[10]);
659 if (branch == 12)
661 pad[16] += 0x203fdf50;
662 minor_20;
663 major_14 (pad, pad[8]);
666 pad[1] += my_sin (seed) ? 0xbabd3794 : seed;
668 if (branch == 6)
670 pad[4] ^= 0xca8e79ab;
671 pad[13] -= pad[1];
672 major_6 (pad, pad[14]);
675 if (branch == 3)
677 pad[13] += pad[15] < 0x137bffeb ? pad[15] : pad[11];
678 pad[2] ^= pad[15] << 5;
679 major_9 (pad, seed);
682 pad[3] |= my_cos (pad[3]) ? 0xbabd3794 : pad[17];
684 if (branch == 9)
686 minor_17;
687 pad[5] -= pad[15];
688 major_2 (pad, seed);
691 if (branch == 13)
693 ROREQ (pad[4], 0x2);
694 pad[4] -= pad[17] ^ 0x2217cf47;
695 major_17 (pad, seed);
698 seed ^= pad[2] * 0xb25bcc4d;
700 if (branch == 11)
702 pad[19] += 0x12b9e29d - pad[12];
703 pad[7] &= pad[13] ^ 0x21aaf758;
704 major_4 (pad, pad[17]);
707 if (branch == 0)
709 pad[12] ^= pad[15] - 0xf5cfde0;
710 minor_31 (0x7);
711 major_18 (pad, seed);
714 pad[8] += 0xf1030e9c - pad[12];
716 if (branch == 5)
718 pad[6] ^= 0xea99e155;
719 pad[19] += 0x12b9e29d - pad[12];
720 major_15 (pad, seed);
723 if (branch == 8)
725 pad[7] &= 0x710c48e8;
726 pad[2] *= pad[3] + 0xd6863a6;
727 major_3 (pad, pad[17]);
730 pad[15] += 0xa8f341c7 - pad[1];
732 if (branch == 0)
734 pad[2] *= pad[3] + 0xd6863a6;
735 pad[3] -= pad[0] ^ 0x185f3b0d;
736 major_21 (pad, seed);
739 if (branch == 1)
741 TRY (minor_3);
742 pad[12] *= pad[12];
743 major_16 (pad, pad[12]);
746 pad[6] *= pad[5] * 0x1d;
749 static void major_6 (u32 *pad, u32 seed)
751 int branch = pad[17] % 15;
753 if (branch == 0)
755 pad[13] += pad[15] < 0x137bffeb ? pad[15] : pad[11];
756 pad[13] *= 0x22dd951f;
757 major_24 (pad, pad[8]);
760 pad[11] -= my_sin (pad[9]) ? 0xe205322c : pad[7];
762 if (branch == 13)
764 TRY (ROREQ (pad[1], 0x4));
765 pad[12] ^= pad[15] - 0xf5cfde0;
766 major_19 (pad, pad[0]);
769 pad[10] -= pad[6] ^ 0x1289de2;
771 if (branch == 8)
773 ROREQ (pad[9], 10);
774 TRY (minor_13);
775 major_25 (pad, pad[4]);
778 if (branch == 5)
780 pad[13] *= 0x6a94c749;
781 pad[18] -= pad[13] ^ 0x154abcdf;
782 major_17 (pad, seed);
785 ROLEQ (pad[16], my_sqrt (pad[17]));
787 if (branch == 2)
789 pad[16] += 0x3f147441;
790 major_4 (pad, pad[16]);
793 pad[9] += my_sqrt (pad[3]);
795 if (branch == 14)
797 ROREQ (pad[9], 15);
798 pad[13] -= pad[1];
799 major_18 (pad, seed);
802 seed = pad[6] ^ seed ^ 0x202ab323;
804 if (branch == 9)
806 pad[5] += pad[0] ^ 0x3e17add3;
807 pad[4] -= pad[17] ^ 0x2217cf47;
808 major_15 (pad, pad[8]);
811 if (branch == 6)
813 pad[2] *= pad[3] + 0xd6863a6;
814 pad[6] += pad[19] - 0x3f5675d6;
815 major_3 (pad, pad[16]);
818 pad[15] ^= my_sqrt (pad[10]);
820 if (branch == 1)
822 TRY (minor_2 (0xb30d40d0));
823 pad[10] *= pad[10] - 0x5eae6bf;
824 major_21 (pad, pad[13]);
827 pad[0] -= pad[11] ^ 0x1284af29;
829 if (branch == 4)
831 pad[5] += pad[0] ^ 0x3e17add3;
832 minor_29;
833 major_16 (pad, pad[17]);
836 ROLEQ (seed, pad[11] * 0x10);
838 if (branch == 11)
840 pad[9] ^= 0x1d8f33a6;
841 TRY (minor_9 (0x13ee15c3));
842 major_1 (pad, pad[19]);
845 if (branch == 0)
847 TRY (minor_3);
848 pad[19] ^= my_cos (pad[9]) ? 0x57337b8 : pad[14];
849 major_14 (pad, pad[16]);
852 pad[9] |= pad[9] ^ 0x2ad7629;
854 if (branch == 10)
856 TRY (ROREQ (pad[1], 0xc));
857 TRY (minor_9 (0xe8869877));
858 major_24 (pad, seed);
861 pad[4] *= pad[12] * 0x4a237369;
863 if (branch == 12)
865 pad[9] += ROL (pad[4], 9);
866 TRY (minor_7);
867 major_19 (pad, pad[5]);
870 if (branch == 7)
872 pad[14] |= pad[3] ^ 0x4345732;
873 TRY (minor_9 (0xdd1ca541));
874 major_25 (pad, pad[1]);
877 seed *= pad[4] + 0x76e5a087;
879 if (branch == 3)
881 TRY (minor_5);
882 TRY (minor_1 (0x62f4d3c4));
883 major_17 (pad, seed);
887 static void major_7 (u32 *pad, u32 seed)
889 int branch = (pad[10] ^ pad[11] ^ pad[18]) & 15;
891 if (branch == 3)
893 minor_27;
894 TRY (minor_2 (0x54bcde17));
895 major_1 (pad, pad[14]);
898 if (branch == 9)
900 pad[7] &= pad[13] ^ 0x21aaf758;
901 pad[13] -= pad[1];
902 major_14 (pad, pad[12]);
905 pad[8] |= 0xc6ef5e80 + pad[1];
907 if (branch == 2)
909 pad[6] += pad[19] - 0x3f5675d6;
910 pad[6] += 0xfe07af0e - pad[3];
911 major_6 (pad, pad[16]);
914 if (branch == 5)
916 pad[5] -= pad[15];
917 pad[16] += 0x3fa3dc2f;
918 major_9 (pad, pad[5]);
921 if (branch == 1)
923 pad[13] += pad[15] < 0x137bffeb ? pad[15] : pad[11];
924 pad[14] |= pad[3] ^ 0x4345732;
925 major_2 (pad, pad[3]);
928 pad[15] -= 0xc6ef5e80 + pad[19];
930 if (branch == 4)
932 pad[2] ^= pad[15] << 5;
933 minor_28;
934 major_5 (pad, pad[7]);
937 if (branch == 1)
939 pad[0] += pad[6] * 0x3c;
940 minor_31 (0x15);
941 major_12 (pad, pad[16]);
944 if (branch == 9)
946 pad[5] += pad[0] ^ 0x3e17add3;
947 pad[9] &= 0x4bd89b02;
948 major_11 (pad, pad[19]);
951 seed -= pad[0] ^ 0x3b61016b;
953 if (branch == 4)
955 pad[5] -= pad[15];
956 TRY (minor_9 (0x1984a749));
957 major_13 (pad, pad[3]);
960 if (branch == 3)
962 pad[9] += ROL (pad[4], 9);
963 minor_28;
964 major_22 (pad, pad[4]);
967 if (branch == 7)
969 TRY (minor_3);
970 minor_31 (0xd);
971 major_8 (pad, pad[5]);
974 ROLEQ (pad[11], pad[10] ^ 0x1a);
976 if (branch == 8)
978 pad[18] -= pad[13] ^ 0x154abcdf;
979 pad[19] += 0x12b9e29d - pad[12];
980 major_10 (pad, seed);
983 if (branch == 14)
985 pad[19] += 0x12b9e29d - pad[12];
986 ROREQ (pad[9], 3);
987 major_1 (pad, seed);
990 seed -= pad[14] * 0xc02e189f;
992 if (branch == 0)
994 pad[6] ^= 0x94eaa20d;
995 minor_27;
996 major_14 (pad, pad[6]);
999 if (branch == 13)
1001 pad[12] += 0x2ac57dfa;
1002 pad[2] ^= pad[15] << 5;
1003 major_6 (pad, pad[4]);
1006 if (branch == 8)
1008 pad[18] *= pad[10] + 0x466e09cf;
1009 pad[13] -= pad[1];
1010 major_9 (pad, seed);
1013 pad[4] += 0xa207344d - seed;
1015 if (branch == 12)
1017 TRY (minor_2 (0x80a1da17));
1018 pad[13] *= 0xa02fe00;
1019 major_2 (pad, pad[3]);
1022 if (branch == 2)
1024 pad[13] *= 0x6aa5cc8c;
1025 pad[6] ^= 0xaefb322;
1026 major_5 (pad, pad[9]);
1029 if (branch == 0)
1031 minor_31 (0xb);
1032 pad[5] += pad[0] ^ 0x3e17add3;
1033 major_12 (pad, pad[5]);
1036 seed ^= pad[18] ^ 0xe6830c9;
1038 if (branch == 6)
1040 pad[9] |= pad[7] ^ 0x2a19119f;
1041 pad[7] &= pad[13] ^ 0x21aaf758;
1042 major_11 (pad, seed);
1045 if (branch == 7)
1047 pad[3] -= pad[0] ^ 0x185f3b0d;
1048 TRY (minor_2 (0xb11da063));
1049 major_13 (pad, pad[3]);
1052 if (branch == 15)
1054 minor_34;
1055 pad[4] ^= 0x41e634f6;
1056 major_22 (pad, pad[17]);
1059 pad[0] ^= my_sin (seed) ? 0x8b50cd51 : pad[8];
1061 if (branch == 11)
1063 minor_28;
1064 pad[2] ^= pad[15] << 5;
1065 major_8 (pad, seed);
1068 if (branch == 5)
1070 pad[9] += ROL (pad[4], 9);
1071 pad[7] &= pad[13] ^ 0x21aaf758;
1072 major_10 (pad, pad[16]);
1075 seed += pad[1] * 0x3e;
1077 if (branch == 6)
1079 minor_34;
1080 ROREQ (pad[4], 0x9);
1081 major_1 (pad, pad[12]);
1084 if (branch == 10)
1086 minor_22;
1087 pad[12] ^= pad[15] - 0xf5cfde0;
1088 major_14 (pad, seed);
1091 pad[1] ^= pad[2] & 0x3b627777;
1094 static void major_8 (u32 *pad, u32 seed)
1096 int branch = (pad[2] ^ seed ^ pad[17]) & 15;
1098 if (branch == 7)
1100 pad[13] -= pad[1];
1101 minor_26;
1102 major_21 (pad, seed);
1105 if (branch == 0)
1107 minor_35;
1108 TRY (minor_2 (0xe0b52e33));
1109 major_16 (pad, pad[15]);
1112 seed -= ROR (pad[2], 6);
1114 if (branch == 5)
1116 pad[4] ^= 0x9aa940f;
1117 pad[5] += pad[0] ^ 0x3e17add3;
1118 major_1 (pad, pad[12]);
1121 if (branch == 1)
1123 minor_22;
1124 minor_17;
1125 major_14 (pad, pad[1]);
1128 pad[12] -= pad[17] * 0x74;
1130 if (branch == 1)
1132 pad[12] += pad[6] + 0x21d7bf61;
1133 pad[13] *= ROR (pad[3], 5);
1134 major_6 (pad, pad[5]);
1137 if (branch == 14)
1139 pad[4] ^= 0x91ac407e;
1140 TRY (minor_7);
1141 major_9 (pad, seed);
1144 pad[3] ^= pad[7] + 0x137c9f7d;
1146 if (branch == 0)
1148 pad[7] &= pad[13] ^ 0x21aaf758;
1149 pad[2] ^= pad[15] << 5;
1150 major_2 (pad, pad[5]);
1153 if (branch == 4)
1155 pad[10] += 0x8958821;
1156 pad[16] += 0x3d2948e4;
1157 major_5 (pad, pad[4]);
1160 if (branch == 3)
1162 pad[3] -= pad[0] ^ 0x185f3b0d;
1163 pad[9] |= pad[7] ^ 0x2a19119f;
1164 major_12 (pad, pad[12]);
1167 pad[11] += pad[17] < 0xc9a31cd6 ? pad[17] : pad[4];
1169 if (branch == 4)
1171 pad[9] ^= 0x1c686298;
1172 pad[12] ^= pad[15] - 0xf5cfde0;
1173 major_11 (pad, pad[9]);
1176 if (branch == 13)
1178 pad[7] |= 0x378d3869;
1179 TRY (minor_13);
1180 major_13 (pad, pad[13]);
1183 seed *= pad[12] + 0xbd99f684;
1185 if (branch == 7)
1187 pad[6] += pad[19] - 0x3f5675d6;
1188 pad[19] ^= my_cos (pad[9]) ? 0x57337b8 : pad[14];
1189 major_22 (pad, seed);
1192 if (branch == 8)
1194 pad[13] *= 0x1dcee48b;
1195 minor_30;
1196 major_21 (pad, seed);
1199 pad[10] += 0xaa3373fc - pad[6];
1201 if (branch == 5)
1203 minor_31 (0xe);
1204 TRY (minor_1 (0xbc90d50));
1205 major_16 (pad, seed);
1208 if (branch == 15)
1210 pad[9] |= pad[7] ^ 0x2a19119f;
1211 pad[0] += pad[18] ^ 0x4ac16b8d;
1212 major_1 (pad, seed);
1215 if (branch == 6)
1217 minor_34;
1218 pad[2] ^= my_sin (pad[13]) ? 0xfd08092 : pad[10];
1219 major_14 (pad, seed);
1222 seed ^= pad[11] < 0xa4dda95a ? pad[11] : pad[2];
1224 if (branch == 6)
1226 pad[16] += 0x1a36972b;
1227 minor_17;
1228 major_6 (pad, pad[5]);
1231 if (branch == 12)
1233 TRY (minor_12 (0xb6571d3f));
1234 pad[0] += pad[6] * 0x3c;
1235 major_9 (pad, pad[9]);
1238 seed *= pad[14] + 0x9baa8db;
1240 if (branch == 9)
1242 TRY (minor_9 (0xe378a0ed));
1243 pad[5] += pad[0] ^ 0x3e17add3;
1244 major_2 (pad, pad[8]);
1247 if (branch == 11)
1249 TRY (minor_10 (0xbd149bd9));
1250 minor_32 (0x6476f303);
1251 major_5 (pad, seed);
1254 pad[17] += my_sqrt (pad[12]);
1256 if (branch == 10)
1258 pad[13] *= 0xa02fe00;
1259 pad[12] += pad[6] + 0x21d7bf61;
1260 major_12 (pad, pad[19]);
1263 if (branch == 3)
1265 pad[13] *= 0x111b84cd;
1266 minor_30;
1267 major_11 (pad, pad[2]);
1270 pad[7] ^= pad[9] * 0x27219096;
1272 if (branch == 2)
1274 pad[6] += pad[19] - 0x3f5675d6;
1275 pad[16] += 0xfe49a900;
1276 major_13 (pad, pad[15]);
1277 TRY (minor_6);
1278 pad[19] ^= my_cos (pad[9]) ? 0x57337b8 : pad[14];
1279 major_22 (pad, pad[19]);
1282 ROLEQ (pad[2], 0x6c0798b3 ^ seed);
1285 static void major_9 (u32 *pad, u32 seed)
1287 int branch = pad[8] & 15;
1289 if (branch == 10)
1291 minor_29;
1292 pad[7] &= pad[13] ^ 0x21aaf758;
1293 major_19 (pad, pad[0]);
1296 if (branch == 3)
1298 pad[16] += 0x45e88961;
1299 TRY (minor_8);
1300 major_25 (pad, pad[15]);
1303 if (branch == 8)
1305 TRY (minor_6);
1306 minor_22;
1307 major_17 (pad, pad[2]);
1310 pad[8] |= pad[9] * 0x6a;
1312 if (branch == 0)
1314 pad[7] &= 0x30004a24;
1315 pad[9] ^= pad[7] * 0x44;
1316 major_4 (pad, pad[11]);
1319 if (branch == 14)
1321 pad[13] += pad[15] < 0x137bffeb ? pad[15] : pad[11];
1322 TRY (minor_7);
1323 major_18 (pad, pad[13]);
1326 pad[10] &= pad[6] - 0x1286a10;
1328 if (branch == 12)
1330 pad[9] += ROL (pad[4], 9);
1331 TRY (minor_4);
1332 major_15 (pad, pad[17]);
1335 if (branch == 2)
1337 TRY (minor_8);
1338 minor_20;
1339 major_3 (pad, pad[13]);
1342 seed |= seed + 0x20029bc7;
1343 ROREQ (pad[14], ROL (seed, 8));
1345 if (branch == 9)
1347 pad[7] &= pad[13] ^ 0x21aaf758;
1348 minor_26;
1349 major_21 (pad, pad[5]);
1352 seed += 0x176cf052 - pad[12];
1354 if (branch == 15)
1356 pad[12] ^= pad[15] - 0xf5cfde0;
1357 pad[13] *= 0xa02fe00;
1358 major_16 (pad, seed);
1361 if (branch == 1)
1363 pad[13] *= ROR (pad[3], 5);
1364 pad[19] ^= my_cos (pad[9]) ? 0x57337b8 : pad[14];
1365 major_1 (pad, pad[17]);
1368 ROLEQ (pad[8], pad[4] | 0xf);
1370 if (branch == 5)
1372 pad[9] ^= pad[7] * 0x44;
1373 pad[7] &= 0x1df23f52;
1374 major_14 (pad, pad[6]);
1377 if (branch == 4)
1379 pad[5] -= pad[15];
1380 pad[6] ^= 0x851242df;
1381 major_6 (pad, seed);
1384 pad[13] *= pad[2] * 0x65;
1386 if (branch == 0)
1388 pad[14] |= pad[3] ^ 0x4345732;
1389 pad[13] += pad[15] < 0x137bffeb ? pad[15] : pad[11];
1390 major_19 (pad, pad[10]);
1393 if (branch == 6)
1395 minor_29;
1396 minor_22;
1397 major_25 (pad, seed);
1400 pad[11] |= ROR (pad[17], 29);
1402 if (branch == 13)
1404 pad[10] *= pad[10] - 0x5eae6bf;
1405 pad[16] += 0x5e01d54b;
1406 major_17 (pad, pad[18]);
1409 pad[17] &= seed * 0x30;
1411 if (branch == 7)
1413 minor_27;
1414 TRY (minor_12 (0x65ec261));
1415 major_4 (pad, pad[0]);
1418 if (branch == 11)
1420 pad[14] |= pad[3] ^ 0x4345732;
1421 pad[0] += pad[18] ^ 0x4ac16b8d;
1422 major_18 (pad, pad[16]);
1425 pad[13] |= pad[3] * 0x3e;
1428 static void major_10 (u32 *pad, u32 seed)
1430 int branch = (pad[4] ^ pad[12] ^ pad[17]) & 15;
1432 if (branch == 9)
1434 TRY (minor_12 (0x9febcd24));
1435 pad[7] &= 0x259cf308;
1436 major_16 (pad, pad[14]);
1439 if (branch == 4)
1441 pad[6] ^= 0xa7e6f9b9;
1442 pad[10] *= pad[10] - 0x5eae6bf;
1443 major_1 (pad, pad[2]);
1446 pad[9] += pad[11] < 0x3d7f80c ? pad[11] : pad[9];
1448 if (branch == 2)
1450 pad[12] += pad[6] + 0x21d7bf61;
1451 pad[14] |= pad[3] ^ 0x4345732;
1452 major_9 (pad, pad[1]);
1455 if (branch == 6)
1457 TRY (minor_10 (0xece6bfa0));
1458 pad[14] |= pad[3] ^ 0x4345732;
1459 major_14 (pad, seed);
1462 if (branch == 8)
1464 TRY (minor_7);
1465 pad[18] *= pad[10] + 0x466e09cf;
1466 major_6 (pad, pad[12]);
1469 pad[10] *= my_cos (seed) ? 0x16b578ee : pad[2];
1471 if (branch == 6)
1473 minor_19;
1474 minor_29;
1475 major_2 (pad, pad[10]);
1478 if (branch == 13)
1480 pad[9] ^= pad[7] * 0x44;
1481 minor_35;
1482 major_5 (pad, pad[10]);
1485 pad[17] += seed * 0x4d;
1487 if (branch == 1)
1489 minor_26;
1490 pad[19] ^= my_cos (pad[9]) ? 0x57337b8 : pad[14];
1491 major_12 (pad, seed);
1492 pad[19] ^= pad[15] ^ 0x3574ed3;
1493 pad[10] += 0x9f2550bd;
1494 major_13 (pad, seed);
1497 if (branch == 14)
1499 TRY (minor_8);
1500 minor_31 (0x7);
1501 major_11 (pad, pad[19]);
1504 ROLEQ (seed, pad[7] * 0xd);
1506 if (branch == 12)
1508 pad[9] &= 0x2f23cdc6;
1509 pad[10] *= pad[10] - 0x5eae6bf;
1510 major_22 (pad, pad[2]);
1513 if (branch == 3)
1515 minor_28;
1516 minor_26;
1517 major_8 (pad, pad[4]);
1518 pad[12] *= pad[12];
1519 TRY (minor_6);
1520 major_16 (pad, pad[18]);
1523 pad[4] += my_sin (pad[0]) ? 0x1873296 : pad[1];
1525 if (branch == 10)
1527 minor_26;
1528 TRY (minor_13);
1529 major_1 (pad, pad[8]);
1532 if (branch == 4)
1534 pad[12] *= 0xf44cb55;
1535 pad[16] += 0x75a864cf;
1536 major_14 (pad, pad[4]);
1539 pad[12] += 0x1c0bd6db - pad[11];
1541 if (branch == 2)
1543 pad[13] *= 0x17b441db;
1544 TRY (minor_12 (0x8951503f));
1545 major_9 (pad, pad[19]);
1548 if (branch == 7)
1550 TRY (minor_7);
1551 minor_26;
1552 major_6 (pad, pad[14]);
1555 if (branch == 11)
1557 pad[0] += pad[6] * 0x3c;
1558 pad[4] -= pad[17] ^ 0x2217cf47;
1559 major_2 (pad, pad[8]);
1562 pad[18] -= pad[6] * 0x2c;
1564 if (branch == 0)
1566 pad[13] *= 0x1855aabc;
1567 TRY (minor_3);
1568 major_12 (pad, seed);
1571 if (branch == 5)
1573 pad[18] *= pad[10] + 0x466e09cf;
1574 pad[9] ^= pad[7] * 0x44;
1575 major_11 (pad, pad[10]);
1578 if (branch == 7)
1580 pad[18] *= pad[10] + 0x466e09cf;
1581 minor_29;
1582 major_5 (pad, pad[15]);
1585 pad[6] ^= pad[16] ^ 0x354e354d;
1587 if (branch == 0)
1589 TRY (minor_8);
1590 minor_22;
1591 major_8 (pad, pad[8]);
1594 if (branch == 5)
1596 pad[6] += 0xfe07af0e - pad[3];
1597 pad[13] *= 0xa02fe00;
1598 major_16 (pad, pad[10]);
1601 if (branch == 8)
1603 pad[14] |= pad[3] ^ 0x4345732;
1604 minor_32 (0x8a0e1ad7);
1605 major_22 (pad, pad[8]);
1608 if (branch == 15)
1610 pad[9] |= pad[7] ^ 0x2a19119f;
1611 minor_28;
1612 major_13 (pad, seed);
1615 pad[3] += pad[13] + 0x3ba9c809;
1618 static void major_11 (u32 *pad, u32 seed)
1620 int branch = (pad[6] ^ seed ^ pad[14]) & 15;
1622 if (branch == 2)
1624 pad[19] ^= pad[15] ^ 0x3574ed3;
1625 pad[13] -= pad[1];
1626 major_18 (pad, pad[0]);
1629 if (branch == 0)
1631 pad[7] ^= 0x414517ea;
1632 TRY (minor_4);
1633 major_15 (pad, pad[13]);
1636 pad[14] &= seed * 0x3f;
1638 if (branch == 10)
1640 minor_19;
1641 pad[9] &= 0x38063558;
1642 major_3 (pad, pad[10]);
1645 if (branch == 15)
1647 minor_34;
1648 pad[12] += 0x5c1481dd;
1649 major_21 (pad, pad[11]);
1652 ROREQ (pad[10], pad[14] * 0x13);
1654 if (branch == 8)
1656 pad[19] ^= my_cos (pad[9]) ? 0x57337b8 : pad[14];
1657 pad[12] ^= pad[15] - 0xf5cfde0;
1658 major_16 (pad, seed);
1661 if (branch == 4)
1663 pad[3] -= pad[0] ^ 0x185f3b0d;
1664 pad[6] ^= 0xa8115127;
1665 major_1 (pad, pad[5]);
1668 pad[11] ^= seed - 0x3c17609c;
1670 if (branch == 1)
1672 pad[12] += pad[6] ^ 0x211f5e40;
1673 minor_29;
1674 major_14 (pad, seed);
1677 if (branch == 7)
1679 ROREQ (pad[9], 11);
1680 TRY (minor_3);
1681 major_6 (pad, pad[11]);
1684 pad[14] += my_sin (pad[9]) ? 0x2d3f1771 : pad[11];
1686 if (branch == 5)
1688 TRY (minor_8);
1689 pad[0] += pad[18] ^ 0x4ac16b8d;
1690 major_9 (pad, pad[9]);
1693 if (branch == 2)
1695 pad[12] *= 0xf44cb55;
1696 minor_31 (0x1f);
1697 major_2 (pad, pad[13]);
1700 if (branch == 1)
1702 pad[9] &= 0x3f34e168;
1703 pad[18] *= pad[10] + 0x466e09cf;
1704 major_5 (pad, seed);
1707 pad[18] &= pad[17] + 0x21012257;
1709 if (branch == 14)
1711 pad[6] += 0xfe07af0e - pad[3];
1712 TRY (minor_2 (0x51f9a91a));
1713 major_12 (pad, pad[14]);
1716 if (branch == 12)
1718 pad[14] |= pad[3] ^ 0x4345732;
1719 pad[16] += 0x485c892b;
1720 major_18 (pad, pad[12]);
1723 pad[19] &= pad[10] ^ 0x6fc516d5;
1725 if (branch == 6)
1727 TRY (minor_5);
1728 pad[12] += pad[6] ^ 0x211f5e40;
1729 major_15 (pad, pad[13]);
1732 if (branch == 11)
1734 TRY (minor_6);
1735 minor_28;
1736 major_3 (pad, seed);
1739 pad[8] ^= pad[11] * 0x7b;
1741 if (branch == 4)
1743 pad[2] *= pad[3] + 0xd6863a6;
1744 minor_26;
1745 major_21 (pad, pad[4]);
1748 if (branch == 3)
1750 pad[19] ^= pad[15] ^ 0x3574ed3;
1751 minor_17;
1752 major_16 (pad, pad[9]);
1755 pad[0] += pad[13] + 0x88a77a94;
1757 if (branch == 0)
1759 TRY (minor_2 (0xf10f9d87));
1760 pad[12] ^= pad[15] - 0xf5cfde0;
1761 major_1 (pad, pad[15]);
1764 if (branch == 9)
1766 pad[13] -= pad[1];
1767 pad[2] ^= my_sin (pad[13]) ? 0xfd08092 : pad[10];
1768 major_14 (pad, pad[18]);
1771 seed *= pad[8] - 0x44260e37;
1773 if (branch == 3)
1775 minor_26;
1776 pad[10] += 0x8958821;
1777 major_6 (pad, pad[8]);
1780 if (branch == 13)
1782 pad[0] += pad[18] ^ 0x4ac16b8d;
1783 pad[7] ^= 0x129d6c5e;
1784 major_9 (pad, seed);
1787 pad[2] &= ROL (pad[19], 14);
1790 static void major_12 (u32 *pad, u32 seed)
1792 int branch = (pad[7] ^ seed ^ pad[18]) & 15;
1794 if (branch == 15)
1796 TRY (minor_7);
1797 pad[13] += pad[15] < 0x137bffeb ? pad[15] : pad[11];
1798 major_4 (pad, pad[17]);
1801 pad[8] |= seed + 0xe43fc6b;
1803 if (branch == 1)
1805 minor_32 (0x979304f6);
1806 minor_26;
1807 major_18 (pad, pad[6]);
1810 if (branch == 8)
1812 minor_20;
1813 TRY (minor_12 (0xf7131053));
1814 major_15 (pad, pad[13]);
1817 pad[19] ^= seed * 0x4b;
1819 if (branch == 1)
1821 pad[13] *= 0x85695585;
1822 pad[13] *= 0x2c9514d7;
1823 major_3 (pad, pad[17]);
1826 if (branch == 10)
1828 pad[9] |= pad[7] ^ 0x2a19119f;
1829 TRY (minor_1 (0x433a0094));
1830 major_21 (pad, pad[8]);
1833 pad[1] ^= pad[14] * 0x16;
1835 if (branch == 0)
1837 pad[13] *= 0x136644be;
1838 TRY (minor_6);
1839 major_16 (pad, pad[14]);
1842 pad[7] |= seed ^ 0xe857063;
1844 if (branch == 4)
1846 pad[18] -= pad[13] ^ 0x154abcdf;
1847 pad[12] += 0xf894616a;
1848 major_1 (pad, pad[6]);
1851 if (branch == 9)
1853 TRY (minor_3);
1854 pad[7] &= 0x3b887f26;
1855 major_14 (pad, pad[7]);
1858 ROREQ (pad[6], pad[9] * 0x8413f1b6);
1860 if (branch == 3)
1862 TRY (minor_9 (0xcd88ea76));
1863 TRY (minor_8);
1864 major_6 (pad, pad[19]);
1867 if (branch == 13)
1869 ROREQ (pad[9], 5);
1870 TRY (ROREQ (pad[1], 0x8));
1871 major_9 (pad, pad[1]);
1874 pad[6] -= pad[17] < 0x417e2f7b ? pad[17] : pad[19];
1876 if (branch == 5)
1878 pad[9] |= pad[7] ^ 0x2a19119f;
1879 minor_19;
1880 major_2 (pad, pad[1]);
1883 if (branch == 12)
1885 pad[13] -= pad[1];
1886 pad[0] += pad[6] * 0x3c;
1887 major_5 (pad, pad[7]);
1890 pad[6] |= my_sqrt (seed);
1892 if (branch == 2)
1894 pad[2] ^= pad[15] << 5;
1895 pad[7] &= pad[13] ^ 0x21aaf758;
1896 major_4 (pad, seed);
1899 pad[2] ^= pad[8] + 0x3e85747b;
1901 if (branch == 0)
1903 minor_20;
1904 pad[9] &= 0x5a61aa8d;
1905 major_18 (pad, pad[14]);
1908 if (branch == 11)
1910 pad[6] += 0xfe07af0e - pad[3];
1911 minor_32 (0xbf47f027);
1912 major_15 (pad, pad[3]);
1915 pad[2] &= seed;
1917 if (branch == 3)
1919 pad[13] *= 0xc9cf079;
1920 pad[18] -= pad[13] ^ 0x154abcdf;
1921 major_3 (pad, pad[4]);
1924 if (branch == 7)
1926 pad[12] ^= pad[15] - 0xf5cfde0;
1927 TRY (minor_4);
1928 major_21 (pad, pad[14]);
1931 seed += pad[9] - 0xbc1b5d9;
1933 if (branch == 14)
1935 TRY (minor_8);
1936 pad[9] ^= pad[7] * 0x44;
1937 major_16 (pad, seed);
1940 pad[18] += pad[11] * 0x5b;
1942 if (branch == 2)
1944 pad[7] &= pad[13] ^ 0x21aaf758;
1945 minor_17;
1946 major_1 (pad, pad[1]);
1949 if (branch == 6)
1951 pad[2] ^= pad[15] << 5;
1952 pad[18] -= pad[13] ^ 0x154abcdf;
1953 major_14 (pad, seed);
1956 pad[4] ^= pad[4] - 0xe87fd622;
1959 static void major_13 (u32 *pad, u32 seed)
1961 int branch = (pad[4] ^ seed ^ pad[18]) & 15;
1963 if (branch == 12)
1965 minor_29;
1966 pad[9] |= pad[7] ^ 0x2a19119f;
1967 major_15 (pad, pad[11]);
1970 if (branch == 4)
1972 ROREQ (pad[9], 10);
1973 pad[12] ^= pad[15] - 0xf5cfde0;
1974 major_3 (pad, seed);
1977 seed ^= pad[1] * 0x6c;
1979 if (branch == 1)
1981 TRY (minor_12 (0xad86172c));
1982 pad[12] ^= pad[15] - 0xf5cfde0;
1983 major_21 (pad, pad[7]);
1986 if (branch == 9)
1988 pad[0] += pad[6] * 0x3c;
1989 pad[9] &= 0xa2cc0e51;
1990 major_16 (pad, pad[10]);
1993 pad[11] += pad[8] - 0xef3b680;
1995 if (branch == 5)
1997 minor_20;
1998 pad[2] ^= my_sin (pad[13]) ? 0xfd08092 : pad[10];
1999 major_1 (pad, seed);
2002 if (branch == 2)
2004 pad[12] += 0x1f3bc7f4;
2005 pad[9] += ROL (pad[4], 9);
2006 major_14 (pad, pad[3]);
2009 pad[19] -= seed ^ 0x42b04005;
2011 if (branch == 8)
2013 TRY (minor_13);
2014 pad[0] += pad[18] ^ 0x4ac16b8d;
2015 major_6 (pad, pad[2]);
2018 if (branch == 3)
2020 TRY (minor_13);
2021 minor_17;
2022 major_9 (pad, seed);
2025 pad[0] += my_sqrt (pad[16]);
2027 if (branch == 11)
2029 pad[12] ^= pad[15] - 0xf5cfde0;
2030 ROREQ (pad[4], 0x19);
2031 major_2 (pad, pad[19]);
2034 if (branch == 13)
2036 TRY (minor_4);
2037 minor_26;
2038 major_5 (pad, pad[7]);
2041 seed += pad[17] | 0xead7ac4a;
2043 if (branch == 1)
2045 TRY (minor_1 (0xd3280a0));
2046 pad[7] ^= 0x3eb9d37;
2047 major_12 (pad, pad[12]);
2050 if (branch == 14)
2052 minor_28;
2053 minor_31 (0x1f);
2054 major_11 (pad, seed);
2057 ROREQ (pad[2], pad[15] < 0x3f2998c ? pad[15] : seed);
2059 if (branch == 5)
2061 TRY (minor_12 (0x2dd0e73));
2062 minor_26;
2063 major_15 (pad, seed);
2066 if (branch == 3)
2068 TRY (minor_9 (0x21602b81));
2069 pad[13] *= 0x52fa4a96;
2070 major_3 (pad, seed);
2073 pad[4] += pad[2] ^ 0x1579499;
2075 if (branch == 10)
2077 TRY (minor_7);
2078 pad[5] += pad[0] ^ 0x3e17add3;
2079 major_21 (pad, pad[5]);
2082 if (branch == 0)
2084 TRY (minor_5);
2085 pad[0] += pad[6] * 0x3c;
2086 major_16 (pad, pad[8]);
2089 seed -= pad[2] * 0x74;
2091 if (branch == 0)
2093 pad[13] -= pad[1];
2094 pad[19] ^= pad[15] ^ 0x3574ed3;
2095 major_1 (pad, seed);
2098 if (branch == 15)
2100 pad[9] &= 0x334ce7cf;
2101 TRY (minor_10 (0xbcbc7bb));
2102 major_14 (pad, seed);
2105 pad[10] -= pad[10] | 0xae9eedbf;
2107 if (branch == 6)
2109 TRY (minor_3);
2110 TRY (minor_6);
2111 major_6 (pad, pad[11]);
2114 if (branch == 4)
2116 pad[2] ^= my_sin (pad[13]) ? 0xfd08092 : pad[10];
2117 pad[13] *= 0x9f7e2a0;
2118 major_9 (pad, pad[19]);
2121 seed += pad[17] ^ 0xae9eedbf;
2123 if (branch == 7)
2125 TRY (minor_8);
2126 pad[18] *= pad[10] + 0x466e09cf;
2127 major_2 (pad, pad[8]);
2130 if (branch == 2)
2132 TRY (minor_3);
2133 pad[9] |= pad[7] ^ 0x2a19119f;
2134 major_5 (pad, pad[18]);
2137 pad[16] -= pad[11] < 0x1e7d86ee ? pad[11] : seed;
2140 static void major_14 (u32 *pad, u32 seed)
2142 int branch = (pad[8] ^ seed ^ pad[11]) % 14;
2144 if (branch == 0)
2146 TRY (minor_1 (0xe32bdca0));
2147 minor_30;
2148 major_23 (pad, pad[19]);
2151 seed -= seed ^ 0xf74450ff;
2153 if (branch == 1)
2155 minor_32 (0x788c78a4);
2156 pad[13] -= pad[1];
2157 major_24 (pad, seed);
2160 pad[13] -= my_cos (pad[3]) ? 0xf74450ff : pad[4];
2162 if (branch == 9)
2164 pad[9] |= pad[7] ^ 0x2a19119f;
2165 ROREQ (pad[9], 11);
2166 major_19 (pad, seed);
2169 pad[9] ^= pad[6] * 0x59;
2171 if (branch == 7)
2173 minor_26;
2174 pad[6] += 0xfe07af0e - pad[3];
2175 major_25 (pad, pad[11]);
2178 if (branch == 8)
2180 pad[13] -= pad[1];
2181 pad[4] ^= 0xb949718c;
2182 major_17 (pad, pad[7]);
2185 pad[1] ^= my_sin (seed) ? 0xc90f1504 : pad[17];
2187 if (branch == 13)
2189 pad[9] &= 0x59d432be;
2190 pad[18] -= pad[13] ^ 0x154abcdf;
2191 major_4 (pad, pad[4]);
2194 pad[17] += pad[13] < 0xac24eb8 ? pad[13] : pad[9];
2196 if (branch == 5)
2198 pad[4] ^= 0x3bcc51a7;
2199 pad[12] += 0x4ec6cf36;
2200 major_18 (pad, pad[1]);
2203 seed |= ROR (pad[18], 11);
2205 if (branch == 3)
2207 minor_20;
2208 pad[5] -= pad[15];
2209 major_15 (pad, pad[0]);
2212 pad[4] += seed + 0xf65efbd;
2214 if (branch == 10)
2216 TRY (minor_5);
2217 pad[2] *= pad[3] + 0xd6863a6;
2218 major_3 (pad, pad[5]);
2221 if (branch == 11)
2223 pad[7] &= 0xdf76eba8;
2224 TRY (minor_6);
2225 major_21 (pad, seed);
2228 pad[4] ^= ROL (pad[8], 22);
2230 if (branch == 6)
2232 TRY (minor_10 (0xec30bd82));
2233 pad[2] *= pad[3] + 0xd6863a6;
2234 major_16 (pad, pad[13]);
2237 seed *= pad[6] + 0x6bbeb974;
2239 if (branch == 2)
2241 pad[18] *= pad[10] + 0x466e09cf;
2242 pad[2] *= pad[3] + 0xd6863a6;
2243 major_1 (pad, pad[6]);
2246 pad[16] -= pad[2] * 0x65a10fa8;
2248 if (branch == 12)
2250 pad[19] ^= pad[15] ^ 0x3574ed3;
2251 ROREQ (pad[9], 15);
2252 major_23 (pad, pad[14]);
2255 ROREQ (pad[13], my_sqrt (seed));
2257 if (branch == 4)
2259 minor_19;
2260 minor_17;
2261 major_24 (pad, pad[0]);
2264 if (branch == 0)
2266 pad[7] ^= 0xc9d1f4a2;
2267 minor_26;
2268 major_19 (pad, seed);
2271 pad[12] -= my_sin (pad[10]) ? 0x2818ae3c : seed;
2274 static void major_15 (u32 *pad, u32 seed)
2276 int branch = (pad[17] ^ seed ^ pad[19]) % 9;
2278 ROREQ (pad[19], pad[19] + 0xa);
2280 if (branch == 4)
2282 minor_19;
2283 pad[6] ^= 0xf4c1a1c8;
2284 minor_37 (pad);
2287 pad[5] ^= seed + 0x1ff8749d;
2289 if (branch == 5)
2291 ROREQ (pad[4], 0x19);
2292 pad[9] += ROL (pad[4], 9);
2293 minor_36 (pad);
2296 pad[13] ^= pad[15] + 0x19ad9d3;
2298 if (branch == 0)
2300 pad[14] |= pad[3] ^ 0x4345732;
2301 minor_26;
2302 major_23 (pad, pad[13]);
2305 ROREQ (pad[3], my_sqrt (pad[9]));
2307 if (branch == 1)
2309 pad[16] += 0x188ae78f;
2310 pad[2] ^= pad[15] << 5;
2311 major_24 (pad, pad[12]);
2314 seed ^= pad[12] ^ 0x82494ea7;
2316 if (branch == 0)
2318 pad[14] |= pad[3] ^ 0x4345732;
2319 pad[7] &= 0x97ea531;
2320 major_19 (pad, pad[6]);
2323 ROLEQ (pad[0], 0x82494ea7 & seed);
2325 if (branch == 7)
2327 minor_20;
2328 TRY (minor_9 (0xd3d79cb4));
2329 major_25 (pad, pad[6]);
2332 pad[18] ^= pad[9] - 0x5606038;
2334 if (branch == 3)
2336 pad[13] += pad[15] < 0x137bffeb ? pad[15] : pad[11];
2337 pad[16] += 0x6a07a3d0;
2338 major_17 (pad, pad[8]);
2341 pad[9] |= my_sin (pad[7]) ? 0x3ec62d23 : pad[6];
2343 if (branch == 2)
2345 pad[18] *= pad[10] + 0x466e09cf;
2346 TRY (minor_6);
2347 major_4 (pad, pad[1]);
2350 if (branch == 6)
2352 minor_27;
2353 minor_22;
2354 major_18 (pad, pad[0]);
2358 static void major_16 (u32 *pad, u32 seed)
2360 int branch = (pad[11] ^ seed ^ pad[5]) % 12;
2362 if (branch == 5)
2364 pad[2] *= pad[3] + 0xd6863a6;
2365 minor_22;
2366 minor_37 (pad);
2369 pad[4] ^= seed - 0xafd4eac;
2371 if (branch == 2)
2373 TRY (minor_5);
2374 pad[0] += pad[18] ^ 0x4ac16b8d;
2375 minor_36 (pad);
2378 pad[15] -= 0xafd4eac ^ seed;
2380 if (branch == 0)
2382 TRY (minor_2 (0x80e3e69e));
2383 ROREQ (pad[9], 12);
2384 major_23 (pad, pad[4]);
2387 pad[8] ^= my_sqrt (pad[16]);
2389 if (branch == 3)
2391 pad[9] ^= 0x8e61a4f;
2392 pad[13] -= pad[1];
2393 major_24 (pad, seed);
2396 if (branch == 10)
2398 pad[6] += pad[19] - 0x3f5675d6;
2399 pad[13] *= 0xa02fe00;
2400 major_19 (pad, pad[6]);
2403 if (branch == 4)
2405 TRY (minor_8);
2406 TRY (minor_5);
2407 major_25 (pad, pad[0]);
2410 pad[8] ^= pad[15] * 0x5f;
2412 if (branch == 0)
2414 minor_32 (0x6191efec);
2415 pad[13] += pad[15] < 0x137bffeb ? pad[15] : pad[11];
2416 major_17 (pad, pad[9]);
2419 seed -= seed & 0x179da692;
2420 pad[6] &= my_sin (seed) ? 0xcc35b823 : pad[14];
2422 if (branch == 9)
2424 pad[6] += 0xfe07af0e - pad[3];
2425 pad[0] += pad[18] ^ 0x4ac16b8d;
2426 major_4 (pad, pad[0]);
2429 if (branch == 6)
2431 pad[7] |= 0xa885099;
2432 pad[9] ^= 0xdd34e6b;
2433 major_18 (pad, seed);
2436 if (branch == 7)
2438 pad[12] += 0x5e6f4861;
2439 pad[18] -= pad[13] ^ 0x154abcdf;
2440 major_15 (pad, pad[14]);
2443 pad[10] += pad[1] + 0x217f7a00;
2445 if (branch == 1)
2447 pad[0] += pad[18] ^ 0x4ac16b8d;
2448 minor_27;
2449 major_3 (pad, pad[17]);
2452 pad[5] &= ROR (pad[0], 14);
2454 if (branch == 8)
2456 pad[2] *= pad[3] + 0xd6863a6;
2457 pad[9] ^= pad[7] * 0x44;
2458 major_21 (pad, pad[13]);
2461 if (branch == 11)
2463 minor_30;
2464 pad[13] += pad[15] < 0x137bffeb ? pad[15] : pad[11];
2465 minor_37 (pad);
2468 pad[12] |= ROL (pad[7], 14);
2471 static void major_17 (u32 *pad, u32 seed)
2473 int branch = (pad[8] ^ pad[7] ^ pad[12]) % 6;
2475 pad[1] |= pad[4] ^ 0x10104d4;
2477 if (branch == 3)
2479 minor_20;
2480 ROREQ (pad[9], 12);
2481 minor_37 (pad);
2484 seed = ((seed ^ 0x1ea9da8) + seed) * pad[18] * 0xd;
2486 if (branch == 0)
2488 TRY (minor_1 (0x10381ff0));
2489 pad[2] *= pad[3] + 0xd6863a6;
2490 minor_36 (pad);
2493 pad[14] += pad[12] * 0x19;
2494 pad[2] -= my_sqrt (pad[5]);
2496 if (branch == 4)
2498 pad[16] += 0x81063b22;
2499 pad[9] ^= pad[7] * 0x44;
2500 major_23 (pad, seed);
2503 pad[6] &= pad[4] - 0x679dca37;
2504 pad[1] ^= pad[16] + 0x988db31;
2506 if (branch == 0)
2508 pad[7] ^= 0xa98896dd;
2509 TRY (minor_3);
2510 major_24 (pad, pad[6]);
2513 pad[6] += ROR (seed, 10);
2514 seed -= pad[0] < 0x29ea2cb6 ? pad[0] : pad[3];
2516 if (branch == 2)
2518 minor_35;
2519 pad[12] ^= pad[15] - 0xf5cfde0;
2520 major_19 (pad, seed);
2523 seed *= my_sqrt (seed);
2524 pad[5] *= my_cos (seed) ? 0x211af3c8 : pad[19];
2526 if (branch == 5)
2528 minor_28;
2529 pad[13] *= 0xa02fe00;
2530 major_25 (pad, pad[13]);
2534 static void major_18 (u32 *pad, u32 seed)
2536 int branch = (pad[14] ^ pad[11] ^ pad[17]) & 7;
2538 pad[11] ^= ROR (pad[13], 21);
2540 if (branch == 5)
2542 pad[6] += pad[19] - 0x3f5675d6;
2543 pad[9] ^= 0x94d017f;
2544 minor_37 (pad);
2547 ROREQ (pad[3], pad[16] * 0xf);
2549 if (branch == 2)
2551 pad[5] += pad[0] ^ 0x3e17add3;
2552 minor_34;
2553 minor_36 (pad);
2556 pad[11] -= my_sqrt (pad[9]);
2557 pad[12] += 0x17267c5b - pad[11];
2559 if (branch == 3)
2561 minor_31 (0xb);
2562 pad[7] &= pad[13] ^ 0x21aaf758;
2563 major_23 (pad, pad[0]);
2566 pad[17] ^= seed ^ 0x35eddea4;
2568 if (branch == 0)
2570 pad[10] += 0x3409139c;
2571 pad[19] ^= my_cos (pad[9]) ? 0x57337b8 : pad[14];
2572 major_24 (pad, pad[6]);
2575 pad[6] *= pad[17] + 0xb89b51c;
2577 if (branch == 1)
2579 pad[6] += 0xfe07af0e - pad[3];
2580 TRY (minor_2 (0x90254266));
2581 major_19 (pad, pad[6]);
2584 pad[19] ^= pad[3] < 0x5755f00e ? pad[3] : pad[1];
2585 pad[15] ^= pad[12] * 0x17;
2587 if (branch == 7)
2589 pad[13] *= ROR (pad[3], 5);
2590 pad[13] *= ROR (pad[3], 5);
2591 major_25 (pad, pad[9]);
2594 pad[10] += 0x395f1d29 - seed;
2596 if (branch == 0)
2598 pad[12] += 0x2272516f;
2599 pad[13] *= 0x48e3e7ac;
2600 major_17 (pad, pad[16]);
2603 ROLEQ (pad[1], ROL (pad[8], 20));
2604 seed -= pad[9] ^ 0xc9c0bd95;
2606 if (branch == 6)
2608 TRY (minor_2 (0x10b4eaef));
2609 pad[12] += 0x222fe8f5;
2610 major_4 (pad, seed);
2613 ROLEQ (pad[18], pad[7] & 0x11);
2616 static void major_19 (u32 *pad, u32 seed)
2618 int branch = (pad[18] ^ pad[6] ^ pad[15]) & 3;
2620 seed *= pad[15] * 0x3c02927;
2621 ROREQ (seed, seed * 0x7);
2623 if (branch == 0)
2625 pad[12] += pad[6] ^ 0x211f5e40;
2626 pad[9] ^= 0x6b4bfbe3;
2627 minor_37 (pad);
2630 seed ^= pad[6] ^ 0xc1fcda0;
2631 pad[5] -= my_cos (pad[6]) ? 0xb9269bb0 : pad[10];
2633 if (branch == 0)
2635 pad[9] ^= 0x703e6c86;
2636 pad[16] += 0xbb78136d;
2637 minor_36 (pad);
2640 seed *= pad[19] + 0x11500e47;
2641 pad[3] ^= ROL (pad[4], 20);
2643 if (branch == 3)
2645 pad[2] ^= pad[15] << 5;
2646 pad[19] ^= pad[15] ^ 0x3574ed3;
2647 major_23 (pad, pad[15]);
2650 pad[13] -= my_sqrt (seed);
2651 ROREQ (seed, my_cos (seed) ? 7 : pad[10]);
2652 pad[16] = pad[15] * pad[16] * 0x4a;
2654 if (branch == 1)
2656 pad[7] ^= 0xb3bb63f;
2657 pad[4] -= pad[17] ^ 0x2217cf47;
2658 major_24 (pad, seed);
2662 static void major_21 (u32 *pad, u32 seed)
2664 int branch = (pad[1] ^ pad[0] ^ pad[16]) % 11;
2666 if (branch == 2)
2668 pad[2] *= pad[3] + 0xd6863a6;
2669 pad[12] ^= pad[15] - 0xf5cfde0;
2670 minor_37 (pad);
2673 pad[5] -= seed;
2675 if (branch == 8)
2677 pad[16] += 0x2b058ae8;
2678 pad[6] += 0xfe07af0e - pad[3];
2679 minor_36 (pad);
2682 pad[17] ^= ROL (pad[18], 28);
2684 if (branch == 4)
2686 pad[2] *= pad[3] + 0xd6863a6;
2687 minor_32 (0x79fb5201);
2688 major_23 (pad, pad[7]);
2691 pad[0] ^= my_sqrt (pad[12]);
2693 if (branch == 0)
2695 pad[19] ^= pad[15] ^ 0x3574ed3;
2696 TRY (minor_5);
2697 major_24 (pad, pad[2]);
2700 pad[10] ^= seed * 0x6c;
2702 if (branch == 9)
2704 pad[2] ^= my_sin (pad[13]) ? 0xfd08092 : pad[10];
2705 minor_32 (0x6ddf8c10);
2706 major_19 (pad, pad[10]);
2709 pad[8] -= my_cos (pad[12]) ? 0x8759908e : seed;
2711 if (branch == 7)
2713 minor_19;
2714 minor_29;
2715 major_25 (pad, pad[1]);
2718 seed ^= my_sin (seed) ? 0x2c99fade : pad[14];
2720 if (branch == 1)
2722 TRY (minor_12 (0x3fcf3163));
2723 pad[9] ^= pad[7] * 0x44;
2724 major_17 (pad, seed);
2727 pad[15] += my_cos (pad[11]) ? 0x1bec01f : seed;
2729 if (branch == 5)
2731 pad[13] *= 0x1bd5157f;
2732 pad[6] += pad[19] - 0x3f5675d6;
2733 major_4 (pad, pad[15]);
2736 ROREQ (pad[1], 0x80d9edac * pad[16]);
2738 if (branch == 0)
2740 TRY (minor_10 (0xfde30e03));
2741 pad[9] |= pad[7] ^ 0x2a19119f;
2742 major_18 (pad, seed);
2745 pad[7] &= pad[15] * 0xa8f285;
2747 if (branch == 10)
2749 pad[7] ^= 0xef011757;
2750 ROREQ (pad[9], 9);
2751 major_15 (pad, pad[13]);
2754 if (branch == 3)
2756 pad[12] += pad[6] + 0x21d7bf61;
2757 pad[6] += pad[19] - 0x3f5675d6;
2758 major_3 (pad, pad[10]);
2761 pad[3] *= my_sin (pad[8]) ? 0x5b51fb19 : pad[2];
2763 if (branch == 6)
2765 pad[9] += ROL (pad[4], 9);
2766 minor_22;
2767 minor_37 (pad);
2770 pad[11] ^= pad[17] * 0x44;
2773 static void major_22 (u32 *pad, u32 seed)
2775 int branch = (pad[5] ^ pad[0] ^ seed) & 15;
2777 if (branch == 3)
2779 TRY (minor_6);
2780 minor_31 (0x13);
2781 major_3 (pad, seed);
2784 if (branch == 0)
2786 pad[6] ^= 0x6066818c;
2787 pad[13] -= pad[1];
2788 major_21 (pad, pad[2]);
2791 pad[14] ^= ROL (pad[16], 22);
2793 if (branch == 12)
2795 pad[10] += 0x830ba927;
2796 minor_32 (0x6f3a3876);
2797 major_16 (pad, pad[8]);
2800 if (branch == 1)
2802 minor_34;
2803 pad[16] += 0x1bc7b861;
2804 major_1 (pad, pad[6]);
2807 pad[12] ^= pad[11] < 0x521b2180 ? pad[11] : pad[9];
2809 if (branch == 1)
2811 minor_31 (0x12);
2812 pad[0] += pad[6] * 0x3c;
2813 major_14 (pad, pad[15]);
2816 if (branch == 8)
2818 TRY (minor_5);
2819 pad[18] *= pad[10] + 0x466e09cf;
2820 major_6 (pad, pad[13]);
2823 if (branch == 4)
2825 pad[9] += ROL (pad[4], 9);
2826 pad[2] *= pad[3] + 0xd6863a6;
2827 major_9 (pad, pad[16]);
2830 pad[18] &= my_sqrt (pad[9]);
2832 if (branch == 5)
2834 TRY (minor_4);
2835 pad[2] ^= pad[15] << 5;
2836 major_2 (pad, pad[2]);
2839 if (branch == 6)
2841 pad[2] *= pad[3] + 0xd6863a6;
2842 pad[6] += 0xfe07af0e - pad[3];
2843 major_5 (pad, pad[14]);
2846 pad[18] -= pad[16] * 0x77;
2848 if (branch == 9)
2850 pad[4] ^= 0xa09619f7;
2851 ROREQ (pad[4], 0x19);
2852 major_12 (pad, pad[10]);
2855 if (branch == 10)
2857 pad[12] ^= pad[15] - 0xf5cfde0;
2858 pad[13] *= 0x6cd0251e;
2859 major_11 (pad, pad[0]);
2862 if (branch == 6)
2864 pad[2] *= pad[3] + 0xd6863a6;
2865 ROREQ (pad[4], 0x1a);
2866 major_13 (pad, seed);
2869 pad[13] ^= 0x4930de03 ^ seed;
2871 if (branch == 2)
2873 pad[10] += 0x6467451;
2874 pad[4] -= pad[17] ^ 0x2217cf47;
2875 major_3 (pad, pad[2]);
2878 if (branch == 7)
2880 pad[4] -= pad[17] ^ 0x2217cf47;
2881 pad[0] += pad[18] ^ 0x4ac16b8d;
2882 major_21 (pad, pad[0]);
2885 pad[6] -= my_sqrt (pad[10]);
2887 if (branch == 3)
2889 TRY (minor_9 (0x5b9d1f9));
2890 pad[10] += 0x8958821;
2891 major_16 (pad, pad[8]);
2894 if (branch == 4)
2896 pad[13] -= pad[1];
2897 pad[13] *= 0x72494c9c;
2898 major_1 (pad, seed);
2901 if (branch == 13)
2903 pad[12] += pad[6] + 0x21d7bf61;
2904 pad[13] *= ROR (pad[3], 5);
2905 major_14 (pad, pad[2]);
2908 seed -= ROR (pad[8], 17);
2910 if (branch == 15)
2912 pad[19] += 0x12b9e29d - pad[12];
2913 pad[0] += pad[6] * 0x3c;
2914 major_6 (pad, pad[4]);
2917 if (branch == 2)
2919 pad[19] ^= my_cos (pad[9]) ? 0x57337b8 : pad[14];
2920 minor_20;
2921 major_9 (pad, pad[16]);
2924 ROREQ (pad[14], seed - 0x3b46a63f);
2926 if (branch == 11)
2928 pad[19] ^= my_cos (pad[9]) ? 0x57337b8 : pad[14];
2929 pad[9] += ROL (pad[4], 9);
2930 major_2 (pad, pad[9]);
2933 if (branch == 5)
2935 pad[19] += 0x12b9e29d - pad[12];
2936 TRY (minor_4);
2937 major_5 (pad, pad[6]);
2940 if (branch == 0)
2942 minor_20;
2943 pad[6] ^= 0xa9c74969;
2944 major_12 (pad, pad[14]);
2947 pad[8] ^= ROR (seed, 6);
2949 if (branch == 14)
2951 pad[12] += 0x49fc5980;
2952 pad[3] -= pad[0] ^ 0x185f3b0d;
2953 major_11 (pad, seed);
2956 pad[0] += my_sin (pad[0]) ? 0x9bcd446 : pad[14];
2959 static void major_23 (u32 *pad, u32 seed)
2961 int branch = seed & 1;
2963 pad[4] += pad[8] - 0x16f911e4;
2964 pad[9] ^= pad[2] * 11;
2965 pad[10] ^= pad[7] < 0x402226f ? pad[7] : pad[2];
2966 seed |= pad[17] - 0x1e97aeb;
2967 seed |= pad[14] < 0xf3b1e0b3 ? pad[14] : pad[5];
2969 if (branch == 0)
2971 pad[7] &= pad[13] ^ 0x21aaf758;
2972 minor_32 (0x640f077d);
2973 minor_37 (pad);
2976 pad[1] -= pad[19] * 0x64;
2977 pad[1] += seed - 0x18d1b90;
2978 pad[7] -= pad[3] ^ 0x44de1958;
2979 pad[11] ^= ROL (pad[2], 9);
2980 pad[17] += ROL (pad[12], 27);
2982 if (branch == 0)
2984 TRY (minor_9 (0xdc306f47));
2985 pad[9] ^= pad[7] * 0x44;
2986 minor_36 (pad);
2989 ROREQ (pad[7], pad[13]);
2992 static void major_24 (u32 *pad, u32 seed)
2994 int branch = (pad[2] ^ seed ^ pad[7]) % 3;
2996 seed *= my_cos (seed) ? 0x6be8f94 : seed;
2997 pad[2] ^= pad[2] + 0x3786364b;
2998 ROLEQ (pad[17], seed - 0x10);
3000 if (branch == 0)
3002 minor_35;
3003 minor_27;
3004 minor_37 (pad);
3007 pad[5] += my_sin (pad[16]) ? 0x3af2a8e2 : pad[16];
3009 if (branch == 0)
3011 TRY (minor_5);
3012 pad[2] *= pad[3] + 0xd6863a6;
3013 minor_36 (pad);
3016 pad[13] ^= my_cos (pad[16]) ? 0xf6951daa : pad[1];
3017 pad[18] |= pad[17] & 0x6361a322;
3019 if (branch == 1)
3021 pad[13] *= ROR (pad[3], 5) * 0xb25cb20f;
3022 major_23 (pad, pad[15]);
3026 static void major_25 (u32 *pad, u32 seed)
3028 int branch = (pad[7] ^ pad[2] ^ seed) % 5;
3030 pad[2] -= 0x31b8a51 & seed;
3032 if (branch == 3)
3034 pad[2] ^= my_sin (pad[13]) ? 0xfd08092 : pad[10];
3035 pad[9] &= 0x49a7e0c7;
3036 minor_37 (pad);
3039 pad[1] &= ROR (seed, 29);
3040 ROLEQ (pad[12], my_cos (pad[1]) ? 27 : pad[5]);
3042 if (branch == 2)
3044 TRY (minor_4);
3045 pad[2] ^= my_sin (pad[13]) ? 0xfd08092 : pad[10];
3046 minor_36 (pad);
3049 ROREQ (seed, my_sqrt (seed));
3050 seed ^= 0xc63d7671 * seed;
3051 pad[17] += pad[19] * 0x7a;
3053 if (branch == 0)
3055 pad[10] += 0x8958821;
3056 pad[18] *= pad[10] + 0x466e09cf;
3057 major_23 (pad, pad[10]);
3060 ROREQ (pad[18], my_cos (pad[6]) ? 0x11 : pad[1]);
3062 if (branch == 4)
3064 TRY (minor_7);
3065 pad[9] ^= 0x3480eee;
3066 major_24 (pad, seed);
3069 pad[10] -= my_sqrt (seed);
3070 pad[11] &= seed * 0x3f;
3072 if (branch == 0)
3074 pad[18] *= pad[10] + 0x466e09cf;
3075 pad[13] *= 0x6ff7af6a;
3076 major_19 (pad, pad[17]);
3079 ROLEQ (pad[1], pad[15] + 0x19);
3082 static void mix (u32 *pad, u32 seed)
3084 int branch = (pad[5] ^ pad[9] ^ pad[19]) & 15;
3086 switch (branch)
3088 case 0:
3089 pad[2] ^= my_sin (pad[13]) ? 0xfd08092 : pad[10];
3090 TRY (minor_5);
3091 major_5 (pad, 0x45835eb3);
3092 break;
3093 case 5:
3094 TRY (minor_8);
3095 pad[12] += 0x33bd47dd;
3096 major_6 (pad, pad[9]);
3097 break;
3098 case 8:
3099 minor_28;
3100 pad[6] += pad[19] - 0x3f5675d6;
3101 major_9 (pad, pad[10]);
3102 break;
3103 case 9:
3104 TRY (minor_7);
3105 TRY (minor_13);
3106 major_14 (pad, seed);
3107 break;
3108 case 10:
3109 TRY (minor_5);
3110 pad[6] ^= 0x33b5c9ac;
3111 major_2 (pad, pad[0]);
3112 break;
3115 pad[2] ^= pad[6] + 0x1847de17;
3117 switch (branch)
3119 case 1:
3120 pad[9] ^= 0x1df05ea2;
3121 pad[19] += 0x12b9e29d - pad[12];
3122 major_12 (pad, 0x45835eb3);
3123 break;
3124 case 10:
3125 minor_28;
3126 pad[12] *= pad[12];
3127 major_11 (pad, pad[6]);
3128 break;
3131 pad[19] += pad[12] * 0x68;
3133 switch (branch)
3135 case 2:
3136 minor_28;
3137 pad[12] ^= pad[15] - 0xf5cfde0;
3138 major_13 (pad, pad[19]);
3139 pad[6] += pad[19] - 0x3f5675d6;
3140 pad[12] += 0x602283af;
3141 major_22 (pad, pad[0]);
3142 break;
3143 case 6:
3144 TRY (minor_1 (0x706a6bc));
3145 TRY (minor_2 (0x82b598a1));
3146 major_8 (pad, 0x45835eb3);
3147 break;
3150 pad[7] -= pad[14] & 0x1ada7fa;
3152 switch (branch)
3154 case 4:
3155 minor_20;
3156 pad[12] += pad[6] + 0x21d7bf61;
3157 major_10 (pad, pad[16]);
3158 break;
3159 case 6:
3160 TRY (minor_7);
3161 TRY (minor_2 (0xd2950f8c));
3162 major_7 (pad, 0x45835eb3);
3163 break;
3166 seed = (pad[0] + 0xd092d1bb) & 0x45835eb3;
3168 switch (branch)
3170 case 3:
3171 TRY (minor_5);
3172 pad[7] &= pad[13] ^ 0x21aaf758;
3173 major_9 (pad, pad[17]);
3174 break;
3175 case 4:
3176 pad[13] -= pad[1];
3177 pad[18] *= pad[10] + 0x466e09cf;
3178 major_14 (pad, pad[5]);
3179 break;
3180 case 7:
3181 TRY (minor_9 (0x6d32760));
3182 pad[9] ^= pad[7] * 0x44;
3183 major_6 (pad, pad[8]);
3184 break;
3187 ROLEQ (pad[8], pad[3] ^ 0x6);
3189 switch (branch)
3191 case 0:
3192 pad[7] &= pad[13] ^ 0x21aaf758;
3193 pad[14] |= pad[3] ^ 0x4345732;
3194 major_12 (pad, pad[9]);
3195 break;
3196 case 5:
3197 minor_22;
3198 minor_29;
3199 major_2 (pad, pad[1]);
3200 break;
3201 case 9:
3202 pad[13] -= pad[1];
3203 TRY (minor_7);
3204 major_5 (pad, pad[2]);
3205 break;
3208 pad[9] *= pad[14] | 0xbbf1fbef;
3210 switch (branch)
3212 case 15:
3213 pad[12] += pad[6] ^ 0x211f5e40;
3214 pad[5] += pad[0] ^ 0x3e17add3;
3215 major_11 (pad, pad[8]);
3216 break;
3217 case 12:
3218 pad[19] ^= pad[15] ^ 0x3574ed3;
3219 minor_30;
3220 major_13 (pad, pad[16]);
3221 break;
3224 seed *= my_sqrt (pad[1]);
3226 switch (branch)
3228 case 11:
3229 minor_32 (0x678aae2c);
3230 minor_22;
3231 major_22 (pad, pad[11]);
3232 break;
3233 case 14:
3234 pad[13] *= ROR (pad[3], 5);
3235 minor_35;
3236 major_8 (pad, pad[18]);
3237 break;
3238 case 7:
3239 ROREQ (pad[4], 0x2);
3240 ROREQ (pad[9], 4);
3241 major_10 (pad, pad[0]);
3242 break;
3245 pad[3] -= pad[7] ^ 0x4e46f05d;
3247 switch (branch)
3249 case 3:
3250 pad[7] ^= 0xeda01e71;
3251 pad[13] -= pad[1];
3252 major_7 (pad, pad[11]);
3253 break;
3254 case 8:
3255 pad[2] ^= my_sin (pad[13]) ? 0xfd08092 : pad[10];
3256 pad[9] += ROL (pad[4], 9);
3257 major_14 (pad, pad[2]);
3258 break;
3261 pad[19] ^= 0xb1bdd560 ^ seed;
3263 switch (branch)
3265 case 1:
3266 pad[12] ^= pad[15] - 0xf5cfde0;
3267 pad[12] *= pad[12];
3268 major_9 (pad, pad[5]);
3269 break;
3270 case 13:
3271 pad[18] *= pad[10] + 0x466e09cf;
3272 pad[2] ^= pad[15] << 5;
3273 major_6 (pad, pad[15]);
3274 break;
3277 pad[6] ^= my_sqrt (pad[5]);