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