BlowfishCipher.java

00001 // BlowfishCipher - the Blowfish encryption method
00002 //
00003 // Copyright (C) 1996 by Jef Poskanzer <jef@acme.com>.  All rights reserved.
00004 //
00005 // Redistribution and use in source and binary forms, with or without
00006 // modification, are permitted provided that the following conditions
00007 // are met:
00008 // 1. Redistributions of source code must retain the above copyright
00009 //    notice, this list of conditions and the following disclaimer.
00010 // 2. Redistributions in binary form must reproduce the above copyright
00011 //    notice, this list of conditions and the following disclaimer in the
00012 //    documentation and/or other materials provided with the distribution.
00013 //
00014 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
00015 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00016 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00017 // ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
00018 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00019 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00020 // OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00021 // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00022 // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00023 // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00024 // SUCH DAMAGE.
00025 //
00026 // Visit the ACME Labs Java page for up-to-date versions of this and other
00027 // fine Java utilities: http://www.acme.com/java/
00028 
00029 package Acme.Crypto;
00030 
00031 import java.io.*;
00032 
00034 // <P>
00035 // This is surprisingly fast, for pure Java.  On a SPARC 20, wrapped
00036 // in Acme.Crypto.EncryptedOutputStream or Acme.Crypto.EncryptedInputStream,
00037 // it does around 8000 bytes/second, somewhat faster than Acme.Crypto.DesCipher.
00038 // <P>
00039 // With help from David Brownell.
00040 // <P>
00041 // <A HREF="/resources/classes/Acme/Crypto/BlowfishCipher.java">Fetch the software.</A><BR>
00042 // <A HREF="/resources/classes/Acme.tar.gz">Fetch the entire Acme package.</A>
00043 // <P>
00044 // @see EncryptedOutputStream
00045 // @see EncryptedInputStream
00046 
00047 public class BlowfishCipher extends BlockCipher
00048     {
00049 
00050     private static final int N = 16;    // number of rounds
00051 
00052     // Constructor, string key.
00053     public BlowfishCipher( String keyStr )
00054         {
00055         super( 0, 8 );
00056         setKey( keyStr );
00057         }
00058 
00059     // Constructor, byte-array key.
00060     public BlowfishCipher( byte[] key )
00061         {
00062         super( 0, 8 );
00063         setKey( key );
00064         }
00065 
00066 
00067     // Key routines.
00068 
00069     private int[] P = new int[N + 2];
00070     private int[][] S = new int[4][256];
00071 
00073     public void setKey( byte[] key )
00074         {
00075         int i, j, k;
00076         int data, datal, datar;
00077 
00078         // Initialize P and S.
00079         for ( i = 0; i < N + 2; ++i )
00080             P[i] = Pinit[i];
00081         for ( i = 0; i < 4; ++i )
00082             for ( j = 0; j < 256; ++j )
00083                 S[i][j] = Sinit[i][j];
00084 
00085         // XOR the key into P.
00086         j = 0;
00087         for ( i = 0; i < N + 2; ++i )
00088             {
00089             data = 0x00000000;
00090             for ( k = 0; k < 4; ++k )
00091                 {
00092                 data = ( data << 8 ) | ( key[j % key.length] & 0xff );
00093                 ++j;
00094                 }
00095             P[i] ^= data;
00096             }
00097 
00098         // Auto-munge P and S.
00099         int[] datalr = { 0x00000000, 0x00000000 };
00100         for ( i = 0; i < N + 2; i += 2 )
00101             {
00102             encrypt( datalr );
00103             P[i] = datalr[0];
00104             P[i + 1] = datalr[1];
00105             }
00106         for ( i = 0; i < 4; ++i )
00107             {
00108             for ( j = 0; j < 256; j += 2 )
00109                 {
00110                 encrypt( datalr );
00111                 S[i][j] = datalr[0];
00112                 S[i][j + 1] = datalr[1];
00113                 }
00114             }
00115         }
00116 
00117 
00118     // Block encryption routines.
00119 
00121     public void encrypt( byte[] clearText, int clearOff, byte[] cipherText, int cipherOff )
00122         {
00123         int[] tempInts = new int[2];
00124 
00125         squashBytesToInts( clearText, clearOff, tempInts, 0, 2 );
00126         encrypt( tempInts );
00127         spreadIntsToBytes( tempInts, 0, cipherText, cipherOff, 2 );
00128         }
00129 
00131     private void encrypt( int[] text )
00132         {
00133         int xl, xr, temp;
00134         int i;
00135 
00136         xl = text[0];
00137         xr = text[1];
00138 
00139         xl ^= P[0];
00140         xr ^= F( xl ) ^ P[1];
00141         xl ^= F( xr ) ^ P[2];
00142         xr ^= F( xl ) ^ P[3];
00143         xl ^= F( xr ) ^ P[4];
00144         xr ^= F( xl ) ^ P[5];
00145         xl ^= F( xr ) ^ P[6];
00146         xr ^= F( xl ) ^ P[7];
00147         xl ^= F( xr ) ^ P[8];
00148         xr ^= F( xl ) ^ P[9];
00149         xl ^= F( xr ) ^ P[10];
00150         xr ^= F( xl ) ^ P[11];
00151         xl ^= F( xr ) ^ P[12];
00152         xr ^= F( xl ) ^ P[13];
00153         xl ^= F( xr ) ^ P[14];
00154         xr ^= F( xl ) ^ P[15];
00155         xl ^= F( xr ) ^ P[16];
00156         xr ^= P[17];
00157 
00158         text[0] = xr;
00159         text[1] = xl;
00160         }
00161 
00163     public void decrypt( byte[] cipherText, int cipherOff, byte[] clearText, int clearOff )
00164         {
00165         int[] tempInts = new int[2];
00166 
00167         squashBytesToInts( cipherText, cipherOff, tempInts, 0, 2 );
00168         decrypt( tempInts );
00169         spreadIntsToBytes( tempInts, 0, clearText, clearOff, 2 );
00170         }
00171 
00173     public void decrypt( int[] text )
00174         {
00175         int xl, xr, temp;
00176         int i;
00177 
00178         xr = text[0];
00179         xl = text[1];
00180 
00181         xr ^=  P[17];
00182         xl ^= F( xr ) ^ P[16];
00183         xr ^= F( xl ) ^ P[15];
00184         xl ^= F( xr ) ^ P[14];
00185         xr ^= F( xl ) ^ P[13];
00186         xl ^= F( xr ) ^ P[12];
00187         xr ^= F( xl ) ^ P[11];
00188         xl ^= F( xr ) ^ P[10];
00189         xr ^= F( xl ) ^ P[9];
00190         xl ^= F( xr ) ^ P[8];
00191         xr ^= F( xl ) ^ P[7];
00192         xl ^= F( xr ) ^ P[6];
00193         xr ^= F( xl ) ^ P[5];
00194         xl ^= F( xr ) ^ P[4];
00195         xr ^= F( xl ) ^ P[3];
00196         xl ^= F( xr ) ^ P[2];
00197         xr ^= F( xl ) ^ P[1];
00198         xl ^= P[0];
00199 
00200         text[0] = xl;
00201         text[1] = xr;
00202         }
00203 
00204     private int F( int x )
00205         {
00206         int a, b, c, d;
00207         d = x & 0x00FF;
00208         x >>= 8;
00209         c = x & 0x00FF;
00210         x >>= 8;
00211         b = x & 0x00FF;
00212         x >>= 8;
00213         a = x & 0x00FF;
00214         return ( ( S[0][a] + S[1][b] ) ^ S[2][c] ) + S[3][d];
00215         }
00216 
00217 
00219     public static void main( String[] args )
00220         {
00221         byte[] cipherText = new byte[8];
00222         byte[] decipherText = new byte[8];
00223 
00224         BlockCipher bf1 = new BlowfishCipher( "abcdefghijklmnopqrstuvwxyz" );
00225         byte[] clearText1 = {
00226             (byte) 0x42, (byte) 0x4c, (byte) 0x4f, (byte) 0x57,
00227             (byte) 0x46, (byte) 0x49, (byte) 0x53, (byte) 0x48 };
00228         byte[] desiredText1 = {
00229             (byte) 0x32, (byte) 0x4e, (byte) 0xd0, (byte) 0xfe,
00230             (byte) 0xf4, (byte) 0x13, (byte) 0xa2, (byte) 0x03 };
00231         System.out.println( "cleartext: " + toStringBlock( clearText1 ) );
00232         bf1.encrypt( clearText1, cipherText );
00233         System.out.println( "encrypted: " + toStringBlock( cipherText ) );
00234         System.out.println( "desired:   " + toStringBlock( desiredText1 ) );
00235         bf1.decrypt( cipherText, decipherText );
00236         System.out.println( "decrypted: " + toStringBlock( decipherText ) );
00237 
00238         System.out.println();
00239 
00240         BlockCipher bf2 = new BlowfishCipher( "Who is John Galt?" );
00241         byte[] clearText2 = {
00242             (byte) 0xfe, (byte) 0xdc, (byte) 0xba, (byte) 0x98,
00243             (byte) 0x76, (byte) 0x54, (byte) 0x32, (byte) 0x10 };
00244         byte[] desiredText2 = {
00245             (byte) 0xcc, (byte) 0x91, (byte) 0x73, (byte) 0x2b,
00246             (byte) 0x80, (byte) 0x22, (byte) 0xf6, (byte) 0x84 };
00247         System.out.println( "cleartext: " + toStringBlock( clearText2 ) );
00248         bf2.encrypt( clearText2, cipherText );
00249         System.out.println( "encrypted: " + toStringBlock( cipherText ) );
00250         System.out.println( "desired:   " + toStringBlock( desiredText2 ) );
00251         bf2.decrypt( cipherText, decipherText );
00252         System.out.println( "decrypted: " + toStringBlock( decipherText ) );
00253         }
00254 
00255 
00256     // Initialization data.
00257 
00258     private static final int[] Pinit = {
00259         0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
00260         0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
00261         0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
00262         0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
00263         0x9216d5d9, 0x8979fb1b
00264         };
00265 
00266     private static final int[][] Sinit = { {
00267         0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
00268         0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
00269         0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
00270         0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
00271         0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
00272         0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
00273         0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
00274         0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
00275         0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
00276         0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
00277         0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
00278         0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
00279         0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
00280         0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
00281         0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
00282         0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
00283         0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
00284         0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
00285         0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
00286         0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
00287         0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
00288         0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
00289         0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
00290         0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
00291         0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
00292         0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
00293         0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
00294         0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
00295         0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
00296         0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
00297         0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
00298         0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
00299         0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
00300         0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
00301         0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
00302         0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
00303         0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
00304         0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
00305         0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
00306         0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
00307         0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
00308         0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
00309         0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
00310         0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
00311         0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
00312         0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
00313         0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
00314         0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
00315         0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
00316         0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
00317         0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
00318         0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
00319         0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
00320         0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
00321         0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
00322         0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
00323         0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
00324         0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
00325         0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
00326         0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
00327         0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
00328         0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
00329         0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
00330         0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a,
00331         }, {
00332         0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
00333         0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
00334         0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
00335         0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
00336         0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
00337         0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
00338         0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
00339         0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
00340         0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
00341         0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
00342         0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
00343         0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
00344         0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
00345         0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
00346         0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
00347         0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
00348         0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
00349         0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
00350         0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
00351         0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
00352         0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
00353         0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
00354         0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
00355         0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
00356         0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
00357         0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
00358         0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
00359         0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
00360         0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
00361         0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
00362         0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
00363         0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
00364         0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
00365         0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
00366         0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
00367         0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
00368         0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
00369         0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
00370         0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
00371         0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
00372         0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
00373         0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
00374         0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
00375         0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
00376         0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
00377         0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
00378         0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
00379         0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
00380         0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
00381         0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
00382         0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
00383         0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
00384         0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
00385         0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
00386         0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
00387         0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
00388         0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
00389         0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
00390         0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
00391         0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
00392         0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
00393         0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
00394         0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
00395         0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7,
00396         }, {
00397         0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
00398         0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
00399         0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
00400         0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
00401         0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
00402         0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
00403         0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
00404         0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
00405         0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
00406         0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
00407         0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
00408         0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
00409         0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
00410         0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
00411         0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
00412         0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
00413         0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
00414         0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
00415         0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
00416         0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
00417         0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
00418         0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
00419         0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
00420         0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
00421         0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
00422         0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
00423         0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
00424         0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
00425         0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
00426         0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
00427         0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
00428         0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
00429         0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
00430         0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
00431         0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
00432         0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
00433         0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
00434         0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
00435         0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
00436         0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
00437         0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
00438         0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
00439         0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
00440         0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
00441         0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
00442         0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
00443         0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
00444         0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
00445         0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
00446         0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
00447         0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
00448         0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
00449         0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
00450         0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
00451         0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
00452         0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
00453         0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
00454         0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
00455         0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
00456         0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
00457         0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
00458         0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
00459         0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
00460         0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0,
00461         }, {
00462         0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
00463         0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
00464         0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
00465         0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
00466         0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
00467         0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
00468         0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
00469         0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
00470         0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
00471         0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
00472         0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
00473         0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
00474         0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
00475         0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
00476         0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
00477         0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
00478         0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
00479         0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
00480         0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
00481         0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
00482         0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
00483         0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
00484         0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
00485         0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
00486         0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
00487         0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
00488         0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
00489         0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
00490         0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
00491         0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
00492         0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
00493         0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
00494         0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
00495         0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
00496         0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
00497         0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
00498         0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
00499         0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
00500         0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
00501         0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
00502         0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
00503         0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
00504         0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
00505         0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
00506         0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
00507         0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
00508         0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
00509         0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
00510         0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
00511         0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
00512         0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
00513         0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
00514         0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
00515         0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
00516         0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
00517         0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
00518         0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
00519         0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
00520         0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
00521         0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
00522         0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
00523         0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
00524         0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
00525         0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6
00526         } };
00527 
00528     }

Generated on Mon Dec 4 11:03:25 2006 for OpenMobileIS by  doxygen 1.5.1-p1