| 1 | // | 
|---|
| 2 | // This DES class has been extracted from package Acme.Crypto for use in VNC. | 
|---|
| 3 | // The bytebit[] array has been reversed so that the most significant bit | 
|---|
| 4 | // in each byte of the key is ignored, not the least significant.  Also the | 
|---|
| 5 | // unnecessary odd parity code has been removed. | 
|---|
| 6 | // | 
|---|
| 7 | // These changes are: | 
|---|
| 8 | //  Copyright (C) 1999 AT&T Laboratories Cambridge.  All Rights Reserved. | 
|---|
| 9 | // | 
|---|
| 10 | // This software is distributed in the hope that it will be useful, | 
|---|
| 11 | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|---|
| 12 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 
|---|
| 13 | // | 
|---|
| 14 |  | 
|---|
| 15 | // DesCipher - the DES encryption method | 
|---|
| 16 | // | 
|---|
| 17 | // The meat of this code is by Dave Zimmerman <dzimm@widget.com>, and is: | 
|---|
| 18 | // | 
|---|
| 19 | // Copyright (c) 1996 Widget Workshop, Inc. All Rights Reserved. | 
|---|
| 20 | // | 
|---|
| 21 | // Permission to use, copy, modify, and distribute this software | 
|---|
| 22 | // and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and | 
|---|
| 23 | // without fee is hereby granted, provided that this copyright notice is kept  | 
|---|
| 24 | // intact.  | 
|---|
| 25 | //  | 
|---|
| 26 | // WIDGET WORKSHOP MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY | 
|---|
| 27 | // OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED | 
|---|
| 28 | // TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A | 
|---|
| 29 | // PARTICULAR PURPOSE, OR NON-INFRINGEMENT. WIDGET WORKSHOP SHALL NOT BE LIABLE | 
|---|
| 30 | // FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR | 
|---|
| 31 | // DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. | 
|---|
| 32 | //  | 
|---|
| 33 | // THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE | 
|---|
| 34 | // CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE | 
|---|
| 35 | // PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT | 
|---|
| 36 | // NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE | 
|---|
| 37 | // SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE | 
|---|
| 38 | // SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE | 
|---|
| 39 | // PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES").  WIDGET WORKSHOP | 
|---|
| 40 | // SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR | 
|---|
| 41 | // HIGH RISK ACTIVITIES. | 
|---|
| 42 | // | 
|---|
| 43 | // | 
|---|
| 44 | // The rest is: | 
|---|
| 45 | // | 
|---|
| 46 | // Copyright (C) 1996 by Jef Poskanzer <jef@acme.com>.  All rights reserved. | 
|---|
| 47 | // | 
|---|
| 48 | // Redistribution and use in source and binary forms, with or without | 
|---|
| 49 | // modification, are permitted provided that the following conditions | 
|---|
| 50 | // are met: | 
|---|
| 51 | // 1. Redistributions of source code must retain the above copyright | 
|---|
| 52 | //    notice, this list of conditions and the following disclaimer. | 
|---|
| 53 | // 2. Redistributions in binary form must reproduce the above copyright | 
|---|
| 54 | //    notice, this list of conditions and the following disclaimer in the | 
|---|
| 55 | //    documentation and/or other materials provided with the distribution. | 
|---|
| 56 | // | 
|---|
| 57 | // THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | 
|---|
| 58 | // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
|---|
| 59 | // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 
|---|
| 60 | // ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | 
|---|
| 61 | // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | 
|---|
| 62 | // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | 
|---|
| 63 | // OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | 
|---|
| 64 | // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | 
|---|
| 65 | // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | 
|---|
| 66 | // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | 
|---|
| 67 | // SUCH DAMAGE. | 
|---|
| 68 | // | 
|---|
| 69 | // Visit the ACME Labs Java page for up-to-date versions of this and other | 
|---|
| 70 | // fine Java utilities: http://www.acme.com/java/ | 
|---|
| 71 |  | 
|---|
| 72 |  | 
|---|
| 73 | import java.io.*; | 
|---|
| 74 |  | 
|---|
| 75 | /// The DES encryption method. | 
|---|
| 76 | // <P> | 
|---|
| 77 | // This is surprisingly fast, for pure Java.  On a SPARC 20, wrapped | 
|---|
| 78 | // in Acme.Crypto.EncryptedOutputStream or Acme.Crypto.EncryptedInputStream, | 
|---|
| 79 | // it does around 7000 bytes/second. | 
|---|
| 80 | // <P> | 
|---|
| 81 | // Most of this code is by Dave Zimmerman <dzimm@widget.com>, and is | 
|---|
| 82 | // Copyright (c) 1996 Widget Workshop, Inc.  See the source file for details. | 
|---|
| 83 | // <P> | 
|---|
| 84 | // <A HREF="/resources/classes/Acme/Crypto/DesCipher.java">Fetch the software.</A><BR> | 
|---|
| 85 | // <A HREF="/resources/classes/Acme.tar.Z">Fetch the entire Acme package.</A> | 
|---|
| 86 | // <P> | 
|---|
| 87 | // @see Des3Cipher | 
|---|
| 88 | // @see EncryptedOutputStream | 
|---|
| 89 | // @see EncryptedInputStream | 
|---|
| 90 |  | 
|---|
| 91 | public class DesCipher | 
|---|
| 92 |     { | 
|---|
| 93 |  | 
|---|
| 94 |     // Constructor, byte-array key. | 
|---|
| 95 |     public DesCipher( byte[] key ) | 
|---|
| 96 |         { | 
|---|
| 97 |         setKey( key ); | 
|---|
| 98 |         } | 
|---|
| 99 |  | 
|---|
| 100 |     // Key routines. | 
|---|
| 101 |  | 
|---|
| 102 |     private int[] encryptKeys = new int[32]; | 
|---|
| 103 |     private int[] decryptKeys = new int[32]; | 
|---|
| 104 |  | 
|---|
| 105 |     /// Set the key. | 
|---|
| 106 |     public void setKey( byte[] key ) | 
|---|
| 107 |         { | 
|---|
| 108 |         deskey( key, true, encryptKeys ); | 
|---|
| 109 |         deskey( key, false, decryptKeys ); | 
|---|
| 110 |         } | 
|---|
| 111 |  | 
|---|
| 112 |     // Turn an 8-byte key into internal keys. | 
|---|
| 113 |     private void deskey( byte[] keyBlock, boolean encrypting, int[] KnL ) | 
|---|
| 114 |         { | 
|---|
| 115 |         int i, j, l, m, n; | 
|---|
| 116 |         int[] pc1m = new int[56]; | 
|---|
| 117 |         int[] pcr = new int[56]; | 
|---|
| 118 |         int[] kn = new int[32]; | 
|---|
| 119 |  | 
|---|
| 120 |         for ( j = 0; j < 56; ++j ) | 
|---|
| 121 |             { | 
|---|
| 122 |             l = pc1[j]; | 
|---|
| 123 |             m = l & 07; | 
|---|
| 124 |             pc1m[j] = ( (keyBlock[l >>> 3] & bytebit[m]) != 0 )? 1: 0; | 
|---|
| 125 |             } | 
|---|
| 126 |  | 
|---|
| 127 |         for ( i = 0; i < 16; ++i ) | 
|---|
| 128 |             { | 
|---|
| 129 |             if ( encrypting ) | 
|---|
| 130 |                 m = i << 1; | 
|---|
| 131 |             else | 
|---|
| 132 |                 m = (15-i) << 1; | 
|---|
| 133 |             n = m+1; | 
|---|
| 134 |             kn[m] = kn[n] = 0; | 
|---|
| 135 |             for ( j = 0; j < 28; ++j ) | 
|---|
| 136 |                 { | 
|---|
| 137 |                 l = j+totrot[i]; | 
|---|
| 138 |                 if ( l < 28 ) | 
|---|
| 139 |                     pcr[j] = pc1m[l]; | 
|---|
| 140 |                 else | 
|---|
| 141 |                     pcr[j] = pc1m[l-28]; | 
|---|
| 142 |                 } | 
|---|
| 143 |             for ( j=28; j < 56; ++j ) | 
|---|
| 144 |                 { | 
|---|
| 145 |                 l = j+totrot[i]; | 
|---|
| 146 |                 if ( l < 56 ) | 
|---|
| 147 |                     pcr[j] = pc1m[l]; | 
|---|
| 148 |                 else | 
|---|
| 149 |                     pcr[j] = pc1m[l-28]; | 
|---|
| 150 |                 } | 
|---|
| 151 |             for ( j = 0; j < 24; ++j ) | 
|---|
| 152 |                 { | 
|---|
| 153 |                 if ( pcr[pc2[j]] != 0 ) | 
|---|
| 154 |                     kn[m] |= bigbyte[j]; | 
|---|
| 155 |                 if ( pcr[pc2[j+24]] != 0 ) | 
|---|
| 156 |                     kn[n] |= bigbyte[j]; | 
|---|
| 157 |                 } | 
|---|
| 158 |             } | 
|---|
| 159 |         cookey( kn, KnL ); | 
|---|
| 160 |         } | 
|---|
| 161 |  | 
|---|
| 162 |     private void cookey( int[] raw, int KnL[] ) | 
|---|
| 163 |         { | 
|---|
| 164 |         int raw0, raw1; | 
|---|
| 165 |         int rawi, KnLi; | 
|---|
| 166 |         int i; | 
|---|
| 167 |  | 
|---|
| 168 |         for ( i = 0, rawi = 0, KnLi = 0; i < 16; ++i ) | 
|---|
| 169 |             { | 
|---|
| 170 |             raw0 = raw[rawi++]; | 
|---|
| 171 |             raw1 = raw[rawi++]; | 
|---|
| 172 |             KnL[KnLi]  = (raw0 & 0x00fc0000) <<   6; | 
|---|
| 173 |             KnL[KnLi] |= (raw0 & 0x00000fc0) <<  10; | 
|---|
| 174 |             KnL[KnLi] |= (raw1 & 0x00fc0000) >>> 10; | 
|---|
| 175 |             KnL[KnLi] |= (raw1 & 0x00000fc0) >>>  6; | 
|---|
| 176 |             ++KnLi; | 
|---|
| 177 |             KnL[KnLi]  = (raw0 & 0x0003f000) <<  12; | 
|---|
| 178 |             KnL[KnLi] |= (raw0 & 0x0000003f) <<  16; | 
|---|
| 179 |             KnL[KnLi] |= (raw1 & 0x0003f000) >>>  4; | 
|---|
| 180 |             KnL[KnLi] |= (raw1 & 0x0000003f); | 
|---|
| 181 |             ++KnLi; | 
|---|
| 182 |             } | 
|---|
| 183 |         } | 
|---|
| 184 |  | 
|---|
| 185 |  | 
|---|
| 186 |     // Block encryption routines. | 
|---|
| 187 |  | 
|---|
| 188 |     private int[] tempInts = new int[2]; | 
|---|
| 189 |  | 
|---|
| 190 |     /// Encrypt a block of eight bytes. | 
|---|
| 191 |     public void encrypt( byte[] clearText, int clearOff, byte[] cipherText, int cipherOff ) | 
|---|
| 192 |         { | 
|---|
| 193 |         squashBytesToInts( clearText, clearOff, tempInts, 0, 2 ); | 
|---|
| 194 |         des( tempInts, tempInts, encryptKeys ); | 
|---|
| 195 |         spreadIntsToBytes( tempInts, 0, cipherText, cipherOff, 2 ); | 
|---|
| 196 |         } | 
|---|
| 197 |  | 
|---|
| 198 |     /// Decrypt a block of eight bytes. | 
|---|
| 199 |     public void decrypt( byte[] cipherText, int cipherOff, byte[] clearText, int clearOff ) | 
|---|
| 200 |         { | 
|---|
| 201 |         squashBytesToInts( cipherText, cipherOff, tempInts, 0, 2 ); | 
|---|
| 202 |         des( tempInts, tempInts, decryptKeys ); | 
|---|
| 203 |         spreadIntsToBytes( tempInts, 0, clearText, clearOff, 2 ); | 
|---|
| 204 |         } | 
|---|
| 205 |  | 
|---|
| 206 |     // The DES function. | 
|---|
| 207 |     private void des( int[] inInts, int[] outInts, int[] keys ) | 
|---|
| 208 |         { | 
|---|
| 209 |         int fval, work, right, leftt; | 
|---|
| 210 |         int round; | 
|---|
| 211 |         int keysi = 0; | 
|---|
| 212 |  | 
|---|
| 213 |         leftt = inInts[0]; | 
|---|
| 214 |         right = inInts[1]; | 
|---|
| 215 |  | 
|---|
| 216 |         work   = ((leftt >>>  4) ^ right) & 0x0f0f0f0f; | 
|---|
| 217 |         right ^= work; | 
|---|
| 218 |         leftt ^= (work << 4); | 
|---|
| 219 |  | 
|---|
| 220 |         work   = ((leftt >>> 16) ^ right) & 0x0000ffff; | 
|---|
| 221 |         right ^= work; | 
|---|
| 222 |         leftt ^= (work << 16); | 
|---|
| 223 |  | 
|---|
| 224 |         work   = ((right >>>  2) ^ leftt) & 0x33333333; | 
|---|
| 225 |         leftt ^= work; | 
|---|
| 226 |         right ^= (work << 2); | 
|---|
| 227 |  | 
|---|
| 228 |         work   = ((right >>>  8) ^ leftt) & 0x00ff00ff; | 
|---|
| 229 |         leftt ^= work; | 
|---|
| 230 |         right ^= (work << 8); | 
|---|
| 231 |         right  = (right << 1) | ((right >>> 31) & 1); | 
|---|
| 232 |  | 
|---|
| 233 |         work   = (leftt ^ right) & 0xaaaaaaaa; | 
|---|
| 234 |         leftt ^= work; | 
|---|
| 235 |         right ^= work; | 
|---|
| 236 |         leftt  = (leftt << 1) | ((leftt >>> 31) & 1); | 
|---|
| 237 |  | 
|---|
| 238 |         for ( round = 0; round < 8; ++round ) | 
|---|
| 239 |             { | 
|---|
| 240 |             work   = (right << 28) | (right >>> 4); | 
|---|
| 241 |             work  ^= keys[keysi++]; | 
|---|
| 242 |             fval   = SP7[ work         & 0x0000003f ]; | 
|---|
| 243 |             fval  |= SP5[(work >>>  8) & 0x0000003f ]; | 
|---|
| 244 |             fval  |= SP3[(work >>> 16) & 0x0000003f ]; | 
|---|
| 245 |             fval  |= SP1[(work >>> 24) & 0x0000003f ]; | 
|---|
| 246 |             work   = right ^ keys[keysi++]; | 
|---|
| 247 |             fval  |= SP8[ work         & 0x0000003f ]; | 
|---|
| 248 |             fval  |= SP6[(work >>>  8) & 0x0000003f ]; | 
|---|
| 249 |             fval  |= SP4[(work >>> 16) & 0x0000003f ]; | 
|---|
| 250 |             fval  |= SP2[(work >>> 24) & 0x0000003f ]; | 
|---|
| 251 |             leftt ^= fval; | 
|---|
| 252 |             work   = (leftt << 28) | (leftt >>> 4); | 
|---|
| 253 |             work  ^= keys[keysi++]; | 
|---|
| 254 |             fval   = SP7[ work         & 0x0000003f ]; | 
|---|
| 255 |             fval  |= SP5[(work >>>  8) & 0x0000003f ]; | 
|---|
| 256 |             fval  |= SP3[(work >>> 16) & 0x0000003f ]; | 
|---|
| 257 |             fval  |= SP1[(work >>> 24) & 0x0000003f ]; | 
|---|
| 258 |             work   = leftt ^ keys[keysi++]; | 
|---|
| 259 |             fval  |= SP8[ work         & 0x0000003f ]; | 
|---|
| 260 |             fval  |= SP6[(work >>>  8) & 0x0000003f ]; | 
|---|
| 261 |             fval  |= SP4[(work >>> 16) & 0x0000003f ]; | 
|---|
| 262 |             fval  |= SP2[(work >>> 24) & 0x0000003f ]; | 
|---|
| 263 |             right ^= fval; | 
|---|
| 264 |             } | 
|---|
| 265 |  | 
|---|
| 266 |         right  = (right << 31) | (right >>> 1); | 
|---|
| 267 |         work   = (leftt ^ right) & 0xaaaaaaaa; | 
|---|
| 268 |         leftt ^= work; | 
|---|
| 269 |         right ^= work; | 
|---|
| 270 |         leftt  = (leftt << 31) | (leftt >>> 1); | 
|---|
| 271 |         work   = ((leftt >>>  8) ^ right) & 0x00ff00ff; | 
|---|
| 272 |         right ^= work; | 
|---|
| 273 |         leftt ^= (work << 8); | 
|---|
| 274 |         work   = ((leftt >>>  2) ^ right) & 0x33333333; | 
|---|
| 275 |         right ^= work; | 
|---|
| 276 |         leftt ^= (work << 2); | 
|---|
| 277 |         work   = ((right >>> 16) ^ leftt) & 0x0000ffff; | 
|---|
| 278 |         leftt ^= work; | 
|---|
| 279 |         right ^= (work << 16); | 
|---|
| 280 |         work   = ((right >>>  4) ^ leftt) & 0x0f0f0f0f; | 
|---|
| 281 |         leftt ^= work; | 
|---|
| 282 |         right ^= (work << 4); | 
|---|
| 283 |         outInts[0] = right; | 
|---|
| 284 |         outInts[1] = leftt; | 
|---|
| 285 |         } | 
|---|
| 286 |  | 
|---|
| 287 |  | 
|---|
| 288 |     // Tables, permutations, S-boxes, etc. | 
|---|
| 289 |  | 
|---|
| 290 |     private static byte[] bytebit = { | 
|---|
| 291 |         (byte)0x01, (byte)0x02, (byte)0x04, (byte)0x08, | 
|---|
| 292 |         (byte)0x10, (byte)0x20, (byte)0x40, (byte)0x80 | 
|---|
| 293 |         }; | 
|---|
| 294 |     private static int[] bigbyte = { | 
|---|
| 295 |         0x800000, 0x400000, 0x200000, 0x100000, | 
|---|
| 296 |         0x080000, 0x040000, 0x020000, 0x010000, | 
|---|
| 297 |         0x008000, 0x004000, 0x002000, 0x001000, | 
|---|
| 298 |         0x000800, 0x000400, 0x000200, 0x000100, | 
|---|
| 299 |         0x000080, 0x000040, 0x000020, 0x000010, | 
|---|
| 300 |         0x000008, 0x000004, 0x000002, 0x000001 | 
|---|
| 301 |         }; | 
|---|
| 302 |     private static byte[] pc1 = { | 
|---|
| 303 |          (byte)56, (byte)48, (byte)40, (byte)32, (byte)24, (byte)16, (byte) 8, | 
|---|
| 304 |       (byte) 0, (byte)57, (byte)49, (byte)41, (byte)33, (byte)25, (byte)17, | 
|---|
| 305 |          (byte) 9, (byte) 1, (byte)58, (byte)50, (byte)42, (byte)34, (byte)26, | 
|---|
| 306 |       (byte)18, (byte)10, (byte) 2, (byte)59, (byte)51, (byte)43, (byte)35, | 
|---|
| 307 |          (byte)62, (byte)54, (byte)46, (byte)38, (byte)30, (byte)22, (byte)14, | 
|---|
| 308 |       (byte) 6, (byte)61, (byte)53, (byte)45, (byte)37, (byte)29, (byte)21, | 
|---|
| 309 |          (byte)13, (byte) 5, (byte)60, (byte)52, (byte)44, (byte)36, (byte)28, | 
|---|
| 310 |       (byte)20, (byte)12, (byte) 4, (byte)27, (byte)19, (byte)11, (byte)3 | 
|---|
| 311 |         }; | 
|---|
| 312 |     private static int[] totrot = { | 
|---|
| 313 |         1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28 | 
|---|
| 314 |         }; | 
|---|
| 315 |  | 
|---|
| 316 |     private static byte[] pc2 = { | 
|---|
| 317 |         (byte)13, (byte)16, (byte)10, (byte)23, (byte) 0, (byte) 4, | 
|---|
| 318 |                   (byte) 2, (byte)27, (byte)14, (byte) 5, (byte)20, (byte) 9, | 
|---|
| 319 |         (byte)22, (byte)18, (byte)11, (byte)3 , (byte)25, (byte) 7, | 
|---|
| 320 |                   (byte)15, (byte) 6, (byte)26, (byte)19, (byte)12, (byte) 1, | 
|---|
| 321 |         (byte)40, (byte)51, (byte)30, (byte)36, (byte)46, (byte)54, | 
|---|
| 322 |                   (byte)29, (byte)39, (byte)50, (byte)44, (byte)32, (byte)47, | 
|---|
| 323 |         (byte)43, (byte)48, (byte)38, (byte)55, (byte)33, (byte)52, | 
|---|
| 324 |                   (byte)45, (byte)41, (byte)49, (byte)35, (byte)28, (byte)31, | 
|---|
| 325 |         }; | 
|---|
| 326 |  | 
|---|
| 327 |     private static int[] SP1 = { | 
|---|
| 328 |         0x01010400, 0x00000000, 0x00010000, 0x01010404, | 
|---|
| 329 |         0x01010004, 0x00010404, 0x00000004, 0x00010000, | 
|---|
| 330 |         0x00000400, 0x01010400, 0x01010404, 0x00000400, | 
|---|
| 331 |         0x01000404, 0x01010004, 0x01000000, 0x00000004, | 
|---|
| 332 |         0x00000404, 0x01000400, 0x01000400, 0x00010400, | 
|---|
| 333 |         0x00010400, 0x01010000, 0x01010000, 0x01000404, | 
|---|
| 334 |         0x00010004, 0x01000004, 0x01000004, 0x00010004, | 
|---|
| 335 |         0x00000000, 0x00000404, 0x00010404, 0x01000000, | 
|---|
| 336 |         0x00010000, 0x01010404, 0x00000004, 0x01010000, | 
|---|
| 337 |         0x01010400, 0x01000000, 0x01000000, 0x00000400, | 
|---|
| 338 |         0x01010004, 0x00010000, 0x00010400, 0x01000004, | 
|---|
| 339 |         0x00000400, 0x00000004, 0x01000404, 0x00010404, | 
|---|
| 340 |         0x01010404, 0x00010004, 0x01010000, 0x01000404, | 
|---|
| 341 |         0x01000004, 0x00000404, 0x00010404, 0x01010400, | 
|---|
| 342 |         0x00000404, 0x01000400, 0x01000400, 0x00000000, | 
|---|
| 343 |         0x00010004, 0x00010400, 0x00000000, 0x01010004 | 
|---|
| 344 |         }; | 
|---|
| 345 |     private static int[] SP2 = { | 
|---|
| 346 |         0x80108020, 0x80008000, 0x00008000, 0x00108020, | 
|---|
| 347 |         0x00100000, 0x00000020, 0x80100020, 0x80008020, | 
|---|
| 348 |         0x80000020, 0x80108020, 0x80108000, 0x80000000, | 
|---|
| 349 |         0x80008000, 0x00100000, 0x00000020, 0x80100020, | 
|---|
| 350 |         0x00108000, 0x00100020, 0x80008020, 0x00000000, | 
|---|
| 351 |         0x80000000, 0x00008000, 0x00108020, 0x80100000, | 
|---|
| 352 |         0x00100020, 0x80000020, 0x00000000, 0x00108000, | 
|---|
| 353 |         0x00008020, 0x80108000, 0x80100000, 0x00008020, | 
|---|
| 354 |         0x00000000, 0x00108020, 0x80100020, 0x00100000, | 
|---|
| 355 |         0x80008020, 0x80100000, 0x80108000, 0x00008000, | 
|---|
| 356 |         0x80100000, 0x80008000, 0x00000020, 0x80108020, | 
|---|
| 357 |         0x00108020, 0x00000020, 0x00008000, 0x80000000, | 
|---|
| 358 |         0x00008020, 0x80108000, 0x00100000, 0x80000020, | 
|---|
| 359 |         0x00100020, 0x80008020, 0x80000020, 0x00100020, | 
|---|
| 360 |         0x00108000, 0x00000000, 0x80008000, 0x00008020, | 
|---|
| 361 |         0x80000000, 0x80100020, 0x80108020, 0x00108000 | 
|---|
| 362 |         }; | 
|---|
| 363 |     private static int[] SP3 = { | 
|---|
| 364 |         0x00000208, 0x08020200, 0x00000000, 0x08020008, | 
|---|
| 365 |         0x08000200, 0x00000000, 0x00020208, 0x08000200, | 
|---|
| 366 |         0x00020008, 0x08000008, 0x08000008, 0x00020000, | 
|---|
| 367 |         0x08020208, 0x00020008, 0x08020000, 0x00000208, | 
|---|
| 368 |         0x08000000, 0x00000008, 0x08020200, 0x00000200, | 
|---|
| 369 |         0x00020200, 0x08020000, 0x08020008, 0x00020208, | 
|---|
| 370 |         0x08000208, 0x00020200, 0x00020000, 0x08000208, | 
|---|
| 371 |         0x00000008, 0x08020208, 0x00000200, 0x08000000, | 
|---|
| 372 |         0x08020200, 0x08000000, 0x00020008, 0x00000208, | 
|---|
| 373 |         0x00020000, 0x08020200, 0x08000200, 0x00000000, | 
|---|
| 374 |         0x00000200, 0x00020008, 0x08020208, 0x08000200, | 
|---|
| 375 |         0x08000008, 0x00000200, 0x00000000, 0x08020008, | 
|---|
| 376 |         0x08000208, 0x00020000, 0x08000000, 0x08020208, | 
|---|
| 377 |         0x00000008, 0x00020208, 0x00020200, 0x08000008, | 
|---|
| 378 |         0x08020000, 0x08000208, 0x00000208, 0x08020000, | 
|---|
| 379 |         0x00020208, 0x00000008, 0x08020008, 0x00020200 | 
|---|
| 380 |         }; | 
|---|
| 381 |     private static int[] SP4 = { | 
|---|
| 382 |         0x00802001, 0x00002081, 0x00002081, 0x00000080, | 
|---|
| 383 |         0x00802080, 0x00800081, 0x00800001, 0x00002001, | 
|---|
| 384 |         0x00000000, 0x00802000, 0x00802000, 0x00802081, | 
|---|
| 385 |         0x00000081, 0x00000000, 0x00800080, 0x00800001, | 
|---|
| 386 |         0x00000001, 0x00002000, 0x00800000, 0x00802001, | 
|---|
| 387 |         0x00000080, 0x00800000, 0x00002001, 0x00002080, | 
|---|
| 388 |         0x00800081, 0x00000001, 0x00002080, 0x00800080, | 
|---|
| 389 |         0x00002000, 0x00802080, 0x00802081, 0x00000081, | 
|---|
| 390 |         0x00800080, 0x00800001, 0x00802000, 0x00802081, | 
|---|
| 391 |         0x00000081, 0x00000000, 0x00000000, 0x00802000, | 
|---|
| 392 |         0x00002080, 0x00800080, 0x00800081, 0x00000001, | 
|---|
| 393 |         0x00802001, 0x00002081, 0x00002081, 0x00000080, | 
|---|
| 394 |         0x00802081, 0x00000081, 0x00000001, 0x00002000, | 
|---|
| 395 |         0x00800001, 0x00002001, 0x00802080, 0x00800081, | 
|---|
| 396 |         0x00002001, 0x00002080, 0x00800000, 0x00802001, | 
|---|
| 397 |         0x00000080, 0x00800000, 0x00002000, 0x00802080 | 
|---|
| 398 |         }; | 
|---|
| 399 |     private static int[] SP5 = { | 
|---|
| 400 |         0x00000100, 0x02080100, 0x02080000, 0x42000100, | 
|---|
| 401 |         0x00080000, 0x00000100, 0x40000000, 0x02080000, | 
|---|
| 402 |         0x40080100, 0x00080000, 0x02000100, 0x40080100, | 
|---|
| 403 |         0x42000100, 0x42080000, 0x00080100, 0x40000000, | 
|---|
| 404 |         0x02000000, 0x40080000, 0x40080000, 0x00000000, | 
|---|
| 405 |         0x40000100, 0x42080100, 0x42080100, 0x02000100, | 
|---|
| 406 |         0x42080000, 0x40000100, 0x00000000, 0x42000000, | 
|---|
| 407 |         0x02080100, 0x02000000, 0x42000000, 0x00080100, | 
|---|
| 408 |         0x00080000, 0x42000100, 0x00000100, 0x02000000, | 
|---|
| 409 |         0x40000000, 0x02080000, 0x42000100, 0x40080100, | 
|---|
| 410 |         0x02000100, 0x40000000, 0x42080000, 0x02080100, | 
|---|
| 411 |         0x40080100, 0x00000100, 0x02000000, 0x42080000, | 
|---|
| 412 |         0x42080100, 0x00080100, 0x42000000, 0x42080100, | 
|---|
| 413 |         0x02080000, 0x00000000, 0x40080000, 0x42000000, | 
|---|
| 414 |         0x00080100, 0x02000100, 0x40000100, 0x00080000, | 
|---|
| 415 |         0x00000000, 0x40080000, 0x02080100, 0x40000100 | 
|---|
| 416 |         }; | 
|---|
| 417 |     private static int[] SP6 = { | 
|---|
| 418 |         0x20000010, 0x20400000, 0x00004000, 0x20404010, | 
|---|
| 419 |         0x20400000, 0x00000010, 0x20404010, 0x00400000, | 
|---|
| 420 |         0x20004000, 0x00404010, 0x00400000, 0x20000010, | 
|---|
| 421 |         0x00400010, 0x20004000, 0x20000000, 0x00004010, | 
|---|
| 422 |         0x00000000, 0x00400010, 0x20004010, 0x00004000, | 
|---|
| 423 |         0x00404000, 0x20004010, 0x00000010, 0x20400010, | 
|---|
| 424 |         0x20400010, 0x00000000, 0x00404010, 0x20404000, | 
|---|
| 425 |         0x00004010, 0x00404000, 0x20404000, 0x20000000, | 
|---|
| 426 |         0x20004000, 0x00000010, 0x20400010, 0x00404000, | 
|---|
| 427 |         0x20404010, 0x00400000, 0x00004010, 0x20000010, | 
|---|
| 428 |         0x00400000, 0x20004000, 0x20000000, 0x00004010, | 
|---|
| 429 |         0x20000010, 0x20404010, 0x00404000, 0x20400000, | 
|---|
| 430 |         0x00404010, 0x20404000, 0x00000000, 0x20400010, | 
|---|
| 431 |         0x00000010, 0x00004000, 0x20400000, 0x00404010, | 
|---|
| 432 |         0x00004000, 0x00400010, 0x20004010, 0x00000000, | 
|---|
| 433 |         0x20404000, 0x20000000, 0x00400010, 0x20004010 | 
|---|
| 434 |         }; | 
|---|
| 435 |     private static int[] SP7 = { | 
|---|
| 436 |         0x00200000, 0x04200002, 0x04000802, 0x00000000, | 
|---|
| 437 |         0x00000800, 0x04000802, 0x00200802, 0x04200800, | 
|---|
| 438 |         0x04200802, 0x00200000, 0x00000000, 0x04000002, | 
|---|
| 439 |         0x00000002, 0x04000000, 0x04200002, 0x00000802, | 
|---|
| 440 |         0x04000800, 0x00200802, 0x00200002, 0x04000800, | 
|---|
| 441 |         0x04000002, 0x04200000, 0x04200800, 0x00200002, | 
|---|
| 442 |         0x04200000, 0x00000800, 0x00000802, 0x04200802, | 
|---|
| 443 |         0x00200800, 0x00000002, 0x04000000, 0x00200800, | 
|---|
| 444 |         0x04000000, 0x00200800, 0x00200000, 0x04000802, | 
|---|
| 445 |         0x04000802, 0x04200002, 0x04200002, 0x00000002, | 
|---|
| 446 |         0x00200002, 0x04000000, 0x04000800, 0x00200000, | 
|---|
| 447 |         0x04200800, 0x00000802, 0x00200802, 0x04200800, | 
|---|
| 448 |         0x00000802, 0x04000002, 0x04200802, 0x04200000, | 
|---|
| 449 |         0x00200800, 0x00000000, 0x00000002, 0x04200802, | 
|---|
| 450 |         0x00000000, 0x00200802, 0x04200000, 0x00000800, | 
|---|
| 451 |         0x04000002, 0x04000800, 0x00000800, 0x00200002 | 
|---|
| 452 |         }; | 
|---|
| 453 |     private static int[] SP8 = { | 
|---|
| 454 |         0x10001040, 0x00001000, 0x00040000, 0x10041040, | 
|---|
| 455 |         0x10000000, 0x10001040, 0x00000040, 0x10000000, | 
|---|
| 456 |         0x00040040, 0x10040000, 0x10041040, 0x00041000, | 
|---|
| 457 |         0x10041000, 0x00041040, 0x00001000, 0x00000040, | 
|---|
| 458 |         0x10040000, 0x10000040, 0x10001000, 0x00001040, | 
|---|
| 459 |         0x00041000, 0x00040040, 0x10040040, 0x10041000, | 
|---|
| 460 |         0x00001040, 0x00000000, 0x00000000, 0x10040040, | 
|---|
| 461 |         0x10000040, 0x10001000, 0x00041040, 0x00040000, | 
|---|
| 462 |         0x00041040, 0x00040000, 0x10041000, 0x00001000, | 
|---|
| 463 |         0x00000040, 0x10040040, 0x00001000, 0x00041040, | 
|---|
| 464 |         0x10001000, 0x00000040, 0x10000040, 0x10040000, | 
|---|
| 465 |         0x10040040, 0x10000000, 0x00040000, 0x10001040, | 
|---|
| 466 |         0x00000000, 0x10041040, 0x00040040, 0x10000040, | 
|---|
| 467 |         0x10040000, 0x10001000, 0x10001040, 0x00000000, | 
|---|
| 468 |         0x10041040, 0x00041000, 0x00041000, 0x00001040, | 
|---|
| 469 |         0x00001040, 0x00040040, 0x10000000, 0x10041000 | 
|---|
| 470 |         }; | 
|---|
| 471 |  | 
|---|
| 472 |     // Routines taken from other parts of the Acme utilities. | 
|---|
| 473 |  | 
|---|
| 474 |     /// Squash bytes down to ints. | 
|---|
| 475 |     public static void squashBytesToInts( byte[] inBytes, int inOff, int[] outInts, int outOff, int intLen ) | 
|---|
| 476 |         { | 
|---|
| 477 |         for ( int i = 0; i < intLen; ++i ) | 
|---|
| 478 |             outInts[outOff + i] =  | 
|---|
| 479 |                 ( ( inBytes[inOff + i * 4    ] & 0xff ) << 24 ) | | 
|---|
| 480 |                 ( ( inBytes[inOff + i * 4 + 1] & 0xff ) << 16 ) | | 
|---|
| 481 |                 ( ( inBytes[inOff + i * 4 + 2] & 0xff ) <<  8 ) | | 
|---|
| 482 |                   ( inBytes[inOff + i * 4 + 3] & 0xff ); | 
|---|
| 483 |         } | 
|---|
| 484 |  | 
|---|
| 485 |     /// Spread ints into bytes. | 
|---|
| 486 |     public static void spreadIntsToBytes( int[] inInts, int inOff, byte[] outBytes, int outOff, int intLen ) | 
|---|
| 487 |         { | 
|---|
| 488 |         for ( int i = 0; i < intLen; ++i ) | 
|---|
| 489 |             { | 
|---|
| 490 |             outBytes[outOff + i * 4    ] = (byte) ( inInts[inOff + i] >>> 24 ); | 
|---|
| 491 |             outBytes[outOff + i * 4 + 1] = (byte) ( inInts[inOff + i] >>> 16 ); | 
|---|
| 492 |             outBytes[outOff + i * 4 + 2] = (byte) ( inInts[inOff + i] >>>  8 ); | 
|---|
| 493 |             outBytes[outOff + i * 4 + 3] = (byte)   inInts[inOff + i]; | 
|---|
| 494 |             } | 
|---|
| 495 |         } | 
|---|
| 496 |     } | 
|---|