1/*
2 * Copyright (c) 1998, 2007, Oracle and/or its affiliates. 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.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * 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}
559