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
45static u_int32_t S1[];
46static u_int32_t S2[];
47static u_int32_t S3[];
48static u_int32_t S4[];
49static u_int32_t S5[];
50static u_int32_t S6[];
51static u_int32_t S7[];
52static u_int32_t S8[];
53
54
55/*
56 * Step 1
57 */
58void 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
176void 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
222void 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
268void 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
310void 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
352static 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
419static 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
486static 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
553static 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
620static 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
687static 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
754static 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
821static 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
888