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