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
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 */
32 #define __attribute__(x)
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
)
51 for (j
= 0, k
= 0; j
++ <= i
; j
+= ++k
<< 1);
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
)
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;
158 pad
[17] ^= pad
[17] - 0x1259dbb;
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;
169 pad
[7] |= 0x3e73450d;
174 pad
[11] &= pad
[19] & 0x170b54ed;
178 pad
[12] ^= pad
[15] - 0xf5cfde0;
180 major_23 (pad
, pad
[8]);
183 ROREQ (pad
[1], pad
[14] < 0x164d8d96 ? pad
[14] : pad
[4]);
187 TRY (minor_1 (0xc0948cf0));
189 major_24 (pad
, pad
[18]);
194 pad
[12] ^= pad
[15] - 0xf5cfde0;
196 major_19 (pad
, pad
[12]);
199 ROLEQ (pad
[6], pad
[13] ^ 0x2);
203 TRY (ROREQ (pad
[1], 0x4));
204 pad
[9] ^= pad
[7] * 0x44;
205 major_25 (pad
, seed
);
210 pad
[2] ^= my_sin (pad
[13]) ? 0xfd08092 : pad
[10];
211 pad
[13] *= ROR (pad
[3], 5);
212 major_17 (pad
, pad
[15]);
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;
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];
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
);
243 pad
[4] -= pad
[17] ^ 0x2217cf47;
244 pad
[13] *= ROR (pad
[3], 5);
245 major_3 (pad
, pad
[14]);
250 pad
[19] ^= my_cos (pad
[9]) ? 0x57337b8 : pad
[14];
252 major_21 (pad
, pad
[18]);
255 pad
[5] *= my_sqrt (pad
[9]);
260 minor_32 (0x8517ae30);
261 major_16 (pad
, pad
[4]);
264 pad
[13] &= pad
[18] - 0xeb6dee4;
275 pad
[7] |= 0x7de964ed;
277 major_23 (pad
, pad
[3]);
281 static void major_2 (u32
*pad
, u32 seed
)
283 int branch
= pad
[10] & 15;
288 pad
[7] &= pad
[13] ^ 0x21aaf758;
289 major_25 (pad
, pad
[0]);
292 pad
[0] -= seed
* 0x36;
296 pad
[2] *= pad
[3] + 0xd6863a6;
297 pad
[6] += 0xfe07af0e - pad
[3];
298 major_17 (pad
, seed
);
303 pad
[6] ^= 0x9374c368;
304 pad
[7] &= 0xc45b99ee;
305 major_4 (pad
, pad
[14]);
308 pad
[7] -= pad
[8] | 0x1a1a9407;
313 pad
[3] -= pad
[0] ^ 0x185f3b0d;
314 major_18 (pad
, pad
[14]);
317 pad
[2] += pad
[0] + 0x19259d5;
321 pad
[9] ^= pad
[7] * 0x44;
322 pad
[2] ^= pad
[15] << 5;
323 major_15 (pad
, seed
);
329 pad
[3] -= pad
[0] ^ 0x185f3b0d;
330 major_3 (pad
, pad
[15]);
333 pad
[16] &= seed
- 0x1badcb5;
337 pad
[14] |= pad
[3] ^ 0x4345732;
339 major_21 (pad
, pad
[3]);
342 pad
[5] -= my_cos (pad
[4]) ? 0xffcdb92f : pad
[14];
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;
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]);
368 pad
[13] *= 0x7f0d5ead;
369 major_6 (pad
, pad
[5]);
374 pad
[6] += pad
[19] - 0x3f5675d6;
379 pad
[6] += pad
[3] * 0x79;
383 pad
[9] &= 0x3eb4ed97;
385 major_25 (pad
, pad
[6]);
388 pad
[16] ^= my_cos (pad
[7]) ? 0x2d36f243 : pad
[13];
392 pad
[0] += pad
[18] ^ 0x4ac16b8d;
394 major_17 (pad
, pad
[2]);
399 pad
[10] += 0x8958821;
400 TRY (minor_1 (0x115e64d4));
401 major_4 (pad
, pad
[19]);
404 pad
[14] &= pad
[3] ^ 0xb8eb772d;
409 pad
[2] ^= pad
[15] << 5;
410 major_18 (pad
, pad
[8]);
413 ROREQ (pad
[1], pad
[12] * 0x5);
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]);
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;
445 pad
[2] -= pad
[4] * 0xd;
449 pad
[7] ^= 0x414517ea;
454 seed
+= pad
[12] * 0x19;
458 pad
[13] += pad
[15] < 0x137bffeb ? pad
[15] : pad
[11];
460 major_23 (pad
, seed
);
463 seed
+= pad
[7] + 0xbd42ff0;
468 pad
[16] += 0x1f5b0c59;
469 major_24 (pad
, seed
);
472 pad
[15] -= pad
[0] ^ 0x16bee8c4;
478 major_19 (pad
, seed
);
481 pad
[18] ^= pad
[11] + 0x9fd1847f;
485 pad
[6] += pad
[19] - 0x3f5675d6;
486 pad
[6] += pad
[19] - 0x3f5675d6;
487 major_25 (pad
, seed
);
490 ROLEQ (pad
[14], pad
[19]);
495 pad
[12] += pad
[6] + 0x21d7bf61;
496 major_17 (pad
, seed
);
499 ROREQ (pad
[0], pad
[13] * 0x13);
503 TRY (minor_2 (0x70da1d6f));
512 major_18 (pad
, pad
[5]);
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);
531 pad
[6] += pad
[19] - 0x3f5675d6;
536 pad
[15] += seed
* 0x32;
537 pad
[5] += 0xc93495e4 - pad
[14];
541 TRY (minor_10 (0x10db4a9d));
542 pad
[6] += 0xfe07af0e - pad
[3];
546 pad
[12] *= my_cos (pad
[14]) ? 0xf5a79f2a : pad
[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
;
561 TRY (ROREQ (pad
[1], 0x1c));
562 major_24 (pad
, seed
);
565 pad
[3] -= my_sqrt (pad
[9]);
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;
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];
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;
602 pad
[9] += ROL (pad
[4], 9);
603 major_17 (pad
, pad
[15]);
606 pad
[2] ^= pad
[15] - 0xe09f62af;
611 pad
[9] |= pad
[7] ^ 0x2a19119f;
612 major_4 (pad
, pad
[10]);
619 major_18 (pad
, seed
);
622 pad
[5] += pad
[8] * 0x49;
626 pad
[14] |= pad
[3] ^ 0x4345732;
628 major_15 (pad
, pad
[19]);
635 major_3 (pad
, pad
[4]);
638 seed
+= pad
[16] < 0x4dfe57f8 ? pad
[16] : pad
[17];
642 pad
[13] *= 0x7ae310dc;
643 pad
[12] ^= pad
[15] - 0xf5cfde0;
644 major_21 (pad
, pad
[11]);
645 pad
[13] *= ROR (pad
[3], 5);
647 major_16 (pad
, pad
[10]);
650 pad
[5] += pad
[6] + 0xd5c1b299;
654 pad
[19] ^= my_cos (pad
[9]) ? 0x57337b8 : pad
[14];
655 pad
[9] |= pad
[7] ^ 0x2a19119f;
656 major_1 (pad
, pad
[10]);
661 pad
[16] += 0x203fdf50;
663 major_14 (pad
, pad
[8]);
666 pad
[1] += my_sin (seed
) ? 0xbabd3794 : seed
;
670 pad
[4] ^= 0xca8e79ab;
672 major_6 (pad
, pad
[14]);
677 pad
[13] += pad
[15] < 0x137bffeb ? pad
[15] : pad
[11];
678 pad
[2] ^= pad
[15] << 5;
682 pad
[3] |= my_cos (pad
[3]) ? 0xbabd3794 : pad
[17];
694 pad
[4] -= pad
[17] ^ 0x2217cf47;
695 major_17 (pad
, seed
);
698 seed
^= pad
[2] * 0xb25bcc4d;
702 pad
[19] += 0x12b9e29d - pad
[12];
703 pad
[7] &= pad
[13] ^ 0x21aaf758;
704 major_4 (pad
, pad
[17]);
709 pad
[12] ^= pad
[15] - 0xf5cfde0;
711 major_18 (pad
, seed
);
714 pad
[8] += 0xf1030e9c - pad
[12];
718 pad
[6] ^= 0xea99e155;
719 pad
[19] += 0x12b9e29d - pad
[12];
720 major_15 (pad
, seed
);
725 pad
[7] &= 0x710c48e8;
726 pad
[2] *= pad
[3] + 0xd6863a6;
727 major_3 (pad
, pad
[17]);
730 pad
[15] += 0xa8f341c7 - pad
[1];
734 pad
[2] *= pad
[3] + 0xd6863a6;
735 pad
[3] -= pad
[0] ^ 0x185f3b0d;
736 major_21 (pad
, seed
);
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;
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];
764 TRY (ROREQ (pad
[1], 0x4));
765 pad
[12] ^= pad
[15] - 0xf5cfde0;
766 major_19 (pad
, pad
[0]);
769 pad
[10] -= pad
[6] ^ 0x1289de2;
775 major_25 (pad
, pad
[4]);
780 pad
[13] *= 0x6a94c749;
781 pad
[18] -= pad
[13] ^ 0x154abcdf;
782 major_17 (pad
, seed
);
785 ROLEQ (pad
[16], my_sqrt (pad
[17]));
789 pad
[16] += 0x3f147441;
790 major_4 (pad
, pad
[16]);
793 pad
[9] += my_sqrt (pad
[3]);
799 major_18 (pad
, seed
);
802 seed
= pad
[6] ^ seed
^ 0x202ab323;
806 pad
[5] += pad
[0] ^ 0x3e17add3;
807 pad
[4] -= pad
[17] ^ 0x2217cf47;
808 major_15 (pad
, pad
[8]);
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]);
822 TRY (minor_2 (0xb30d40d0));
823 pad
[10] *= pad
[10] - 0x5eae6bf;
824 major_21 (pad
, pad
[13]);
827 pad
[0] -= pad
[11] ^ 0x1284af29;
831 pad
[5] += pad
[0] ^ 0x3e17add3;
833 major_16 (pad
, pad
[17]);
836 ROLEQ (seed
, pad
[11] * 0x10);
840 pad
[9] ^= 0x1d8f33a6;
841 TRY (minor_9 (0x13ee15c3));
842 major_1 (pad
, pad
[19]);
848 pad
[19] ^= my_cos (pad
[9]) ? 0x57337b8 : pad
[14];
849 major_14 (pad
, pad
[16]);
852 pad
[9] |= pad
[9] ^ 0x2ad7629;
856 TRY (ROREQ (pad
[1], 0xc));
857 TRY (minor_9 (0xe8869877));
858 major_24 (pad
, seed
);
861 pad
[4] *= pad
[12] * 0x4a237369;
865 pad
[9] += ROL (pad
[4], 9);
867 major_19 (pad
, pad
[5]);
872 pad
[14] |= pad
[3] ^ 0x4345732;
873 TRY (minor_9 (0xdd1ca541));
874 major_25 (pad
, pad
[1]);
877 seed
*= pad
[4] + 0x76e5a087;
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;
894 TRY (minor_2 (0x54bcde17));
895 major_1 (pad
, pad
[14]);
900 pad
[7] &= pad
[13] ^ 0x21aaf758;
902 major_14 (pad
, pad
[12]);
905 pad
[8] |= 0xc6ef5e80 + pad
[1];
909 pad
[6] += pad
[19] - 0x3f5675d6;
910 pad
[6] += 0xfe07af0e - pad
[3];
911 major_6 (pad
, pad
[16]);
917 pad
[16] += 0x3fa3dc2f;
918 major_9 (pad
, pad
[5]);
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];
932 pad
[2] ^= pad
[15] << 5;
934 major_5 (pad
, pad
[7]);
939 pad
[0] += pad
[6] * 0x3c;
941 major_12 (pad
, pad
[16]);
946 pad
[5] += pad
[0] ^ 0x3e17add3;
947 pad
[9] &= 0x4bd89b02;
948 major_11 (pad
, pad
[19]);
951 seed
-= pad
[0] ^ 0x3b61016b;
956 TRY (minor_9 (0x1984a749));
957 major_13 (pad
, pad
[3]);
962 pad
[9] += ROL (pad
[4], 9);
964 major_22 (pad
, pad
[4]);
971 major_8 (pad
, pad
[5]);
974 ROLEQ (pad
[11], pad
[10] ^ 0x1a);
978 pad
[18] -= pad
[13] ^ 0x154abcdf;
979 pad
[19] += 0x12b9e29d - pad
[12];
980 major_10 (pad
, seed
);
985 pad
[19] += 0x12b9e29d - pad
[12];
990 seed
-= pad
[14] * 0xc02e189f;
994 pad
[6] ^= 0x94eaa20d;
996 major_14 (pad
, pad
[6]);
1001 pad
[12] += 0x2ac57dfa;
1002 pad
[2] ^= pad
[15] << 5;
1003 major_6 (pad
, pad
[4]);
1008 pad
[18] *= pad
[10] + 0x466e09cf;
1010 major_9 (pad
, seed
);
1013 pad
[4] += 0xa207344d - seed
;
1017 TRY (minor_2 (0x80a1da17));
1018 pad
[13] *= 0xa02fe00;
1019 major_2 (pad
, pad
[3]);
1024 pad
[13] *= 0x6aa5cc8c;
1025 pad
[6] ^= 0xaefb322;
1026 major_5 (pad
, pad
[9]);
1032 pad
[5] += pad
[0] ^ 0x3e17add3;
1033 major_12 (pad
, pad
[5]);
1036 seed
^= pad
[18] ^ 0xe6830c9;
1040 pad
[9] |= pad
[7] ^ 0x2a19119f;
1041 pad
[7] &= pad
[13] ^ 0x21aaf758;
1042 major_11 (pad
, seed
);
1047 pad
[3] -= pad
[0] ^ 0x185f3b0d;
1048 TRY (minor_2 (0xb11da063));
1049 major_13 (pad
, pad
[3]);
1055 pad
[4] ^= 0x41e634f6;
1056 major_22 (pad
, pad
[17]);
1059 pad
[0] ^= my_sin (seed
) ? 0x8b50cd51 : pad
[8];
1064 pad
[2] ^= pad
[15] << 5;
1065 major_8 (pad
, seed
);
1070 pad
[9] += ROL (pad
[4], 9);
1071 pad
[7] &= pad
[13] ^ 0x21aaf758;
1072 major_10 (pad
, pad
[16]);
1075 seed
+= pad
[1] * 0x3e;
1080 ROREQ (pad
[4], 0x9);
1081 major_1 (pad
, pad
[12]);
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;
1102 major_21 (pad
, seed
);
1108 TRY (minor_2 (0xe0b52e33));
1109 major_16 (pad
, pad
[15]);
1112 seed
-= ROR (pad
[2], 6);
1116 pad
[4] ^= 0x9aa940f;
1117 pad
[5] += pad
[0] ^ 0x3e17add3;
1118 major_1 (pad
, pad
[12]);
1125 major_14 (pad
, pad
[1]);
1128 pad
[12] -= pad
[17] * 0x74;
1132 pad
[12] += pad
[6] + 0x21d7bf61;
1133 pad
[13] *= ROR (pad
[3], 5);
1134 major_6 (pad
, pad
[5]);
1139 pad
[4] ^= 0x91ac407e;
1141 major_9 (pad
, seed
);
1144 pad
[3] ^= pad
[7] + 0x137c9f7d;
1148 pad
[7] &= pad
[13] ^ 0x21aaf758;
1149 pad
[2] ^= pad
[15] << 5;
1150 major_2 (pad
, pad
[5]);
1155 pad
[10] += 0x8958821;
1156 pad
[16] += 0x3d2948e4;
1157 major_5 (pad
, pad
[4]);
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];
1171 pad
[9] ^= 0x1c686298;
1172 pad
[12] ^= pad
[15] - 0xf5cfde0;
1173 major_11 (pad
, pad
[9]);
1178 pad
[7] |= 0x378d3869;
1180 major_13 (pad
, pad
[13]);
1183 seed
*= pad
[12] + 0xbd99f684;
1187 pad
[6] += pad
[19] - 0x3f5675d6;
1188 pad
[19] ^= my_cos (pad
[9]) ? 0x57337b8 : pad
[14];
1189 major_22 (pad
, seed
);
1194 pad
[13] *= 0x1dcee48b;
1196 major_21 (pad
, seed
);
1199 pad
[10] += 0xaa3373fc - pad
[6];
1204 TRY (minor_1 (0xbc90d50));
1205 major_16 (pad
, seed
);
1210 pad
[9] |= pad
[7] ^ 0x2a19119f;
1211 pad
[0] += pad
[18] ^ 0x4ac16b8d;
1212 major_1 (pad
, seed
);
1218 pad
[2] ^= my_sin (pad
[13]) ? 0xfd08092 : pad
[10];
1219 major_14 (pad
, seed
);
1222 seed
^= pad
[11] < 0xa4dda95a ? pad
[11] : pad
[2];
1226 pad
[16] += 0x1a36972b;
1228 major_6 (pad
, pad
[5]);
1233 TRY (minor_12 (0xb6571d3f));
1234 pad
[0] += pad
[6] * 0x3c;
1235 major_9 (pad
, pad
[9]);
1238 seed
*= pad
[14] + 0x9baa8db;
1242 TRY (minor_9 (0xe378a0ed));
1243 pad
[5] += pad
[0] ^ 0x3e17add3;
1244 major_2 (pad
, pad
[8]);
1249 TRY (minor_10 (0xbd149bd9));
1250 minor_32 (0x6476f303);
1251 major_5 (pad
, seed
);
1254 pad
[17] += my_sqrt (pad
[12]);
1258 pad
[13] *= 0xa02fe00;
1259 pad
[12] += pad
[6] + 0x21d7bf61;
1260 major_12 (pad
, pad
[19]);
1265 pad
[13] *= 0x111b84cd;
1267 major_11 (pad
, pad
[2]);
1270 pad
[7] ^= pad
[9] * 0x27219096;
1274 pad
[6] += pad
[19] - 0x3f5675d6;
1275 pad
[16] += 0xfe49a900;
1276 major_13 (pad
, pad
[15]);
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;
1292 pad
[7] &= pad
[13] ^ 0x21aaf758;
1293 major_19 (pad
, pad
[0]);
1298 pad
[16] += 0x45e88961;
1300 major_25 (pad
, pad
[15]);
1307 major_17 (pad
, pad
[2]);
1310 pad
[8] |= pad
[9] * 0x6a;
1314 pad
[7] &= 0x30004a24;
1315 pad
[9] ^= pad
[7] * 0x44;
1316 major_4 (pad
, pad
[11]);
1321 pad
[13] += pad
[15] < 0x137bffeb ? pad
[15] : pad
[11];
1323 major_18 (pad
, pad
[13]);
1326 pad
[10] &= pad
[6] - 0x1286a10;
1330 pad
[9] += ROL (pad
[4], 9);
1332 major_15 (pad
, pad
[17]);
1339 major_3 (pad
, pad
[13]);
1342 seed
|= seed
+ 0x20029bc7;
1343 ROREQ (pad
[14], ROL (seed
, 8));
1347 pad
[7] &= pad
[13] ^ 0x21aaf758;
1349 major_21 (pad
, pad
[5]);
1352 seed
+= 0x176cf052 - pad
[12];
1356 pad
[12] ^= pad
[15] - 0xf5cfde0;
1357 pad
[13] *= 0xa02fe00;
1358 major_16 (pad
, seed
);
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);
1372 pad
[9] ^= pad
[7] * 0x44;
1373 pad
[7] &= 0x1df23f52;
1374 major_14 (pad
, pad
[6]);
1380 pad
[6] ^= 0x851242df;
1381 major_6 (pad
, seed
);
1384 pad
[13] *= pad
[2] * 0x65;
1388 pad
[14] |= pad
[3] ^ 0x4345732;
1389 pad
[13] += pad
[15] < 0x137bffeb ? pad
[15] : pad
[11];
1390 major_19 (pad
, pad
[10]);
1397 major_25 (pad
, seed
);
1400 pad
[11] |= ROR (pad
[17], 29);
1404 pad
[10] *= pad
[10] - 0x5eae6bf;
1405 pad
[16] += 0x5e01d54b;
1406 major_17 (pad
, pad
[18]);
1409 pad
[17] &= seed
* 0x30;
1414 TRY (minor_12 (0x65ec261));
1415 major_4 (pad
, pad
[0]);
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;
1434 TRY (minor_12 (0x9febcd24));
1435 pad
[7] &= 0x259cf308;
1436 major_16 (pad
, pad
[14]);
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];
1450 pad
[12] += pad
[6] + 0x21d7bf61;
1451 pad
[14] |= pad
[3] ^ 0x4345732;
1452 major_9 (pad
, pad
[1]);
1457 TRY (minor_10 (0xece6bfa0));
1458 pad
[14] |= pad
[3] ^ 0x4345732;
1459 major_14 (pad
, seed
);
1465 pad
[18] *= pad
[10] + 0x466e09cf;
1466 major_6 (pad
, pad
[12]);
1469 pad
[10] *= my_cos (seed
) ? 0x16b578ee : pad
[2];
1475 major_2 (pad
, pad
[10]);
1480 pad
[9] ^= pad
[7] * 0x44;
1482 major_5 (pad
, pad
[10]);
1485 pad
[17] += seed
* 0x4d;
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
);
1501 major_11 (pad
, pad
[19]);
1504 ROLEQ (seed
, pad
[7] * 0xd);
1508 pad
[9] &= 0x2f23cdc6;
1509 pad
[10] *= pad
[10] - 0x5eae6bf;
1510 major_22 (pad
, pad
[2]);
1517 major_8 (pad
, pad
[4]);
1520 major_16 (pad
, pad
[18]);
1523 pad
[4] += my_sin (pad
[0]) ? 0x1873296 : pad
[1];
1529 major_1 (pad
, pad
[8]);
1534 pad
[12] *= 0xf44cb55;
1535 pad
[16] += 0x75a864cf;
1536 major_14 (pad
, pad
[4]);
1539 pad
[12] += 0x1c0bd6db - pad
[11];
1543 pad
[13] *= 0x17b441db;
1544 TRY (minor_12 (0x8951503f));
1545 major_9 (pad
, pad
[19]);
1552 major_6 (pad
, pad
[14]);
1557 pad
[0] += pad
[6] * 0x3c;
1558 pad
[4] -= pad
[17] ^ 0x2217cf47;
1559 major_2 (pad
, pad
[8]);
1562 pad
[18] -= pad
[6] * 0x2c;
1566 pad
[13] *= 0x1855aabc;
1568 major_12 (pad
, seed
);
1573 pad
[18] *= pad
[10] + 0x466e09cf;
1574 pad
[9] ^= pad
[7] * 0x44;
1575 major_11 (pad
, pad
[10]);
1580 pad
[18] *= pad
[10] + 0x466e09cf;
1582 major_5 (pad
, pad
[15]);
1585 pad
[6] ^= pad
[16] ^ 0x354e354d;
1591 major_8 (pad
, pad
[8]);
1596 pad
[6] += 0xfe07af0e - pad
[3];
1597 pad
[13] *= 0xa02fe00;
1598 major_16 (pad
, pad
[10]);
1603 pad
[14] |= pad
[3] ^ 0x4345732;
1604 minor_32 (0x8a0e1ad7);
1605 major_22 (pad
, pad
[8]);
1610 pad
[9] |= pad
[7] ^ 0x2a19119f;
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;
1624 pad
[19] ^= pad
[15] ^ 0x3574ed3;
1626 major_18 (pad
, pad
[0]);
1631 pad
[7] ^= 0x414517ea;
1633 major_15 (pad
, pad
[13]);
1636 pad
[14] &= seed
* 0x3f;
1641 pad
[9] &= 0x38063558;
1642 major_3 (pad
, pad
[10]);
1648 pad
[12] += 0x5c1481dd;
1649 major_21 (pad
, pad
[11]);
1652 ROREQ (pad
[10], pad
[14] * 0x13);
1656 pad
[19] ^= my_cos (pad
[9]) ? 0x57337b8 : pad
[14];
1657 pad
[12] ^= pad
[15] - 0xf5cfde0;
1658 major_16 (pad
, seed
);
1663 pad
[3] -= pad
[0] ^ 0x185f3b0d;
1664 pad
[6] ^= 0xa8115127;
1665 major_1 (pad
, pad
[5]);
1668 pad
[11] ^= seed
- 0x3c17609c;
1672 pad
[12] += pad
[6] ^ 0x211f5e40;
1674 major_14 (pad
, seed
);
1681 major_6 (pad
, pad
[11]);
1684 pad
[14] += my_sin (pad
[9]) ? 0x2d3f1771 : pad
[11];
1689 pad
[0] += pad
[18] ^ 0x4ac16b8d;
1690 major_9 (pad
, pad
[9]);
1695 pad
[12] *= 0xf44cb55;
1697 major_2 (pad
, pad
[13]);
1702 pad
[9] &= 0x3f34e168;
1703 pad
[18] *= pad
[10] + 0x466e09cf;
1704 major_5 (pad
, seed
);
1707 pad
[18] &= pad
[17] + 0x21012257;
1711 pad
[6] += 0xfe07af0e - pad
[3];
1712 TRY (minor_2 (0x51f9a91a));
1713 major_12 (pad
, pad
[14]);
1718 pad
[14] |= pad
[3] ^ 0x4345732;
1719 pad
[16] += 0x485c892b;
1720 major_18 (pad
, pad
[12]);
1723 pad
[19] &= pad
[10] ^ 0x6fc516d5;
1728 pad
[12] += pad
[6] ^ 0x211f5e40;
1729 major_15 (pad
, pad
[13]);
1736 major_3 (pad
, seed
);
1739 pad
[8] ^= pad
[11] * 0x7b;
1743 pad
[2] *= pad
[3] + 0xd6863a6;
1745 major_21 (pad
, pad
[4]);
1750 pad
[19] ^= pad
[15] ^ 0x3574ed3;
1752 major_16 (pad
, pad
[9]);
1755 pad
[0] += pad
[13] + 0x88a77a94;
1759 TRY (minor_2 (0xf10f9d87));
1760 pad
[12] ^= pad
[15] - 0xf5cfde0;
1761 major_1 (pad
, pad
[15]);
1767 pad
[2] ^= my_sin (pad
[13]) ? 0xfd08092 : pad
[10];
1768 major_14 (pad
, pad
[18]);
1771 seed
*= pad
[8] - 0x44260e37;
1776 pad
[10] += 0x8958821;
1777 major_6 (pad
, pad
[8]);
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;
1797 pad
[13] += pad
[15] < 0x137bffeb ? pad
[15] : pad
[11];
1798 major_4 (pad
, pad
[17]);
1801 pad
[8] |= seed
+ 0xe43fc6b;
1805 minor_32 (0x979304f6);
1807 major_18 (pad
, pad
[6]);
1813 TRY (minor_12 (0xf7131053));
1814 major_15 (pad
, pad
[13]);
1817 pad
[19] ^= seed
* 0x4b;
1821 pad
[13] *= 0x85695585;
1822 pad
[13] *= 0x2c9514d7;
1823 major_3 (pad
, pad
[17]);
1828 pad
[9] |= pad
[7] ^ 0x2a19119f;
1829 TRY (minor_1 (0x433a0094));
1830 major_21 (pad
, pad
[8]);
1833 pad
[1] ^= pad
[14] * 0x16;
1837 pad
[13] *= 0x136644be;
1839 major_16 (pad
, pad
[14]);
1842 pad
[7] |= seed
^ 0xe857063;
1846 pad
[18] -= pad
[13] ^ 0x154abcdf;
1847 pad
[12] += 0xf894616a;
1848 major_1 (pad
, pad
[6]);
1854 pad
[7] &= 0x3b887f26;
1855 major_14 (pad
, pad
[7]);
1858 ROREQ (pad
[6], pad
[9] * 0x8413f1b6);
1862 TRY (minor_9 (0xcd88ea76));
1864 major_6 (pad
, pad
[19]);
1870 TRY (ROREQ (pad
[1], 0x8));
1871 major_9 (pad
, pad
[1]);
1874 pad
[6] -= pad
[17] < 0x417e2f7b ? pad
[17] : pad
[19];
1878 pad
[9] |= pad
[7] ^ 0x2a19119f;
1880 major_2 (pad
, pad
[1]);
1886 pad
[0] += pad
[6] * 0x3c;
1887 major_5 (pad
, pad
[7]);
1890 pad
[6] |= my_sqrt (seed
);
1894 pad
[2] ^= pad
[15] << 5;
1895 pad
[7] &= pad
[13] ^ 0x21aaf758;
1896 major_4 (pad
, seed
);
1899 pad
[2] ^= pad
[8] + 0x3e85747b;
1904 pad
[9] &= 0x5a61aa8d;
1905 major_18 (pad
, pad
[14]);
1910 pad
[6] += 0xfe07af0e - pad
[3];
1911 minor_32 (0xbf47f027);
1912 major_15 (pad
, pad
[3]);
1919 pad
[13] *= 0xc9cf079;
1920 pad
[18] -= pad
[13] ^ 0x154abcdf;
1921 major_3 (pad
, pad
[4]);
1926 pad
[12] ^= pad
[15] - 0xf5cfde0;
1928 major_21 (pad
, pad
[14]);
1931 seed
+= pad
[9] - 0xbc1b5d9;
1936 pad
[9] ^= pad
[7] * 0x44;
1937 major_16 (pad
, seed
);
1940 pad
[18] += pad
[11] * 0x5b;
1944 pad
[7] &= pad
[13] ^ 0x21aaf758;
1946 major_1 (pad
, pad
[1]);
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;
1966 pad
[9] |= pad
[7] ^ 0x2a19119f;
1967 major_15 (pad
, pad
[11]);
1973 pad
[12] ^= pad
[15] - 0xf5cfde0;
1974 major_3 (pad
, seed
);
1977 seed
^= pad
[1] * 0x6c;
1981 TRY (minor_12 (0xad86172c));
1982 pad
[12] ^= pad
[15] - 0xf5cfde0;
1983 major_21 (pad
, pad
[7]);
1988 pad
[0] += pad
[6] * 0x3c;
1989 pad
[9] &= 0xa2cc0e51;
1990 major_16 (pad
, pad
[10]);
1993 pad
[11] += pad
[8] - 0xef3b680;
1998 pad
[2] ^= my_sin (pad
[13]) ? 0xfd08092 : pad
[10];
1999 major_1 (pad
, seed
);
2004 pad
[12] += 0x1f3bc7f4;
2005 pad
[9] += ROL (pad
[4], 9);
2006 major_14 (pad
, pad
[3]);
2009 pad
[19] -= seed
^ 0x42b04005;
2014 pad
[0] += pad
[18] ^ 0x4ac16b8d;
2015 major_6 (pad
, pad
[2]);
2022 major_9 (pad
, seed
);
2025 pad
[0] += my_sqrt (pad
[16]);
2029 pad
[12] ^= pad
[15] - 0xf5cfde0;
2030 ROREQ (pad
[4], 0x19);
2031 major_2 (pad
, pad
[19]);
2038 major_5 (pad
, pad
[7]);
2041 seed
+= pad
[17] | 0xead7ac4a;
2045 TRY (minor_1 (0xd3280a0));
2046 pad
[7] ^= 0x3eb9d37;
2047 major_12 (pad
, pad
[12]);
2054 major_11 (pad
, seed
);
2057 ROREQ (pad
[2], pad
[15] < 0x3f2998c ? pad
[15] : seed
);
2061 TRY (minor_12 (0x2dd0e73));
2063 major_15 (pad
, seed
);
2068 TRY (minor_9 (0x21602b81));
2069 pad
[13] *= 0x52fa4a96;
2070 major_3 (pad
, seed
);
2073 pad
[4] += pad
[2] ^ 0x1579499;
2078 pad
[5] += pad
[0] ^ 0x3e17add3;
2079 major_21 (pad
, pad
[5]);
2085 pad
[0] += pad
[6] * 0x3c;
2086 major_16 (pad
, pad
[8]);
2089 seed
-= pad
[2] * 0x74;
2094 pad
[19] ^= pad
[15] ^ 0x3574ed3;
2095 major_1 (pad
, seed
);
2100 pad
[9] &= 0x334ce7cf;
2101 TRY (minor_10 (0xbcbc7bb));
2102 major_14 (pad
, seed
);
2105 pad
[10] -= pad
[10] | 0xae9eedbf;
2111 major_6 (pad
, pad
[11]);
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;
2126 pad
[18] *= pad
[10] + 0x466e09cf;
2127 major_2 (pad
, pad
[8]);
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;
2146 TRY (minor_1 (0xe32bdca0));
2148 major_23 (pad
, pad
[19]);
2151 seed
-= seed
^ 0xf74450ff;
2155 minor_32 (0x788c78a4);
2157 major_24 (pad
, seed
);
2160 pad
[13] -= my_cos (pad
[3]) ? 0xf74450ff : pad
[4];
2164 pad
[9] |= pad
[7] ^ 0x2a19119f;
2166 major_19 (pad
, seed
);
2169 pad
[9] ^= pad
[6] * 0x59;
2174 pad
[6] += 0xfe07af0e - pad
[3];
2175 major_25 (pad
, pad
[11]);
2181 pad
[4] ^= 0xb949718c;
2182 major_17 (pad
, pad
[7]);
2185 pad
[1] ^= my_sin (seed
) ? 0xc90f1504 : pad
[17];
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];
2198 pad
[4] ^= 0x3bcc51a7;
2199 pad
[12] += 0x4ec6cf36;
2200 major_18 (pad
, pad
[1]);
2203 seed
|= ROR (pad
[18], 11);
2209 major_15 (pad
, pad
[0]);
2212 pad
[4] += seed
+ 0xf65efbd;
2217 pad
[2] *= pad
[3] + 0xd6863a6;
2218 major_3 (pad
, pad
[5]);
2223 pad
[7] &= 0xdf76eba8;
2225 major_21 (pad
, seed
);
2228 pad
[4] ^= ROL (pad
[8], 22);
2232 TRY (minor_10 (0xec30bd82));
2233 pad
[2] *= pad
[3] + 0xd6863a6;
2234 major_16 (pad
, pad
[13]);
2237 seed
*= pad
[6] + 0x6bbeb974;
2241 pad
[18] *= pad
[10] + 0x466e09cf;
2242 pad
[2] *= pad
[3] + 0xd6863a6;
2243 major_1 (pad
, pad
[6]);
2246 pad
[16] -= pad
[2] * 0x65a10fa8;
2250 pad
[19] ^= pad
[15] ^ 0x3574ed3;
2252 major_23 (pad
, pad
[14]);
2255 ROREQ (pad
[13], my_sqrt (seed
));
2261 major_24 (pad
, pad
[0]);
2266 pad
[7] ^= 0xc9d1f4a2;
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);
2283 pad
[6] ^= 0xf4c1a1c8;
2287 pad
[5] ^= seed
+ 0x1ff8749d;
2291 ROREQ (pad
[4], 0x19);
2292 pad
[9] += ROL (pad
[4], 9);
2296 pad
[13] ^= pad
[15] + 0x19ad9d3;
2300 pad
[14] |= pad
[3] ^ 0x4345732;
2302 major_23 (pad
, pad
[13]);
2305 ROREQ (pad
[3], my_sqrt (pad
[9]));
2309 pad
[16] += 0x188ae78f;
2310 pad
[2] ^= pad
[15] << 5;
2311 major_24 (pad
, pad
[12]);
2314 seed
^= pad
[12] ^ 0x82494ea7;
2318 pad
[14] |= pad
[3] ^ 0x4345732;
2319 pad
[7] &= 0x97ea531;
2320 major_19 (pad
, pad
[6]);
2323 ROLEQ (pad
[0], 0x82494ea7 & seed
);
2328 TRY (minor_9 (0xd3d79cb4));
2329 major_25 (pad
, pad
[6]);
2332 pad
[18] ^= pad
[9] - 0x5606038;
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];
2345 pad
[18] *= pad
[10] + 0x466e09cf;
2347 major_4 (pad
, pad
[1]);
2354 major_18 (pad
, pad
[0]);
2358 static void major_16 (u32
*pad
, u32 seed
)
2360 int branch
= (pad
[11] ^ seed
^ pad
[5]) % 12;
2364 pad
[2] *= pad
[3] + 0xd6863a6;
2369 pad
[4] ^= seed
- 0xafd4eac;
2374 pad
[0] += pad
[18] ^ 0x4ac16b8d;
2378 pad
[15] -= 0xafd4eac ^ seed
;
2382 TRY (minor_2 (0x80e3e69e));
2384 major_23 (pad
, pad
[4]);
2387 pad
[8] ^= my_sqrt (pad
[16]);
2391 pad
[9] ^= 0x8e61a4f;
2393 major_24 (pad
, seed
);
2398 pad
[6] += pad
[19] - 0x3f5675d6;
2399 pad
[13] *= 0xa02fe00;
2400 major_19 (pad
, pad
[6]);
2407 major_25 (pad
, pad
[0]);
2410 pad
[8] ^= pad
[15] * 0x5f;
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];
2424 pad
[6] += 0xfe07af0e - pad
[3];
2425 pad
[0] += pad
[18] ^ 0x4ac16b8d;
2426 major_4 (pad
, pad
[0]);
2431 pad
[7] |= 0xa885099;
2432 pad
[9] ^= 0xdd34e6b;
2433 major_18 (pad
, seed
);
2438 pad
[12] += 0x5e6f4861;
2439 pad
[18] -= pad
[13] ^ 0x154abcdf;
2440 major_15 (pad
, pad
[14]);
2443 pad
[10] += pad
[1] + 0x217f7a00;
2447 pad
[0] += pad
[18] ^ 0x4ac16b8d;
2449 major_3 (pad
, pad
[17]);
2452 pad
[5] &= ROR (pad
[0], 14);
2456 pad
[2] *= pad
[3] + 0xd6863a6;
2457 pad
[9] ^= pad
[7] * 0x44;
2458 major_21 (pad
, pad
[13]);
2464 pad
[13] += pad
[15] < 0x137bffeb ? pad
[15] : pad
[11];
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;
2484 seed
= ((seed
^ 0x1ea9da8) + seed
) * pad
[18] * 0xd;
2488 TRY (minor_1 (0x10381ff0));
2489 pad
[2] *= pad
[3] + 0xd6863a6;
2493 pad
[14] += pad
[12] * 0x19;
2494 pad
[2] -= my_sqrt (pad
[5]);
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;
2508 pad
[7] ^= 0xa98896dd;
2510 major_24 (pad
, pad
[6]);
2513 pad
[6] += ROR (seed
, 10);
2514 seed
-= pad
[0] < 0x29ea2cb6 ? pad
[0] : pad
[3];
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];
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);
2542 pad
[6] += pad
[19] - 0x3f5675d6;
2543 pad
[9] ^= 0x94d017f;
2547 ROREQ (pad
[3], pad
[16] * 0xf);
2551 pad
[5] += pad
[0] ^ 0x3e17add3;
2556 pad
[11] -= my_sqrt (pad
[9]);
2557 pad
[12] += 0x17267c5b - pad
[11];
2562 pad
[7] &= pad
[13] ^ 0x21aaf758;
2563 major_23 (pad
, pad
[0]);
2566 pad
[17] ^= seed
^ 0x35eddea4;
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;
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;
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
;
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;
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);
2625 pad
[12] += pad
[6] ^ 0x211f5e40;
2626 pad
[9] ^= 0x6b4bfbe3;
2630 seed
^= pad
[6] ^ 0xc1fcda0;
2631 pad
[5] -= my_cos (pad
[6]) ? 0xb9269bb0 : pad
[10];
2635 pad
[9] ^= 0x703e6c86;
2636 pad
[16] += 0xbb78136d;
2640 seed
*= pad
[19] + 0x11500e47;
2641 pad
[3] ^= ROL (pad
[4], 20);
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;
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;
2668 pad
[2] *= pad
[3] + 0xd6863a6;
2669 pad
[12] ^= pad
[15] - 0xf5cfde0;
2677 pad
[16] += 0x2b058ae8;
2678 pad
[6] += 0xfe07af0e - pad
[3];
2682 pad
[17] ^= ROL (pad
[18], 28);
2686 pad
[2] *= pad
[3] + 0xd6863a6;
2687 minor_32 (0x79fb5201);
2688 major_23 (pad
, pad
[7]);
2691 pad
[0] ^= my_sqrt (pad
[12]);
2695 pad
[19] ^= pad
[15] ^ 0x3574ed3;
2697 major_24 (pad
, pad
[2]);
2700 pad
[10] ^= seed
* 0x6c;
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
;
2715 major_25 (pad
, pad
[1]);
2718 seed
^= my_sin (seed
) ? 0x2c99fade : pad
[14];
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
;
2731 pad
[13] *= 0x1bd5157f;
2732 pad
[6] += pad
[19] - 0x3f5675d6;
2733 major_4 (pad
, pad
[15]);
2736 ROREQ (pad
[1], 0x80d9edac * pad
[16]);
2740 TRY (minor_10 (0xfde30e03));
2741 pad
[9] |= pad
[7] ^ 0x2a19119f;
2742 major_18 (pad
, seed
);
2745 pad
[7] &= pad
[15] * 0xa8f285;
2749 pad
[7] ^= 0xef011757;
2751 major_15 (pad
, pad
[13]);
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];
2765 pad
[9] += ROL (pad
[4], 9);
2770 pad
[11] ^= pad
[17] * 0x44;
2773 static void major_22 (u32
*pad
, u32 seed
)
2775 int branch
= (pad
[5] ^ pad
[0] ^ seed
) & 15;
2781 major_3 (pad
, seed
);
2786 pad
[6] ^= 0x6066818c;
2788 major_21 (pad
, pad
[2]);
2791 pad
[14] ^= ROL (pad
[16], 22);
2795 pad
[10] += 0x830ba927;
2796 minor_32 (0x6f3a3876);
2797 major_16 (pad
, pad
[8]);
2803 pad
[16] += 0x1bc7b861;
2804 major_1 (pad
, pad
[6]);
2807 pad
[12] ^= pad
[11] < 0x521b2180 ? pad
[11] : pad
[9];
2812 pad
[0] += pad
[6] * 0x3c;
2813 major_14 (pad
, pad
[15]);
2819 pad
[18] *= pad
[10] + 0x466e09cf;
2820 major_6 (pad
, pad
[13]);
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]);
2835 pad
[2] ^= pad
[15] << 5;
2836 major_2 (pad
, pad
[2]);
2841 pad
[2] *= pad
[3] + 0xd6863a6;
2842 pad
[6] += 0xfe07af0e - pad
[3];
2843 major_5 (pad
, pad
[14]);
2846 pad
[18] -= pad
[16] * 0x77;
2850 pad
[4] ^= 0xa09619f7;
2851 ROREQ (pad
[4], 0x19);
2852 major_12 (pad
, pad
[10]);
2857 pad
[12] ^= pad
[15] - 0xf5cfde0;
2858 pad
[13] *= 0x6cd0251e;
2859 major_11 (pad
, pad
[0]);
2864 pad
[2] *= pad
[3] + 0xd6863a6;
2865 ROREQ (pad
[4], 0x1a);
2866 major_13 (pad
, seed
);
2869 pad
[13] ^= 0x4930de03 ^ seed
;
2873 pad
[10] += 0x6467451;
2874 pad
[4] -= pad
[17] ^ 0x2217cf47;
2875 major_3 (pad
, pad
[2]);
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]);
2889 TRY (minor_9 (0x5b9d1f9));
2890 pad
[10] += 0x8958821;
2891 major_16 (pad
, pad
[8]);
2897 pad
[13] *= 0x72494c9c;
2898 major_1 (pad
, seed
);
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);
2912 pad
[19] += 0x12b9e29d - pad
[12];
2913 pad
[0] += pad
[6] * 0x3c;
2914 major_6 (pad
, pad
[4]);
2919 pad
[19] ^= my_cos (pad
[9]) ? 0x57337b8 : pad
[14];
2921 major_9 (pad
, pad
[16]);
2924 ROREQ (pad
[14], seed
- 0x3b46a63f);
2928 pad
[19] ^= my_cos (pad
[9]) ? 0x57337b8 : pad
[14];
2929 pad
[9] += ROL (pad
[4], 9);
2930 major_2 (pad
, pad
[9]);
2935 pad
[19] += 0x12b9e29d - pad
[12];
2937 major_5 (pad
, pad
[6]);
2943 pad
[6] ^= 0xa9c74969;
2944 major_12 (pad
, pad
[14]);
2947 pad
[8] ^= ROR (seed
, 6);
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];
2971 pad
[7] &= pad
[13] ^ 0x21aaf758;
2972 minor_32 (0x640f077d);
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);
2984 TRY (minor_9 (0xdc306f47));
2985 pad
[9] ^= pad
[7] * 0x44;
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);
3007 pad
[5] += my_sin (pad
[16]) ? 0x3af2a8e2 : pad
[16];
3012 pad
[2] *= pad
[3] + 0xd6863a6;
3016 pad
[13] ^= my_cos (pad
[16]) ? 0xf6951daa : pad
[1];
3017 pad
[18] |= pad
[17] & 0x6361a322;
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
;
3034 pad
[2] ^= my_sin (pad
[13]) ? 0xfd08092 : pad
[10];
3035 pad
[9] &= 0x49a7e0c7;
3039 pad
[1] &= ROR (seed
, 29);
3040 ROLEQ (pad
[12], my_cos (pad
[1]) ? 27 : pad
[5]);
3045 pad
[2] ^= my_sin (pad
[13]) ? 0xfd08092 : pad
[10];
3049 ROREQ (seed
, my_sqrt (seed
));
3050 seed
^= 0xc63d7671 * seed
;
3051 pad
[17] += pad
[19] * 0x7a;
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]);
3065 pad
[9] ^= 0x3480eee;
3066 major_24 (pad
, seed
);
3069 pad
[10] -= my_sqrt (seed
);
3070 pad
[11] &= seed
* 0x3f;
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;
3089 pad
[2] ^= my_sin (pad
[13]) ? 0xfd08092 : pad
[10];
3091 major_5 (pad
, 0x45835eb3);
3095 pad
[12] += 0x33bd47dd;
3096 major_6 (pad
, pad
[9]);
3100 pad
[6] += pad
[19] - 0x3f5675d6;
3101 major_9 (pad
, pad
[10]);
3106 major_14 (pad
, seed
);
3110 pad
[6] ^= 0x33b5c9ac;
3111 major_2 (pad
, pad
[0]);
3115 pad
[2] ^= pad
[6] + 0x1847de17;
3120 pad
[9] ^= 0x1df05ea2;
3121 pad
[19] += 0x12b9e29d - pad
[12];
3122 major_12 (pad
, 0x45835eb3);
3127 major_11 (pad
, pad
[6]);
3131 pad
[19] += pad
[12] * 0x68;
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]);
3144 TRY (minor_1 (0x706a6bc));
3145 TRY (minor_2 (0x82b598a1));
3146 major_8 (pad
, 0x45835eb3);
3150 pad
[7] -= pad
[14] & 0x1ada7fa;
3156 pad
[12] += pad
[6] + 0x21d7bf61;
3157 major_10 (pad
, pad
[16]);
3161 TRY (minor_2 (0xd2950f8c));
3162 major_7 (pad
, 0x45835eb3);
3166 seed
= (pad
[0] + 0xd092d1bb) & 0x45835eb3;
3172 pad
[7] &= pad
[13] ^ 0x21aaf758;
3173 major_9 (pad
, pad
[17]);
3177 pad
[18] *= pad
[10] + 0x466e09cf;
3178 major_14 (pad
, pad
[5]);
3181 TRY (minor_9 (0x6d32760));
3182 pad
[9] ^= pad
[7] * 0x44;
3183 major_6 (pad
, pad
[8]);
3187 ROLEQ (pad
[8], pad
[3] ^ 0x6);
3192 pad
[7] &= pad
[13] ^ 0x21aaf758;
3193 pad
[14] |= pad
[3] ^ 0x4345732;
3194 major_12 (pad
, pad
[9]);
3199 major_2 (pad
, pad
[1]);
3204 major_5 (pad
, pad
[2]);
3208 pad
[9] *= pad
[14] | 0xbbf1fbef;
3213 pad
[12] += pad
[6] ^ 0x211f5e40;
3214 pad
[5] += pad
[0] ^ 0x3e17add3;
3215 major_11 (pad
, pad
[8]);
3218 pad
[19] ^= pad
[15] ^ 0x3574ed3;
3220 major_13 (pad
, pad
[16]);
3224 seed
*= my_sqrt (pad
[1]);
3229 minor_32 (0x678aae2c);
3231 major_22 (pad
, pad
[11]);
3234 pad
[13] *= ROR (pad
[3], 5);
3236 major_8 (pad
, pad
[18]);
3239 ROREQ (pad
[4], 0x2);
3241 major_10 (pad
, pad
[0]);
3245 pad
[3] -= pad
[7] ^ 0x4e46f05d;
3250 pad
[7] ^= 0xeda01e71;
3252 major_7 (pad
, pad
[11]);
3255 pad
[2] ^= my_sin (pad
[13]) ? 0xfd08092 : pad
[10];
3256 pad
[9] += ROL (pad
[4], 9);
3257 major_14 (pad
, pad
[2]);
3261 pad
[19] ^= 0xb1bdd560 ^ seed
;
3266 pad
[12] ^= pad
[15] - 0xf5cfde0;
3268 major_9 (pad
, pad
[5]);
3271 pad
[18] *= pad
[10] + 0x466e09cf;
3272 pad
[2] ^= pad
[15] << 5;
3273 major_6 (pad
, pad
[15]);
3277 pad
[6] ^= my_sqrt (pad
[5]);