2 * Written in 2012 by Gregor Pintar <grpintar@gmail.com>
4 * To the extent possible under law, the author(s) have dedicated
5 * all copyright and related and neighboring rights to this software
6 * to the public domain worldwide.
8 * This software is distributed without any warranty.
10 * You should have received a copy of the CC0 Public Domain Dedication.
11 * If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
14 /* Derived from Tom St Denis public domain source */
20 #include <kripto/cast.h>
21 #include <kripto/loadstore.h>
22 #include <kripto/rotate.h>
23 #include <kripto/memwipe.h>
24 #include <kripto/block.h>
25 #include <kripto/desc/block.h>
26 #include <kripto/object/block.h>
28 #include <kripto/block/twofish.h>
32 struct kripto_block_object obj
;
42 #define TWOFISH_K_LEN(R) (((R) << 1) + 8)
44 static const uint8_t s0
[256] =
46 0xA9, 0x67, 0xB3, 0xE8, 0x04, 0xFD, 0xA3, 0x76,
47 0x9A, 0x92, 0x80, 0x78, 0xE4, 0xDD, 0xD1, 0x38,
48 0x0D, 0xC6, 0x35, 0x98, 0x18, 0xF7, 0xEC, 0x6C,
49 0x43, 0x75, 0x37, 0x26, 0xFA, 0x13, 0x94, 0x48,
50 0xF2, 0xD0, 0x8B, 0x30, 0x84, 0x54, 0xDF, 0x23,
51 0x19, 0x5B, 0x3D, 0x59, 0xF3, 0xAE, 0xA2, 0x82,
52 0x63, 0x01, 0x83, 0x2E, 0xD9, 0x51, 0x9B, 0x7C,
53 0xA6, 0xEB, 0xA5, 0xBE, 0x16, 0x0C, 0xE3, 0x61,
54 0xC0, 0x8C, 0x3A, 0xF5, 0x73, 0x2C, 0x25, 0x0B,
55 0xBB, 0x4E, 0x89, 0x6B, 0x53, 0x6A, 0xB4, 0xF1,
56 0xE1, 0xE6, 0xBD, 0x45, 0xE2, 0xF4, 0xB6, 0x66,
57 0xCC, 0x95, 0x03, 0x56, 0xD4, 0x1C, 0x1E, 0xD7,
58 0xFB, 0xC3, 0x8E, 0xB5, 0xE9, 0xCF, 0xBF, 0xBA,
59 0xEA, 0x77, 0x39, 0xAF, 0x33, 0xC9, 0x62, 0x71,
60 0x81, 0x79, 0x09, 0xAD, 0x24, 0xCD, 0xF9, 0xD8,
61 0xE5, 0xC5, 0xB9, 0x4D, 0x44, 0x08, 0x86, 0xE7,
62 0xA1, 0x1D, 0xAA, 0xED, 0x06, 0x70, 0xB2, 0xD2,
63 0x41, 0x7B, 0xA0, 0x11, 0x31, 0xC2, 0x27, 0x90,
64 0x20, 0xF6, 0x60, 0xFF, 0x96, 0x5C, 0xB1, 0xAB,
65 0x9E, 0x9C, 0x52, 0x1B, 0x5F, 0x93, 0x0A, 0xEF,
66 0x91, 0x85, 0x49, 0xEE, 0x2D, 0x4F, 0x8F, 0x3B,
67 0x47, 0x87, 0x6D, 0x46, 0xD6, 0x3E, 0x69, 0x64,
68 0x2A, 0xCE, 0xCB, 0x2F, 0xFC, 0x97, 0x05, 0x7A,
69 0xAC, 0x7F, 0xD5, 0x1A, 0x4B, 0x0E, 0xA7, 0x5A,
70 0x28, 0x14, 0x3F, 0x29, 0x88, 0x3C, 0x4C, 0x02,
71 0xB8, 0xDA, 0xB0, 0x17, 0x55, 0x1F, 0x8A, 0x7D,
72 0x57, 0xC7, 0x8D, 0x74, 0xB7, 0xC4, 0x9F, 0x72,
73 0x7E, 0x15, 0x22, 0x12, 0x58, 0x07, 0x99, 0x34,
74 0x6E, 0x50, 0xDE, 0x68, 0x65, 0xBC, 0xDB, 0xF8,
75 0xC8, 0xA8, 0x2B, 0x40, 0xDC, 0xFE, 0x32, 0xA4,
76 0xCA, 0x10, 0x21, 0xF0, 0xD3, 0x5D, 0x0F, 0x00,
77 0x6F, 0x9D, 0x36, 0x42, 0x4A, 0x5E, 0xC1, 0xE0
80 static const uint8_t s1
[256] =
82 0x75, 0xF3, 0xC6, 0xF4, 0xDB, 0x7B, 0xFB, 0xC8,
83 0x4A, 0xD3, 0xE6, 0x6B, 0x45, 0x7D, 0xE8, 0x4B,
84 0xD6, 0x32, 0xD8, 0xFD, 0x37, 0x71, 0xF1, 0xE1,
85 0x30, 0x0F, 0xF8, 0x1B, 0x87, 0xFA, 0x06, 0x3F,
86 0x5E, 0xBA, 0xAE, 0x5B, 0x8A, 0x00, 0xBC, 0x9D,
87 0x6D, 0xC1, 0xB1, 0x0E, 0x80, 0x5D, 0xD2, 0xD5,
88 0xA0, 0x84, 0x07, 0x14, 0xB5, 0x90, 0x2C, 0xA3,
89 0xB2, 0x73, 0x4C, 0x54, 0x92, 0x74, 0x36, 0x51,
90 0x38, 0xB0, 0xBD, 0x5A, 0xFC, 0x60, 0x62, 0x96,
91 0x6C, 0x42, 0xF7, 0x10, 0x7C, 0x28, 0x27, 0x8C,
92 0x13, 0x95, 0x9C, 0xC7, 0x24, 0x46, 0x3B, 0x70,
93 0xCA, 0xE3, 0x85, 0xCB, 0x11, 0xD0, 0x93, 0xB8,
94 0xA6, 0x83, 0x20, 0xFF, 0x9F, 0x77, 0xC3, 0xCC,
95 0x03, 0x6F, 0x08, 0xBF, 0x40, 0xE7, 0x2B, 0xE2,
96 0x79, 0x0C, 0xAA, 0x82, 0x41, 0x3A, 0xEA, 0xB9,
97 0xE4, 0x9A, 0xA4, 0x97, 0x7E, 0xDA, 0x7A, 0x17,
98 0x66, 0x94, 0xA1, 0x1D, 0x3D, 0xF0, 0xDE, 0xB3,
99 0x0B, 0x72, 0xA7, 0x1C, 0xEF, 0xD1, 0x53, 0x3E,
100 0x8F, 0x33, 0x26, 0x5F, 0xEC, 0x76, 0x2A, 0x49,
101 0x81, 0x88, 0xEE, 0x21, 0xC4, 0x1A, 0xEB, 0xD9,
102 0xC5, 0x39, 0x99, 0xCD, 0xAD, 0x31, 0x8B, 0x01,
103 0x18, 0x23, 0xDD, 0x1F, 0x4E, 0x2D, 0xF9, 0x48,
104 0x4F, 0xF2, 0x65, 0x8E, 0x78, 0x5C, 0x58, 0x19,
105 0x8D, 0xE5, 0x98, 0x57, 0x67, 0x7F, 0x05, 0x64,
106 0xAF, 0x63, 0xB6, 0xFE, 0xF5, 0xB7, 0x3C, 0xA5,
107 0xCE, 0xE9, 0x68, 0x44, 0xE0, 0x4D, 0x43, 0x69,
108 0x29, 0x2E, 0xAC, 0x15, 0x59, 0xA8, 0x0A, 0x9E,
109 0x6E, 0x47, 0xDF, 0x34, 0x35, 0x6A, 0xCF, 0xDC,
110 0x22, 0xC9, 0xC0, 0x9B, 0x89, 0xD4, 0xED, 0xAB,
111 0x12, 0xA2, 0x0D, 0x52, 0xBB, 0x02, 0x2F, 0xA9,
112 0xD7, 0x61, 0x1E, 0xB4, 0x50, 0x04, 0xF6, 0xC2,
113 0x16, 0x25, 0x86, 0x56, 0x55, 0x09, 0xBE, 0x91
116 static const uint32_t mds0
[256] =
118 0x00000000, 0xEFEF5B01, 0xB7B7B602, 0x5858ED03,
119 0x07070504, 0xE8E85E05, 0xB0B0B306, 0x5F5FE807,
120 0x0E0E0A08, 0xE1E15109, 0xB9B9BC0A, 0x5656E70B,
121 0x09090F0C, 0xE6E6540D, 0xBEBEB90E, 0x5151E20F,
122 0x1C1C1410, 0xF3F34F11, 0xABABA212, 0x4444F913,
123 0x1B1B1114, 0xF4F44A15, 0xACACA716, 0x4343FC17,
124 0x12121E18, 0xFDFD4519, 0xA5A5A81A, 0x4A4AF31B,
125 0x15151B1C, 0xFAFA401D, 0xA2A2AD1E, 0x4D4DF61F,
126 0x38382820, 0xD7D77321, 0x8F8F9E22, 0x6060C523,
127 0x3F3F2D24, 0xD0D07625, 0x88889B26, 0x6767C027,
128 0x36362228, 0xD9D97929, 0x8181942A, 0x6E6ECF2B,
129 0x3131272C, 0xDEDE7C2D, 0x8686912E, 0x6969CA2F,
130 0x24243C30, 0xCBCB6731, 0x93938A32, 0x7C7CD133,
131 0x23233934, 0xCCCC6235, 0x94948F36, 0x7B7BD437,
132 0x2A2A3638, 0xC5C56D39, 0x9D9D803A, 0x7272DB3B,
133 0x2D2D333C, 0xC2C2683D, 0x9A9A853E, 0x7575DE3F,
134 0x70705040, 0x9F9F0B41, 0xC7C7E642, 0x2828BD43,
135 0x77775544, 0x98980E45, 0xC0C0E346, 0x2F2FB847,
136 0x7E7E5A48, 0x91910149, 0xC9C9EC4A, 0x2626B74B,
137 0x79795F4C, 0x9696044D, 0xCECEE94E, 0x2121B24F,
138 0x6C6C4450, 0x83831F51, 0xDBDBF252, 0x3434A953,
139 0x6B6B4154, 0x84841A55, 0xDCDCF756, 0x3333AC57,
140 0x62624E58, 0x8D8D1559, 0xD5D5F85A, 0x3A3AA35B,
141 0x65654B5C, 0x8A8A105D, 0xD2D2FD5E, 0x3D3DA65F,
142 0x48487860, 0xA7A72361, 0xFFFFCE62, 0x10109563,
143 0x4F4F7D64, 0xA0A02665, 0xF8F8CB66, 0x17179067,
144 0x46467268, 0xA9A92969, 0xF1F1C46A, 0x1E1E9F6B,
145 0x4141776C, 0xAEAE2C6D, 0xF6F6C16E, 0x19199A6F,
146 0x54546C70, 0xBBBB3771, 0xE3E3DA72, 0x0C0C8173,
147 0x53536974, 0xBCBC3275, 0xE4E4DF76, 0x0B0B8477,
148 0x5A5A6678, 0xB5B53D79, 0xEDEDD07A, 0x02028B7B,
149 0x5D5D637C, 0xB2B2387D, 0xEAEAD57E, 0x05058E7F,
150 0xE0E0A080, 0x0F0FFB81, 0x57571682, 0xB8B84D83,
151 0xE7E7A584, 0x0808FE85, 0x50501386, 0xBFBF4887,
152 0xEEEEAA88, 0x0101F189, 0x59591C8A, 0xB6B6478B,
153 0xE9E9AF8C, 0x0606F48D, 0x5E5E198E, 0xB1B1428F,
154 0xFCFCB490, 0x1313EF91, 0x4B4B0292, 0xA4A45993,
155 0xFBFBB194, 0x1414EA95, 0x4C4C0796, 0xA3A35C97,
156 0xF2F2BE98, 0x1D1DE599, 0x4545089A, 0xAAAA539B,
157 0xF5F5BB9C, 0x1A1AE09D, 0x42420D9E, 0xADAD569F,
158 0xD8D888A0, 0x3737D3A1, 0x6F6F3EA2, 0x808065A3,
159 0xDFDF8DA4, 0x3030D6A5, 0x68683BA6, 0x878760A7,
160 0xD6D682A8, 0x3939D9A9, 0x616134AA, 0x8E8E6FAB,
161 0xD1D187AC, 0x3E3EDCAD, 0x666631AE, 0x89896AAF,
162 0xC4C49CB0, 0x2B2BC7B1, 0x73732AB2, 0x9C9C71B3,
163 0xC3C399B4, 0x2C2CC2B5, 0x74742FB6, 0x9B9B74B7,
164 0xCACA96B8, 0x2525CDB9, 0x7D7D20BA, 0x92927BBB,
165 0xCDCD93BC, 0x2222C8BD, 0x7A7A25BE, 0x95957EBF,
166 0x9090F0C0, 0x7F7FABC1, 0x272746C2, 0xC8C81DC3,
167 0x9797F5C4, 0x7878AEC5, 0x202043C6, 0xCFCF18C7,
168 0x9E9EFAC8, 0x7171A1C9, 0x29294CCA, 0xC6C617CB,
169 0x9999FFCC, 0x7676A4CD, 0x2E2E49CE, 0xC1C112CF,
170 0x8C8CE4D0, 0x6363BFD1, 0x3B3B52D2, 0xD4D409D3,
171 0x8B8BE1D4, 0x6464BAD5, 0x3C3C57D6, 0xD3D30CD7,
172 0x8282EED8, 0x6D6DB5D9, 0x353558DA, 0xDADA03DB,
173 0x8585EBDC, 0x6A6AB0DD, 0x32325DDE, 0xDDDD06DF,
174 0xA8A8D8E0, 0x474783E1, 0x1F1F6EE2, 0xF0F035E3,
175 0xAFAFDDE4, 0x404086E5, 0x18186BE6, 0xF7F730E7,
176 0xA6A6D2E8, 0x494989E9, 0x111164EA, 0xFEFE3FEB,
177 0xA1A1D7EC, 0x4E4E8CED, 0x161661EE, 0xF9F93AEF,
178 0xB4B4CCF0, 0x5B5B97F1, 0x03037AF2, 0xECEC21F3,
179 0xB3B3C9F4, 0x5C5C92F5, 0x04047FF6, 0xEBEB24F7,
180 0xBABAC6F8, 0x55559DF9, 0x0D0D70FA, 0xE2E22BFB,
181 0xBDBDC3FC, 0x525298FD, 0x0A0A75FE, 0xE5E52EFF
184 static const uint32_t mds1
[256] =
186 0x00000000, 0x015BEFEF, 0x02B6B7B7, 0x03ED5858,
187 0x04050707, 0x055EE8E8, 0x06B3B0B0, 0x07E85F5F,
188 0x080A0E0E, 0x0951E1E1, 0x0ABCB9B9, 0x0BE75656,
189 0x0C0F0909, 0x0D54E6E6, 0x0EB9BEBE, 0x0FE25151,
190 0x10141C1C, 0x114FF3F3, 0x12A2ABAB, 0x13F94444,
191 0x14111B1B, 0x154AF4F4, 0x16A7ACAC, 0x17FC4343,
192 0x181E1212, 0x1945FDFD, 0x1AA8A5A5, 0x1BF34A4A,
193 0x1C1B1515, 0x1D40FAFA, 0x1EADA2A2, 0x1FF64D4D,
194 0x20283838, 0x2173D7D7, 0x229E8F8F, 0x23C56060,
195 0x242D3F3F, 0x2576D0D0, 0x269B8888, 0x27C06767,
196 0x28223636, 0x2979D9D9, 0x2A948181, 0x2BCF6E6E,
197 0x2C273131, 0x2D7CDEDE, 0x2E918686, 0x2FCA6969,
198 0x303C2424, 0x3167CBCB, 0x328A9393, 0x33D17C7C,
199 0x34392323, 0x3562CCCC, 0x368F9494, 0x37D47B7B,
200 0x38362A2A, 0x396DC5C5, 0x3A809D9D, 0x3BDB7272,
201 0x3C332D2D, 0x3D68C2C2, 0x3E859A9A, 0x3FDE7575,
202 0x40507070, 0x410B9F9F, 0x42E6C7C7, 0x43BD2828,
203 0x44557777, 0x450E9898, 0x46E3C0C0, 0x47B82F2F,
204 0x485A7E7E, 0x49019191, 0x4AECC9C9, 0x4BB72626,
205 0x4C5F7979, 0x4D049696, 0x4EE9CECE, 0x4FB22121,
206 0x50446C6C, 0x511F8383, 0x52F2DBDB, 0x53A93434,
207 0x54416B6B, 0x551A8484, 0x56F7DCDC, 0x57AC3333,
208 0x584E6262, 0x59158D8D, 0x5AF8D5D5, 0x5BA33A3A,
209 0x5C4B6565, 0x5D108A8A, 0x5EFDD2D2, 0x5FA63D3D,
210 0x60784848, 0x6123A7A7, 0x62CEFFFF, 0x63951010,
211 0x647D4F4F, 0x6526A0A0, 0x66CBF8F8, 0x67901717,
212 0x68724646, 0x6929A9A9, 0x6AC4F1F1, 0x6B9F1E1E,
213 0x6C774141, 0x6D2CAEAE, 0x6EC1F6F6, 0x6F9A1919,
214 0x706C5454, 0x7137BBBB, 0x72DAE3E3, 0x73810C0C,
215 0x74695353, 0x7532BCBC, 0x76DFE4E4, 0x77840B0B,
216 0x78665A5A, 0x793DB5B5, 0x7AD0EDED, 0x7B8B0202,
217 0x7C635D5D, 0x7D38B2B2, 0x7ED5EAEA, 0x7F8E0505,
218 0x80A0E0E0, 0x81FB0F0F, 0x82165757, 0x834DB8B8,
219 0x84A5E7E7, 0x85FE0808, 0x86135050, 0x8748BFBF,
220 0x88AAEEEE, 0x89F10101, 0x8A1C5959, 0x8B47B6B6,
221 0x8CAFE9E9, 0x8DF40606, 0x8E195E5E, 0x8F42B1B1,
222 0x90B4FCFC, 0x91EF1313, 0x92024B4B, 0x9359A4A4,
223 0x94B1FBFB, 0x95EA1414, 0x96074C4C, 0x975CA3A3,
224 0x98BEF2F2, 0x99E51D1D, 0x9A084545, 0x9B53AAAA,
225 0x9CBBF5F5, 0x9DE01A1A, 0x9E0D4242, 0x9F56ADAD,
226 0xA088D8D8, 0xA1D33737, 0xA23E6F6F, 0xA3658080,
227 0xA48DDFDF, 0xA5D63030, 0xA63B6868, 0xA7608787,
228 0xA882D6D6, 0xA9D93939, 0xAA346161, 0xAB6F8E8E,
229 0xAC87D1D1, 0xADDC3E3E, 0xAE316666, 0xAF6A8989,
230 0xB09CC4C4, 0xB1C72B2B, 0xB22A7373, 0xB3719C9C,
231 0xB499C3C3, 0xB5C22C2C, 0xB62F7474, 0xB7749B9B,
232 0xB896CACA, 0xB9CD2525, 0xBA207D7D, 0xBB7B9292,
233 0xBC93CDCD, 0xBDC82222, 0xBE257A7A, 0xBF7E9595,
234 0xC0F09090, 0xC1AB7F7F, 0xC2462727, 0xC31DC8C8,
235 0xC4F59797, 0xC5AE7878, 0xC6432020, 0xC718CFCF,
236 0xC8FA9E9E, 0xC9A17171, 0xCA4C2929, 0xCB17C6C6,
237 0xCCFF9999, 0xCDA47676, 0xCE492E2E, 0xCF12C1C1,
238 0xD0E48C8C, 0xD1BF6363, 0xD2523B3B, 0xD309D4D4,
239 0xD4E18B8B, 0xD5BA6464, 0xD6573C3C, 0xD70CD3D3,
240 0xD8EE8282, 0xD9B56D6D, 0xDA583535, 0xDB03DADA,
241 0xDCEB8585, 0xDDB06A6A, 0xDE5D3232, 0xDF06DDDD,
242 0xE0D8A8A8, 0xE1834747, 0xE26E1F1F, 0xE335F0F0,
243 0xE4DDAFAF, 0xE5864040, 0xE66B1818, 0xE730F7F7,
244 0xE8D2A6A6, 0xE9894949, 0xEA641111, 0xEB3FFEFE,
245 0xECD7A1A1, 0xED8C4E4E, 0xEE611616, 0xEF3AF9F9,
246 0xF0CCB4B4, 0xF1975B5B, 0xF27A0303, 0xF321ECEC,
247 0xF4C9B3B3, 0xF5925C5C, 0xF67F0404, 0xF724EBEB,
248 0xF8C6BABA, 0xF99D5555, 0xFA700D0D, 0xFB2BE2E2,
249 0xFCC3BDBD, 0xFD985252, 0xFE750A0A, 0xFF2EE5E5
252 static const uint32_t mds2
[256] =
254 0x00000000, 0xEF01EF5B, 0xB702B7B6, 0x580358ED,
255 0x07040705, 0xE805E85E, 0xB006B0B3, 0x5F075FE8,
256 0x0E080E0A, 0xE109E151, 0xB90AB9BC, 0x560B56E7,
257 0x090C090F, 0xE60DE654, 0xBE0EBEB9, 0x510F51E2,
258 0x1C101C14, 0xF311F34F, 0xAB12ABA2, 0x441344F9,
259 0x1B141B11, 0xF415F44A, 0xAC16ACA7, 0x431743FC,
260 0x1218121E, 0xFD19FD45, 0xA51AA5A8, 0x4A1B4AF3,
261 0x151C151B, 0xFA1DFA40, 0xA21EA2AD, 0x4D1F4DF6,
262 0x38203828, 0xD721D773, 0x8F228F9E, 0x602360C5,
263 0x3F243F2D, 0xD025D076, 0x8826889B, 0x672767C0,
264 0x36283622, 0xD929D979, 0x812A8194, 0x6E2B6ECF,
265 0x312C3127, 0xDE2DDE7C, 0x862E8691, 0x692F69CA,
266 0x2430243C, 0xCB31CB67, 0x9332938A, 0x7C337CD1,
267 0x23342339, 0xCC35CC62, 0x9436948F, 0x7B377BD4,
268 0x2A382A36, 0xC539C56D, 0x9D3A9D80, 0x723B72DB,
269 0x2D3C2D33, 0xC23DC268, 0x9A3E9A85, 0x753F75DE,
270 0x70407050, 0x9F419F0B, 0xC742C7E6, 0x284328BD,
271 0x77447755, 0x9845980E, 0xC046C0E3, 0x2F472FB8,
272 0x7E487E5A, 0x91499101, 0xC94AC9EC, 0x264B26B7,
273 0x794C795F, 0x964D9604, 0xCE4ECEE9, 0x214F21B2,
274 0x6C506C44, 0x8351831F, 0xDB52DBF2, 0x345334A9,
275 0x6B546B41, 0x8455841A, 0xDC56DCF7, 0x335733AC,
276 0x6258624E, 0x8D598D15, 0xD55AD5F8, 0x3A5B3AA3,
277 0x655C654B, 0x8A5D8A10, 0xD25ED2FD, 0x3D5F3DA6,
278 0x48604878, 0xA761A723, 0xFF62FFCE, 0x10631095,
279 0x4F644F7D, 0xA065A026, 0xF866F8CB, 0x17671790,
280 0x46684672, 0xA969A929, 0xF16AF1C4, 0x1E6B1E9F,
281 0x416C4177, 0xAE6DAE2C, 0xF66EF6C1, 0x196F199A,
282 0x5470546C, 0xBB71BB37, 0xE372E3DA, 0x0C730C81,
283 0x53745369, 0xBC75BC32, 0xE476E4DF, 0x0B770B84,
284 0x5A785A66, 0xB579B53D, 0xED7AEDD0, 0x027B028B,
285 0x5D7C5D63, 0xB27DB238, 0xEA7EEAD5, 0x057F058E,
286 0xE080E0A0, 0x0F810FFB, 0x57825716, 0xB883B84D,
287 0xE784E7A5, 0x088508FE, 0x50865013, 0xBF87BF48,
288 0xEE88EEAA, 0x018901F1, 0x598A591C, 0xB68BB647,
289 0xE98CE9AF, 0x068D06F4, 0x5E8E5E19, 0xB18FB142,
290 0xFC90FCB4, 0x139113EF, 0x4B924B02, 0xA493A459,
291 0xFB94FBB1, 0x149514EA, 0x4C964C07, 0xA397A35C,
292 0xF298F2BE, 0x1D991DE5, 0x459A4508, 0xAA9BAA53,
293 0xF59CF5BB, 0x1A9D1AE0, 0x429E420D, 0xAD9FAD56,
294 0xD8A0D888, 0x37A137D3, 0x6FA26F3E, 0x80A38065,
295 0xDFA4DF8D, 0x30A530D6, 0x68A6683B, 0x87A78760,
296 0xD6A8D682, 0x39A939D9, 0x61AA6134, 0x8EAB8E6F,
297 0xD1ACD187, 0x3EAD3EDC, 0x66AE6631, 0x89AF896A,
298 0xC4B0C49C, 0x2BB12BC7, 0x73B2732A, 0x9CB39C71,
299 0xC3B4C399, 0x2CB52CC2, 0x74B6742F, 0x9BB79B74,
300 0xCAB8CA96, 0x25B925CD, 0x7DBA7D20, 0x92BB927B,
301 0xCDBCCD93, 0x22BD22C8, 0x7ABE7A25, 0x95BF957E,
302 0x90C090F0, 0x7FC17FAB, 0x27C22746, 0xC8C3C81D,
303 0x97C497F5, 0x78C578AE, 0x20C62043, 0xCFC7CF18,
304 0x9EC89EFA, 0x71C971A1, 0x29CA294C, 0xC6CBC617,
305 0x99CC99FF, 0x76CD76A4, 0x2ECE2E49, 0xC1CFC112,
306 0x8CD08CE4, 0x63D163BF, 0x3BD23B52, 0xD4D3D409,
307 0x8BD48BE1, 0x64D564BA, 0x3CD63C57, 0xD3D7D30C,
308 0x82D882EE, 0x6DD96DB5, 0x35DA3558, 0xDADBDA03,
309 0x85DC85EB, 0x6ADD6AB0, 0x32DE325D, 0xDDDFDD06,
310 0xA8E0A8D8, 0x47E14783, 0x1FE21F6E, 0xF0E3F035,
311 0xAFE4AFDD, 0x40E54086, 0x18E6186B, 0xF7E7F730,
312 0xA6E8A6D2, 0x49E94989, 0x11EA1164, 0xFEEBFE3F,
313 0xA1ECA1D7, 0x4EED4E8C, 0x16EE1661, 0xF9EFF93A,
314 0xB4F0B4CC, 0x5BF15B97, 0x03F2037A, 0xECF3EC21,
315 0xB3F4B3C9, 0x5CF55C92, 0x04F6047F, 0xEBF7EB24,
316 0xBAF8BAC6, 0x55F9559D, 0x0DFA0D70, 0xE2FBE22B,
317 0xBDFCBDC3, 0x52FD5298, 0x0AFE0A75, 0xE5FFE52E
320 static const uint32_t mds3
[256] =
322 0x00000000, 0x5BEF015B, 0xB6B702B6, 0xED5803ED,
323 0x05070405, 0x5EE8055E, 0xB3B006B3, 0xE85F07E8,
324 0x0A0E080A, 0x51E10951, 0xBCB90ABC, 0xE7560BE7,
325 0x0F090C0F, 0x54E60D54, 0xB9BE0EB9, 0xE2510FE2,
326 0x141C1014, 0x4FF3114F, 0xA2AB12A2, 0xF94413F9,
327 0x111B1411, 0x4AF4154A, 0xA7AC16A7, 0xFC4317FC,
328 0x1E12181E, 0x45FD1945, 0xA8A51AA8, 0xF34A1BF3,
329 0x1B151C1B, 0x40FA1D40, 0xADA21EAD, 0xF64D1FF6,
330 0x28382028, 0x73D72173, 0x9E8F229E, 0xC56023C5,
331 0x2D3F242D, 0x76D02576, 0x9B88269B, 0xC06727C0,
332 0x22362822, 0x79D92979, 0x94812A94, 0xCF6E2BCF,
333 0x27312C27, 0x7CDE2D7C, 0x91862E91, 0xCA692FCA,
334 0x3C24303C, 0x67CB3167, 0x8A93328A, 0xD17C33D1,
335 0x39233439, 0x62CC3562, 0x8F94368F, 0xD47B37D4,
336 0x362A3836, 0x6DC5396D, 0x809D3A80, 0xDB723BDB,
337 0x332D3C33, 0x68C23D68, 0x859A3E85, 0xDE753FDE,
338 0x50704050, 0x0B9F410B, 0xE6C742E6, 0xBD2843BD,
339 0x55774455, 0x0E98450E, 0xE3C046E3, 0xB82F47B8,
340 0x5A7E485A, 0x01914901, 0xECC94AEC, 0xB7264BB7,
341 0x5F794C5F, 0x04964D04, 0xE9CE4EE9, 0xB2214FB2,
342 0x446C5044, 0x1F83511F, 0xF2DB52F2, 0xA93453A9,
343 0x416B5441, 0x1A84551A, 0xF7DC56F7, 0xAC3357AC,
344 0x4E62584E, 0x158D5915, 0xF8D55AF8, 0xA33A5BA3,
345 0x4B655C4B, 0x108A5D10, 0xFDD25EFD, 0xA63D5FA6,
346 0x78486078, 0x23A76123, 0xCEFF62CE, 0x95106395,
347 0x7D4F647D, 0x26A06526, 0xCBF866CB, 0x90176790,
348 0x72466872, 0x29A96929, 0xC4F16AC4, 0x9F1E6B9F,
349 0x77416C77, 0x2CAE6D2C, 0xC1F66EC1, 0x9A196F9A,
350 0x6C54706C, 0x37BB7137, 0xDAE372DA, 0x810C7381,
351 0x69537469, 0x32BC7532, 0xDFE476DF, 0x840B7784,
352 0x665A7866, 0x3DB5793D, 0xD0ED7AD0, 0x8B027B8B,
353 0x635D7C63, 0x38B27D38, 0xD5EA7ED5, 0x8E057F8E,
354 0xA0E080A0, 0xFB0F81FB, 0x16578216, 0x4DB8834D,
355 0xA5E784A5, 0xFE0885FE, 0x13508613, 0x48BF8748,
356 0xAAEE88AA, 0xF10189F1, 0x1C598A1C, 0x47B68B47,
357 0xAFE98CAF, 0xF4068DF4, 0x195E8E19, 0x42B18F42,
358 0xB4FC90B4, 0xEF1391EF, 0x024B9202, 0x59A49359,
359 0xB1FB94B1, 0xEA1495EA, 0x074C9607, 0x5CA3975C,
360 0xBEF298BE, 0xE51D99E5, 0x08459A08, 0x53AA9B53,
361 0xBBF59CBB, 0xE01A9DE0, 0x0D429E0D, 0x56AD9F56,
362 0x88D8A088, 0xD337A1D3, 0x3E6FA23E, 0x6580A365,
363 0x8DDFA48D, 0xD630A5D6, 0x3B68A63B, 0x6087A760,
364 0x82D6A882, 0xD939A9D9, 0x3461AA34, 0x6F8EAB6F,
365 0x87D1AC87, 0xDC3EADDC, 0x3166AE31, 0x6A89AF6A,
366 0x9CC4B09C, 0xC72BB1C7, 0x2A73B22A, 0x719CB371,
367 0x99C3B499, 0xC22CB5C2, 0x2F74B62F, 0x749BB774,
368 0x96CAB896, 0xCD25B9CD, 0x207DBA20, 0x7B92BB7B,
369 0x93CDBC93, 0xC822BDC8, 0x257ABE25, 0x7E95BF7E,
370 0xF090C0F0, 0xAB7FC1AB, 0x4627C246, 0x1DC8C31D,
371 0xF597C4F5, 0xAE78C5AE, 0x4320C643, 0x18CFC718,
372 0xFA9EC8FA, 0xA171C9A1, 0x4C29CA4C, 0x17C6CB17,
373 0xFF99CCFF, 0xA476CDA4, 0x492ECE49, 0x12C1CF12,
374 0xE48CD0E4, 0xBF63D1BF, 0x523BD252, 0x09D4D309,
375 0xE18BD4E1, 0xBA64D5BA, 0x573CD657, 0x0CD3D70C,
376 0xEE82D8EE, 0xB56DD9B5, 0x5835DA58, 0x03DADB03,
377 0xEB85DCEB, 0xB06ADDB0, 0x5D32DE5D, 0x06DDDF06,
378 0xD8A8E0D8, 0x8347E183, 0x6E1FE26E, 0x35F0E335,
379 0xDDAFE4DD, 0x8640E586, 0x6B18E66B, 0x30F7E730,
380 0xD2A6E8D2, 0x8949E989, 0x6411EA64, 0x3FFEEB3F,
381 0xD7A1ECD7, 0x8C4EED8C, 0x6116EE61, 0x3AF9EF3A,
382 0xCCB4F0CC, 0x975BF197, 0x7A03F27A, 0x21ECF321,
383 0xC9B3F4C9, 0x925CF592, 0x7F04F67F, 0x24EBF724,
384 0xC6BAF8C6, 0x9D55F99D, 0x700DFA70, 0x2BE2FB2B,
385 0xC3BDFCC3, 0x9852FD98, 0x750AFE75, 0x2EE5FF2E
388 static const uint32_t rs0
[256] =
390 0x00000000, 0xA402A401, 0x05040502, 0xA106A103,
391 0x0A080A04, 0xAE0AAE05, 0x0F0C0F06, 0xAB0EAB07,
392 0x14101408, 0xB012B009, 0x1114110A, 0xB516B50B,
393 0x1E181E0C, 0xBA1ABA0D, 0x1B1C1B0E, 0xBF1EBF0F,
394 0x28202810, 0x8C228C11, 0x2D242D12, 0x89268913,
395 0x22282214, 0x862A8615, 0x272C2716, 0x832E8317,
396 0x3C303C18, 0x98329819, 0x3934391A, 0x9D369D1B,
397 0x3638361C, 0x923A921D, 0x333C331E, 0x973E971F,
398 0x50405020, 0xF442F421, 0x55445522, 0xF146F123,
399 0x5A485A24, 0xFE4AFE25, 0x5F4C5F26, 0xFB4EFB27,
400 0x44504428, 0xE052E029, 0x4154412A, 0xE556E52B,
401 0x4E584E2C, 0xEA5AEA2D, 0x4B5C4B2E, 0xEF5EEF2F,
402 0x78607830, 0xDC62DC31, 0x7D647D32, 0xD966D933,
403 0x72687234, 0xD66AD635, 0x776C7736, 0xD36ED337,
404 0x6C706C38, 0xC872C839, 0x6974693A, 0xCD76CD3B,
405 0x6678663C, 0xC27AC23D, 0x637C633E, 0xC77EC73F,
406 0xA080A040, 0x04820441, 0xA584A542, 0x01860143,
407 0xAA88AA44, 0x0E8A0E45, 0xAF8CAF46, 0x0B8E0B47,
408 0xB490B448, 0x10921049, 0xB194B14A, 0x1596154B,
409 0xBE98BE4C, 0x1A9A1A4D, 0xBB9CBB4E, 0x1F9E1F4F,
410 0x88A08850, 0x2CA22C51, 0x8DA48D52, 0x29A62953,
411 0x82A88254, 0x26AA2655, 0x87AC8756, 0x23AE2357,
412 0x9CB09C58, 0x38B23859, 0x99B4995A, 0x3DB63D5B,
413 0x96B8965C, 0x32BA325D, 0x93BC935E, 0x37BE375F,
414 0xF0C0F060, 0x54C25461, 0xF5C4F562, 0x51C65163,
415 0xFAC8FA64, 0x5ECA5E65, 0xFFCCFF66, 0x5BCE5B67,
416 0xE4D0E468, 0x40D24069, 0xE1D4E16A, 0x45D6456B,
417 0xEED8EE6C, 0x4ADA4A6D, 0xEBDCEB6E, 0x4FDE4F6F,
418 0xD8E0D870, 0x7CE27C71, 0xDDE4DD72, 0x79E67973,
419 0xD2E8D274, 0x76EA7675, 0xD7ECD776, 0x73EE7377,
420 0xCCF0CC78, 0x68F26879, 0xC9F4C97A, 0x6DF66D7B,
421 0xC6F8C67C, 0x62FA627D, 0xC3FCC37E, 0x67FE677F,
422 0x0D4D0D80, 0xA94FA981, 0x08490882, 0xAC4BAC83,
423 0x07450784, 0xA347A385, 0x02410286, 0xA643A687,
424 0x195D1988, 0xBD5FBD89, 0x1C591C8A, 0xB85BB88B,
425 0x1355138C, 0xB757B78D, 0x1651168E, 0xB253B28F,
426 0x256D2590, 0x816F8191, 0x20692092, 0x846B8493,
427 0x2F652F94, 0x8B678B95, 0x2A612A96, 0x8E638E97,
428 0x317D3198, 0x957F9599, 0x3479349A, 0x907B909B,
429 0x3B753B9C, 0x9F779F9D, 0x3E713E9E, 0x9A739A9F,
430 0x5D0D5DA0, 0xF90FF9A1, 0x580958A2, 0xFC0BFCA3,
431 0x570557A4, 0xF307F3A5, 0x520152A6, 0xF603F6A7,
432 0x491D49A8, 0xED1FEDA9, 0x4C194CAA, 0xE81BE8AB,
433 0x431543AC, 0xE717E7AD, 0x461146AE, 0xE213E2AF,
434 0x752D75B0, 0xD12FD1B1, 0x702970B2, 0xD42BD4B3,
435 0x7F257FB4, 0xDB27DBB5, 0x7A217AB6, 0xDE23DEB7,
436 0x613D61B8, 0xC53FC5B9, 0x643964BA, 0xC03BC0BB,
437 0x6B356BBC, 0xCF37CFBD, 0x6E316EBE, 0xCA33CABF,
438 0xADCDADC0, 0x09CF09C1, 0xA8C9A8C2, 0x0CCB0CC3,
439 0xA7C5A7C4, 0x03C703C5, 0xA2C1A2C6, 0x06C306C7,
440 0xB9DDB9C8, 0x1DDF1DC9, 0xBCD9BCCA, 0x18DB18CB,
441 0xB3D5B3CC, 0x17D717CD, 0xB6D1B6CE, 0x12D312CF,
442 0x85ED85D0, 0x21EF21D1, 0x80E980D2, 0x24EB24D3,
443 0x8FE58FD4, 0x2BE72BD5, 0x8AE18AD6, 0x2EE32ED7,
444 0x91FD91D8, 0x35FF35D9, 0x94F994DA, 0x30FB30DB,
445 0x9BF59BDC, 0x3FF73FDD, 0x9EF19EDE, 0x3AF33ADF,
446 0xFD8DFDE0, 0x598F59E1, 0xF889F8E2, 0x5C8B5CE3,
447 0xF785F7E4, 0x538753E5, 0xF281F2E6, 0x568356E7,
448 0xE99DE9E8, 0x4D9F4DE9, 0xEC99ECEA, 0x489B48EB,
449 0xE395E3EC, 0x479747ED, 0xE691E6EE, 0x429342EF,
450 0xD5ADD5F0, 0x71AF71F1, 0xD0A9D0F2, 0x74AB74F3,
451 0xDFA5DFF4, 0x7BA77BF5, 0xDAA1DAF6, 0x7EA37EF7,
452 0xC1BDC1F8, 0x65BF65F9, 0xC4B9C4FA, 0x60BB60FB,
453 0xCBB5CBFC, 0x6FB76FFD, 0xCEB1CEFE, 0x6AB36AFF
456 static const uint32_t rs1
[256] =
458 0x00000000, 0x55A156A4, 0xAA0FAC05, 0xFFAEFAA1,
459 0x191E150A, 0x4CBF43AE, 0xB311B90F, 0xE6B0EFAB,
460 0x323C2A14, 0x679D7CB0, 0x98338611, 0xCD92D0B5,
461 0x2B223F1E, 0x7E8369BA, 0x812D931B, 0xD48CC5BF,
462 0x64785428, 0x31D9028C, 0xCE77F82D, 0x9BD6AE89,
463 0x7D664122, 0x28C71786, 0xD769ED27, 0x82C8BB83,
464 0x56447E3C, 0x03E52898, 0xFC4BD239, 0xA9EA849D,
465 0x4F5A6B36, 0x1AFB3D92, 0xE555C733, 0xB0F49197,
466 0xC8F0A850, 0x9D51FEF4, 0x62FF0455, 0x375E52F1,
467 0xD1EEBD5A, 0x844FEBFE, 0x7BE1115F, 0x2E4047FB,
468 0xFACC8244, 0xAF6DD4E0, 0x50C32E41, 0x056278E5,
469 0xE3D2974E, 0xB673C1EA, 0x49DD3B4B, 0x1C7C6DEF,
470 0xAC88FC78, 0xF929AADC, 0x0687507D, 0x532606D9,
471 0xB596E972, 0xE037BFD6, 0x1F994577, 0x4A3813D3,
472 0x9EB4D66C, 0xCB1580C8, 0x34BB7A69, 0x611A2CCD,
473 0x87AAC366, 0xD20B95C2, 0x2DA56F63, 0x780439C7,
474 0xDDAD1DA0, 0x880C4B04, 0x77A2B1A5, 0x2203E701,
475 0xC4B308AA, 0x91125E0E, 0x6EBCA4AF, 0x3B1DF20B,
476 0xEF9137B4, 0xBA306110, 0x459E9BB1, 0x103FCD15,
477 0xF68F22BE, 0xA32E741A, 0x5C808EBB, 0x0921D81F,
478 0xB9D54988, 0xEC741F2C, 0x13DAE58D, 0x467BB329,
479 0xA0CB5C82, 0xF56A0A26, 0x0AC4F087, 0x5F65A623,
480 0x8BE9639C, 0xDE483538, 0x21E6CF99, 0x7447993D,
481 0x92F77696, 0xC7562032, 0x38F8DA93, 0x6D598C37,
482 0x155DB5F0, 0x40FCE354, 0xBF5219F5, 0xEAF34F51,
483 0x0C43A0FA, 0x59E2F65E, 0xA64C0CFF, 0xF3ED5A5B,
484 0x27619FE4, 0x72C0C940, 0x8D6E33E1, 0xD8CF6545,
485 0x3E7F8AEE, 0x6BDEDC4A, 0x947026EB, 0xC1D1704F,
486 0x7125E1D8, 0x2484B77C, 0xDB2A4DDD, 0x8E8B1B79,
487 0x683BF4D2, 0x3D9AA276, 0xC23458D7, 0x97950E73,
488 0x4319CBCC, 0x16B89D68, 0xE91667C9, 0xBCB7316D,
489 0x5A07DEC6, 0x0FA68862, 0xF00872C3, 0xA5A92467,
490 0xF7173A0D, 0xA2B66CA9, 0x5D189608, 0x08B9C0AC,
491 0xEE092F07, 0xBBA879A3, 0x44068302, 0x11A7D5A6,
492 0xC52B1019, 0x908A46BD, 0x6F24BC1C, 0x3A85EAB8,
493 0xDC350513, 0x899453B7, 0x763AA916, 0x239BFFB2,
494 0x936F6E25, 0xC6CE3881, 0x3960C220, 0x6CC19484,
495 0x8A717B2F, 0xDFD02D8B, 0x207ED72A, 0x75DF818E,
496 0xA1534431, 0xF4F21295, 0x0B5CE834, 0x5EFDBE90,
497 0xB84D513B, 0xEDEC079F, 0x1242FD3E, 0x47E3AB9A,
498 0x3FE7925D, 0x6A46C4F9, 0x95E83E58, 0xC04968FC,
499 0x26F98757, 0x7358D1F3, 0x8CF62B52, 0xD9577DF6,
500 0x0DDBB849, 0x587AEEED, 0xA7D4144C, 0xF27542E8,
501 0x14C5AD43, 0x4164FBE7, 0xBECA0146, 0xEB6B57E2,
502 0x5B9FC675, 0x0E3E90D1, 0xF1906A70, 0xA4313CD4,
503 0x4281D37F, 0x172085DB, 0xE88E7F7A, 0xBD2F29DE,
504 0x69A3EC61, 0x3C02BAC5, 0xC3AC4064, 0x960D16C0,
505 0x70BDF96B, 0x251CAFCF, 0xDAB2556E, 0x8F1303CA,
506 0x2ABA27AD, 0x7F1B7109, 0x80B58BA8, 0xD514DD0C,
507 0x33A432A7, 0x66056403, 0x99AB9EA2, 0xCC0AC806,
508 0x18860DB9, 0x4D275B1D, 0xB289A1BC, 0xE728F718,
509 0x019818B3, 0x54394E17, 0xAB97B4B6, 0xFE36E212,
510 0x4EC27385, 0x1B632521, 0xE4CDDF80, 0xB16C8924,
511 0x57DC668F, 0x027D302B, 0xFDD3CA8A, 0xA8729C2E,
512 0x7CFE5991, 0x295F0F35, 0xD6F1F594, 0x8350A330,
513 0x65E04C9B, 0x30411A3F, 0xCFEFE09E, 0x9A4EB63A,
514 0xE24A8FFD, 0xB7EBD959, 0x484523F8, 0x1DE4755C,
515 0xFB549AF7, 0xAEF5CC53, 0x515B36F2, 0x04FA6056,
516 0xD076A5E9, 0x85D7F34D, 0x7A7909EC, 0x2FD85F48,
517 0xC968B0E3, 0x9CC9E647, 0x63671CE6, 0x36C64A42,
518 0x8632DBD5, 0xD3938D71, 0x2C3D77D0, 0x799C2174,
519 0x9F2CCEDF, 0xCA8D987B, 0x352362DA, 0x6082347E,
520 0xB40EF1C1, 0xE1AFA765, 0x1E015DC4, 0x4BA00B60,
521 0xAD10E4CB, 0xF8B1B26F, 0x071F48CE, 0x52BE1E6A
524 static const uint32_t rs2
[256] =
526 0x00000000, 0x87FC8255, 0x43B549AA, 0xC449CBFF,
527 0x86279219, 0x01DB104C, 0xC592DBB3, 0x426E59E6,
528 0x414E6932, 0xC6B2EB67, 0x02FB2098, 0x8507A2CD,
529 0xC769FB2B, 0x4095797E, 0x84DCB281, 0x032030D4,
530 0x829CD264, 0x05605031, 0xC1299BCE, 0x46D5199B,
531 0x04BB407D, 0x8347C228, 0x470E09D7, 0xC0F28B82,
532 0xC3D2BB56, 0x442E3903, 0x8067F2FC, 0x079B70A9,
533 0x45F5294F, 0xC209AB1A, 0x064060E5, 0x81BCE2B0,
534 0x4975E9C8, 0xCE896B9D, 0x0AC0A062, 0x8D3C2237,
535 0xCF527BD1, 0x48AEF984, 0x8CE7327B, 0x0B1BB02E,
536 0x083B80FA, 0x8FC702AF, 0x4B8EC950, 0xCC724B05,
537 0x8E1C12E3, 0x09E090B6, 0xCDA95B49, 0x4A55D91C,
538 0xCBE93BAC, 0x4C15B9F9, 0x885C7206, 0x0FA0F053,
539 0x4DCEA9B5, 0xCA322BE0, 0x0E7BE01F, 0x8987624A,
540 0x8AA7529E, 0x0D5BD0CB, 0xC9121B34, 0x4EEE9961,
541 0x0C80C087, 0x8B7C42D2, 0x4F35892D, 0xC8C90B78,
542 0x92EA9FDD, 0x15161D88, 0xD15FD677, 0x56A35422,
543 0x14CD0DC4, 0x93318F91, 0x5778446E, 0xD084C63B,
544 0xD3A4F6EF, 0x545874BA, 0x9011BF45, 0x17ED3D10,
545 0x558364F6, 0xD27FE6A3, 0x16362D5C, 0x91CAAF09,
546 0x10764DB9, 0x978ACFEC, 0x53C30413, 0xD43F8646,
547 0x9651DFA0, 0x11AD5DF5, 0xD5E4960A, 0x5218145F,
548 0x5138248B, 0xD6C4A6DE, 0x128D6D21, 0x9571EF74,
549 0xD71FB692, 0x50E334C7, 0x94AAFF38, 0x13567D6D,
550 0xDB9F7615, 0x5C63F440, 0x982A3FBF, 0x1FD6BDEA,
551 0x5DB8E40C, 0xDA446659, 0x1E0DADA6, 0x99F12FF3,
552 0x9AD11F27, 0x1D2D9D72, 0xD964568D, 0x5E98D4D8,
553 0x1CF68D3E, 0x9B0A0F6B, 0x5F43C494, 0xD8BF46C1,
554 0x5903A471, 0xDEFF2624, 0x1AB6EDDB, 0x9D4A6F8E,
555 0xDF243668, 0x58D8B43D, 0x9C917FC2, 0x1B6DFD97,
556 0x184DCD43, 0x9FB14F16, 0x5BF884E9, 0xDC0406BC,
557 0x9E6A5F5A, 0x1996DD0F, 0xDDDF16F0, 0x5A2394A5,
558 0x699973F7, 0xEE65F1A2, 0x2A2C3A5D, 0xADD0B808,
559 0xEFBEE1EE, 0x684263BB, 0xAC0BA844, 0x2BF72A11,
560 0x28D71AC5, 0xAF2B9890, 0x6B62536F, 0xEC9ED13A,
561 0xAEF088DC, 0x290C0A89, 0xED45C176, 0x6AB94323,
562 0xEB05A193, 0x6CF923C6, 0xA8B0E839, 0x2F4C6A6C,
563 0x6D22338A, 0xEADEB1DF, 0x2E977A20, 0xA96BF875,
564 0xAA4BC8A1, 0x2DB74AF4, 0xE9FE810B, 0x6E02035E,
565 0x2C6C5AB8, 0xAB90D8ED, 0x6FD91312, 0xE8259147,
566 0x20EC9A3F, 0xA710186A, 0x6359D395, 0xE4A551C0,
567 0xA6CB0826, 0x21378A73, 0xE57E418C, 0x6282C3D9,
568 0x61A2F30D, 0xE65E7158, 0x2217BAA7, 0xA5EB38F2,
569 0xE7856114, 0x6079E341, 0xA43028BE, 0x23CCAAEB,
570 0xA270485B, 0x258CCA0E, 0xE1C501F1, 0x663983A4,
571 0x2457DA42, 0xA3AB5817, 0x67E293E8, 0xE01E11BD,
572 0xE33E2169, 0x64C2A33C, 0xA08B68C3, 0x2777EA96,
573 0x6519B370, 0xE2E53125, 0x26ACFADA, 0xA150788F,
574 0xFB73EC2A, 0x7C8F6E7F, 0xB8C6A580, 0x3F3A27D5,
575 0x7D547E33, 0xFAA8FC66, 0x3EE13799, 0xB91DB5CC,
576 0xBA3D8518, 0x3DC1074D, 0xF988CCB2, 0x7E744EE7,
577 0x3C1A1701, 0xBBE69554, 0x7FAF5EAB, 0xF853DCFE,
578 0x79EF3E4E, 0xFE13BC1B, 0x3A5A77E4, 0xBDA6F5B1,
579 0xFFC8AC57, 0x78342E02, 0xBC7DE5FD, 0x3B8167A8,
580 0x38A1577C, 0xBF5DD529, 0x7B141ED6, 0xFCE89C83,
581 0xBE86C565, 0x397A4730, 0xFD338CCF, 0x7ACF0E9A,
582 0xB20605E2, 0x35FA87B7, 0xF1B34C48, 0x764FCE1D,
583 0x342197FB, 0xB3DD15AE, 0x7794DE51, 0xF0685C04,
584 0xF3486CD0, 0x74B4EE85, 0xB0FD257A, 0x3701A72F,
585 0x756FFEC9, 0xF2937C9C, 0x36DAB763, 0xB1263536,
586 0x309AD786, 0xB76655D3, 0x732F9E2C, 0xF4D31C79,
587 0xB6BD459F, 0x3141C7CA, 0xF5080C35, 0x72F48E60,
588 0x71D4BEB4, 0xF6283CE1, 0x3261F71E, 0xB59D754B,
589 0xF7F32CAD, 0x700FAEF8, 0xB4466507, 0x33BAE752
592 static const uint32_t rs3
[256] =
594 0x00000000, 0x5AC1F387, 0xB4CFAB43, 0xEE0E58C4,
595 0x25D31B86, 0x7F12E801, 0x911CB0C5, 0xCBDD4342,
596 0x4AEB3641, 0x102AC5C6, 0xFE249D02, 0xA4E56E85,
597 0x6F382DC7, 0x35F9DE40, 0xDBF78684, 0x81367503,
598 0x949B6C82, 0xCE5A9F05, 0x2054C7C1, 0x7A953446,
599 0xB1487704, 0xEB898483, 0x0587DC47, 0x5F462FC0,
600 0xDE705AC3, 0x84B1A944, 0x6ABFF180, 0x307E0207,
601 0xFBA34145, 0xA162B2C2, 0x4F6CEA06, 0x15AD1981,
602 0x657BD849, 0x3FBA2BCE, 0xD1B4730A, 0x8B75808D,
603 0x40A8C3CF, 0x1A693048, 0xF467688C, 0xAEA69B0B,
604 0x2F90EE08, 0x75511D8F, 0x9B5F454B, 0xC19EB6CC,
605 0x0A43F58E, 0x50820609, 0xBE8C5ECD, 0xE44DAD4A,
606 0xF1E0B4CB, 0xAB21474C, 0x452F1F88, 0x1FEEEC0F,
607 0xD433AF4D, 0x8EF25CCA, 0x60FC040E, 0x3A3DF789,
608 0xBB0B828A, 0xE1CA710D, 0x0FC429C9, 0x5505DA4E,
609 0x9ED8990C, 0xC4196A8B, 0x2A17324F, 0x70D6C1C8,
610 0xCAF6FD92, 0x90370E15, 0x7E3956D1, 0x24F8A556,
611 0xEF25E614, 0xB5E41593, 0x5BEA4D57, 0x012BBED0,
612 0x801DCBD3, 0xDADC3854, 0x34D26090, 0x6E139317,
613 0xA5CED055, 0xFF0F23D2, 0x11017B16, 0x4BC08891,
614 0x5E6D9110, 0x04AC6297, 0xEAA23A53, 0xB063C9D4,
615 0x7BBE8A96, 0x217F7911, 0xCF7121D5, 0x95B0D252,
616 0x1486A751, 0x4E4754D6, 0xA0490C12, 0xFA88FF95,
617 0x3155BCD7, 0x6B944F50, 0x859A1794, 0xDF5BE413,
618 0xAF8D25DB, 0xF54CD65C, 0x1B428E98, 0x41837D1F,
619 0x8A5E3E5D, 0xD09FCDDA, 0x3E91951E, 0x64506699,
620 0xE566139A, 0xBFA7E01D, 0x51A9B8D9, 0x0B684B5E,
621 0xC0B5081C, 0x9A74FB9B, 0x747AA35F, 0x2EBB50D8,
622 0x3B164959, 0x61D7BADE, 0x8FD9E21A, 0xD518119D,
623 0x1EC552DF, 0x4404A158, 0xAA0AF99C, 0xF0CB0A1B,
624 0x71FD7F18, 0x2B3C8C9F, 0xC532D45B, 0x9FF327DC,
625 0x542E649E, 0x0EEF9719, 0xE0E1CFDD, 0xBA203C5A,
626 0xD9A1B769, 0x836044EE, 0x6D6E1C2A, 0x37AFEFAD,
627 0xFC72ACEF, 0xA6B35F68, 0x48BD07AC, 0x127CF42B,
628 0x934A8128, 0xC98B72AF, 0x27852A6B, 0x7D44D9EC,
629 0xB6999AAE, 0xEC586929, 0x025631ED, 0x5897C26A,
630 0x4D3ADBEB, 0x17FB286C, 0xF9F570A8, 0xA334832F,
631 0x68E9C06D, 0x322833EA, 0xDC266B2E, 0x86E798A9,
632 0x07D1EDAA, 0x5D101E2D, 0xB31E46E9, 0xE9DFB56E,
633 0x2202F62C, 0x78C305AB, 0x96CD5D6F, 0xCC0CAEE8,
634 0xBCDA6F20, 0xE61B9CA7, 0x0815C463, 0x52D437E4,
635 0x990974A6, 0xC3C88721, 0x2DC6DFE5, 0x77072C62,
636 0xF6315961, 0xACF0AAE6, 0x42FEF222, 0x183F01A5,
637 0xD3E242E7, 0x8923B160, 0x672DE9A4, 0x3DEC1A23,
638 0x284103A2, 0x7280F025, 0x9C8EA8E1, 0xC64F5B66,
639 0x0D921824, 0x5753EBA3, 0xB95DB367, 0xE39C40E0,
640 0x62AA35E3, 0x386BC664, 0xD6659EA0, 0x8CA46D27,
641 0x47792E65, 0x1DB8DDE2, 0xF3B68526, 0xA97776A1,
642 0x13574AFB, 0x4996B97C, 0xA798E1B8, 0xFD59123F,
643 0x3684517D, 0x6C45A2FA, 0x824BFA3E, 0xD88A09B9,
644 0x59BC7CBA, 0x037D8F3D, 0xED73D7F9, 0xB7B2247E,
645 0x7C6F673C, 0x26AE94BB, 0xC8A0CC7F, 0x92613FF8,
646 0x87CC2679, 0xDD0DD5FE, 0x33038D3A, 0x69C27EBD,
647 0xA21F3DFF, 0xF8DECE78, 0x16D096BC, 0x4C11653B,
648 0xCD271038, 0x97E6E3BF, 0x79E8BB7B, 0x232948FC,
649 0xE8F40BBE, 0xB235F839, 0x5C3BA0FD, 0x06FA537A,
650 0x762C92B2, 0x2CED6135, 0xC2E339F1, 0x9822CA76,
651 0x53FF8934, 0x093E7AB3, 0xE7302277, 0xBDF1D1F0,
652 0x3CC7A4F3, 0x66065774, 0x88080FB0, 0xD2C9FC37,
653 0x1914BF75, 0x43D54CF2, 0xADDB1436, 0xF71AE7B1,
654 0xE2B7FE30, 0xB8760DB7, 0x56785573, 0x0CB9A6F4,
655 0xC764E5B6, 0x9DA51631, 0x73AB4EF5, 0x296ABD72,
656 0xA85CC871, 0xF29D3BF6, 0x1C936332, 0x465290B5,
657 0x8D8FD3F7, 0xD74E2070, 0x394078B4, 0x63818B33
660 static const uint32_t rs4
[256] =
662 0x00000000, 0x58471E5A, 0xB08E3CB4, 0xE8C922EE,
663 0x2D517825, 0x7516667F, 0x9DDF4491, 0xC5985ACB,
664 0x5AA2F04A, 0x02E5EE10, 0xEA2CCCFE, 0xB26BD2A4,
665 0x77F3886F, 0x2FB49635, 0xC77DB4DB, 0x9F3AAA81,
666 0xB409AD94, 0xEC4EB3CE, 0x04879120, 0x5CC08F7A,
667 0x9958D5B1, 0xC11FCBEB, 0x29D6E905, 0x7191F75F,
668 0xEEAB5DDE, 0xB6EC4384, 0x5E25616A, 0x06627F30,
669 0xC3FA25FB, 0x9BBD3BA1, 0x7374194F, 0x2B330715,
670 0x25121765, 0x7D55093F, 0x959C2BD1, 0xCDDB358B,
671 0x08436F40, 0x5004711A, 0xB8CD53F4, 0xE08A4DAE,
672 0x7FB0E72F, 0x27F7F975, 0xCF3EDB9B, 0x9779C5C1,
673 0x52E19F0A, 0x0AA68150, 0xE26FA3BE, 0xBA28BDE4,
674 0x911BBAF1, 0xC95CA4AB, 0x21958645, 0x79D2981F,
675 0xBC4AC2D4, 0xE40DDC8E, 0x0CC4FE60, 0x5483E03A,
676 0xCBB94ABB, 0x93FE54E1, 0x7B37760F, 0x23706855,
677 0xE6E8329E, 0xBEAF2CC4, 0x56660E2A, 0x0E211070,
678 0x4A242ECA, 0x12633090, 0xFAAA127E, 0xA2ED0C24,
679 0x677556EF, 0x3F3248B5, 0xD7FB6A5B, 0x8FBC7401,
680 0x1086DE80, 0x48C1C0DA, 0xA008E234, 0xF84FFC6E,
681 0x3DD7A6A5, 0x6590B8FF, 0x8D599A11, 0xD51E844B,
682 0xFE2D835E, 0xA66A9D04, 0x4EA3BFEA, 0x16E4A1B0,
683 0xD37CFB7B, 0x8B3BE521, 0x63F2C7CF, 0x3BB5D995,
684 0xA48F7314, 0xFCC86D4E, 0x14014FA0, 0x4C4651FA,
685 0x89DE0B31, 0xD199156B, 0x39503785, 0x611729DF,
686 0x6F3639AF, 0x377127F5, 0xDFB8051B, 0x87FF1B41,
687 0x4267418A, 0x1A205FD0, 0xF2E97D3E, 0xAAAE6364,
688 0x3594C9E5, 0x6DD3D7BF, 0x851AF551, 0xDD5DEB0B,
689 0x18C5B1C0, 0x4082AF9A, 0xA84B8D74, 0xF00C932E,
690 0xDB3F943B, 0x83788A61, 0x6BB1A88F, 0x33F6B6D5,
691 0xF66EEC1E, 0xAE29F244, 0x46E0D0AA, 0x1EA7CEF0,
692 0x819D6471, 0xD9DA7A2B, 0x311358C5, 0x6954469F,
693 0xACCC1C54, 0xF48B020E, 0x1C4220E0, 0x44053EBA,
694 0x94485CD9, 0xCC0F4283, 0x24C6606D, 0x7C817E37,
695 0xB91924FC, 0xE15E3AA6, 0x09971848, 0x51D00612,
696 0xCEEAAC93, 0x96ADB2C9, 0x7E649027, 0x26238E7D,
697 0xE3BBD4B6, 0xBBFCCAEC, 0x5335E802, 0x0B72F658,
698 0x2041F14D, 0x7806EF17, 0x90CFCDF9, 0xC888D3A3,
699 0x0D108968, 0x55579732, 0xBD9EB5DC, 0xE5D9AB86,
700 0x7AE30107, 0x22A41F5D, 0xCA6D3DB3, 0x922A23E9,
701 0x57B27922, 0x0FF56778, 0xE73C4596, 0xBF7B5BCC,
702 0xB15A4BBC, 0xE91D55E6, 0x01D47708, 0x59936952,
703 0x9C0B3399, 0xC44C2DC3, 0x2C850F2D, 0x74C21177,
704 0xEBF8BBF6, 0xB3BFA5AC, 0x5B768742, 0x03319918,
705 0xC6A9C3D3, 0x9EEEDD89, 0x7627FF67, 0x2E60E13D,
706 0x0553E628, 0x5D14F872, 0xB5DDDA9C, 0xED9AC4C6,
707 0x28029E0D, 0x70458057, 0x988CA2B9, 0xC0CBBCE3,
708 0x5FF11662, 0x07B60838, 0xEF7F2AD6, 0xB738348C,
709 0x72A06E47, 0x2AE7701D, 0xC22E52F3, 0x9A694CA9,
710 0xDE6C7213, 0x862B6C49, 0x6EE24EA7, 0x36A550FD,
711 0xF33D0A36, 0xAB7A146C, 0x43B33682, 0x1BF428D8,
712 0x84CE8259, 0xDC899C03, 0x3440BEED, 0x6C07A0B7,
713 0xA99FFA7C, 0xF1D8E426, 0x1911C6C8, 0x4156D892,
714 0x6A65DF87, 0x3222C1DD, 0xDAEBE333, 0x82ACFD69,
715 0x4734A7A2, 0x1F73B9F8, 0xF7BA9B16, 0xAFFD854C,
716 0x30C72FCD, 0x68803197, 0x80491379, 0xD80E0D23,
717 0x1D9657E8, 0x45D149B2, 0xAD186B5C, 0xF55F7506,
718 0xFB7E6576, 0xA3397B2C, 0x4BF059C2, 0x13B74798,
719 0xD62F1D53, 0x8E680309, 0x66A121E7, 0x3EE63FBD,
720 0xA1DC953C, 0xF99B8B66, 0x1152A988, 0x4915B7D2,
721 0x8C8DED19, 0xD4CAF343, 0x3C03D1AD, 0x6444CFF7,
722 0x4F77C8E2, 0x1730D6B8, 0xFFF9F456, 0xA7BEEA0C,
723 0x6226B0C7, 0x3A61AE9D, 0xD2A88C73, 0x8AEF9229,
724 0x15D538A8, 0x4D9226F2, 0xA55B041C, 0xFD1C1A46,
725 0x3884408D, 0x60C35ED7, 0x880A7C39, 0xD04D6263
728 static const uint32_t rs5
[256] =
730 0x00000000, 0xDBAEC658, 0xFB11C1B0, 0x20BF07E8,
731 0xBB22CF2D, 0x608C0975, 0x40330E9D, 0x9B9DC8C5,
732 0x3B44D35A, 0xE0EA1502, 0xC05512EA, 0x1BFBD4B2,
733 0x80661C77, 0x5BC8DA2F, 0x7B77DDC7, 0xA0D91B9F,
734 0x7688EBB4, 0xAD262DEC, 0x8D992A04, 0x5637EC5C,
735 0xCDAA2499, 0x1604E2C1, 0x36BBE529, 0xED152371,
736 0x4DCC38EE, 0x9662FEB6, 0xB6DDF95E, 0x6D733F06,
737 0xF6EEF7C3, 0x2D40319B, 0x0DFF3673, 0xD651F02B,
738 0xEC5D9B25, 0x37F35D7D, 0x174C5A95, 0xCCE29CCD,
739 0x577F5408, 0x8CD19250, 0xAC6E95B8, 0x77C053E0,
740 0xD719487F, 0x0CB78E27, 0x2C0889CF, 0xF7A64F97,
741 0x6C3B8752, 0xB795410A, 0x972A46E2, 0x4C8480BA,
742 0x9AD57091, 0x417BB6C9, 0x61C4B121, 0xBA6A7779,
743 0x21F7BFBC, 0xFA5979E4, 0xDAE67E0C, 0x0148B854,
744 0xA191A3CB, 0x7A3F6593, 0x5A80627B, 0x812EA423,
745 0x1AB36CE6, 0xC11DAABE, 0xE1A2AD56, 0x3A0C6B0E,
746 0x95BA7B4A, 0x4E14BD12, 0x6EABBAFA, 0xB5057CA2,
747 0x2E98B467, 0xF536723F, 0xD58975D7, 0x0E27B38F,
748 0xAEFEA810, 0x75506E48, 0x55EF69A0, 0x8E41AFF8,
749 0x15DC673D, 0xCE72A165, 0xEECDA68D, 0x356360D5,
750 0xE33290FE, 0x389C56A6, 0x1823514E, 0xC38D9716,
751 0x58105FD3, 0x83BE998B, 0xA3019E63, 0x78AF583B,
752 0xD87643A4, 0x03D885FC, 0x23678214, 0xF8C9444C,
753 0x63548C89, 0xB8FA4AD1, 0x98454D39, 0x43EB8B61,
754 0x79E7E06F, 0xA2492637, 0x82F621DF, 0x5958E787,
755 0xC2C52F42, 0x196BE91A, 0x39D4EEF2, 0xE27A28AA,
756 0x42A33335, 0x990DF56D, 0xB9B2F285, 0x621C34DD,
757 0xF981FC18, 0x222F3A40, 0x02903DA8, 0xD93EFBF0,
758 0x0F6F0BDB, 0xD4C1CD83, 0xF47ECA6B, 0x2FD00C33,
759 0xB44DC4F6, 0x6FE302AE, 0x4F5C0546, 0x94F2C31E,
760 0x342BD881, 0xEF851ED9, 0xCF3A1931, 0x1494DF69,
761 0x8F0917AC, 0x54A7D1F4, 0x7418D61C, 0xAFB61044,
762 0x6739F694, 0xBC9730CC, 0x9C283724, 0x4786F17C,
763 0xDC1B39B9, 0x07B5FFE1, 0x270AF809, 0xFCA43E51,
764 0x5C7D25CE, 0x87D3E396, 0xA76CE47E, 0x7CC22226,
765 0xE75FEAE3, 0x3CF12CBB, 0x1C4E2B53, 0xC7E0ED0B,
766 0x11B11D20, 0xCA1FDB78, 0xEAA0DC90, 0x310E1AC8,
767 0xAA93D20D, 0x713D1455, 0x518213BD, 0x8A2CD5E5,
768 0x2AF5CE7A, 0xF15B0822, 0xD1E40FCA, 0x0A4AC992,
769 0x91D70157, 0x4A79C70F, 0x6AC6C0E7, 0xB16806BF,
770 0x8B646DB1, 0x50CAABE9, 0x7075AC01, 0xABDB6A59,
771 0x3046A29C, 0xEBE864C4, 0xCB57632C, 0x10F9A574,
772 0xB020BEEB, 0x6B8E78B3, 0x4B317F5B, 0x909FB903,
773 0x0B0271C6, 0xD0ACB79E, 0xF013B076, 0x2BBD762E,
774 0xFDEC8605, 0x2642405D, 0x06FD47B5, 0xDD5381ED,
775 0x46CE4928, 0x9D608F70, 0xBDDF8898, 0x66714EC0,
776 0xC6A8555F, 0x1D069307, 0x3DB994EF, 0xE61752B7,
777 0x7D8A9A72, 0xA6245C2A, 0x869B5BC2, 0x5D359D9A,
778 0xF2838DDE, 0x292D4B86, 0x09924C6E, 0xD23C8A36,
779 0x49A142F3, 0x920F84AB, 0xB2B08343, 0x691E451B,
780 0xC9C75E84, 0x126998DC, 0x32D69F34, 0xE978596C,
781 0x72E591A9, 0xA94B57F1, 0x89F45019, 0x525A9641,
782 0x840B666A, 0x5FA5A032, 0x7F1AA7DA, 0xA4B46182,
783 0x3F29A947, 0xE4876F1F, 0xC43868F7, 0x1F96AEAF,
784 0xBF4FB530, 0x64E17368, 0x445E7480, 0x9FF0B2D8,
785 0x046D7A1D, 0xDFC3BC45, 0xFF7CBBAD, 0x24D27DF5,
786 0x1EDE16FB, 0xC570D0A3, 0xE5CFD74B, 0x3E611113,
787 0xA5FCD9D6, 0x7E521F8E, 0x5EED1866, 0x8543DE3E,
788 0x259AC5A1, 0xFE3403F9, 0xDE8B0411, 0x0525C249,
789 0x9EB80A8C, 0x4516CCD4, 0x65A9CB3C, 0xBE070D64,
790 0x6856FD4F, 0xB3F83B17, 0x93473CFF, 0x48E9FAA7,
791 0xD3743262, 0x08DAF43A, 0x2865F3D2, 0xF3CB358A,
792 0x53122E15, 0x88BCE84D, 0xA803EFA5, 0x73AD29FD,
793 0xE830E138, 0x339E2760, 0x13212088, 0xC88FE6D0
796 static const uint32_t rs6
[256] =
798 0x00000000, 0x9E3D68DB, 0x717AD0FB, 0xEF47B820,
799 0xE2F4EDBB, 0x7CC98560, 0x938E3D40, 0x0DB3559B,
800 0x89A5973B, 0x1798FFE0, 0xF8DF47C0, 0x66E22F1B,
801 0x6B517A80, 0xF56C125B, 0x1A2BAA7B, 0x8416C2A0,
802 0x5F076376, 0xC13A0BAD, 0x2E7DB38D, 0xB040DB56,
803 0xBDF38ECD, 0x23CEE616, 0xCC895E36, 0x52B436ED,
804 0xD6A2F44D, 0x489F9C96, 0xA7D824B6, 0x39E54C6D,
805 0x345619F6, 0xAA6B712D, 0x452CC90D, 0xDB11A1D6,
806 0xBE0EC6EC, 0x2033AE37, 0xCF741617, 0x51497ECC,
807 0x5CFA2B57, 0xC2C7438C, 0x2D80FBAC, 0xB3BD9377,
808 0x37AB51D7, 0xA996390C, 0x46D1812C, 0xD8ECE9F7,
809 0xD55FBC6C, 0x4B62D4B7, 0xA4256C97, 0x3A18044C,
810 0xE109A59A, 0x7F34CD41, 0x90737561, 0x0E4E1DBA,
811 0x03FD4821, 0x9DC020FA, 0x728798DA, 0xECBAF001,
812 0x68AC32A1, 0xF6915A7A, 0x19D6E25A, 0x87EB8A81,
813 0x8A58DF1A, 0x1465B7C1, 0xFB220FE1, 0x651F673A,
814 0x311CC195, 0xAF21A94E, 0x4066116E, 0xDE5B79B5,
815 0xD3E82C2E, 0x4DD544F5, 0xA292FCD5, 0x3CAF940E,
816 0xB8B956AE, 0x26843E75, 0xC9C38655, 0x57FEEE8E,
817 0x5A4DBB15, 0xC470D3CE, 0x2B376BEE, 0xB50A0335,
818 0x6E1BA2E3, 0xF026CA38, 0x1F617218, 0x815C1AC3,
819 0x8CEF4F58, 0x12D22783, 0xFD959FA3, 0x63A8F778,
820 0xE7BE35D8, 0x79835D03, 0x96C4E523, 0x08F98DF8,
821 0x054AD863, 0x9B77B0B8, 0x74300898, 0xEA0D6043,
822 0x8F120779, 0x112F6FA2, 0xFE68D782, 0x6055BF59,
823 0x6DE6EAC2, 0xF3DB8219, 0x1C9C3A39, 0x82A152E2,
824 0x06B79042, 0x988AF899, 0x77CD40B9, 0xE9F02862,
825 0xE4437DF9, 0x7A7E1522, 0x9539AD02, 0x0B04C5D9,
826 0xD015640F, 0x4E280CD4, 0xA16FB4F4, 0x3F52DC2F,
827 0x32E189B4, 0xACDCE16F, 0x439B594F, 0xDDA63194,
828 0x59B0F334, 0xC78D9BEF, 0x28CA23CF, 0xB6F74B14,
829 0xBB441E8F, 0x25797654, 0xCA3ECE74, 0x5403A6AF,
830 0x6238CF67, 0xFC05A7BC, 0x13421F9C, 0x8D7F7747,
831 0x80CC22DC, 0x1EF14A07, 0xF1B6F227, 0x6F8B9AFC,
832 0xEB9D585C, 0x75A03087, 0x9AE788A7, 0x04DAE07C,
833 0x0969B5E7, 0x9754DD3C, 0x7813651C, 0xE62E0DC7,
834 0x3D3FAC11, 0xA302C4CA, 0x4C457CEA, 0xD2781431,
835 0xDFCB41AA, 0x41F62971, 0xAEB19151, 0x308CF98A,
836 0xB49A3B2A, 0x2AA753F1, 0xC5E0EBD1, 0x5BDD830A,
837 0x566ED691, 0xC853BE4A, 0x2714066A, 0xB9296EB1,
838 0xDC36098B, 0x420B6150, 0xAD4CD970, 0x3371B1AB,
839 0x3EC2E430, 0xA0FF8CEB, 0x4FB834CB, 0xD1855C10,
840 0x55939EB0, 0xCBAEF66B, 0x24E94E4B, 0xBAD42690,
841 0xB767730B, 0x295A1BD0, 0xC61DA3F0, 0x5820CB2B,
842 0x83316AFD, 0x1D0C0226, 0xF24BBA06, 0x6C76D2DD,
843 0x61C58746, 0xFFF8EF9D, 0x10BF57BD, 0x8E823F66,
844 0x0A94FDC6, 0x94A9951D, 0x7BEE2D3D, 0xE5D345E6,
845 0xE860107D, 0x765D78A6, 0x991AC086, 0x0727A85D,
846 0x53240EF2, 0xCD196629, 0x225EDE09, 0xBC63B6D2,
847 0xB1D0E349, 0x2FED8B92, 0xC0AA33B2, 0x5E975B69,
848 0xDA8199C9, 0x44BCF112, 0xABFB4932, 0x35C621E9,
849 0x38757472, 0xA6481CA9, 0x490FA489, 0xD732CC52,
850 0x0C236D84, 0x921E055F, 0x7D59BD7F, 0xE364D5A4,
851 0xEED7803F, 0x70EAE8E4, 0x9FAD50C4, 0x0190381F,
852 0x8586FABF, 0x1BBB9264, 0xF4FC2A44, 0x6AC1429F,
853 0x67721704, 0xF94F7FDF, 0x1608C7FF, 0x8835AF24,
854 0xED2AC81E, 0x7317A0C5, 0x9C5018E5, 0x026D703E,
855 0x0FDE25A5, 0x91E34D7E, 0x7EA4F55E, 0xE0999D85,
856 0x648F5F25, 0xFAB237FE, 0x15F58FDE, 0x8BC8E705,
857 0x867BB29E, 0x1846DA45, 0xF7016265, 0x693C0ABE,
858 0xB22DAB68, 0x2C10C3B3, 0xC3577B93, 0x5D6A1348,
859 0x50D946D3, 0xCEE42E08, 0x21A39628, 0xBF9EFEF3,
860 0x3B883C53, 0xA5B55488, 0x4AF2ECA8, 0xD4CF8473,
861 0xD97CD1E8, 0x4741B933, 0xA8060113, 0x363B69C8
864 static const uint32_t rs7
[256] =
866 0x00000000, 0x0319E59E, 0x06328771, 0x052B62EF,
867 0x0C6443E2, 0x0F7DA67C, 0x0A56C493, 0x094F210D,
868 0x18C88689, 0x1BD16317, 0x1EFA01F8, 0x1DE3E466,
869 0x14ACC56B, 0x17B520F5, 0x129E421A, 0x1187A784,
870 0x30DD415F, 0x33C4A4C1, 0x36EFC62E, 0x35F623B0,
871 0x3CB902BD, 0x3FA0E723, 0x3A8B85CC, 0x39926052,
872 0x2815C7D6, 0x2B0C2248, 0x2E2740A7, 0x2D3EA539,
873 0x24718434, 0x276861AA, 0x22430345, 0x215AE6DB,
874 0x60F782BE, 0x63EE6720, 0x66C505CF, 0x65DCE051,
875 0x6C93C15C, 0x6F8A24C2, 0x6AA1462D, 0x69B8A3B3,
876 0x783F0437, 0x7B26E1A9, 0x7E0D8346, 0x7D1466D8,
877 0x745B47D5, 0x7742A24B, 0x7269C0A4, 0x7170253A,
878 0x502AC3E1, 0x5333267F, 0x56184490, 0x5501A10E,
879 0x5C4E8003, 0x5F57659D, 0x5A7C0772, 0x5965E2EC,
880 0x48E24568, 0x4BFBA0F6, 0x4ED0C219, 0x4DC92787,
881 0x4486068A, 0x479FE314, 0x42B481FB, 0x41AD6465,
882 0xC0A34931, 0xC3BAACAF, 0xC691CE40, 0xC5882BDE,
883 0xCCC70AD3, 0xCFDEEF4D, 0xCAF58DA2, 0xC9EC683C,
884 0xD86BCFB8, 0xDB722A26, 0xDE5948C9, 0xDD40AD57,
885 0xD40F8C5A, 0xD71669C4, 0xD23D0B2B, 0xD124EEB5,
886 0xF07E086E, 0xF367EDF0, 0xF64C8F1F, 0xF5556A81,
887 0xFC1A4B8C, 0xFF03AE12, 0xFA28CCFD, 0xF9312963,
888 0xE8B68EE7, 0xEBAF6B79, 0xEE840996, 0xED9DEC08,
889 0xE4D2CD05, 0xE7CB289B, 0xE2E04A74, 0xE1F9AFEA,
890 0xA054CB8F, 0xA34D2E11, 0xA6664CFE, 0xA57FA960,
891 0xAC30886D, 0xAF296DF3, 0xAA020F1C, 0xA91BEA82,
892 0xB89C4D06, 0xBB85A898, 0xBEAECA77, 0xBDB72FE9,
893 0xB4F80EE4, 0xB7E1EB7A, 0xB2CA8995, 0xB1D36C0B,
894 0x90898AD0, 0x93906F4E, 0x96BB0DA1, 0x95A2E83F,
895 0x9CEDC932, 0x9FF42CAC, 0x9ADF4E43, 0x99C6ABDD,
896 0x88410C59, 0x8B58E9C7, 0x8E738B28, 0x8D6A6EB6,
897 0x84254FBB, 0x873CAA25, 0x8217C8CA, 0x810E2D54,
898 0xCD0B9262, 0xCE1277FC, 0xCB391513, 0xC820F08D,
899 0xC16FD180, 0xC276341E, 0xC75D56F1, 0xC444B36F,
900 0xD5C314EB, 0xD6DAF175, 0xD3F1939A, 0xD0E87604,
901 0xD9A75709, 0xDABEB297, 0xDF95D078, 0xDC8C35E6,
902 0xFDD6D33D, 0xFECF36A3, 0xFBE4544C, 0xF8FDB1D2,
903 0xF1B290DF, 0xF2AB7541, 0xF78017AE, 0xF499F230,
904 0xE51E55B4, 0xE607B02A, 0xE32CD2C5, 0xE035375B,
905 0xE97A1656, 0xEA63F3C8, 0xEF489127, 0xEC5174B9,
906 0xADFC10DC, 0xAEE5F542, 0xABCE97AD, 0xA8D77233,
907 0xA198533E, 0xA281B6A0, 0xA7AAD44F, 0xA4B331D1,
908 0xB5349655, 0xB62D73CB, 0xB3061124, 0xB01FF4BA,
909 0xB950D5B7, 0xBA493029, 0xBF6252C6, 0xBC7BB758,
910 0x9D215183, 0x9E38B41D, 0x9B13D6F2, 0x980A336C,
911 0x91451261, 0x925CF7FF, 0x97779510, 0x946E708E,
912 0x85E9D70A, 0x86F03294, 0x83DB507B, 0x80C2B5E5,
913 0x898D94E8, 0x8A947176, 0x8FBF1399, 0x8CA6F607,
914 0x0DA8DB53, 0x0EB13ECD, 0x0B9A5C22, 0x0883B9BC,
915 0x01CC98B1, 0x02D57D2F, 0x07FE1FC0, 0x04E7FA5E,
916 0x15605DDA, 0x1679B844, 0x1352DAAB, 0x104B3F35,
917 0x19041E38, 0x1A1DFBA6, 0x1F369949, 0x1C2F7CD7,
918 0x3D759A0C, 0x3E6C7F92, 0x3B471D7D, 0x385EF8E3,
919 0x3111D9EE, 0x32083C70, 0x37235E9F, 0x343ABB01,
920 0x25BD1C85, 0x26A4F91B, 0x238F9BF4, 0x20967E6A,
921 0x29D95F67, 0x2AC0BAF9, 0x2FEBD816, 0x2CF23D88,
922 0x6D5F59ED, 0x6E46BC73, 0x6B6DDE9C, 0x68743B02,
923 0x613B1A0F, 0x6222FF91, 0x67099D7E, 0x641078E0,
924 0x7597DF64, 0x768E3AFA, 0x73A55815, 0x70BCBD8B,
925 0x79F39C86, 0x7AEA7918, 0x7FC11BF7, 0x7CD8FE69,
926 0x5D8218B2, 0x5E9BFD2C, 0x5BB09FC3, 0x58A97A5D,
927 0x51E65B50, 0x52FFBECE, 0x57D4DC21, 0x54CD39BF,
928 0x454A9E3B, 0x46537BA5, 0x4378194A, 0x4061FCD4,
929 0x492EDDD9, 0x4A373847, 0x4F1C5AA8, 0x4C05BF36
934 mds0[(x)[0]] ^ mds1[(x)[1]] ^ mds2[(x)[2]] ^ mds3[(x)[3]] \
937 static void rs(const uint8_t *in
, uint8_t *out
)
941 t
= rs0
[in
[0]] ^ rs1
[in
[1]] ^ rs2
[in
[2]] ^ rs3
[in
[3]] ^
942 rs4
[in
[4]] ^ rs5
[in
[5]] ^ rs6
[in
[6]] ^ rs7
[in
[7]];
944 STORE32L(t
, U8(out
));
965 t
[0] = s1
[t
[0]] ^ key
[(6 + off
) << 2];
966 t
[1] = s0
[t
[1]] ^ key
[((6 + off
) << 2) + 1];
967 t
[2] = s0
[t
[2]] ^ key
[((6 + off
) << 2) + 2];
968 t
[3] = s1
[t
[3]] ^ key
[((6 + off
) << 2) + 3];
971 t
[0] = s1
[t
[0]] ^ key
[(4 + off
) << 2];
972 t
[1] = s1
[t
[1]] ^ key
[((4 + off
) << 2) + 1];
973 t
[2] = s0
[t
[2]] ^ key
[((4 + off
) << 2) + 2];
974 t
[3] = s0
[t
[3]] ^ key
[((4 + off
) << 2) + 3];
977 t
[0] = s0
[t
[0]] ^ key
[(2 + off
) << 2];
978 t
[1] = s1
[t
[1]] ^ key
[((2 + off
) << 2) + 1];
979 t
[2] = s0
[t
[2]] ^ key
[((2 + off
) << 2) + 2];
980 t
[3] = s1
[t
[3]] ^ key
[((2 + off
) << 2) + 3];
983 t
[0] = s1
[s0
[t
[0]] ^ key
[off
<< 2]];
984 t
[1] = s0
[s0
[t
[1]] ^ key
[(off
<< 2) + 1]];
985 t
[2] = s1
[s1
[t
[2]] ^ key
[(off
<< 2) + 2]];
986 t
[3] = s0
[s1
[t
[3]] ^ key
[(off
<< 2) + 3]];
992 static void twofish_setup
1007 for(x
= 0; x
< key_len
; x
++) K
[x
] = key
[x
];
1008 key_len
= (key_len
+ 7) >> 3;
1009 while(x
< (key_len
<< 3)) K
[x
++] = 0;
1012 for(x
= 0; x
< (s
->rounds
+ 4); x
++)
1014 S
[0] = S
[1] = S
[2] = S
[3] = (x
<< 1);
1015 A
= h(S
, K
, key_len
, 0);
1017 S
[0] = S
[1] = S
[2] = S
[3] = (x
<< 1) | 1;
1018 B
= ROL32_08(h(S
, K
, key_len
, 1));
1020 s
->k
[x
<< 1] = A
+ B
;
1021 s
->k
[(x
<< 1) | 1] = ROL32_09(A
+ (B
<< 1));
1025 for(y
= 0; y
< key_len
; y
++)
1026 rs(K
+ (y
<< 3), S
+ (y
<< 2));
1028 for(x
= 0; x
< 256; x
++)
1030 s
->s0
[x
] = s
->s1
[x
] = s
->s2
[x
] = s
->s3
[x
] = x
;
1036 s
->s0
[x
] = s1
[(uint8_t)s
->s0
[x
]] ^ S
[y
++];
1037 s
->s1
[x
] = s0
[(uint8_t)s
->s1
[x
]] ^ S
[y
++];
1038 s
->s2
[x
] = s0
[(uint8_t)s
->s2
[x
]] ^ S
[y
++];
1039 s
->s3
[x
] = s1
[(uint8_t)s
->s3
[x
]] ^ S
[y
++];
1042 s
->s0
[x
] = s1
[(uint8_t)s
->s0
[x
]] ^ S
[y
++];
1043 s
->s1
[x
] = s1
[(uint8_t)s
->s1
[x
]] ^ S
[y
++];
1044 s
->s2
[x
] = s0
[(uint8_t)s
->s2
[x
]] ^ S
[y
++];
1045 s
->s3
[x
] = s0
[(uint8_t)s
->s3
[x
]] ^ S
[y
++];
1048 s
->s0
[x
] = s0
[(uint8_t)s
->s0
[x
]] ^ S
[y
++];
1049 s
->s1
[x
] = s1
[(uint8_t)s
->s1
[x
]] ^ S
[y
++];
1050 s
->s2
[x
] = s0
[(uint8_t)s
->s2
[x
]] ^ S
[y
++];
1051 s
->s3
[x
] = s1
[(uint8_t)s
->s3
[x
]] ^ S
[y
++];
1054 s
->s0
[x
] = mds0
[s1
[s0
[(uint8_t)s
->s0
[x
]] ^ S
[y
++]]];
1055 s
->s1
[x
] = mds1
[s0
[s0
[(uint8_t)s
->s1
[x
]] ^ S
[y
++]]];
1056 s
->s2
[x
] = mds2
[s1
[s1
[(uint8_t)s
->s2
[x
]] ^ S
[y
++]]];
1057 s
->s3
[x
] = mds3
[s0
[s1
[(uint8_t)s
->s3
[x
]] ^ S
[y
++]]];
1062 kripto_memwipe(K
, 32);
1063 kripto_memwipe(S
, 16);
1064 kripto_memwipe(&A
, sizeof(uint32_t));
1065 kripto_memwipe(&B
, sizeof(uint32_t));
1070 s->s0[(x) & 0xFF] ^ s->s1[((x) >> 8) & 0xFF] ^ \
1071 s->s2[((x) >> 16) & 0xFF] ^ s->s3[(x) >> 24] \
1076 s->s0[(x) >> 24] ^ s->s1[(x) & 0xFF] ^ \
1077 s->s2[((x) >> 8) & 0xFF] ^ s->s3[((x) >> 16) & 0xFF] \
1080 static void twofish_encrypt
1082 const kripto_block
*s
,
1096 x0
= LOAD32L(CU8(pt
)) ^ s
->k
[0];
1097 x1
= LOAD32L(CU8(pt
) + 4) ^ s
->k
[1];
1098 x2
= LOAD32L(CU8(pt
) + 8) ^ s
->k
[2];
1099 x3
= LOAD32L(CU8(pt
) + 12) ^ s
->k
[3];
1102 for(r
= (s
->rounds
>> 1); r
; r
--)
1105 g0
= G0(x0
, s
) + g1
;
1106 x2
= ROR32_01(x2
^ (g0
+ k
[0]));
1107 x3
= ROL32_01(x3
) ^ (g1
+ g0
+ k
[1]);
1110 g0
= G0(x2
, s
) + g1
;
1111 x0
= ROR32_01(x0
^ (g0
+ k
[2]));
1112 x1
= ROL32_01(x1
) ^ (g1
+ g0
+ k
[3]);
1123 STORE32L(x2
, U8(ct
));
1124 STORE32L(x3
, U8(ct
) + 4);
1125 STORE32L(x0
, U8(ct
) + 8);
1126 STORE32L(x1
, U8(ct
) + 12);
1129 static void twofish_decrypt
1131 const kripto_block
*s
,
1146 x0
= LOAD32L(CU8(ct
) + 8) ^ s
->k
[6];
1147 x1
= LOAD32L(CU8(ct
) + 12) ^ s
->k
[7];
1148 x2
= LOAD32L(CU8(ct
)) ^ s
->k
[4];
1149 x3
= LOAD32L(CU8(ct
) + 4) ^ s
->k
[5];
1151 k
= s
->k
+ 4 + (s
->rounds
<< 1);
1152 for(r
= (s
->rounds
>> 1); r
; r
--)
1155 g0
= G0(x2
, s
) + g1
;
1156 x0
= ROL32_01(x0
) ^ (g0
+ k
[2]);
1157 x1
= ROR32_01(x1
^ (g1
+ g0
+ k
[3]));
1160 g0
= G0(x0
, s
) + g1
;
1161 x2
= ROL32_01(x2
) ^ (g0
+ k
[0]);
1162 x3
= ROR32_01(x3
^ (g1
+ g0
+ k
[1]));
1172 STORE32L(x0
, U8(pt
));
1173 STORE32L(x1
, U8(pt
) + 4);
1174 STORE32L(x2
, U8(pt
) + 8);
1175 STORE32L(x3
, U8(pt
) + 12);
1178 static kripto_block
*twofish_create
1182 unsigned int key_len
1189 s
= malloc(sizeof(struct kripto_block
) + (TWOFISH_K_LEN(r
) << 2));
1192 s
->obj
.desc
= kripto_block_twofish
;
1193 s
->size
= sizeof(kripto_block
) + (TWOFISH_K_LEN(r
) << 2);
1195 s
->k
= (uint32_t *)((uint8_t *)s
+ sizeof(struct kripto_block
));
1197 twofish_setup(s
, key
, key_len
);
1202 static void twofish_destroy(kripto_block
*s
)
1204 kripto_memwipe(s
, s
->size
);
1208 static kripto_block
*twofish_recreate
1213 unsigned int key_len
1218 if(sizeof(kripto_block
) + (TWOFISH_K_LEN(r
) << 2) > s
->size
)
1221 s
= twofish_create(r
, key
, key_len
);
1226 twofish_setup(s
, key
, key_len
);
1232 static const kripto_block_desc twofish
=
1240 16, /* block size */
1244 const kripto_block_desc
*const kripto_block_twofish
= &twofish
;