blob: 19ae3b51823f2cab172ff12684fe8ae10611198d [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26package com.sun.crypto.provider;
27
28import java.security.InvalidKeyException;
29
30/**
31 * This is the internal Blowfish class responsible for encryption and
32 * decryption of a byte array of size <code>BLOWFISH_BLOCK_SIZE</code>.
33 *
34 * @author Jan Luehe
35 * @author David Brownell
36 *
37 * @see BlowfishCipher
38 */
39
40final class BlowfishCrypt extends SymmetricCipher
41 implements BlowfishConstants {
42
43 /*
44 * Are we encrypting or decrypting?
45 */
46 private boolean decrypting = false;
47
48 /**
49 * Gets this cipher's block size.
50 *
51 * @return this cipher's block size
52 */
53 int getBlockSize() {
54 return BLOWFISH_BLOCK_SIZE;
55 }
56
57 void init(boolean decrypting, String algorithm, byte[] rawKey)
58 throws InvalidKeyException {
59 this.decrypting = decrypting;
60 if (!algorithm.equalsIgnoreCase("Blowfish")) {
61 throw new InvalidKeyException("Wrong algorithm: Blowfish required");
62 }
63 if (rawKey.length > BLOWFISH_MAX_KEYSIZE) {
64 throw new InvalidKeyException("Key too long (> 448 bits)");
65 }
66 // Step 1: Init P and then S arrays from pi bytes
67 int i, j, count;
68
69 System.arraycopy(pi, 0, p, 0, 18);
70 System.arraycopy(pi, 18, s0, 0, 256);
71 System.arraycopy(pi, 18 + 256, s1, 0, 256);
72 System.arraycopy(pi, 18 + 512, s2, 0, 256);
73 System.arraycopy(pi, 18 + 768, s3, 0, 256);
74
75 // Step 2: XOR all parts of P with key data
76 int tmp = 0;
77 int nLen = rawKey.length;
78 int nKeyPos = 0;
79 for (i = 0; i < 18; i++) {
80 for (j = 0; j < 4; j++) {
81 tmp <<= 8;
82 tmp |= 0x0ff & rawKey[nKeyPos];
83 if (++nKeyPos == nLen) nKeyPos = 0;
84 }
85 p[i] ^= tmp;
86 }
87
88 // Steps 3-7: Replace all P, S values with computed values
89 int[] data = new int[2];
90
91 for (i = 0; i < 18; i+=2) {
92 encryptBlock(data);
93 p[i] = data[0];
94 p[i+1] = data[1];
95 }
96
97 for (j = 0; j < 256; j+=2) {
98 encryptBlock(data);
99 s0[j] = data[0];
100 s0[j+1] = data[1];
101 }
102 for (j = 0; j < 256; j+=2) {
103 encryptBlock(data);
104 s1[j] = data[0];
105 s1[j+1] = data[1];
106 }
107 for (j = 0; j < 256; j+=2) {
108 encryptBlock(data);
109 s2[j] = data[0];
110 s2[j+1] = data[1];
111 }
112 for (j = 0; j < 256; j+=2) {
113 encryptBlock(data);
114 s3[j] = data[0];
115 s3[j+1] = data[1];
116 }
117 }
118
119 /**
120 * Performs encryption operation.
121 *
122 * <p>The input plain text <code>plain</code>, starting at
123 * <code>plainOffset</code> and ending at
124 * <code>(plainOffset + len - 1)</code>, is encrypted.
125 * The result is stored in <code>cipher</code>, starting at
126 * <code>cipherOffset</code>.
127 *
128 * <p>The subclass that implements Cipher should ensure that
129 * <code>init</code> has been called before this method is called.
130 *
131 * @param plain the buffer with the input data to be encrypted
132 * @param plainOffset the offset in <code>plain</code>
133 * @param plainLen the length of the input data
134 * @param cipher the buffer for the result
135 * @param cipherOffset the offset in <code>cipher</code>
136 */
137 void encryptBlock(byte[] plain, int plainOffset,
138 byte[] cipher, int cipherOffset)
139 {
140 cipherBlock(plain, plainOffset, cipher, cipherOffset);
141 }
142
143 /**
144 * Performs decryption operation.
145 *
146 * <p>The input cipher text <code>cipher</code>, starting at
147 * <code>cipherOffset</code> and ending at
148 * <code>(cipherOffset + len - 1)</code>, is decrypted.
149 * The result is stored in <code>plain</code>, starting at
150 * <code>plainOffset</code>.
151 *
152 * <p>The subclass that implements Cipher should ensure that
153 * <code>init</code> has been called before this method is called.
154 *
155 * @param cipher the buffer with the input data to be decrypted
156 * @param cipherOffset the offset in <code>cipherOffset</code>
157 * @param cipherLen the length of the input data
158 * @param plain the buffer for the result
159 * @param plainOffset the offset in <code>plain</code>
160 */
161 void decryptBlock(byte[] cipher, int cipherOffset,
162 byte[] plain, int plainOffset)
163 {
164 cipherBlock(cipher, cipherOffset, plain, plainOffset);
165 }
166
167 /**
168 * Encrypts, or decrypts, the blocks of data passed in.
169 */
170 private void cipherBlock(byte[] in, int inOffset,
171 byte[] out, int outOffset) {
172 temp[0] = ((in[inOffset ] ) << 24) |
173 ((in[inOffset + 1] & 0xff) << 16) |
174 ((in[inOffset + 2] & 0xff) << 8) |
175 ((in[inOffset + 3] & 0xff) );
176
177 temp[1] = ((in[inOffset + 4] ) << 24) |
178 ((in[inOffset + 5] & 0xff) << 16) |
179 ((in[inOffset + 6] & 0xff) << 8) |
180 ((in[inOffset + 7] & 0xff) );
181
182 if (decrypting) {
183 decryptBlock(temp);
184 } else {
185 encryptBlock(temp);
186 }
187
188 int t = temp[0];
189 out[outOffset ] = (byte)(t >> 24);
190 out[outOffset + 1] = (byte)(t >> 16);
191 out[outOffset + 2] = (byte)(t >> 8);
192 out[outOffset + 3] = (byte)(t );
193
194 t = temp[1];
195 out[outOffset + 4] = (byte)(t >> 24);
196 out[outOffset + 5] = (byte)(t >> 16);
197 out[outOffset + 6] = (byte)(t >> 8);
198 out[outOffset + 7] = (byte)(t );
199 }
200
201 /**
202 * Encrypts a single block, in place.
203 */
204 private void encryptBlock(int[] value) {
205 int left = value[0];
206 int right = value[1];
207
208 left ^= p[0];
209
210 right ^= F(left) ^ p[1];
211 left ^= F(right) ^ p[2];
212 right ^= F(left) ^ p[3];
213 left ^= F(right) ^ p[4];
214
215 right ^= F(left) ^ p[5];
216 left ^= F(right) ^ p[6];
217 right ^= F(left) ^ p[7];
218 left ^= F(right) ^ p[8];
219
220 right ^= F(left) ^ p[9];
221 left ^= F(right) ^ p[10];
222 right ^= F(left) ^ p[11];
223 left ^= F(right) ^ p[12];
224
225 right ^= F(left) ^ p[13];
226 left ^= F(right) ^ p[14];
227 right ^= F(left) ^ p[15];
228 left ^= F(right) ^ p[16];
229
230 right ^= p[17];
231
232 value[0] = right;
233 value[1] = left;
234 }
235
236 /**
237 * Decrypts a single block, in place.
238 */
239 private void decryptBlock(int[] value) {
240 int left = value[1];
241 int right = value[0];
242
243 right ^= p[17];
244
245 left ^= p[16] ^ F(right);
246 right ^= p[15] ^ F(left);
247 left ^= p[14] ^ F(right);
248 right ^= p[13] ^ F(left);
249
250 left ^= p[12] ^ F(right);
251 right ^= p[11] ^ F(left);
252 left ^= p[10] ^ F(right);
253 right ^= p[9] ^ F(left);
254
255 left ^= p[8] ^ F(right);
256 right ^= p[7] ^ F(left);
257 left ^= p[6] ^ F(right);
258 right ^= p[5] ^ F(left);
259
260 left ^= p[4] ^ F(right);
261 right ^= p[3] ^ F(left);
262 left ^= p[2] ^ F(right);
263 right ^= p[1] ^ F(left);
264
265 left ^= p[0];
266
267 value[0] = left;
268 value[1] = right;
269 }
270
271 /**
272 * Calculates the S-Box function F().
273 *
274 * This gets used "rounds" times on each encryption/decryption.
275 */
276 private int F(int v) {
277 return (( s0[ v >>> 24 ]
278 + s1[(v >> 16) & 0xff])
279 ^ s2[(v >> 8) & 0xff])
280 + s3[ v & 0xff];
281 }
282
283 private final int[] p = new int[18]; // subkeys
284 private final int[] s0 = new int[256]; // s-boxes
285 private final int[] s1 = new int[256];
286 private final int[] s2 = new int[256];
287 private final int[] s3 = new int[256];
288 private final int[] temp = new int[2]; // to avoid encrypt/decrypt mallocs
289
290 // many digits of pi, for initializing p and s
291 private static final int[] pi = {
292
293 // p [rounds + 2]
294 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
295 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
296 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
297 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
298 0x9216d5d9, 0x8979fb1b,
299
300 // s [4][256]
301 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
302 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
303 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
304 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
305 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
306 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
307 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
308 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
309 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
310 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
311 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
312 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
313 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
314 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
315 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
316 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
317 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
318 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
319 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
320 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
321 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
322 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
323 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
324 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
325 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
326 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
327 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
328 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
329 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
330 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
331 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
332 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
333 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
334 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
335 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
336 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
337 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
338 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
339 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
340 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
341 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
342 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
343 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
344 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
345 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
346 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
347 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
348 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
349 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
350 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
351 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
352 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
353 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
354 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
355 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
356 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
357 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
358 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
359 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
360 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
361 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
362 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
363 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
364 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a,
365 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
366 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
367 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
368 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
369 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
370 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
371 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
372 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
373 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
374 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
375 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
376 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
377 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
378 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
379 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
380 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
381 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
382 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
383 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
384 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
385 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
386 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
387 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
388 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
389 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
390 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
391 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
392 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
393 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
394 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
395 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
396 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
397 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
398 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
399 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
400 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
401 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
402 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
403 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
404 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
405 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
406 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
407 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
408 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
409 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
410 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
411 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
412 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
413 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
414 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
415 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
416 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
417 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
418 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
419 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
420 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
421 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
422 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
423 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
424 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
425 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
426 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
427 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
428 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7,
429 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
430 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
431 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
432 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
433 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
434 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
435 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
436 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
437 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
438 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
439 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
440 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
441 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
442 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
443 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
444 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
445 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
446 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
447 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
448 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
449 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
450 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
451 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
452 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
453 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
454 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
455 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
456 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
457 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
458 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
459 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
460 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
461 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
462 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
463 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
464 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
465 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
466 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
467 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
468 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
469 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
470 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
471 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
472 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
473 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
474 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
475 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
476 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
477 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
478 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
479 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
480 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
481 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
482 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
483 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
484 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
485 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
486 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
487 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
488 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
489 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
490 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
491 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
492 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0,
493 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
494 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
495 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
496 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
497 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
498 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
499 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
500 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
501 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
502 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
503 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
504 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
505 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
506 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
507 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
508 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
509 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
510 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
511 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
512 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
513 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
514 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
515 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
516 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
517 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
518 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
519 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
520 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
521 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
522 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
523 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
524 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
525 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
526 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
527 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
528 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
529 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
530 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
531 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
532 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
533 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
534 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
535 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
536 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
537 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
538 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
539 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
540 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
541 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
542 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
543 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
544 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
545 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
546 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
547 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
548 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
549 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
550 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
551 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
552 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
553 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
554 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
555 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
556 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6,
557 };
558}