Merge from vendor branch GCC:
[dragonfly.git] / sys / crypto / cast128 / cast128.c
1 /*      $FreeBSD: src/sys/crypto/cast128/cast128.c,v 1.1.2.3 2001/12/05 05:54:57 ume Exp $      */
2 /*      $DragonFly: src/sys/crypto/cast128/cast128.c,v 1.2 2003/06/17 04:28:20 dillon Exp $     */
3 /*      $KAME: cast128.c,v 1.5 2001/11/27 09:47:32 sakane Exp $ */
4
5 /*
6  * heavily modified by Tomomi Suzuki <suzuki@grelot.elec.ryukoku.ac.jp>
7  */
8 /*
9  * The CAST-128 Encryption Algorithm (RFC 2144)
10  *
11  * original implementation <Hideo "Sir MaNMOS" Morisita>
12  * 1997/08/21
13  */
14 /*
15  * Copyright (C) 1997 Hideo "Sir MANMOS" Morishita
16  * All rights reserved.
17  *
18  * Redistribution and use in source and binary forms, with or without
19  * modification, are permitted provided that the following conditions
20  * are met:
21  * 1. Redistributions of source code must retain the above copyright
22  *    notice, this list of conditions and the following disclaimer.
23  * 2. Redistributions in binary form must reproduce the above copyright
24  *    notice, this list of conditions and the following disclaimer in the
25  *    documentation and/or other materials provided with the distribution.
26  *
27  * THIS SOFTWARE IS PROVIDED BY Hideo "Sir MaNMOS" Morishita ``AS IS'' AND
28  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30  * ARE DISCLAIMED.  IN NO EVENT SHALL Hideo "Sir MaNMOS" Morishita BE LIABLE
31  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
33  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
34  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
36  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37  * SUCH DAMAGE.
38  */
39
40 #include <sys/param.h>
41 #include <sys/systm.h>
42 #include <crypto/cast128/cast128.h>
43 #include <crypto/cast128/cast128_subkey.h>
44
45
46 static u_int32_t S1[];
47 static u_int32_t S2[];
48 static u_int32_t S3[];
49 static u_int32_t S4[];
50 static u_int32_t S5[];
51 static u_int32_t S6[];
52 static u_int32_t S7[];
53 static u_int32_t S8[];
54
55
56 /*
57  * Step 1
58  */
59 void set_cast128_subkey(u_int32_t *subkey, u_int8_t *key0, int keylen)
60 {
61         u_int32_t buf[8]; /* for x0x1x2x3, x4x5x6x7 ..., z0z1z2z3, ... */
62         u_int32_t key[16];
63         int i;
64
65         /*
66          * the key has to be initilized.  should it be logged when the key
67          * length is more than 16 bytes ?  anyway, ignore it at this moment.
68          */
69         if (keylen > 16)
70                 keylen = 16;
71         for (i = 0; i < keylen; i++)
72                 key[i] = key0[i];
73         while (i < 16)
74                 key[i++] = 0;
75
76         buf[0] = (key[ 0] << 24) | (key[ 1] << 16) | (key[ 2] << 8)
77                 | key[ 3];
78         buf[1] = (key[ 4] << 24) | (key[ 5] << 16) | (key[ 6] << 8)
79                 | key[ 7];
80         buf[2] = (key[ 8] << 24) | (key[ 9] << 16) | (key[10] << 8)
81                 | key[11];
82         buf[3] = (key[12] << 24) | (key[13] << 16) | (key[14] << 8)
83                 | key[15];
84
85         /* masking subkey */
86         z0z1z2z3 = x0x1x2x3 ^ S5[xD] ^ S6[xF] ^ S7[xC] ^ S8[xE] ^ S7[x8];
87         z4z5z6z7 = x8x9xAxB ^ S5[z0] ^ S6[z2] ^ S7[z1] ^ S8[z3] ^ S8[xA];
88         z8z9zAzB = xCxDxExF ^ S5[z7] ^ S6[z6] ^ S7[z5] ^ S8[z4] ^ S5[x9];
89         zCzDzEzF = x4x5x6x7 ^ S5[zA] ^ S6[z9] ^ S7[zB] ^ S8[z8] ^ S6[xB];
90         subkey[0]  = S5[z8] ^ S6[z9] ^ S7[z7] ^ S8[z6] ^ S5[z2];
91         subkey[1]  = S5[zA] ^ S6[zB] ^ S7[z5] ^ S8[z4] ^ S6[z6];
92         subkey[2]  = S5[zC] ^ S6[zD] ^ S7[z3] ^ S8[z2] ^ S7[z9];
93         subkey[3]  = S5[zE] ^ S6[zF] ^ S7[z1] ^ S8[z0] ^ S8[zC];
94
95         x0x1x2x3 = z8z9zAzB ^ S5[z5] ^ S6[z7] ^ S7[z4] ^ S8[z6] ^ S7[z0];
96         x4x5x6x7 = z0z1z2z3 ^ S5[x0] ^ S6[x2] ^ S7[x1] ^ S8[x3] ^ S8[z2];
97         x8x9xAxB = z4z5z6z7 ^ S5[x7] ^ S6[x6] ^ S7[x5] ^ S8[x4] ^ S5[z1];
98         xCxDxExF = zCzDzEzF ^ S5[xA] ^ S6[x9] ^ S7[xB] ^ S8[x8] ^ S6[z3];
99         subkey[4]  = S5[x3] ^ S6[x2] ^ S7[xC] ^ S8[xD] ^ S5[x8];
100         subkey[5]  = S5[x1] ^ S6[x0] ^ S7[xE] ^ S8[xF] ^ S6[xD];
101         subkey[6]  = S5[x7] ^ S6[x6] ^ S7[x8] ^ S8[x9] ^ S7[x3];
102         subkey[7]  = S5[x5] ^ S6[x4] ^ S7[xA] ^ S8[xB] ^ S8[x7];
103
104         z0z1z2z3 = x0x1x2x3 ^ S5[xD] ^ S6[xF] ^ S7[xC] ^ S8[xE] ^ S7[x8];
105         z4z5z6z7 = x8x9xAxB ^ S5[z0] ^ S6[z2] ^ S7[z1] ^ S8[z3] ^ S8[xA];
106         z8z9zAzB = xCxDxExF ^ S5[z7] ^ S6[z6] ^ S7[z5] ^ S8[z4] ^ S5[x9];
107         zCzDzEzF = x4x5x6x7 ^ S5[zA] ^ S6[z9] ^ S7[zB] ^ S8[z8] ^ S6[xB];
108         subkey[8]  = S5[z3] ^ S6[z2] ^ S7[zC] ^ S8[zD] ^ S5[z9];
109         subkey[9]  = S5[z1] ^ S6[z0] ^ S7[zE] ^ S8[zF] ^ S6[zC];
110         subkey[10] = S5[z7] ^ S6[z6] ^ S7[z8] ^ S8[z9] ^ S7[z2];
111         subkey[11] = S5[z5] ^ S6[z4] ^ S7[zA] ^ S8[zB] ^ S8[z6];
112
113         x0x1x2x3 = z8z9zAzB ^ S5[z5] ^ S6[z7] ^ S7[z4] ^ S8[z6] ^ S7[z0];
114         x4x5x6x7 = z0z1z2z3 ^ S5[x0] ^ S6[x2] ^ S7[x1] ^ S8[x3] ^ S8[z2];
115         x8x9xAxB = z4z5z6z7 ^ S5[x7] ^ S6[x6] ^ S7[x5] ^ S8[x4] ^ S5[z1];
116         xCxDxExF = zCzDzEzF ^ S5[xA] ^ S6[x9] ^ S7[xB] ^ S8[x8] ^ S6[z3];
117         subkey[12] = S5[x8] ^ S6[x9] ^ S7[x7] ^ S8[x6] ^ S5[x3];
118         subkey[13] = S5[xA] ^ S6[xB] ^ S7[x5] ^ S8[x4] ^ S6[x7];
119         subkey[14] = S5[xC] ^ S6[xD] ^ S7[x3] ^ S8[x2] ^ S7[x8];
120         subkey[15] = S5[xE] ^ S6[xF] ^ S7[x1] ^ S8[x0] ^ S8[xD];
121
122         /* rotate subkey (least significast 5 bits) */
123         z0z1z2z3 = x0x1x2x3 ^ S5[xD] ^ S6[xF] ^ S7[xC] ^ S8[xE] ^ S7[x8];
124         z4z5z6z7 = x8x9xAxB ^ S5[z0] ^ S6[z2] ^ S7[z1] ^ S8[z3] ^ S8[xA];
125         z8z9zAzB = xCxDxExF ^ S5[z7] ^ S6[z6] ^ S7[z5] ^ S8[z4] ^ S5[x9];
126         zCzDzEzF = x4x5x6x7 ^ S5[zA] ^ S6[z9] ^ S7[zB] ^ S8[z8] ^ S6[xB];
127         subkey[16] = (S5[z8] ^ S6[z9] ^ S7[z7] ^ S8[z6] ^ S5[z2]) & 0x1f;
128         subkey[17] = (S5[zA] ^ S6[zB] ^ S7[z5] ^ S8[z4] ^ S6[z6]) & 0x1f;
129         subkey[18] = (S5[zC] ^ S6[zD] ^ S7[z3] ^ S8[z2] ^ S7[z9]) & 0x1f;
130         subkey[19] = (S5[zE] ^ S6[zF] ^ S7[z1] ^ S8[z0] ^ S8[zC]) & 0x1f;
131
132         x0x1x2x3 = z8z9zAzB ^ S5[z5] ^ S6[z7] ^ S7[z4] ^ S8[z6] ^ S7[z0];
133         x4x5x6x7 = z0z1z2z3 ^ S5[x0] ^ S6[x2] ^ S7[x1] ^ S8[x3] ^ S8[z2];
134         x8x9xAxB = z4z5z6z7 ^ S5[x7] ^ S6[x6] ^ S7[x5] ^ S8[x4] ^ S5[z1];
135         xCxDxExF = zCzDzEzF ^ S5[xA] ^ S6[x9] ^ S7[xB] ^ S8[x8] ^ S6[z3];
136         subkey[20] = (S5[x3] ^ S6[x2] ^ S7[xC] ^ S8[xD] ^ S5[x8]) & 0x1f;
137         subkey[21] = (S5[x1] ^ S6[x0] ^ S7[xE] ^ S8[xF] ^ S6[xD]) & 0x1f;
138         subkey[22] = (S5[x7] ^ S6[x6] ^ S7[x8] ^ S8[x9] ^ S7[x3]) & 0x1f;
139         subkey[23] = (S5[x5] ^ S6[x4] ^ S7[xA] ^ S8[xB] ^ S8[x7]) & 0x1f;
140
141         z0z1z2z3 = x0x1x2x3 ^ S5[xD] ^ S6[xF] ^ S7[xC] ^ S8[xE] ^ S7[x8];
142         z4z5z6z7 = x8x9xAxB ^ S5[z0] ^ S6[z2] ^ S7[z1] ^ S8[z3] ^ S8[xA];
143         z8z9zAzB = xCxDxExF ^ S5[z7] ^ S6[z6] ^ S7[z5] ^ S8[z4] ^ S5[x9];
144         zCzDzEzF = x4x5x6x7 ^ S5[zA] ^ S6[z9] ^ S7[zB] ^ S8[z8] ^ S6[xB];
145         subkey[24] = (S5[z3] ^ S6[z2] ^ S7[zC] ^ S8[zD] ^ S5[z9]) & 0x1f;
146         subkey[25] = (S5[z1] ^ S6[z0] ^ S7[zE] ^ S8[zF] ^ S6[zC]) & 0x1f;
147         subkey[26] = (S5[z7] ^ S6[z6] ^ S7[z8] ^ S8[z9] ^ S7[z2]) & 0x1f;
148         subkey[27] = (S5[z5] ^ S6[z4] ^ S7[zA] ^ S8[zB] ^ S8[z6]) & 0x1f;
149
150         x0x1x2x3 = z8z9zAzB ^ S5[z5] ^ S6[z7] ^ S7[z4] ^ S8[z6] ^ S7[z0];
151         x4x5x6x7 = z0z1z2z3 ^ S5[x0] ^ S6[x2] ^ S7[x1] ^ S8[x3] ^ S8[z2];
152         x8x9xAxB = z4z5z6z7 ^ S5[x7] ^ S6[x6] ^ S7[x5] ^ S8[x4] ^ S5[z1];
153         xCxDxExF = zCzDzEzF ^ S5[xA] ^ S6[x9] ^ S7[xB] ^ S8[x8] ^ S6[z3];
154         subkey[28] = (S5[x8] ^ S6[x9] ^ S7[x7] ^ S8[x6] ^ S5[x3]) & 0x1f;
155         subkey[29] = (S5[xA] ^ S6[xB] ^ S7[x5] ^ S8[x4] ^ S6[x7]) & 0x1f;
156         subkey[30] = (S5[xC] ^ S6[xD] ^ S7[x3] ^ S8[x2] ^ S7[x8]) & 0x1f;
157         subkey[31] = (S5[xE] ^ S6[xF] ^ S7[x1] ^ S8[x0] ^ S8[xD]) & 0x1f;
158 }
159
160
161 #define CAST128_TYPE1(rc, d, km, kr) { \
162         u_int32_t x = circular_leftshift(((km)+(d)), (kr)); \
163         (rc) = ((S1[byte0(x)] ^ S2[byte1(x)]) - S3[byte2(x)]) + S4[byte3(x)]; \
164 }
165
166 #define CAST128_TYPE2(rc, d, km, kr) { \
167         u_int32_t x = circular_leftshift(((km)^(d)), (kr)); \
168         (rc) = ((S1[byte0(x)] - S2[byte1(x)]) + S3[byte2(x)]) ^ S4[byte3(x)]; \
169 }
170
171 #define CAST128_TYPE3(rc, d, km, kr) { \
172         u_int32_t x = circular_leftshift(((km)-(d)), (kr)); \
173         (rc) = ((S1[byte0(x)] + S2[byte1(x)]) ^ S3[byte2(x)]) - S4[byte3(x)]; \
174 }
175
176
177 void cast128_encrypt_round16(u_int8_t *c, const u_int8_t *m,
178                                 u_int32_t *subkey)
179 {
180         u_int32_t l;    /* left 32bit */
181         u_int32_t r;    /* right 32bit */
182         u_int32_t br;   /* backup right 32bit */
183         u_int32_t rc;   /* result code of CAST128_TYPE?() */
184         u_int32_t *km, *kr;
185
186         /* Step 2 */
187         l = (m[0] << 24) | (m[1] << 16) | (m[2] << 8) | m[3];
188         r = (m[4] << 24) | (m[5] << 16) | (m[6] << 8) | m[7];
189
190         /* Step 3 */
191         km = subkey;
192         kr = subkey + 16;
193
194         br = r; CAST128_TYPE1(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
195         br = r; CAST128_TYPE2(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
196         br = r; CAST128_TYPE3(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
197         br = r; CAST128_TYPE1(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
198         br = r; CAST128_TYPE2(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
199         br = r; CAST128_TYPE3(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
200         br = r; CAST128_TYPE1(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
201         br = r; CAST128_TYPE2(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
202         br = r; CAST128_TYPE3(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
203         br = r; CAST128_TYPE1(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
204         br = r; CAST128_TYPE2(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
205         br = r; CAST128_TYPE3(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
206         br = r; CAST128_TYPE1(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
207         br = r; CAST128_TYPE2(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
208         br = r; CAST128_TYPE3(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
209         br = r; CAST128_TYPE1(rc, r, *km, *kr); r = l ^ rc; l = br;
210
211         /* Step 4 */
212         c[0] = (r >> 24) & 0xff;
213         c[1] = (r >> 16) & 0xff;
214         c[2] = (r >> 8) & 0xff;
215         c[3] = r & 0xff;
216         c[4] = (l >> 24) & 0xff;
217         c[5] = (l >> 16) & 0xff;
218         c[6] = (l >> 8) & 0xff;
219         c[7] = l & 0xff;
220 }
221
222
223 void cast128_decrypt_round16(u_int8_t *m, const u_int8_t *c,
224                                 u_int32_t *subkey)
225 {
226         u_int32_t l;    /* left 32bit */
227         u_int32_t r;    /* right 32bit */
228         u_int32_t bl;   /* backup left 32bit */
229         u_int32_t rc;   /* result code of CAST128_TYPE?() */
230         u_int32_t *km, *kr;
231
232         /* Step 2 */
233         r = (c[0] << 24) | (c[1] << 16) | (c[2] << 8) | c[3];
234         l = (c[4] << 24) | (c[5] << 16) | (c[6] << 8) | c[7];
235
236         /* Step 3 */
237         km = subkey + 15;
238         kr = subkey + 31;
239
240         bl = l; CAST128_TYPE1(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
241         bl = l; CAST128_TYPE3(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
242         bl = l; CAST128_TYPE2(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
243         bl = l; CAST128_TYPE1(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
244         bl = l; CAST128_TYPE3(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
245         bl = l; CAST128_TYPE2(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
246         bl = l; CAST128_TYPE1(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
247         bl = l; CAST128_TYPE3(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
248         bl = l; CAST128_TYPE2(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
249         bl = l; CAST128_TYPE1(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
250         bl = l; CAST128_TYPE3(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
251         bl = l; CAST128_TYPE2(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
252         bl = l; CAST128_TYPE1(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
253         bl = l; CAST128_TYPE3(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
254         bl = l; CAST128_TYPE2(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
255         bl = l; CAST128_TYPE1(rc, l, *km, *kr); l = r ^ rc; r = bl;
256
257         /* Step 4 */
258         m[0] = (l >> 24) & 0xff;
259         m[1] = (l >> 16) & 0xff;
260         m[2] = (l >> 8) & 0xff;
261         m[3] = l & 0xff;
262         m[4] = (r >> 24) & 0xff;
263         m[5] = (r >> 16) & 0xff;
264         m[6] = (r >> 8) & 0xff;
265         m[7] = r & 0xff;
266 }
267
268
269 void cast128_encrypt_round12(u_int8_t *c, const u_int8_t *m,
270                                 u_int32_t *subkey)
271 {
272         u_int32_t l;    /* left 32bit */
273         u_int32_t r;    /* right 32bit */
274         u_int32_t br;   /* backup right 32bit */
275         u_int32_t rc;   /* result code of CAST128_TYPE?() */
276         u_int32_t *km, *kr;
277
278         /* Step 2 */
279         l = (m[0] << 24) | (m[1] << 16) | (m[2] << 8) | m[3];
280         r = (m[4] << 24) | (m[5] << 16) | (m[6] << 8) | m[7];
281
282         /* Step 3 */
283         km = subkey;
284         kr = subkey + 16;
285
286         br = r; CAST128_TYPE1(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
287         br = r; CAST128_TYPE2(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
288         br = r; CAST128_TYPE3(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
289         br = r; CAST128_TYPE1(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
290         br = r; CAST128_TYPE2(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
291         br = r; CAST128_TYPE3(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
292         br = r; CAST128_TYPE1(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
293         br = r; CAST128_TYPE2(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
294         br = r; CAST128_TYPE3(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
295         br = r; CAST128_TYPE1(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
296         br = r; CAST128_TYPE2(rc, r, *km, *kr); r = l ^ rc; l = br; km++; kr++;
297         br = r; CAST128_TYPE3(rc, r, *km, *kr); r = l ^ rc; l = br;
298
299         /* Step 4 */
300         c[0] = (r >> 24) & 0xff;
301         c[1] = (r >> 16) & 0xff;
302         c[2] = (r >> 8) & 0xff;
303         c[3] = r & 0xff;
304         c[4] = (l >> 24) & 0xff;
305         c[5] = (l >> 16) & 0xff;
306         c[6] = (l >> 8) & 0xff;
307         c[7] = l & 0xff;
308 }
309
310
311 void cast128_decrypt_round12(u_int8_t *m, const u_int8_t *c,
312                                 u_int32_t *subkey)
313 {
314         u_int32_t l;    /* left 32bit */
315         u_int32_t r;    /* right 32bit */
316         u_int32_t bl;   /* backup left 32bit */
317         u_int32_t rc;   /* result code of CAST128_TYPE?() */
318         u_int32_t *km, *kr;
319
320         /* Step 2 */
321         r = (c[0] << 24) | (c[1] << 16) | (c[2] << 8) | c[3];
322         l = (c[4] << 24) | (c[5] << 16) | (c[6] << 8) | c[7];
323
324         /* Step 3 */
325         km = subkey + 11;
326         kr = subkey + 27;
327
328         bl = l; CAST128_TYPE3(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
329         bl = l; CAST128_TYPE2(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
330         bl = l; CAST128_TYPE1(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
331         bl = l; CAST128_TYPE3(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
332         bl = l; CAST128_TYPE2(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
333         bl = l; CAST128_TYPE1(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
334         bl = l; CAST128_TYPE3(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
335         bl = l; CAST128_TYPE2(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
336         bl = l; CAST128_TYPE1(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
337         bl = l; CAST128_TYPE3(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
338         bl = l; CAST128_TYPE2(rc, l, *km, *kr); l = r ^ rc; r = bl; km--; kr--;
339         bl = l; CAST128_TYPE1(rc, l, *km, *kr); l = r ^ rc; r = bl;
340
341         /* Step 4 */
342         m[0] = (l >> 24) & 0xff;
343         m[1] = (l >> 16) & 0xff;
344         m[2] = (l >> 8) & 0xff;
345         m[3] = l & 0xff;
346         m[4] = (r >> 24) & 0xff;
347         m[5] = (r >> 16) & 0xff;
348         m[6] = (r >> 8) & 0xff;
349         m[7] = r & 0xff;
350 }
351
352
353 static u_int32_t S1[] = {
354         0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a,
355         0x1e213f2f, 0x9c004dd3, 0x6003e540, 0xcf9fc949,
356         0xbfd4af27, 0x88bbbdb5, 0xe2034090, 0x98d09675,
357         0x6e63a0e0, 0x15c361d2, 0xc2e7661d, 0x22d4ff8e,
358         0x28683b6f, 0xc07fd059, 0xff2379c8, 0x775f50e2,
359         0x43c340d3, 0xdf2f8656, 0x887ca41a, 0xa2d2bd2d,
360         0xa1c9e0d6, 0x346c4819, 0x61b76d87, 0x22540f2f,
361         0x2abe32e1, 0xaa54166b, 0x22568e3a, 0xa2d341d0,
362         0x66db40c8, 0xa784392f, 0x004dff2f, 0x2db9d2de,
363         0x97943fac, 0x4a97c1d8, 0x527644b7, 0xb5f437a7,
364         0xb82cbaef, 0xd751d159, 0x6ff7f0ed, 0x5a097a1f,
365         0x827b68d0, 0x90ecf52e, 0x22b0c054, 0xbc8e5935,
366         0x4b6d2f7f, 0x50bb64a2, 0xd2664910, 0xbee5812d,
367         0xb7332290, 0xe93b159f, 0xb48ee411, 0x4bff345d,
368         0xfd45c240, 0xad31973f, 0xc4f6d02e, 0x55fc8165,
369         0xd5b1caad, 0xa1ac2dae, 0xa2d4b76d, 0xc19b0c50,
370         0x882240f2, 0x0c6e4f38, 0xa4e4bfd7, 0x4f5ba272,
371         0x564c1d2f, 0xc59c5319, 0xb949e354, 0xb04669fe,
372         0xb1b6ab8a, 0xc71358dd, 0x6385c545, 0x110f935d,
373         0x57538ad5, 0x6a390493, 0xe63d37e0, 0x2a54f6b3,
374         0x3a787d5f, 0x6276a0b5, 0x19a6fcdf, 0x7a42206a,
375         0x29f9d4d5, 0xf61b1891, 0xbb72275e, 0xaa508167,
376         0x38901091, 0xc6b505eb, 0x84c7cb8c, 0x2ad75a0f,
377         0x874a1427, 0xa2d1936b, 0x2ad286af, 0xaa56d291,
378         0xd7894360, 0x425c750d, 0x93b39e26, 0x187184c9,
379         0x6c00b32d, 0x73e2bb14, 0xa0bebc3c, 0x54623779,
380         0x64459eab, 0x3f328b82, 0x7718cf82, 0x59a2cea6,
381         0x04ee002e, 0x89fe78e6, 0x3fab0950, 0x325ff6c2,
382         0x81383f05, 0x6963c5c8, 0x76cb5ad6, 0xd49974c9,
383         0xca180dcf, 0x380782d5, 0xc7fa5cf6, 0x8ac31511,
384         0x35e79e13, 0x47da91d0, 0xf40f9086, 0xa7e2419e,
385         0x31366241, 0x051ef495, 0xaa573b04, 0x4a805d8d,
386         0x548300d0, 0x00322a3c, 0xbf64cddf, 0xba57a68e,
387         0x75c6372b, 0x50afd341, 0xa7c13275, 0x915a0bf5,
388         0x6b54bfab, 0x2b0b1426, 0xab4cc9d7, 0x449ccd82,
389         0xf7fbf265, 0xab85c5f3, 0x1b55db94, 0xaad4e324,
390         0xcfa4bd3f, 0x2deaa3e2, 0x9e204d02, 0xc8bd25ac,
391         0xeadf55b3, 0xd5bd9e98, 0xe31231b2, 0x2ad5ad6c,
392         0x954329de, 0xadbe4528, 0xd8710f69, 0xaa51c90f,
393         0xaa786bf6, 0x22513f1e, 0xaa51a79b, 0x2ad344cc,
394         0x7b5a41f0, 0xd37cfbad, 0x1b069505, 0x41ece491,
395         0xb4c332e6, 0x032268d4, 0xc9600acc, 0xce387e6d,
396         0xbf6bb16c, 0x6a70fb78, 0x0d03d9c9, 0xd4df39de,
397         0xe01063da, 0x4736f464, 0x5ad328d8, 0xb347cc96,
398         0x75bb0fc3, 0x98511bfb, 0x4ffbcc35, 0xb58bcf6a,
399         0xe11f0abc, 0xbfc5fe4a, 0xa70aec10, 0xac39570a,
400         0x3f04442f, 0x6188b153, 0xe0397a2e, 0x5727cb79,
401         0x9ceb418f, 0x1cacd68d, 0x2ad37c96, 0x0175cb9d,
402         0xc69dff09, 0xc75b65f0, 0xd9db40d8, 0xec0e7779,
403         0x4744ead4, 0xb11c3274, 0xdd24cb9e, 0x7e1c54bd,
404         0xf01144f9, 0xd2240eb1, 0x9675b3fd, 0xa3ac3755,
405         0xd47c27af, 0x51c85f4d, 0x56907596, 0xa5bb15e6,
406         0x580304f0, 0xca042cf1, 0x011a37ea, 0x8dbfaadb,
407         0x35ba3e4a, 0x3526ffa0, 0xc37b4d09, 0xbc306ed9,
408         0x98a52666, 0x5648f725, 0xff5e569d, 0x0ced63d0,
409         0x7c63b2cf, 0x700b45e1, 0xd5ea50f1, 0x85a92872,
410         0xaf1fbda7, 0xd4234870, 0xa7870bf3, 0x2d3b4d79,
411         0x42e04198, 0x0cd0ede7, 0x26470db8, 0xf881814c,
412         0x474d6ad7, 0x7c0c5e5c, 0xd1231959, 0x381b7298,
413         0xf5d2f4db, 0xab838653, 0x6e2f1e23, 0x83719c9e,
414         0xbd91e046, 0x9a56456e, 0xdc39200c, 0x20c8c571,
415         0x962bda1c, 0xe1e696ff, 0xb141ab08, 0x7cca89b9,
416         0x1a69e783, 0x02cc4843, 0xa2f7c579, 0x429ef47d,
417         0x427b169c, 0x5ac9f049, 0xdd8f0f00, 0x5c8165bf,
418 };
419
420 static u_int32_t S2[] = {
421         0x1f201094, 0xef0ba75b, 0x69e3cf7e, 0x393f4380,
422         0xfe61cf7a, 0xeec5207a, 0x55889c94, 0x72fc0651,
423         0xada7ef79, 0x4e1d7235, 0xd55a63ce, 0xde0436ba,
424         0x99c430ef, 0x5f0c0794, 0x18dcdb7d, 0xa1d6eff3,
425         0xa0b52f7b, 0x59e83605, 0xee15b094, 0xe9ffd909,
426         0xdc440086, 0xef944459, 0xba83ccb3, 0xe0c3cdfb,
427         0xd1da4181, 0x3b092ab1, 0xf997f1c1, 0xa5e6cf7b,
428         0x01420ddb, 0xe4e7ef5b, 0x25a1ff41, 0xe180f806,
429         0x1fc41080, 0x179bee7a, 0xd37ac6a9, 0xfe5830a4,
430         0x98de8b7f, 0x77e83f4e, 0x79929269, 0x24fa9f7b,
431         0xe113c85b, 0xacc40083, 0xd7503525, 0xf7ea615f,
432         0x62143154, 0x0d554b63, 0x5d681121, 0xc866c359,
433         0x3d63cf73, 0xcee234c0, 0xd4d87e87, 0x5c672b21,
434         0x071f6181, 0x39f7627f, 0x361e3084, 0xe4eb573b,
435         0x602f64a4, 0xd63acd9c, 0x1bbc4635, 0x9e81032d,
436         0x2701f50c, 0x99847ab4, 0xa0e3df79, 0xba6cf38c,
437         0x10843094, 0x2537a95e, 0xf46f6ffe, 0xa1ff3b1f,
438         0x208cfb6a, 0x8f458c74, 0xd9e0a227, 0x4ec73a34,
439         0xfc884f69, 0x3e4de8df, 0xef0e0088, 0x3559648d,
440         0x8a45388c, 0x1d804366, 0x721d9bfd, 0xa58684bb,
441         0xe8256333, 0x844e8212, 0x128d8098, 0xfed33fb4,
442         0xce280ae1, 0x27e19ba5, 0xd5a6c252, 0xe49754bd,
443         0xc5d655dd, 0xeb667064, 0x77840b4d, 0xa1b6a801,
444         0x84db26a9, 0xe0b56714, 0x21f043b7, 0xe5d05860,
445         0x54f03084, 0x066ff472, 0xa31aa153, 0xdadc4755,
446         0xb5625dbf, 0x68561be6, 0x83ca6b94, 0x2d6ed23b,
447         0xeccf01db, 0xa6d3d0ba, 0xb6803d5c, 0xaf77a709,
448         0x33b4a34c, 0x397bc8d6, 0x5ee22b95, 0x5f0e5304,
449         0x81ed6f61, 0x20e74364, 0xb45e1378, 0xde18639b,
450         0x881ca122, 0xb96726d1, 0x8049a7e8, 0x22b7da7b,
451         0x5e552d25, 0x5272d237, 0x79d2951c, 0xc60d894c,
452         0x488cb402, 0x1ba4fe5b, 0xa4b09f6b, 0x1ca815cf,
453         0xa20c3005, 0x8871df63, 0xb9de2fcb, 0x0cc6c9e9,
454         0x0beeff53, 0xe3214517, 0xb4542835, 0x9f63293c,
455         0xee41e729, 0x6e1d2d7c, 0x50045286, 0x1e6685f3,
456         0xf33401c6, 0x30a22c95, 0x31a70850, 0x60930f13,
457         0x73f98417, 0xa1269859, 0xec645c44, 0x52c877a9,
458         0xcdff33a6, 0xa02b1741, 0x7cbad9a2, 0x2180036f,
459         0x50d99c08, 0xcb3f4861, 0xc26bd765, 0x64a3f6ab,
460         0x80342676, 0x25a75e7b, 0xe4e6d1fc, 0x20c710e6,
461         0xcdf0b680, 0x17844d3b, 0x31eef84d, 0x7e0824e4,
462         0x2ccb49eb, 0x846a3bae, 0x8ff77888, 0xee5d60f6,
463         0x7af75673, 0x2fdd5cdb, 0xa11631c1, 0x30f66f43,
464         0xb3faec54, 0x157fd7fa, 0xef8579cc, 0xd152de58,
465         0xdb2ffd5e, 0x8f32ce19, 0x306af97a, 0x02f03ef8,
466         0x99319ad5, 0xc242fa0f, 0xa7e3ebb0, 0xc68e4906,
467         0xb8da230c, 0x80823028, 0xdcdef3c8, 0xd35fb171,
468         0x088a1bc8, 0xbec0c560, 0x61a3c9e8, 0xbca8f54d,
469         0xc72feffa, 0x22822e99, 0x82c570b4, 0xd8d94e89,
470         0x8b1c34bc, 0x301e16e6, 0x273be979, 0xb0ffeaa6,
471         0x61d9b8c6, 0x00b24869, 0xb7ffce3f, 0x08dc283b,
472         0x43daf65a, 0xf7e19798, 0x7619b72f, 0x8f1c9ba4,
473         0xdc8637a0, 0x16a7d3b1, 0x9fc393b7, 0xa7136eeb,
474         0xc6bcc63e, 0x1a513742, 0xef6828bc, 0x520365d6,
475         0x2d6a77ab, 0x3527ed4b, 0x821fd216, 0x095c6e2e,
476         0xdb92f2fb, 0x5eea29cb, 0x145892f5, 0x91584f7f,
477         0x5483697b, 0x2667a8cc, 0x85196048, 0x8c4bacea,
478         0x833860d4, 0x0d23e0f9, 0x6c387e8a, 0x0ae6d249,
479         0xb284600c, 0xd835731d, 0xdcb1c647, 0xac4c56ea,
480         0x3ebd81b3, 0x230eabb0, 0x6438bc87, 0xf0b5b1fa,
481         0x8f5ea2b3, 0xfc184642, 0x0a036b7a, 0x4fb089bd,
482         0x649da589, 0xa345415e, 0x5c038323, 0x3e5d3bb9,
483         0x43d79572, 0x7e6dd07c, 0x06dfdf1e, 0x6c6cc4ef,
484         0x7160a539, 0x73bfbe70, 0x83877605, 0x4523ecf1,
485 };
486
487 static u_int32_t S3[] = {
488         0x8defc240, 0x25fa5d9f, 0xeb903dbf, 0xe810c907,
489         0x47607fff, 0x369fe44b, 0x8c1fc644, 0xaececa90,
490         0xbeb1f9bf, 0xeefbcaea, 0xe8cf1950, 0x51df07ae,
491         0x920e8806, 0xf0ad0548, 0xe13c8d83, 0x927010d5,
492         0x11107d9f, 0x07647db9, 0xb2e3e4d4, 0x3d4f285e,
493         0xb9afa820, 0xfade82e0, 0xa067268b, 0x8272792e,
494         0x553fb2c0, 0x489ae22b, 0xd4ef9794, 0x125e3fbc,
495         0x21fffcee, 0x825b1bfd, 0x9255c5ed, 0x1257a240,
496         0x4e1a8302, 0xbae07fff, 0x528246e7, 0x8e57140e,
497         0x3373f7bf, 0x8c9f8188, 0xa6fc4ee8, 0xc982b5a5,
498         0xa8c01db7, 0x579fc264, 0x67094f31, 0xf2bd3f5f,
499         0x40fff7c1, 0x1fb78dfc, 0x8e6bd2c1, 0x437be59b,
500         0x99b03dbf, 0xb5dbc64b, 0x638dc0e6, 0x55819d99,
501         0xa197c81c, 0x4a012d6e, 0xc5884a28, 0xccc36f71,
502         0xb843c213, 0x6c0743f1, 0x8309893c, 0x0feddd5f,
503         0x2f7fe850, 0xd7c07f7e, 0x02507fbf, 0x5afb9a04,
504         0xa747d2d0, 0x1651192e, 0xaf70bf3e, 0x58c31380,
505         0x5f98302e, 0x727cc3c4, 0x0a0fb402, 0x0f7fef82,
506         0x8c96fdad, 0x5d2c2aae, 0x8ee99a49, 0x50da88b8,
507         0x8427f4a0, 0x1eac5790, 0x796fb449, 0x8252dc15,
508         0xefbd7d9b, 0xa672597d, 0xada840d8, 0x45f54504,
509         0xfa5d7403, 0xe83ec305, 0x4f91751a, 0x925669c2,
510         0x23efe941, 0xa903f12e, 0x60270df2, 0x0276e4b6,
511         0x94fd6574, 0x927985b2, 0x8276dbcb, 0x02778176,
512         0xf8af918d, 0x4e48f79e, 0x8f616ddf, 0xe29d840e,
513         0x842f7d83, 0x340ce5c8, 0x96bbb682, 0x93b4b148,
514         0xef303cab, 0x984faf28, 0x779faf9b, 0x92dc560d,
515         0x224d1e20, 0x8437aa88, 0x7d29dc96, 0x2756d3dc,
516         0x8b907cee, 0xb51fd240, 0xe7c07ce3, 0xe566b4a1,
517         0xc3e9615e, 0x3cf8209d, 0x6094d1e3, 0xcd9ca341,
518         0x5c76460e, 0x00ea983b, 0xd4d67881, 0xfd47572c,
519         0xf76cedd9, 0xbda8229c, 0x127dadaa, 0x438a074e,
520         0x1f97c090, 0x081bdb8a, 0x93a07ebe, 0xb938ca15,
521         0x97b03cff, 0x3dc2c0f8, 0x8d1ab2ec, 0x64380e51,
522         0x68cc7bfb, 0xd90f2788, 0x12490181, 0x5de5ffd4,
523         0xdd7ef86a, 0x76a2e214, 0xb9a40368, 0x925d958f,
524         0x4b39fffa, 0xba39aee9, 0xa4ffd30b, 0xfaf7933b,
525         0x6d498623, 0x193cbcfa, 0x27627545, 0x825cf47a,
526         0x61bd8ba0, 0xd11e42d1, 0xcead04f4, 0x127ea392,
527         0x10428db7, 0x8272a972, 0x9270c4a8, 0x127de50b,
528         0x285ba1c8, 0x3c62f44f, 0x35c0eaa5, 0xe805d231,
529         0x428929fb, 0xb4fcdf82, 0x4fb66a53, 0x0e7dc15b,
530         0x1f081fab, 0x108618ae, 0xfcfd086d, 0xf9ff2889,
531         0x694bcc11, 0x236a5cae, 0x12deca4d, 0x2c3f8cc5,
532         0xd2d02dfe, 0xf8ef5896, 0xe4cf52da, 0x95155b67,
533         0x494a488c, 0xb9b6a80c, 0x5c8f82bc, 0x89d36b45,
534         0x3a609437, 0xec00c9a9, 0x44715253, 0x0a874b49,
535         0xd773bc40, 0x7c34671c, 0x02717ef6, 0x4feb5536,
536         0xa2d02fff, 0xd2bf60c4, 0xd43f03c0, 0x50b4ef6d,
537         0x07478cd1, 0x006e1888, 0xa2e53f55, 0xb9e6d4bc,
538         0xa2048016, 0x97573833, 0xd7207d67, 0xde0f8f3d,
539         0x72f87b33, 0xabcc4f33, 0x7688c55d, 0x7b00a6b0,
540         0x947b0001, 0x570075d2, 0xf9bb88f8, 0x8942019e,
541         0x4264a5ff, 0x856302e0, 0x72dbd92b, 0xee971b69,
542         0x6ea22fde, 0x5f08ae2b, 0xaf7a616d, 0xe5c98767,
543         0xcf1febd2, 0x61efc8c2, 0xf1ac2571, 0xcc8239c2,
544         0x67214cb8, 0xb1e583d1, 0xb7dc3e62, 0x7f10bdce,
545         0xf90a5c38, 0x0ff0443d, 0x606e6dc6, 0x60543a49,
546         0x5727c148, 0x2be98a1d, 0x8ab41738, 0x20e1be24,
547         0xaf96da0f, 0x68458425, 0x99833be5, 0x600d457d,
548         0x282f9350, 0x8334b362, 0xd91d1120, 0x2b6d8da0,
549         0x642b1e31, 0x9c305a00, 0x52bce688, 0x1b03588a,
550         0xf7baefd5, 0x4142ed9c, 0xa4315c11, 0x83323ec5,
551         0xdfef4636, 0xa133c501, 0xe9d3531c, 0xee353783,
552 };
553
554 static u_int32_t S4[] = {
555         0x9db30420, 0x1fb6e9de, 0xa7be7bef, 0xd273a298,
556         0x4a4f7bdb, 0x64ad8c57, 0x85510443, 0xfa020ed1,
557         0x7e287aff, 0xe60fb663, 0x095f35a1, 0x79ebf120,
558         0xfd059d43, 0x6497b7b1, 0xf3641f63, 0x241e4adf,
559         0x28147f5f, 0x4fa2b8cd, 0xc9430040, 0x0cc32220,
560         0xfdd30b30, 0xc0a5374f, 0x1d2d00d9, 0x24147b15,
561         0xee4d111a, 0x0fca5167, 0x71ff904c, 0x2d195ffe,
562         0x1a05645f, 0x0c13fefe, 0x081b08ca, 0x05170121,
563         0x80530100, 0xe83e5efe, 0xac9af4f8, 0x7fe72701,
564         0xd2b8ee5f, 0x06df4261, 0xbb9e9b8a, 0x7293ea25,
565         0xce84ffdf, 0xf5718801, 0x3dd64b04, 0xa26f263b,
566         0x7ed48400, 0x547eebe6, 0x446d4ca0, 0x6cf3d6f5,
567         0x2649abdf, 0xaea0c7f5, 0x36338cc1, 0x503f7e93,
568         0xd3772061, 0x11b638e1, 0x72500e03, 0xf80eb2bb,
569         0xabe0502e, 0xec8d77de, 0x57971e81, 0xe14f6746,
570         0xc9335400, 0x6920318f, 0x081dbb99, 0xffc304a5,
571         0x4d351805, 0x7f3d5ce3, 0xa6c866c6, 0x5d5bcca9,
572         0xdaec6fea, 0x9f926f91, 0x9f46222f, 0x3991467d,
573         0xa5bf6d8e, 0x1143c44f, 0x43958302, 0xd0214eeb,
574         0x022083b8, 0x3fb6180c, 0x18f8931e, 0x281658e6,
575         0x26486e3e, 0x8bd78a70, 0x7477e4c1, 0xb506e07c,
576         0xf32d0a25, 0x79098b02, 0xe4eabb81, 0x28123b23,
577         0x69dead38, 0x1574ca16, 0xdf871b62, 0x211c40b7,
578         0xa51a9ef9, 0x0014377b, 0x041e8ac8, 0x09114003,
579         0xbd59e4d2, 0xe3d156d5, 0x4fe876d5, 0x2f91a340,
580         0x557be8de, 0x00eae4a7, 0x0ce5c2ec, 0x4db4bba6,
581         0xe756bdff, 0xdd3369ac, 0xec17b035, 0x06572327,
582         0x99afc8b0, 0x56c8c391, 0x6b65811c, 0x5e146119,
583         0x6e85cb75, 0xbe07c002, 0xc2325577, 0x893ff4ec,
584         0x5bbfc92d, 0xd0ec3b25, 0xb7801ab7, 0x8d6d3b24,
585         0x20c763ef, 0xc366a5fc, 0x9c382880, 0x0ace3205,
586         0xaac9548a, 0xeca1d7c7, 0x041afa32, 0x1d16625a,
587         0x6701902c, 0x9b757a54, 0x31d477f7, 0x9126b031,
588         0x36cc6fdb, 0xc70b8b46, 0xd9e66a48, 0x56e55a79,
589         0x026a4ceb, 0x52437eff, 0x2f8f76b4, 0x0df980a5,
590         0x8674cde3, 0xedda04eb, 0x17a9be04, 0x2c18f4df,
591         0xb7747f9d, 0xab2af7b4, 0xefc34d20, 0x2e096b7c,
592         0x1741a254, 0xe5b6a035, 0x213d42f6, 0x2c1c7c26,
593         0x61c2f50f, 0x6552daf9, 0xd2c231f8, 0x25130f69,
594         0xd8167fa2, 0x0418f2c8, 0x001a96a6, 0x0d1526ab,
595         0x63315c21, 0x5e0a72ec, 0x49bafefd, 0x187908d9,
596         0x8d0dbd86, 0x311170a7, 0x3e9b640c, 0xcc3e10d7,
597         0xd5cad3b6, 0x0caec388, 0xf73001e1, 0x6c728aff,
598         0x71eae2a1, 0x1f9af36e, 0xcfcbd12f, 0xc1de8417,
599         0xac07be6b, 0xcb44a1d8, 0x8b9b0f56, 0x013988c3,
600         0xb1c52fca, 0xb4be31cd, 0xd8782806, 0x12a3a4e2,
601         0x6f7de532, 0x58fd7eb6, 0xd01ee900, 0x24adffc2,
602         0xf4990fc5, 0x9711aac5, 0x001d7b95, 0x82e5e7d2,
603         0x109873f6, 0x00613096, 0xc32d9521, 0xada121ff,
604         0x29908415, 0x7fbb977f, 0xaf9eb3db, 0x29c9ed2a,
605         0x5ce2a465, 0xa730f32c, 0xd0aa3fe8, 0x8a5cc091,
606         0xd49e2ce7, 0x0ce454a9, 0xd60acd86, 0x015f1919,
607         0x77079103, 0xdea03af6, 0x78a8565e, 0xdee356df,
608         0x21f05cbe, 0x8b75e387, 0xb3c50651, 0xb8a5c3ef,
609         0xd8eeb6d2, 0xe523be77, 0xc2154529, 0x2f69efdf,
610         0xafe67afb, 0xf470c4b2, 0xf3e0eb5b, 0xd6cc9876,
611         0x39e4460c, 0x1fda8538, 0x1987832f, 0xca007367,
612         0xa99144f8, 0x296b299e, 0x492fc295, 0x9266beab,
613         0xb5676e69, 0x9bd3ddda, 0xdf7e052f, 0xdb25701c,
614         0x1b5e51ee, 0xf65324e6, 0x6afce36c, 0x0316cc04,
615         0x8644213e, 0xb7dc59d0, 0x7965291f, 0xccd6fd43,
616         0x41823979, 0x932bcdf6, 0xb657c34d, 0x4edfd282,
617         0x7ae5290c, 0x3cb9536b, 0x851e20fe, 0x9833557e,
618         0x13ecf0b0, 0xd3ffb372, 0x3f85c5c1, 0x0aef7ed2,
619 };
620
621 static u_int32_t S5[] = {
622         0x7ec90c04, 0x2c6e74b9, 0x9b0e66df, 0xa6337911,
623         0xb86a7fff, 0x1dd358f5, 0x44dd9d44, 0x1731167f,
624         0x08fbf1fa, 0xe7f511cc, 0xd2051b00, 0x735aba00,
625         0x2ab722d8, 0x386381cb, 0xacf6243a, 0x69befd7a,
626         0xe6a2e77f, 0xf0c720cd, 0xc4494816, 0xccf5c180,
627         0x38851640, 0x15b0a848, 0xe68b18cb, 0x4caadeff,
628         0x5f480a01, 0x0412b2aa, 0x259814fc, 0x41d0efe2,
629         0x4e40b48d, 0x248eb6fb, 0x8dba1cfe, 0x41a99b02,
630         0x1a550a04, 0xba8f65cb, 0x7251f4e7, 0x95a51725,
631         0xc106ecd7, 0x97a5980a, 0xc539b9aa, 0x4d79fe6a,
632         0xf2f3f763, 0x68af8040, 0xed0c9e56, 0x11b4958b,
633         0xe1eb5a88, 0x8709e6b0, 0xd7e07156, 0x4e29fea7,
634         0x6366e52d, 0x02d1c000, 0xc4ac8e05, 0x9377f571,
635         0x0c05372a, 0x578535f2, 0x2261be02, 0xd642a0c9,
636         0xdf13a280, 0x74b55bd2, 0x682199c0, 0xd421e5ec,
637         0x53fb3ce8, 0xc8adedb3, 0x28a87fc9, 0x3d959981,
638         0x5c1ff900, 0xfe38d399, 0x0c4eff0b, 0x062407ea,
639         0xaa2f4fb1, 0x4fb96976, 0x90c79505, 0xb0a8a774,
640         0xef55a1ff, 0xe59ca2c2, 0xa6b62d27, 0xe66a4263,
641         0xdf65001f, 0x0ec50966, 0xdfdd55bc, 0x29de0655,
642         0x911e739a, 0x17af8975, 0x32c7911c, 0x89f89468,
643         0x0d01e980, 0x524755f4, 0x03b63cc9, 0x0cc844b2,
644         0xbcf3f0aa, 0x87ac36e9, 0xe53a7426, 0x01b3d82b,
645         0x1a9e7449, 0x64ee2d7e, 0xcddbb1da, 0x01c94910,
646         0xb868bf80, 0x0d26f3fd, 0x9342ede7, 0x04a5c284,
647         0x636737b6, 0x50f5b616, 0xf24766e3, 0x8eca36c1,
648         0x136e05db, 0xfef18391, 0xfb887a37, 0xd6e7f7d4,
649         0xc7fb7dc9, 0x3063fcdf, 0xb6f589de, 0xec2941da,
650         0x26e46695, 0xb7566419, 0xf654efc5, 0xd08d58b7,
651         0x48925401, 0xc1bacb7f, 0xe5ff550f, 0xb6083049,
652         0x5bb5d0e8, 0x87d72e5a, 0xab6a6ee1, 0x223a66ce,
653         0xc62bf3cd, 0x9e0885f9, 0x68cb3e47, 0x086c010f,
654         0xa21de820, 0xd18b69de, 0xf3f65777, 0xfa02c3f6,
655         0x407edac3, 0xcbb3d550, 0x1793084d, 0xb0d70eba,
656         0x0ab378d5, 0xd951fb0c, 0xded7da56, 0x4124bbe4,
657         0x94ca0b56, 0x0f5755d1, 0xe0e1e56e, 0x6184b5be,
658         0x580a249f, 0x94f74bc0, 0xe327888e, 0x9f7b5561,
659         0xc3dc0280, 0x05687715, 0x646c6bd7, 0x44904db3,
660         0x66b4f0a3, 0xc0f1648a, 0x697ed5af, 0x49e92ff6,
661         0x309e374f, 0x2cb6356a, 0x85808573, 0x4991f840,
662         0x76f0ae02, 0x083be84d, 0x28421c9a, 0x44489406,
663         0x736e4cb8, 0xc1092910, 0x8bc95fc6, 0x7d869cf4,
664         0x134f616f, 0x2e77118d, 0xb31b2be1, 0xaa90b472,
665         0x3ca5d717, 0x7d161bba, 0x9cad9010, 0xaf462ba2,
666         0x9fe459d2, 0x45d34559, 0xd9f2da13, 0xdbc65487,
667         0xf3e4f94e, 0x176d486f, 0x097c13ea, 0x631da5c7,
668         0x445f7382, 0x175683f4, 0xcdc66a97, 0x70be0288,
669         0xb3cdcf72, 0x6e5dd2f3, 0x20936079, 0x459b80a5,
670         0xbe60e2db, 0xa9c23101, 0xeba5315c, 0x224e42f2,
671         0x1c5c1572, 0xf6721b2c, 0x1ad2fff3, 0x8c25404e,
672         0x324ed72f, 0x4067b7fd, 0x0523138e, 0x5ca3bc78,
673         0xdc0fd66e, 0x75922283, 0x784d6b17, 0x58ebb16e,
674         0x44094f85, 0x3f481d87, 0xfcfeae7b, 0x77b5ff76,
675         0x8c2302bf, 0xaaf47556, 0x5f46b02a, 0x2b092801,
676         0x3d38f5f7, 0x0ca81f36, 0x52af4a8a, 0x66d5e7c0,
677         0xdf3b0874, 0x95055110, 0x1b5ad7a8, 0xf61ed5ad,
678         0x6cf6e479, 0x20758184, 0xd0cefa65, 0x88f7be58,
679         0x4a046826, 0x0ff6f8f3, 0xa09c7f70, 0x5346aba0,
680         0x5ce96c28, 0xe176eda3, 0x6bac307f, 0x376829d2,
681         0x85360fa9, 0x17e3fe2a, 0x24b79767, 0xf5a96b20,
682         0xd6cd2595, 0x68ff1ebf, 0x7555442c, 0xf19f06be,
683         0xf9e0659a, 0xeeb9491d, 0x34010718, 0xbb30cab8,
684         0xe822fe15, 0x88570983, 0x750e6249, 0xda627e55,
685         0x5e76ffa8, 0xb1534546, 0x6d47de08, 0xefe9e7d4,
686 };
687
688 static u_int32_t S6[] = {
689         0xf6fa8f9d, 0x2cac6ce1, 0x4ca34867, 0xe2337f7c,
690         0x95db08e7, 0x016843b4, 0xeced5cbc, 0x325553ac,
691         0xbf9f0960, 0xdfa1e2ed, 0x83f0579d, 0x63ed86b9,
692         0x1ab6a6b8, 0xde5ebe39, 0xf38ff732, 0x8989b138,
693         0x33f14961, 0xc01937bd, 0xf506c6da, 0xe4625e7e,
694         0xa308ea99, 0x4e23e33c, 0x79cbd7cc, 0x48a14367,
695         0xa3149619, 0xfec94bd5, 0xa114174a, 0xeaa01866,
696         0xa084db2d, 0x09a8486f, 0xa888614a, 0x2900af98,
697         0x01665991, 0xe1992863, 0xc8f30c60, 0x2e78ef3c,
698         0xd0d51932, 0xcf0fec14, 0xf7ca07d2, 0xd0a82072,
699         0xfd41197e, 0x9305a6b0, 0xe86be3da, 0x74bed3cd,
700         0x372da53c, 0x4c7f4448, 0xdab5d440, 0x6dba0ec3,
701         0x083919a7, 0x9fbaeed9, 0x49dbcfb0, 0x4e670c53,
702         0x5c3d9c01, 0x64bdb941, 0x2c0e636a, 0xba7dd9cd,
703         0xea6f7388, 0xe70bc762, 0x35f29adb, 0x5c4cdd8d,
704         0xf0d48d8c, 0xb88153e2, 0x08a19866, 0x1ae2eac8,
705         0x284caf89, 0xaa928223, 0x9334be53, 0x3b3a21bf,
706         0x16434be3, 0x9aea3906, 0xefe8c36e, 0xf890cdd9,
707         0x80226dae, 0xc340a4a3, 0xdf7e9c09, 0xa694a807,
708         0x5b7c5ecc, 0x221db3a6, 0x9a69a02f, 0x68818a54,
709         0xceb2296f, 0x53c0843a, 0xfe893655, 0x25bfe68a,
710         0xb4628abc, 0xcf222ebf, 0x25ac6f48, 0xa9a99387,
711         0x53bddb65, 0xe76ffbe7, 0xe967fd78, 0x0ba93563,
712         0x8e342bc1, 0xe8a11be9, 0x4980740d, 0xc8087dfc,
713         0x8de4bf99, 0xa11101a0, 0x7fd37975, 0xda5a26c0,
714         0xe81f994f, 0x9528cd89, 0xfd339fed, 0xb87834bf,
715         0x5f04456d, 0x22258698, 0xc9c4c83b, 0x2dc156be,
716         0x4f628daa, 0x57f55ec5, 0xe2220abe, 0xd2916ebf,
717         0x4ec75b95, 0x24f2c3c0, 0x42d15d99, 0xcd0d7fa0,
718         0x7b6e27ff, 0xa8dc8af0, 0x7345c106, 0xf41e232f,
719         0x35162386, 0xe6ea8926, 0x3333b094, 0x157ec6f2,
720         0x372b74af, 0x692573e4, 0xe9a9d848, 0xf3160289,
721         0x3a62ef1d, 0xa787e238, 0xf3a5f676, 0x74364853,
722         0x20951063, 0x4576698d, 0xb6fad407, 0x592af950,
723         0x36f73523, 0x4cfb6e87, 0x7da4cec0, 0x6c152daa,
724         0xcb0396a8, 0xc50dfe5d, 0xfcd707ab, 0x0921c42f,
725         0x89dff0bb, 0x5fe2be78, 0x448f4f33, 0x754613c9,
726         0x2b05d08d, 0x48b9d585, 0xdc049441, 0xc8098f9b,
727         0x7dede786, 0xc39a3373, 0x42410005, 0x6a091751,
728         0x0ef3c8a6, 0x890072d6, 0x28207682, 0xa9a9f7be,
729         0xbf32679d, 0xd45b5b75, 0xb353fd00, 0xcbb0e358,
730         0x830f220a, 0x1f8fb214, 0xd372cf08, 0xcc3c4a13,
731         0x8cf63166, 0x061c87be, 0x88c98f88, 0x6062e397,
732         0x47cf8e7a, 0xb6c85283, 0x3cc2acfb, 0x3fc06976,
733         0x4e8f0252, 0x64d8314d, 0xda3870e3, 0x1e665459,
734         0xc10908f0, 0x513021a5, 0x6c5b68b7, 0x822f8aa0,
735         0x3007cd3e, 0x74719eef, 0xdc872681, 0x073340d4,
736         0x7e432fd9, 0x0c5ec241, 0x8809286c, 0xf592d891,
737         0x08a930f6, 0x957ef305, 0xb7fbffbd, 0xc266e96f,
738         0x6fe4ac98, 0xb173ecc0, 0xbc60b42a, 0x953498da,
739         0xfba1ae12, 0x2d4bd736, 0x0f25faab, 0xa4f3fceb,
740         0xe2969123, 0x257f0c3d, 0x9348af49, 0x361400bc,
741         0xe8816f4a, 0x3814f200, 0xa3f94043, 0x9c7a54c2,
742         0xbc704f57, 0xda41e7f9, 0xc25ad33a, 0x54f4a084,
743         0xb17f5505, 0x59357cbe, 0xedbd15c8, 0x7f97c5ab,
744         0xba5ac7b5, 0xb6f6deaf, 0x3a479c3a, 0x5302da25,
745         0x653d7e6a, 0x54268d49, 0x51a477ea, 0x5017d55b,
746         0xd7d25d88, 0x44136c76, 0x0404a8c8, 0xb8e5a121,
747         0xb81a928a, 0x60ed5869, 0x97c55b96, 0xeaec991b,
748         0x29935913, 0x01fdb7f1, 0x088e8dfa, 0x9ab6f6f5,
749         0x3b4cbf9f, 0x4a5de3ab, 0xe6051d35, 0xa0e1d855,
750         0xd36b4cf1, 0xf544edeb, 0xb0e93524, 0xbebb8fbd,
751         0xa2d762cf, 0x49c92f54, 0x38b5f331, 0x7128a454,
752         0x48392905, 0xa65b1db8, 0x851c97bd, 0xd675cf2f,
753 };
754
755 static u_int32_t S7[] = {
756         0x85e04019, 0x332bf567, 0x662dbfff, 0xcfc65693,
757         0x2a8d7f6f, 0xab9bc912, 0xde6008a1, 0x2028da1f,
758         0x0227bce7, 0x4d642916, 0x18fac300, 0x50f18b82,
759         0x2cb2cb11, 0xb232e75c, 0x4b3695f2, 0xb28707de,
760         0xa05fbcf6, 0xcd4181e9, 0xe150210c, 0xe24ef1bd,
761         0xb168c381, 0xfde4e789, 0x5c79b0d8, 0x1e8bfd43,
762         0x4d495001, 0x38be4341, 0x913cee1d, 0x92a79c3f,
763         0x089766be, 0xbaeeadf4, 0x1286becf, 0xb6eacb19,
764         0x2660c200, 0x7565bde4, 0x64241f7a, 0x8248dca9,
765         0xc3b3ad66, 0x28136086, 0x0bd8dfa8, 0x356d1cf2,
766         0x107789be, 0xb3b2e9ce, 0x0502aa8f, 0x0bc0351e,
767         0x166bf52a, 0xeb12ff82, 0xe3486911, 0xd34d7516,
768         0x4e7b3aff, 0x5f43671b, 0x9cf6e037, 0x4981ac83,
769         0x334266ce, 0x8c9341b7, 0xd0d854c0, 0xcb3a6c88,
770         0x47bc2829, 0x4725ba37, 0xa66ad22b, 0x7ad61f1e,
771         0x0c5cbafa, 0x4437f107, 0xb6e79962, 0x42d2d816,
772         0x0a961288, 0xe1a5c06e, 0x13749e67, 0x72fc081a,
773         0xb1d139f7, 0xf9583745, 0xcf19df58, 0xbec3f756,
774         0xc06eba30, 0x07211b24, 0x45c28829, 0xc95e317f,
775         0xbc8ec511, 0x38bc46e9, 0xc6e6fa14, 0xbae8584a,
776         0xad4ebc46, 0x468f508b, 0x7829435f, 0xf124183b,
777         0x821dba9f, 0xaff60ff4, 0xea2c4e6d, 0x16e39264,
778         0x92544a8b, 0x009b4fc3, 0xaba68ced, 0x9ac96f78,
779         0x06a5b79a, 0xb2856e6e, 0x1aec3ca9, 0xbe838688,
780         0x0e0804e9, 0x55f1be56, 0xe7e5363b, 0xb3a1f25d,
781         0xf7debb85, 0x61fe033c, 0x16746233, 0x3c034c28,
782         0xda6d0c74, 0x79aac56c, 0x3ce4e1ad, 0x51f0c802,
783         0x98f8f35a, 0x1626a49f, 0xeed82b29, 0x1d382fe3,
784         0x0c4fb99a, 0xbb325778, 0x3ec6d97b, 0x6e77a6a9,
785         0xcb658b5c, 0xd45230c7, 0x2bd1408b, 0x60c03eb7,
786         0xb9068d78, 0xa33754f4, 0xf430c87d, 0xc8a71302,
787         0xb96d8c32, 0xebd4e7be, 0xbe8b9d2d, 0x7979fb06,
788         0xe7225308, 0x8b75cf77, 0x11ef8da4, 0xe083c858,
789         0x8d6b786f, 0x5a6317a6, 0xfa5cf7a0, 0x5dda0033,
790         0xf28ebfb0, 0xf5b9c310, 0xa0eac280, 0x08b9767a,
791         0xa3d9d2b0, 0x79d34217, 0x021a718d, 0x9ac6336a,
792         0x2711fd60, 0x438050e3, 0x069908a8, 0x3d7fedc4,
793         0x826d2bef, 0x4eeb8476, 0x488dcf25, 0x36c9d566,
794         0x28e74e41, 0xc2610aca, 0x3d49a9cf, 0xbae3b9df,
795         0xb65f8de6, 0x92aeaf64, 0x3ac7d5e6, 0x9ea80509,
796         0xf22b017d, 0xa4173f70, 0xdd1e16c3, 0x15e0d7f9,
797         0x50b1b887, 0x2b9f4fd5, 0x625aba82, 0x6a017962,
798         0x2ec01b9c, 0x15488aa9, 0xd716e740, 0x40055a2c,
799         0x93d29a22, 0xe32dbf9a, 0x058745b9, 0x3453dc1e,
800         0xd699296e, 0x496cff6f, 0x1c9f4986, 0xdfe2ed07,
801         0xb87242d1, 0x19de7eae, 0x053e561a, 0x15ad6f8c,
802         0x66626c1c, 0x7154c24c, 0xea082b2a, 0x93eb2939,
803         0x17dcb0f0, 0x58d4f2ae, 0x9ea294fb, 0x52cf564c,
804         0x9883fe66, 0x2ec40581, 0x763953c3, 0x01d6692e,
805         0xd3a0c108, 0xa1e7160e, 0xe4f2dfa6, 0x693ed285,
806         0x74904698, 0x4c2b0edd, 0x4f757656, 0x5d393378,
807         0xa132234f, 0x3d321c5d, 0xc3f5e194, 0x4b269301,
808         0xc79f022f, 0x3c997e7e, 0x5e4f9504, 0x3ffafbbd,
809         0x76f7ad0e, 0x296693f4, 0x3d1fce6f, 0xc61e45be,
810         0xd3b5ab34, 0xf72bf9b7, 0x1b0434c0, 0x4e72b567,
811         0x5592a33d, 0xb5229301, 0xcfd2a87f, 0x60aeb767,
812         0x1814386b, 0x30bcc33d, 0x38a0c07d, 0xfd1606f2,
813         0xc363519b, 0x589dd390, 0x5479f8e6, 0x1cb8d647,
814         0x97fd61a9, 0xea7759f4, 0x2d57539d, 0x569a58cf,
815         0xe84e63ad, 0x462e1b78, 0x6580f87e, 0xf3817914,
816         0x91da55f4, 0x40a230f3, 0xd1988f35, 0xb6e318d2,
817         0x3ffa50bc, 0x3d40f021, 0xc3c0bdae, 0x4958c24c,
818         0x518f36b2, 0x84b1d370, 0x0fedce83, 0x878ddada,
819         0xf2a279c7, 0x94e01be8, 0x90716f4b, 0x954b8aa3,
820 };
821
822 static u_int32_t S8[] = {
823         0xe216300d, 0xbbddfffc, 0xa7ebdabd, 0x35648095,
824         0x7789f8b7, 0xe6c1121b, 0x0e241600, 0x052ce8b5,
825         0x11a9cfb0, 0xe5952f11, 0xece7990a, 0x9386d174,
826         0x2a42931c, 0x76e38111, 0xb12def3a, 0x37ddddfc,
827         0xde9adeb1, 0x0a0cc32c, 0xbe197029, 0x84a00940,
828         0xbb243a0f, 0xb4d137cf, 0xb44e79f0, 0x049eedfd,
829         0x0b15a15d, 0x480d3168, 0x8bbbde5a, 0x669ded42,
830         0xc7ece831, 0x3f8f95e7, 0x72df191b, 0x7580330d,
831         0x94074251, 0x5c7dcdfa, 0xabbe6d63, 0xaa402164,
832         0xb301d40a, 0x02e7d1ca, 0x53571dae, 0x7a3182a2,
833         0x12a8ddec, 0xfdaa335d, 0x176f43e8, 0x71fb46d4,
834         0x38129022, 0xce949ad4, 0xb84769ad, 0x965bd862,
835         0x82f3d055, 0x66fb9767, 0x15b80b4e, 0x1d5b47a0,
836         0x4cfde06f, 0xc28ec4b8, 0x57e8726e, 0x647a78fc,
837         0x99865d44, 0x608bd593, 0x6c200e03, 0x39dc5ff6,
838         0x5d0b00a3, 0xae63aff2, 0x7e8bd632, 0x70108c0c,
839         0xbbd35049, 0x2998df04, 0x980cf42a, 0x9b6df491,
840         0x9e7edd53, 0x06918548, 0x58cb7e07, 0x3b74ef2e,
841         0x522fffb1, 0xd24708cc, 0x1c7e27cd, 0xa4eb215b,
842         0x3cf1d2e2, 0x19b47a38, 0x424f7618, 0x35856039,
843         0x9d17dee7, 0x27eb35e6, 0xc9aff67b, 0x36baf5b8,
844         0x09c467cd, 0xc18910b1, 0xe11dbf7b, 0x06cd1af8,
845         0x7170c608, 0x2d5e3354, 0xd4de495a, 0x64c6d006,
846         0xbcc0c62c, 0x3dd00db3, 0x708f8f34, 0x77d51b42,
847         0x264f620f, 0x24b8d2bf, 0x15c1b79e, 0x46a52564,
848         0xf8d7e54e, 0x3e378160, 0x7895cda5, 0x859c15a5,
849         0xe6459788, 0xc37bc75f, 0xdb07ba0c, 0x0676a3ab,
850         0x7f229b1e, 0x31842e7b, 0x24259fd7, 0xf8bef472,
851         0x835ffcb8, 0x6df4c1f2, 0x96f5b195, 0xfd0af0fc,
852         0xb0fe134c, 0xe2506d3d, 0x4f9b12ea, 0xf215f225,
853         0xa223736f, 0x9fb4c428, 0x25d04979, 0x34c713f8,
854         0xc4618187, 0xea7a6e98, 0x7cd16efc, 0x1436876c,
855         0xf1544107, 0xbedeee14, 0x56e9af27, 0xa04aa441,
856         0x3cf7c899, 0x92ecbae6, 0xdd67016d, 0x151682eb,
857         0xa842eedf, 0xfdba60b4, 0xf1907b75, 0x20e3030f,
858         0x24d8c29e, 0xe139673b, 0xefa63fb8, 0x71873054,
859         0xb6f2cf3b, 0x9f326442, 0xcb15a4cc, 0xb01a4504,
860         0xf1e47d8d, 0x844a1be5, 0xbae7dfdc, 0x42cbda70,
861         0xcd7dae0a, 0x57e85b7a, 0xd53f5af6, 0x20cf4d8c,
862         0xcea4d428, 0x79d130a4, 0x3486ebfb, 0x33d3cddc,
863         0x77853b53, 0x37effcb5, 0xc5068778, 0xe580b3e6,
864         0x4e68b8f4, 0xc5c8b37e, 0x0d809ea2, 0x398feb7c,
865         0x132a4f94, 0x43b7950e, 0x2fee7d1c, 0x223613bd,
866         0xdd06caa2, 0x37df932b, 0xc4248289, 0xacf3ebc3,
867         0x5715f6b7, 0xef3478dd, 0xf267616f, 0xc148cbe4,
868         0x9052815e, 0x5e410fab, 0xb48a2465, 0x2eda7fa4,
869         0xe87b40e4, 0xe98ea084, 0x5889e9e1, 0xefd390fc,
870         0xdd07d35b, 0xdb485694, 0x38d7e5b2, 0x57720101,
871         0x730edebc, 0x5b643113, 0x94917e4f, 0x503c2fba,
872         0x646f1282, 0x7523d24a, 0xe0779695, 0xf9c17a8f,
873         0x7a5b2121, 0xd187b896, 0x29263a4d, 0xba510cdf,
874         0x81f47c9f, 0xad1163ed, 0xea7b5965, 0x1a00726e,
875         0x11403092, 0x00da6d77, 0x4a0cdd61, 0xad1f4603,
876         0x605bdfb0, 0x9eedc364, 0x22ebe6a8, 0xcee7d28a,
877         0xa0e736a0, 0x5564a6b9, 0x10853209, 0xc7eb8f37,
878         0x2de705ca, 0x8951570f, 0xdf09822b, 0xbd691a6c,
879         0xaa12e4f2, 0x87451c0f, 0xe0f6a27a, 0x3ada4819,
880         0x4cf1764f, 0x0d771c2b, 0x67cdb156, 0x350d8384,
881         0x5938fa0f, 0x42399ef3, 0x36997b07, 0x0e84093d,
882         0x4aa93e61, 0x8360d87b, 0x1fa98b0c, 0x1149382c,
883         0xe97625a5, 0x0614d1b7, 0x0e25244b, 0x0c768347,
884         0x589e8d82, 0x0d2059d1, 0xa466bb1e, 0xf8da0a82,
885         0x04f19130, 0xba6e4ec0, 0x99265164, 0x1ee7230d,
886         0x50b2ad80, 0xeaee6801, 0x8db2a283, 0xea8bf59e,
887 };
888