148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodpackage ch.ethz.ssh2.crypto.cipher;
248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood/*
448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood This file was shamelessly taken from the Bouncy Castle Crypto package.
548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood Their licence file states the following:
648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood Copyright (c) 2000 - 2004 The Legion Of The Bouncy Castle
848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood (http://www.bouncycastle.org)
948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
1048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood Permission is hereby granted, free of charge, to any person obtaining a copy
1148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood of this software and associated documentation files (the "Software"), to deal
1248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood in the Software without restriction, including without limitation the rights
1348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood copies of the Software, and to permit persons to whom the Software is
1548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood furnished to do so, subject to the following conditions:
1648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
1748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood The above copyright notice and this permission notice shall be included in
1848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood all copies or substantial portions of the Software.
1948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
2048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood THE SOFTWARE.
2748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */
2848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
2948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood/**
3048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * An implementation of the AES (Rijndael), from FIPS-197.
3148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * <p>
3248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * For further details see: <a
3348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * href="http://csrc.nist.gov/encryption/aes/">http://csrc.nist.gov/encryption/aes/
3448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * </a>.
3548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood *
3648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * This implementation is based on optimizations from Dr. Brian Gladman's paper
3748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * and C code at <a
3848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * href="http://fp.gladman.plus.com/cryptography_technology/rijndael/">http://fp.gladman.plus.com/cryptography_technology/rijndael/
3948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * </a>
4048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood *
4148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * There are three levels of tradeoff of speed vs memory Because java has no
4248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * preprocessor, they are written as three separate classes from which to choose
4348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood *
4448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * The fastest uses 8Kbytes of static tables to precompute round calculations, 4
4548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * 256 word tables for encryption and 4 for decryption.
4648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood *
4748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * The middle performance version uses only one 256 word table for each, for a
4848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * total of 2Kbytes, adding 12 rotate operations per round to compute the values
4948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * contained in the other tables from the contents of the first
5048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood *
5148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * The slowest version uses no static tables at all and computes the values in
5248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * each round
5348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * <p>
5448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * This file contains the fast version with 8Kbytes of static tables for round
5548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * precomputation
5648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood *
5748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * @author See comments in the source file
5848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * @version 2.50, 03/15/10
5948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */
6048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodpublic class AES implements BlockCipher
6148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood{
6248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	// The S box
6348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private static final byte[] S = { (byte) 99, (byte) 124, (byte) 119, (byte) 123, (byte) 242, (byte) 107,
6448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 111, (byte) 197, (byte) 48, (byte) 1, (byte) 103, (byte) 43, (byte) 254, (byte) 215, (byte) 171,
6548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 118, (byte) 202, (byte) 130, (byte) 201, (byte) 125, (byte) 250, (byte) 89, (byte) 71, (byte) 240,
6648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 173, (byte) 212, (byte) 162, (byte) 175, (byte) 156, (byte) 164, (byte) 114, (byte) 192, (byte) 183,
6748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 253, (byte) 147, (byte) 38, (byte) 54, (byte) 63, (byte) 247, (byte) 204, (byte) 52, (byte) 165,
6848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 229, (byte) 241, (byte) 113, (byte) 216, (byte) 49, (byte) 21, (byte) 4, (byte) 199, (byte) 35,
6948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 195, (byte) 24, (byte) 150, (byte) 5, (byte) 154, (byte) 7, (byte) 18, (byte) 128, (byte) 226,
7048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 235, (byte) 39, (byte) 178, (byte) 117, (byte) 9, (byte) 131, (byte) 44, (byte) 26, (byte) 27,
7148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 110, (byte) 90, (byte) 160, (byte) 82, (byte) 59, (byte) 214, (byte) 179, (byte) 41, (byte) 227,
7248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 47, (byte) 132, (byte) 83, (byte) 209, (byte) 0, (byte) 237, (byte) 32, (byte) 252, (byte) 177,
7348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 91, (byte) 106, (byte) 203, (byte) 190, (byte) 57, (byte) 74, (byte) 76, (byte) 88, (byte) 207,
7448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 208, (byte) 239, (byte) 170, (byte) 251, (byte) 67, (byte) 77, (byte) 51, (byte) 133, (byte) 69,
7548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 249, (byte) 2, (byte) 127, (byte) 80, (byte) 60, (byte) 159, (byte) 168, (byte) 81, (byte) 163,
7648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 64, (byte) 143, (byte) 146, (byte) 157, (byte) 56, (byte) 245, (byte) 188, (byte) 182, (byte) 218,
7748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 33, (byte) 16, (byte) 255, (byte) 243, (byte) 210, (byte) 205, (byte) 12, (byte) 19, (byte) 236,
7848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 95, (byte) 151, (byte) 68, (byte) 23, (byte) 196, (byte) 167, (byte) 126, (byte) 61, (byte) 100,
7948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 93, (byte) 25, (byte) 115, (byte) 96, (byte) 129, (byte) 79, (byte) 220, (byte) 34, (byte) 42,
8048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 144, (byte) 136, (byte) 70, (byte) 238, (byte) 184, (byte) 20, (byte) 222, (byte) 94, (byte) 11,
8148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 219, (byte) 224, (byte) 50, (byte) 58, (byte) 10, (byte) 73, (byte) 6, (byte) 36, (byte) 92,
8248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 194, (byte) 211, (byte) 172, (byte) 98, (byte) 145, (byte) 149, (byte) 228, (byte) 121, (byte) 231,
8348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 200, (byte) 55, (byte) 109, (byte) 141, (byte) 213, (byte) 78, (byte) 169, (byte) 108, (byte) 86,
8448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 244, (byte) 234, (byte) 101, (byte) 122, (byte) 174, (byte) 8, (byte) 186, (byte) 120, (byte) 37,
8548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 46, (byte) 28, (byte) 166, (byte) 180, (byte) 198, (byte) 232, (byte) 221, (byte) 116, (byte) 31,
8648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 75, (byte) 189, (byte) 139, (byte) 138, (byte) 112, (byte) 62, (byte) 181, (byte) 102, (byte) 72,
8748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 3, (byte) 246, (byte) 14, (byte) 97, (byte) 53, (byte) 87, (byte) 185, (byte) 134, (byte) 193,
8848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 29, (byte) 158, (byte) 225, (byte) 248, (byte) 152, (byte) 17, (byte) 105, (byte) 217, (byte) 142,
8948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 148, (byte) 155, (byte) 30, (byte) 135, (byte) 233, (byte) 206, (byte) 85, (byte) 40, (byte) 223,
9048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 140, (byte) 161, (byte) 137, (byte) 13, (byte) 191, (byte) 230, (byte) 66, (byte) 104, (byte) 65,
9148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 153, (byte) 45, (byte) 15, (byte) 176, (byte) 84, (byte) 187, (byte) 22, };
9248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
9348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	// The inverse S-box
9448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private static final byte[] Si = { (byte) 82, (byte) 9, (byte) 106, (byte) 213, (byte) 48, (byte) 54, (byte) 165,
9548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 56, (byte) 191, (byte) 64, (byte) 163, (byte) 158, (byte) 129, (byte) 243, (byte) 215, (byte) 251,
9648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 124, (byte) 227, (byte) 57, (byte) 130, (byte) 155, (byte) 47, (byte) 255, (byte) 135, (byte) 52,
9748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 142, (byte) 67, (byte) 68, (byte) 196, (byte) 222, (byte) 233, (byte) 203, (byte) 84, (byte) 123,
9848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 148, (byte) 50, (byte) 166, (byte) 194, (byte) 35, (byte) 61, (byte) 238, (byte) 76, (byte) 149,
9948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 11, (byte) 66, (byte) 250, (byte) 195, (byte) 78, (byte) 8, (byte) 46, (byte) 161, (byte) 102,
10048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 40, (byte) 217, (byte) 36, (byte) 178, (byte) 118, (byte) 91, (byte) 162, (byte) 73, (byte) 109,
10148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 139, (byte) 209, (byte) 37, (byte) 114, (byte) 248, (byte) 246, (byte) 100, (byte) 134, (byte) 104,
10248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 152, (byte) 22, (byte) 212, (byte) 164, (byte) 92, (byte) 204, (byte) 93, (byte) 101, (byte) 182,
10348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 146, (byte) 108, (byte) 112, (byte) 72, (byte) 80, (byte) 253, (byte) 237, (byte) 185, (byte) 218,
10448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 94, (byte) 21, (byte) 70, (byte) 87, (byte) 167, (byte) 141, (byte) 157, (byte) 132, (byte) 144,
10548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 216, (byte) 171, (byte) 0, (byte) 140, (byte) 188, (byte) 211, (byte) 10, (byte) 247, (byte) 228,
10648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 88, (byte) 5, (byte) 184, (byte) 179, (byte) 69, (byte) 6, (byte) 208, (byte) 44, (byte) 30,
10748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 143, (byte) 202, (byte) 63, (byte) 15, (byte) 2, (byte) 193, (byte) 175, (byte) 189, (byte) 3,
10848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 1, (byte) 19, (byte) 138, (byte) 107, (byte) 58, (byte) 145, (byte) 17, (byte) 65, (byte) 79,
10948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 103, (byte) 220, (byte) 234, (byte) 151, (byte) 242, (byte) 207, (byte) 206, (byte) 240, (byte) 180,
11048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 230, (byte) 115, (byte) 150, (byte) 172, (byte) 116, (byte) 34, (byte) 231, (byte) 173, (byte) 53,
11148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 133, (byte) 226, (byte) 249, (byte) 55, (byte) 232, (byte) 28, (byte) 117, (byte) 223, (byte) 110,
11248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 71, (byte) 241, (byte) 26, (byte) 113, (byte) 29, (byte) 41, (byte) 197, (byte) 137, (byte) 111,
11348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 183, (byte) 98, (byte) 14, (byte) 170, (byte) 24, (byte) 190, (byte) 27, (byte) 252, (byte) 86,
11448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 62, (byte) 75, (byte) 198, (byte) 210, (byte) 121, (byte) 32, (byte) 154, (byte) 219, (byte) 192,
11548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 254, (byte) 120, (byte) 205, (byte) 90, (byte) 244, (byte) 31, (byte) 221, (byte) 168, (byte) 51,
11648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 136, (byte) 7, (byte) 199, (byte) 49, (byte) 177, (byte) 18, (byte) 16, (byte) 89, (byte) 39,
11748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 128, (byte) 236, (byte) 95, (byte) 96, (byte) 81, (byte) 127, (byte) 169, (byte) 25, (byte) 181,
11848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 74, (byte) 13, (byte) 45, (byte) 229, (byte) 122, (byte) 159, (byte) 147, (byte) 201, (byte) 156,
11948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 239, (byte) 160, (byte) 224, (byte) 59, (byte) 77, (byte) 174, (byte) 42, (byte) 245, (byte) 176,
12048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 200, (byte) 235, (byte) 187, (byte) 60, (byte) 131, (byte) 83, (byte) 153, (byte) 97, (byte) 23,
12148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 43, (byte) 4, (byte) 126, (byte) 186, (byte) 119, (byte) 214, (byte) 38, (byte) 225, (byte) 105,
12248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			(byte) 20, (byte) 99, (byte) 85, (byte) 33, (byte) 12, (byte) 125, };
12348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
12448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	// vector used in calculating key schedule (powers of x in GF(256))
12548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private static final int[] rcon = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab,
12648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91 };
12748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
12848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	// precomputation tables of calculations for rounds
12948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private static final int[] T0 = { 0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6, 0x0df2f2ff, 0xbd6b6bd6,
13048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xb16f6fde, 0x54c5c591, 0x50303060, 0x03010102, 0xa96767ce, 0x7d2b2b56, 0x19fefee7, 0x62d7d7b5, 0xe6abab4d,
13148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x9a7676ec, 0x45caca8f, 0x9d82821f, 0x40c9c989, 0x877d7dfa, 0x15fafaef, 0xeb5959b2, 0xc947478e, 0x0bf0f0fb,
13248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xecadad41, 0x67d4d4b3, 0xfda2a25f, 0xeaafaf45, 0xbf9c9c23, 0xf7a4a453, 0x967272e4, 0x5bc0c09b, 0xc2b7b775,
13348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x1cfdfde1, 0xae93933d, 0x6a26264c, 0x5a36366c, 0x413f3f7e, 0x02f7f7f5, 0x4fcccc83, 0x5c343468, 0xf4a5a551,
13448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x34e5e5d1, 0x08f1f1f9, 0x937171e2, 0x73d8d8ab, 0x53313162, 0x3f15152a, 0x0c040408, 0x52c7c795, 0x65232346,
13548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x5ec3c39d, 0x28181830, 0xa1969637, 0x0f05050a, 0xb59a9a2f, 0x0907070e, 0x36121224, 0x9b80801b, 0x3de2e2df,
13648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x26ebebcd, 0x6927274e, 0xcdb2b27f, 0x9f7575ea, 0x1b090912, 0x9e83831d, 0x742c2c58, 0x2e1a1a34, 0x2d1b1b36,
13748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xb26e6edc, 0xee5a5ab4, 0xfba0a05b, 0xf65252a4, 0x4d3b3b76, 0x61d6d6b7, 0xceb3b37d, 0x7b292952, 0x3ee3e3dd,
13848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x712f2f5e, 0x97848413, 0xf55353a6, 0x68d1d1b9, 0x00000000, 0x2cededc1, 0x60202040, 0x1ffcfce3, 0xc8b1b179,
13948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xed5b5bb6, 0xbe6a6ad4, 0x46cbcb8d, 0xd9bebe67, 0x4b393972, 0xde4a4a94, 0xd44c4c98, 0xe85858b0, 0x4acfcf85,
14048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x6bd0d0bb, 0x2aefefc5, 0xe5aaaa4f, 0x16fbfbed, 0xc5434386, 0xd74d4d9a, 0x55333366, 0x94858511, 0xcf45458a,
14148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x10f9f9e9, 0x06020204, 0x817f7ffe, 0xf05050a0, 0x443c3c78, 0xba9f9f25, 0xe3a8a84b, 0xf35151a2, 0xfea3a35d,
14248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xc0404080, 0x8a8f8f05, 0xad92923f, 0xbc9d9d21, 0x48383870, 0x04f5f5f1, 0xdfbcbc63, 0xc1b6b677, 0x75dadaaf,
14348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x63212142, 0x30101020, 0x1affffe5, 0x0ef3f3fd, 0x6dd2d2bf, 0x4ccdcd81, 0x140c0c18, 0x35131326, 0x2fececc3,
14448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xe15f5fbe, 0xa2979735, 0xcc444488, 0x3917172e, 0x57c4c493, 0xf2a7a755, 0x827e7efc, 0x473d3d7a, 0xac6464c8,
14548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xe75d5dba, 0x2b191932, 0x957373e6, 0xa06060c0, 0x98818119, 0xd14f4f9e, 0x7fdcdca3, 0x66222244, 0x7e2a2a54,
14648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xab90903b, 0x8388880b, 0xca46468c, 0x29eeeec7, 0xd3b8b86b, 0x3c141428, 0x79dedea7, 0xe25e5ebc, 0x1d0b0b16,
14748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x76dbdbad, 0x3be0e0db, 0x56323264, 0x4e3a3a74, 0x1e0a0a14, 0xdb494992, 0x0a06060c, 0x6c242448, 0xe45c5cb8,
14848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x5dc2c29f, 0x6ed3d3bd, 0xefacac43, 0xa66262c4, 0xa8919139, 0xa4959531, 0x37e4e4d3, 0x8b7979f2, 0x32e7e7d5,
14948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x43c8c88b, 0x5937376e, 0xb76d6dda, 0x8c8d8d01, 0x64d5d5b1, 0xd24e4e9c, 0xe0a9a949, 0xb46c6cd8, 0xfa5656ac,
15048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x07f4f4f3, 0x25eaeacf, 0xaf6565ca, 0x8e7a7af4, 0xe9aeae47, 0x18080810, 0xd5baba6f, 0x887878f0, 0x6f25254a,
15148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x722e2e5c, 0x241c1c38, 0xf1a6a657, 0xc7b4b473, 0x51c6c697, 0x23e8e8cb, 0x7cdddda1, 0x9c7474e8, 0x211f1f3e,
15248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xdd4b4b96, 0xdcbdbd61, 0x868b8b0d, 0x858a8a0f, 0x907070e0, 0x423e3e7c, 0xc4b5b571, 0xaa6666cc, 0xd8484890,
15348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x05030306, 0x01f6f6f7, 0x120e0e1c, 0xa36161c2, 0x5f35356a, 0xf95757ae, 0xd0b9b969, 0x91868617, 0x58c1c199,
15448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x271d1d3a, 0xb99e9e27, 0x38e1e1d9, 0x13f8f8eb, 0xb398982b, 0x33111122, 0xbb6969d2, 0x70d9d9a9, 0x898e8e07,
15548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xa7949433, 0xb69b9b2d, 0x221e1e3c, 0x92878715, 0x20e9e9c9, 0x49cece87, 0xff5555aa, 0x78282850, 0x7adfdfa5,
15648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x8f8c8c03, 0xf8a1a159, 0x80898909, 0x170d0d1a, 0xdabfbf65, 0x31e6e6d7, 0xc6424284, 0xb86868d0, 0xc3414182,
15748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xb0999929, 0x772d2d5a, 0x110f0f1e, 0xcbb0b07b, 0xfc5454a8, 0xd6bbbb6d, 0x3a16162c };
15848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
15948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private static final int[] T1 = { 0x6363c6a5, 0x7c7cf884, 0x7777ee99, 0x7b7bf68d, 0xf2f2ff0d, 0x6b6bd6bd,
16048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x6f6fdeb1, 0xc5c59154, 0x30306050, 0x01010203, 0x6767cea9, 0x2b2b567d, 0xfefee719, 0xd7d7b562, 0xabab4de6,
16148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x7676ec9a, 0xcaca8f45, 0x82821f9d, 0xc9c98940, 0x7d7dfa87, 0xfafaef15, 0x5959b2eb, 0x47478ec9, 0xf0f0fb0b,
16248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xadad41ec, 0xd4d4b367, 0xa2a25ffd, 0xafaf45ea, 0x9c9c23bf, 0xa4a453f7, 0x7272e496, 0xc0c09b5b, 0xb7b775c2,
16348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xfdfde11c, 0x93933dae, 0x26264c6a, 0x36366c5a, 0x3f3f7e41, 0xf7f7f502, 0xcccc834f, 0x3434685c, 0xa5a551f4,
16448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xe5e5d134, 0xf1f1f908, 0x7171e293, 0xd8d8ab73, 0x31316253, 0x15152a3f, 0x0404080c, 0xc7c79552, 0x23234665,
16548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xc3c39d5e, 0x18183028, 0x969637a1, 0x05050a0f, 0x9a9a2fb5, 0x07070e09, 0x12122436, 0x80801b9b, 0xe2e2df3d,
16648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xebebcd26, 0x27274e69, 0xb2b27fcd, 0x7575ea9f, 0x0909121b, 0x83831d9e, 0x2c2c5874, 0x1a1a342e, 0x1b1b362d,
16748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x6e6edcb2, 0x5a5ab4ee, 0xa0a05bfb, 0x5252a4f6, 0x3b3b764d, 0xd6d6b761, 0xb3b37dce, 0x2929527b, 0xe3e3dd3e,
16848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x2f2f5e71, 0x84841397, 0x5353a6f5, 0xd1d1b968, 0x00000000, 0xededc12c, 0x20204060, 0xfcfce31f, 0xb1b179c8,
16948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x5b5bb6ed, 0x6a6ad4be, 0xcbcb8d46, 0xbebe67d9, 0x3939724b, 0x4a4a94de, 0x4c4c98d4, 0x5858b0e8, 0xcfcf854a,
17048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xd0d0bb6b, 0xefefc52a, 0xaaaa4fe5, 0xfbfbed16, 0x434386c5, 0x4d4d9ad7, 0x33336655, 0x85851194, 0x45458acf,
17148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xf9f9e910, 0x02020406, 0x7f7ffe81, 0x5050a0f0, 0x3c3c7844, 0x9f9f25ba, 0xa8a84be3, 0x5151a2f3, 0xa3a35dfe,
17248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x404080c0, 0x8f8f058a, 0x92923fad, 0x9d9d21bc, 0x38387048, 0xf5f5f104, 0xbcbc63df, 0xb6b677c1, 0xdadaaf75,
17348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x21214263, 0x10102030, 0xffffe51a, 0xf3f3fd0e, 0xd2d2bf6d, 0xcdcd814c, 0x0c0c1814, 0x13132635, 0xececc32f,
17448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x5f5fbee1, 0x979735a2, 0x444488cc, 0x17172e39, 0xc4c49357, 0xa7a755f2, 0x7e7efc82, 0x3d3d7a47, 0x6464c8ac,
17548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x5d5dbae7, 0x1919322b, 0x7373e695, 0x6060c0a0, 0x81811998, 0x4f4f9ed1, 0xdcdca37f, 0x22224466, 0x2a2a547e,
17648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x90903bab, 0x88880b83, 0x46468cca, 0xeeeec729, 0xb8b86bd3, 0x1414283c, 0xdedea779, 0x5e5ebce2, 0x0b0b161d,
17748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xdbdbad76, 0xe0e0db3b, 0x32326456, 0x3a3a744e, 0x0a0a141e, 0x494992db, 0x06060c0a, 0x2424486c, 0x5c5cb8e4,
17848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xc2c29f5d, 0xd3d3bd6e, 0xacac43ef, 0x6262c4a6, 0x919139a8, 0x959531a4, 0xe4e4d337, 0x7979f28b, 0xe7e7d532,
17948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xc8c88b43, 0x37376e59, 0x6d6ddab7, 0x8d8d018c, 0xd5d5b164, 0x4e4e9cd2, 0xa9a949e0, 0x6c6cd8b4, 0x5656acfa,
18048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xf4f4f307, 0xeaeacf25, 0x6565caaf, 0x7a7af48e, 0xaeae47e9, 0x08081018, 0xbaba6fd5, 0x7878f088, 0x25254a6f,
18148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x2e2e5c72, 0x1c1c3824, 0xa6a657f1, 0xb4b473c7, 0xc6c69751, 0xe8e8cb23, 0xdddda17c, 0x7474e89c, 0x1f1f3e21,
18248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x4b4b96dd, 0xbdbd61dc, 0x8b8b0d86, 0x8a8a0f85, 0x7070e090, 0x3e3e7c42, 0xb5b571c4, 0x6666ccaa, 0x484890d8,
18348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x03030605, 0xf6f6f701, 0x0e0e1c12, 0x6161c2a3, 0x35356a5f, 0x5757aef9, 0xb9b969d0, 0x86861791, 0xc1c19958,
18448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x1d1d3a27, 0x9e9e27b9, 0xe1e1d938, 0xf8f8eb13, 0x98982bb3, 0x11112233, 0x6969d2bb, 0xd9d9a970, 0x8e8e0789,
18548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x949433a7, 0x9b9b2db6, 0x1e1e3c22, 0x87871592, 0xe9e9c920, 0xcece8749, 0x5555aaff, 0x28285078, 0xdfdfa57a,
18648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x8c8c038f, 0xa1a159f8, 0x89890980, 0x0d0d1a17, 0xbfbf65da, 0xe6e6d731, 0x424284c6, 0x6868d0b8, 0x414182c3,
18748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x999929b0, 0x2d2d5a77, 0x0f0f1e11, 0xb0b07bcb, 0x5454a8fc, 0xbbbb6dd6, 0x16162c3a };
18848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
18948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private static final int[] T2 = { 0x63c6a563, 0x7cf8847c, 0x77ee9977, 0x7bf68d7b, 0xf2ff0df2, 0x6bd6bd6b,
19048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x6fdeb16f, 0xc59154c5, 0x30605030, 0x01020301, 0x67cea967, 0x2b567d2b, 0xfee719fe, 0xd7b562d7, 0xab4de6ab,
19148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x76ec9a76, 0xca8f45ca, 0x821f9d82, 0xc98940c9, 0x7dfa877d, 0xfaef15fa, 0x59b2eb59, 0x478ec947, 0xf0fb0bf0,
19248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xad41ecad, 0xd4b367d4, 0xa25ffda2, 0xaf45eaaf, 0x9c23bf9c, 0xa453f7a4, 0x72e49672, 0xc09b5bc0, 0xb775c2b7,
19348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xfde11cfd, 0x933dae93, 0x264c6a26, 0x366c5a36, 0x3f7e413f, 0xf7f502f7, 0xcc834fcc, 0x34685c34, 0xa551f4a5,
19448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xe5d134e5, 0xf1f908f1, 0x71e29371, 0xd8ab73d8, 0x31625331, 0x152a3f15, 0x04080c04, 0xc79552c7, 0x23466523,
19548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xc39d5ec3, 0x18302818, 0x9637a196, 0x050a0f05, 0x9a2fb59a, 0x070e0907, 0x12243612, 0x801b9b80, 0xe2df3de2,
19648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xebcd26eb, 0x274e6927, 0xb27fcdb2, 0x75ea9f75, 0x09121b09, 0x831d9e83, 0x2c58742c, 0x1a342e1a, 0x1b362d1b,
19748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x6edcb26e, 0x5ab4ee5a, 0xa05bfba0, 0x52a4f652, 0x3b764d3b, 0xd6b761d6, 0xb37dceb3, 0x29527b29, 0xe3dd3ee3,
19848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x2f5e712f, 0x84139784, 0x53a6f553, 0xd1b968d1, 0x00000000, 0xedc12ced, 0x20406020, 0xfce31ffc, 0xb179c8b1,
19948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x5bb6ed5b, 0x6ad4be6a, 0xcb8d46cb, 0xbe67d9be, 0x39724b39, 0x4a94de4a, 0x4c98d44c, 0x58b0e858, 0xcf854acf,
20048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xd0bb6bd0, 0xefc52aef, 0xaa4fe5aa, 0xfbed16fb, 0x4386c543, 0x4d9ad74d, 0x33665533, 0x85119485, 0x458acf45,
20148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xf9e910f9, 0x02040602, 0x7ffe817f, 0x50a0f050, 0x3c78443c, 0x9f25ba9f, 0xa84be3a8, 0x51a2f351, 0xa35dfea3,
20248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x4080c040, 0x8f058a8f, 0x923fad92, 0x9d21bc9d, 0x38704838, 0xf5f104f5, 0xbc63dfbc, 0xb677c1b6, 0xdaaf75da,
20348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x21426321, 0x10203010, 0xffe51aff, 0xf3fd0ef3, 0xd2bf6dd2, 0xcd814ccd, 0x0c18140c, 0x13263513, 0xecc32fec,
20448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x5fbee15f, 0x9735a297, 0x4488cc44, 0x172e3917, 0xc49357c4, 0xa755f2a7, 0x7efc827e, 0x3d7a473d, 0x64c8ac64,
20548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x5dbae75d, 0x19322b19, 0x73e69573, 0x60c0a060, 0x81199881, 0x4f9ed14f, 0xdca37fdc, 0x22446622, 0x2a547e2a,
20648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x903bab90, 0x880b8388, 0x468cca46, 0xeec729ee, 0xb86bd3b8, 0x14283c14, 0xdea779de, 0x5ebce25e, 0x0b161d0b,
20748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xdbad76db, 0xe0db3be0, 0x32645632, 0x3a744e3a, 0x0a141e0a, 0x4992db49, 0x060c0a06, 0x24486c24, 0x5cb8e45c,
20848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xc29f5dc2, 0xd3bd6ed3, 0xac43efac, 0x62c4a662, 0x9139a891, 0x9531a495, 0xe4d337e4, 0x79f28b79, 0xe7d532e7,
20948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xc88b43c8, 0x376e5937, 0x6ddab76d, 0x8d018c8d, 0xd5b164d5, 0x4e9cd24e, 0xa949e0a9, 0x6cd8b46c, 0x56acfa56,
21048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xf4f307f4, 0xeacf25ea, 0x65caaf65, 0x7af48e7a, 0xae47e9ae, 0x08101808, 0xba6fd5ba, 0x78f08878, 0x254a6f25,
21148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x2e5c722e, 0x1c38241c, 0xa657f1a6, 0xb473c7b4, 0xc69751c6, 0xe8cb23e8, 0xdda17cdd, 0x74e89c74, 0x1f3e211f,
21248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x4b96dd4b, 0xbd61dcbd, 0x8b0d868b, 0x8a0f858a, 0x70e09070, 0x3e7c423e, 0xb571c4b5, 0x66ccaa66, 0x4890d848,
21348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x03060503, 0xf6f701f6, 0x0e1c120e, 0x61c2a361, 0x356a5f35, 0x57aef957, 0xb969d0b9, 0x86179186, 0xc19958c1,
21448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x1d3a271d, 0x9e27b99e, 0xe1d938e1, 0xf8eb13f8, 0x982bb398, 0x11223311, 0x69d2bb69, 0xd9a970d9, 0x8e07898e,
21548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x9433a794, 0x9b2db69b, 0x1e3c221e, 0x87159287, 0xe9c920e9, 0xce8749ce, 0x55aaff55, 0x28507828, 0xdfa57adf,
21648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x8c038f8c, 0xa159f8a1, 0x89098089, 0x0d1a170d, 0xbf65dabf, 0xe6d731e6, 0x4284c642, 0x68d0b868, 0x4182c341,
21748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x9929b099, 0x2d5a772d, 0x0f1e110f, 0xb07bcbb0, 0x54a8fc54, 0xbb6dd6bb, 0x162c3a16 };
21848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
21948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private static final int[] T3 = { 0xc6a56363, 0xf8847c7c, 0xee997777, 0xf68d7b7b, 0xff0df2f2, 0xd6bd6b6b,
22048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xdeb16f6f, 0x9154c5c5, 0x60503030, 0x02030101, 0xcea96767, 0x567d2b2b, 0xe719fefe, 0xb562d7d7, 0x4de6abab,
22148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xec9a7676, 0x8f45caca, 0x1f9d8282, 0x8940c9c9, 0xfa877d7d, 0xef15fafa, 0xb2eb5959, 0x8ec94747, 0xfb0bf0f0,
22248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x41ecadad, 0xb367d4d4, 0x5ffda2a2, 0x45eaafaf, 0x23bf9c9c, 0x53f7a4a4, 0xe4967272, 0x9b5bc0c0, 0x75c2b7b7,
22348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xe11cfdfd, 0x3dae9393, 0x4c6a2626, 0x6c5a3636, 0x7e413f3f, 0xf502f7f7, 0x834fcccc, 0x685c3434, 0x51f4a5a5,
22448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xd134e5e5, 0xf908f1f1, 0xe2937171, 0xab73d8d8, 0x62533131, 0x2a3f1515, 0x080c0404, 0x9552c7c7, 0x46652323,
22548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x9d5ec3c3, 0x30281818, 0x37a19696, 0x0a0f0505, 0x2fb59a9a, 0x0e090707, 0x24361212, 0x1b9b8080, 0xdf3de2e2,
22648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xcd26ebeb, 0x4e692727, 0x7fcdb2b2, 0xea9f7575, 0x121b0909, 0x1d9e8383, 0x58742c2c, 0x342e1a1a, 0x362d1b1b,
22748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xdcb26e6e, 0xb4ee5a5a, 0x5bfba0a0, 0xa4f65252, 0x764d3b3b, 0xb761d6d6, 0x7dceb3b3, 0x527b2929, 0xdd3ee3e3,
22848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x5e712f2f, 0x13978484, 0xa6f55353, 0xb968d1d1, 0x00000000, 0xc12ceded, 0x40602020, 0xe31ffcfc, 0x79c8b1b1,
22948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xb6ed5b5b, 0xd4be6a6a, 0x8d46cbcb, 0x67d9bebe, 0x724b3939, 0x94de4a4a, 0x98d44c4c, 0xb0e85858, 0x854acfcf,
23048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xbb6bd0d0, 0xc52aefef, 0x4fe5aaaa, 0xed16fbfb, 0x86c54343, 0x9ad74d4d, 0x66553333, 0x11948585, 0x8acf4545,
23148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xe910f9f9, 0x04060202, 0xfe817f7f, 0xa0f05050, 0x78443c3c, 0x25ba9f9f, 0x4be3a8a8, 0xa2f35151, 0x5dfea3a3,
23248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x80c04040, 0x058a8f8f, 0x3fad9292, 0x21bc9d9d, 0x70483838, 0xf104f5f5, 0x63dfbcbc, 0x77c1b6b6, 0xaf75dada,
23348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x42632121, 0x20301010, 0xe51affff, 0xfd0ef3f3, 0xbf6dd2d2, 0x814ccdcd, 0x18140c0c, 0x26351313, 0xc32fecec,
23448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xbee15f5f, 0x35a29797, 0x88cc4444, 0x2e391717, 0x9357c4c4, 0x55f2a7a7, 0xfc827e7e, 0x7a473d3d, 0xc8ac6464,
23548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xbae75d5d, 0x322b1919, 0xe6957373, 0xc0a06060, 0x19988181, 0x9ed14f4f, 0xa37fdcdc, 0x44662222, 0x547e2a2a,
23648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x3bab9090, 0x0b838888, 0x8cca4646, 0xc729eeee, 0x6bd3b8b8, 0x283c1414, 0xa779dede, 0xbce25e5e, 0x161d0b0b,
23748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xad76dbdb, 0xdb3be0e0, 0x64563232, 0x744e3a3a, 0x141e0a0a, 0x92db4949, 0x0c0a0606, 0x486c2424, 0xb8e45c5c,
23848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x9f5dc2c2, 0xbd6ed3d3, 0x43efacac, 0xc4a66262, 0x39a89191, 0x31a49595, 0xd337e4e4, 0xf28b7979, 0xd532e7e7,
23948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x8b43c8c8, 0x6e593737, 0xdab76d6d, 0x018c8d8d, 0xb164d5d5, 0x9cd24e4e, 0x49e0a9a9, 0xd8b46c6c, 0xacfa5656,
24048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xf307f4f4, 0xcf25eaea, 0xcaaf6565, 0xf48e7a7a, 0x47e9aeae, 0x10180808, 0x6fd5baba, 0xf0887878, 0x4a6f2525,
24148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x5c722e2e, 0x38241c1c, 0x57f1a6a6, 0x73c7b4b4, 0x9751c6c6, 0xcb23e8e8, 0xa17cdddd, 0xe89c7474, 0x3e211f1f,
24248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x96dd4b4b, 0x61dcbdbd, 0x0d868b8b, 0x0f858a8a, 0xe0907070, 0x7c423e3e, 0x71c4b5b5, 0xccaa6666, 0x90d84848,
24348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x06050303, 0xf701f6f6, 0x1c120e0e, 0xc2a36161, 0x6a5f3535, 0xaef95757, 0x69d0b9b9, 0x17918686, 0x9958c1c1,
24448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x3a271d1d, 0x27b99e9e, 0xd938e1e1, 0xeb13f8f8, 0x2bb39898, 0x22331111, 0xd2bb6969, 0xa970d9d9, 0x07898e8e,
24548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x33a79494, 0x2db69b9b, 0x3c221e1e, 0x15928787, 0xc920e9e9, 0x8749cece, 0xaaff5555, 0x50782828, 0xa57adfdf,
24648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x038f8c8c, 0x59f8a1a1, 0x09808989, 0x1a170d0d, 0x65dabfbf, 0xd731e6e6, 0x84c64242, 0xd0b86868, 0x82c34141,
24748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x29b09999, 0x5a772d2d, 0x1e110f0f, 0x7bcbb0b0, 0xa8fc5454, 0x6dd6bbbb, 0x2c3a1616 };
24848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
24948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private static final int[] Tinv0 = { 0x50a7f451, 0x5365417e, 0xc3a4171a, 0x965e273a, 0xcb6bab3b, 0xf1459d1f,
25048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xab58faac, 0x9303e34b, 0x55fa3020, 0xf66d76ad, 0x9176cc88, 0x254c02f5, 0xfcd7e54f, 0xd7cb2ac5, 0x80443526,
25148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x8fa362b5, 0x495ab1de, 0x671bba25, 0x980eea45, 0xe1c0fe5d, 0x02752fc3, 0x12f04c81, 0xa397468d, 0xc6f9d36b,
25248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xe75f8f03, 0x959c9215, 0xeb7a6dbf, 0xda595295, 0x2d83bed4, 0xd3217458, 0x2969e049, 0x44c8c98e, 0x6a89c275,
25348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x78798ef4, 0x6b3e5899, 0xdd71b927, 0xb64fe1be, 0x17ad88f0, 0x66ac20c9, 0xb43ace7d, 0x184adf63, 0x82311ae5,
25448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x60335197, 0x457f5362, 0xe07764b1, 0x84ae6bbb, 0x1ca081fe, 0x942b08f9, 0x58684870, 0x19fd458f, 0x876cde94,
25548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xb7f87b52, 0x23d373ab, 0xe2024b72, 0x578f1fe3, 0x2aab5566, 0x0728ebb2, 0x03c2b52f, 0x9a7bc586, 0xa50837d3,
25648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xf2872830, 0xb2a5bf23, 0xba6a0302, 0x5c8216ed, 0x2b1ccf8a, 0x92b479a7, 0xf0f207f3, 0xa1e2694e, 0xcdf4da65,
25748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xd5be0506, 0x1f6234d1, 0x8afea6c4, 0x9d532e34, 0xa055f3a2, 0x32e18a05, 0x75ebf6a4, 0x39ec830b, 0xaaef6040,
25848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x069f715e, 0x51106ebd, 0xf98a213e, 0x3d06dd96, 0xae053edd, 0x46bde64d, 0xb58d5491, 0x055dc471, 0x6fd40604,
25948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xff155060, 0x24fb9819, 0x97e9bdd6, 0xcc434089, 0x779ed967, 0xbd42e8b0, 0x888b8907, 0x385b19e7, 0xdbeec879,
26048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x470a7ca1, 0xe90f427c, 0xc91e84f8, 0x00000000, 0x83868009, 0x48ed2b32, 0xac70111e, 0x4e725a6c, 0xfbff0efd,
26148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x5638850f, 0x1ed5ae3d, 0x27392d36, 0x64d90f0a, 0x21a65c68, 0xd1545b9b, 0x3a2e3624, 0xb1670a0c, 0x0fe75793,
26248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xd296eeb4, 0x9e919b1b, 0x4fc5c080, 0xa220dc61, 0x694b775a, 0x161a121c, 0x0aba93e2, 0xe52aa0c0, 0x43e0223c,
26348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x1d171b12, 0x0b0d090e, 0xadc78bf2, 0xb9a8b62d, 0xc8a91e14, 0x8519f157, 0x4c0775af, 0xbbdd99ee, 0xfd607fa3,
26448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x9f2601f7, 0xbcf5725c, 0xc53b6644, 0x347efb5b, 0x7629438b, 0xdcc623cb, 0x68fcedb6, 0x63f1e4b8, 0xcadc31d7,
26548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x10856342, 0x40229713, 0x2011c684, 0x7d244a85, 0xf83dbbd2, 0x1132f9ae, 0x6da129c7, 0x4b2f9e1d, 0xf330b2dc,
26648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xec52860d, 0xd0e3c177, 0x6c16b32b, 0x99b970a9, 0xfa489411, 0x2264e947, 0xc48cfca8, 0x1a3ff0a0, 0xd82c7d56,
26748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xef903322, 0xc74e4987, 0xc1d138d9, 0xfea2ca8c, 0x360bd498, 0xcf81f5a6, 0x28de7aa5, 0x268eb7da, 0xa4bfad3f,
26848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xe49d3a2c, 0x0d927850, 0x9bcc5f6a, 0x62467e54, 0xc2138df6, 0xe8b8d890, 0x5ef7392e, 0xf5afc382, 0xbe805d9f,
26948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x7c93d069, 0xa92dd56f, 0xb31225cf, 0x3b99acc8, 0xa77d1810, 0x6e639ce8, 0x7bbb3bdb, 0x097826cd, 0xf418596e,
27048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x01b79aec, 0xa89a4f83, 0x656e95e6, 0x7ee6ffaa, 0x08cfbc21, 0xe6e815ef, 0xd99be7ba, 0xce366f4a, 0xd4099fea,
27148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xd67cb029, 0xafb2a431, 0x31233f2a, 0x3094a5c6, 0xc066a235, 0x37bc4e74, 0xa6ca82fc, 0xb0d090e0, 0x15d8a733,
27248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x4a9804f1, 0xf7daec41, 0x0e50cd7f, 0x2ff69117, 0x8dd64d76, 0x4db0ef43, 0x544daacc, 0xdf0496e4, 0xe3b5d19e,
27348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x1b886a4c, 0xb81f2cc1, 0x7f516546, 0x04ea5e9d, 0x5d358c01, 0x737487fa, 0x2e410bfb, 0x5a1d67b3, 0x52d2db92,
27448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x335610e9, 0x1347d66d, 0x8c61d79a, 0x7a0ca137, 0x8e14f859, 0x893c13eb, 0xee27a9ce, 0x35c961b7, 0xede51ce1,
27548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x3cb1477a, 0x59dfd29c, 0x3f73f255, 0x79ce1418, 0xbf37c773, 0xeacdf753, 0x5baafd5f, 0x146f3ddf, 0x86db4478,
27648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x81f3afca, 0x3ec468b9, 0x2c342438, 0x5f40a3c2, 0x72c31d16, 0x0c25e2bc, 0x8b493c28, 0x41950dff, 0x7101a839,
27748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xdeb30c08, 0x9ce4b4d8, 0x90c15664, 0x6184cb7b, 0x70b632d5, 0x745c6c48, 0x4257b8d0 };
27848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
27948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private static final int[] Tinv1 = { 0xa7f45150, 0x65417e53, 0xa4171ac3, 0x5e273a96, 0x6bab3bcb, 0x459d1ff1,
28048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x58faacab, 0x03e34b93, 0xfa302055, 0x6d76adf6, 0x76cc8891, 0x4c02f525, 0xd7e54ffc, 0xcb2ac5d7, 0x44352680,
28148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xa362b58f, 0x5ab1de49, 0x1bba2567, 0x0eea4598, 0xc0fe5de1, 0x752fc302, 0xf04c8112, 0x97468da3, 0xf9d36bc6,
28248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x5f8f03e7, 0x9c921595, 0x7a6dbfeb, 0x595295da, 0x83bed42d, 0x217458d3, 0x69e04929, 0xc8c98e44, 0x89c2756a,
28348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x798ef478, 0x3e58996b, 0x71b927dd, 0x4fe1beb6, 0xad88f017, 0xac20c966, 0x3ace7db4, 0x4adf6318, 0x311ae582,
28448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x33519760, 0x7f536245, 0x7764b1e0, 0xae6bbb84, 0xa081fe1c, 0x2b08f994, 0x68487058, 0xfd458f19, 0x6cde9487,
28548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xf87b52b7, 0xd373ab23, 0x024b72e2, 0x8f1fe357, 0xab55662a, 0x28ebb207, 0xc2b52f03, 0x7bc5869a, 0x0837d3a5,
28648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x872830f2, 0xa5bf23b2, 0x6a0302ba, 0x8216ed5c, 0x1ccf8a2b, 0xb479a792, 0xf207f3f0, 0xe2694ea1, 0xf4da65cd,
28748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xbe0506d5, 0x6234d11f, 0xfea6c48a, 0x532e349d, 0x55f3a2a0, 0xe18a0532, 0xebf6a475, 0xec830b39, 0xef6040aa,
28848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x9f715e06, 0x106ebd51, 0x8a213ef9, 0x06dd963d, 0x053eddae, 0xbde64d46, 0x8d5491b5, 0x5dc47105, 0xd406046f,
28948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x155060ff, 0xfb981924, 0xe9bdd697, 0x434089cc, 0x9ed96777, 0x42e8b0bd, 0x8b890788, 0x5b19e738, 0xeec879db,
29048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x0a7ca147, 0x0f427ce9, 0x1e84f8c9, 0x00000000, 0x86800983, 0xed2b3248, 0x70111eac, 0x725a6c4e, 0xff0efdfb,
29148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x38850f56, 0xd5ae3d1e, 0x392d3627, 0xd90f0a64, 0xa65c6821, 0x545b9bd1, 0x2e36243a, 0x670a0cb1, 0xe757930f,
29248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x96eeb4d2, 0x919b1b9e, 0xc5c0804f, 0x20dc61a2, 0x4b775a69, 0x1a121c16, 0xba93e20a, 0x2aa0c0e5, 0xe0223c43,
29348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x171b121d, 0x0d090e0b, 0xc78bf2ad, 0xa8b62db9, 0xa91e14c8, 0x19f15785, 0x0775af4c, 0xdd99eebb, 0x607fa3fd,
29448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x2601f79f, 0xf5725cbc, 0x3b6644c5, 0x7efb5b34, 0x29438b76, 0xc623cbdc, 0xfcedb668, 0xf1e4b863, 0xdc31d7ca,
29548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x85634210, 0x22971340, 0x11c68420, 0x244a857d, 0x3dbbd2f8, 0x32f9ae11, 0xa129c76d, 0x2f9e1d4b, 0x30b2dcf3,
29648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x52860dec, 0xe3c177d0, 0x16b32b6c, 0xb970a999, 0x489411fa, 0x64e94722, 0x8cfca8c4, 0x3ff0a01a, 0x2c7d56d8,
29748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x903322ef, 0x4e4987c7, 0xd138d9c1, 0xa2ca8cfe, 0x0bd49836, 0x81f5a6cf, 0xde7aa528, 0x8eb7da26, 0xbfad3fa4,
29848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x9d3a2ce4, 0x9278500d, 0xcc5f6a9b, 0x467e5462, 0x138df6c2, 0xb8d890e8, 0xf7392e5e, 0xafc382f5, 0x805d9fbe,
29948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x93d0697c, 0x2dd56fa9, 0x1225cfb3, 0x99acc83b, 0x7d1810a7, 0x639ce86e, 0xbb3bdb7b, 0x7826cd09, 0x18596ef4,
30048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xb79aec01, 0x9a4f83a8, 0x6e95e665, 0xe6ffaa7e, 0xcfbc2108, 0xe815efe6, 0x9be7bad9, 0x366f4ace, 0x099fead4,
30148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x7cb029d6, 0xb2a431af, 0x233f2a31, 0x94a5c630, 0x66a235c0, 0xbc4e7437, 0xca82fca6, 0xd090e0b0, 0xd8a73315,
30248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x9804f14a, 0xdaec41f7, 0x50cd7f0e, 0xf691172f, 0xd64d768d, 0xb0ef434d, 0x4daacc54, 0x0496e4df, 0xb5d19ee3,
30348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x886a4c1b, 0x1f2cc1b8, 0x5165467f, 0xea5e9d04, 0x358c015d, 0x7487fa73, 0x410bfb2e, 0x1d67b35a, 0xd2db9252,
30448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x5610e933, 0x47d66d13, 0x61d79a8c, 0x0ca1377a, 0x14f8598e, 0x3c13eb89, 0x27a9ceee, 0xc961b735, 0xe51ce1ed,
30548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xb1477a3c, 0xdfd29c59, 0x73f2553f, 0xce141879, 0x37c773bf, 0xcdf753ea, 0xaafd5f5b, 0x6f3ddf14, 0xdb447886,
30648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xf3afca81, 0xc468b93e, 0x3424382c, 0x40a3c25f, 0xc31d1672, 0x25e2bc0c, 0x493c288b, 0x950dff41, 0x01a83971,
30748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xb30c08de, 0xe4b4d89c, 0xc1566490, 0x84cb7b61, 0xb632d570, 0x5c6c4874, 0x57b8d042 };
30848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
30948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private static final int[] Tinv2 = { 0xf45150a7, 0x417e5365, 0x171ac3a4, 0x273a965e, 0xab3bcb6b, 0x9d1ff145,
31048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xfaacab58, 0xe34b9303, 0x302055fa, 0x76adf66d, 0xcc889176, 0x02f5254c, 0xe54ffcd7, 0x2ac5d7cb, 0x35268044,
31148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x62b58fa3, 0xb1de495a, 0xba25671b, 0xea45980e, 0xfe5de1c0, 0x2fc30275, 0x4c8112f0, 0x468da397, 0xd36bc6f9,
31248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x8f03e75f, 0x9215959c, 0x6dbfeb7a, 0x5295da59, 0xbed42d83, 0x7458d321, 0xe0492969, 0xc98e44c8, 0xc2756a89,
31348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x8ef47879, 0x58996b3e, 0xb927dd71, 0xe1beb64f, 0x88f017ad, 0x20c966ac, 0xce7db43a, 0xdf63184a, 0x1ae58231,
31448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x51976033, 0x5362457f, 0x64b1e077, 0x6bbb84ae, 0x81fe1ca0, 0x08f9942b, 0x48705868, 0x458f19fd, 0xde94876c,
31548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x7b52b7f8, 0x73ab23d3, 0x4b72e202, 0x1fe3578f, 0x55662aab, 0xebb20728, 0xb52f03c2, 0xc5869a7b, 0x37d3a508,
31648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x2830f287, 0xbf23b2a5, 0x0302ba6a, 0x16ed5c82, 0xcf8a2b1c, 0x79a792b4, 0x07f3f0f2, 0x694ea1e2, 0xda65cdf4,
31748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x0506d5be, 0x34d11f62, 0xa6c48afe, 0x2e349d53, 0xf3a2a055, 0x8a0532e1, 0xf6a475eb, 0x830b39ec, 0x6040aaef,
31848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x715e069f, 0x6ebd5110, 0x213ef98a, 0xdd963d06, 0x3eddae05, 0xe64d46bd, 0x5491b58d, 0xc471055d, 0x06046fd4,
31948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x5060ff15, 0x981924fb, 0xbdd697e9, 0x4089cc43, 0xd967779e, 0xe8b0bd42, 0x8907888b, 0x19e7385b, 0xc879dbee,
32048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x7ca1470a, 0x427ce90f, 0x84f8c91e, 0x00000000, 0x80098386, 0x2b3248ed, 0x111eac70, 0x5a6c4e72, 0x0efdfbff,
32148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x850f5638, 0xae3d1ed5, 0x2d362739, 0x0f0a64d9, 0x5c6821a6, 0x5b9bd154, 0x36243a2e, 0x0a0cb167, 0x57930fe7,
32248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xeeb4d296, 0x9b1b9e91, 0xc0804fc5, 0xdc61a220, 0x775a694b, 0x121c161a, 0x93e20aba, 0xa0c0e52a, 0x223c43e0,
32348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x1b121d17, 0x090e0b0d, 0x8bf2adc7, 0xb62db9a8, 0x1e14c8a9, 0xf1578519, 0x75af4c07, 0x99eebbdd, 0x7fa3fd60,
32448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x01f79f26, 0x725cbcf5, 0x6644c53b, 0xfb5b347e, 0x438b7629, 0x23cbdcc6, 0xedb668fc, 0xe4b863f1, 0x31d7cadc,
32548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x63421085, 0x97134022, 0xc6842011, 0x4a857d24, 0xbbd2f83d, 0xf9ae1132, 0x29c76da1, 0x9e1d4b2f, 0xb2dcf330,
32648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x860dec52, 0xc177d0e3, 0xb32b6c16, 0x70a999b9, 0x9411fa48, 0xe9472264, 0xfca8c48c, 0xf0a01a3f, 0x7d56d82c,
32748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x3322ef90, 0x4987c74e, 0x38d9c1d1, 0xca8cfea2, 0xd498360b, 0xf5a6cf81, 0x7aa528de, 0xb7da268e, 0xad3fa4bf,
32848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x3a2ce49d, 0x78500d92, 0x5f6a9bcc, 0x7e546246, 0x8df6c213, 0xd890e8b8, 0x392e5ef7, 0xc382f5af, 0x5d9fbe80,
32948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xd0697c93, 0xd56fa92d, 0x25cfb312, 0xacc83b99, 0x1810a77d, 0x9ce86e63, 0x3bdb7bbb, 0x26cd0978, 0x596ef418,
33048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x9aec01b7, 0x4f83a89a, 0x95e6656e, 0xffaa7ee6, 0xbc2108cf, 0x15efe6e8, 0xe7bad99b, 0x6f4ace36, 0x9fead409,
33148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xb029d67c, 0xa431afb2, 0x3f2a3123, 0xa5c63094, 0xa235c066, 0x4e7437bc, 0x82fca6ca, 0x90e0b0d0, 0xa73315d8,
33248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x04f14a98, 0xec41f7da, 0xcd7f0e50, 0x91172ff6, 0x4d768dd6, 0xef434db0, 0xaacc544d, 0x96e4df04, 0xd19ee3b5,
33348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x6a4c1b88, 0x2cc1b81f, 0x65467f51, 0x5e9d04ea, 0x8c015d35, 0x87fa7374, 0x0bfb2e41, 0x67b35a1d, 0xdb9252d2,
33448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x10e93356, 0xd66d1347, 0xd79a8c61, 0xa1377a0c, 0xf8598e14, 0x13eb893c, 0xa9ceee27, 0x61b735c9, 0x1ce1ede5,
33548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x477a3cb1, 0xd29c59df, 0xf2553f73, 0x141879ce, 0xc773bf37, 0xf753eacd, 0xfd5f5baa, 0x3ddf146f, 0x447886db,
33648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xafca81f3, 0x68b93ec4, 0x24382c34, 0xa3c25f40, 0x1d1672c3, 0xe2bc0c25, 0x3c288b49, 0x0dff4195, 0xa8397101,
33748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x0c08deb3, 0xb4d89ce4, 0x566490c1, 0xcb7b6184, 0x32d570b6, 0x6c48745c, 0xb8d04257 };
33848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
33948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private static final int[] Tinv3 = { 0x5150a7f4, 0x7e536541, 0x1ac3a417, 0x3a965e27, 0x3bcb6bab, 0x1ff1459d,
34048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xacab58fa, 0x4b9303e3, 0x2055fa30, 0xadf66d76, 0x889176cc, 0xf5254c02, 0x4ffcd7e5, 0xc5d7cb2a, 0x26804435,
34148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xb58fa362, 0xde495ab1, 0x25671bba, 0x45980eea, 0x5de1c0fe, 0xc302752f, 0x8112f04c, 0x8da39746, 0x6bc6f9d3,
34248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x03e75f8f, 0x15959c92, 0xbfeb7a6d, 0x95da5952, 0xd42d83be, 0x58d32174, 0x492969e0, 0x8e44c8c9, 0x756a89c2,
34348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xf478798e, 0x996b3e58, 0x27dd71b9, 0xbeb64fe1, 0xf017ad88, 0xc966ac20, 0x7db43ace, 0x63184adf, 0xe582311a,
34448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x97603351, 0x62457f53, 0xb1e07764, 0xbb84ae6b, 0xfe1ca081, 0xf9942b08, 0x70586848, 0x8f19fd45, 0x94876cde,
34548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x52b7f87b, 0xab23d373, 0x72e2024b, 0xe3578f1f, 0x662aab55, 0xb20728eb, 0x2f03c2b5, 0x869a7bc5, 0xd3a50837,
34648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x30f28728, 0x23b2a5bf, 0x02ba6a03, 0xed5c8216, 0x8a2b1ccf, 0xa792b479, 0xf3f0f207, 0x4ea1e269, 0x65cdf4da,
34748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x06d5be05, 0xd11f6234, 0xc48afea6, 0x349d532e, 0xa2a055f3, 0x0532e18a, 0xa475ebf6, 0x0b39ec83, 0x40aaef60,
34848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x5e069f71, 0xbd51106e, 0x3ef98a21, 0x963d06dd, 0xddae053e, 0x4d46bde6, 0x91b58d54, 0x71055dc4, 0x046fd406,
34948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x60ff1550, 0x1924fb98, 0xd697e9bd, 0x89cc4340, 0x67779ed9, 0xb0bd42e8, 0x07888b89, 0xe7385b19, 0x79dbeec8,
35048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xa1470a7c, 0x7ce90f42, 0xf8c91e84, 0x00000000, 0x09838680, 0x3248ed2b, 0x1eac7011, 0x6c4e725a, 0xfdfbff0e,
35148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x0f563885, 0x3d1ed5ae, 0x3627392d, 0x0a64d90f, 0x6821a65c, 0x9bd1545b, 0x243a2e36, 0x0cb1670a, 0x930fe757,
35248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xb4d296ee, 0x1b9e919b, 0x804fc5c0, 0x61a220dc, 0x5a694b77, 0x1c161a12, 0xe20aba93, 0xc0e52aa0, 0x3c43e022,
35348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x121d171b, 0x0e0b0d09, 0xf2adc78b, 0x2db9a8b6, 0x14c8a91e, 0x578519f1, 0xaf4c0775, 0xeebbdd99, 0xa3fd607f,
35448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xf79f2601, 0x5cbcf572, 0x44c53b66, 0x5b347efb, 0x8b762943, 0xcbdcc623, 0xb668fced, 0xb863f1e4, 0xd7cadc31,
35548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x42108563, 0x13402297, 0x842011c6, 0x857d244a, 0xd2f83dbb, 0xae1132f9, 0xc76da129, 0x1d4b2f9e, 0xdcf330b2,
35648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x0dec5286, 0x77d0e3c1, 0x2b6c16b3, 0xa999b970, 0x11fa4894, 0x472264e9, 0xa8c48cfc, 0xa01a3ff0, 0x56d82c7d,
35748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x22ef9033, 0x87c74e49, 0xd9c1d138, 0x8cfea2ca, 0x98360bd4, 0xa6cf81f5, 0xa528de7a, 0xda268eb7, 0x3fa4bfad,
35848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x2ce49d3a, 0x500d9278, 0x6a9bcc5f, 0x5462467e, 0xf6c2138d, 0x90e8b8d8, 0x2e5ef739, 0x82f5afc3, 0x9fbe805d,
35948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x697c93d0, 0x6fa92dd5, 0xcfb31225, 0xc83b99ac, 0x10a77d18, 0xe86e639c, 0xdb7bbb3b, 0xcd097826, 0x6ef41859,
36048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xec01b79a, 0x83a89a4f, 0xe6656e95, 0xaa7ee6ff, 0x2108cfbc, 0xefe6e815, 0xbad99be7, 0x4ace366f, 0xead4099f,
36148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x29d67cb0, 0x31afb2a4, 0x2a31233f, 0xc63094a5, 0x35c066a2, 0x7437bc4e, 0xfca6ca82, 0xe0b0d090, 0x3315d8a7,
36248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xf14a9804, 0x41f7daec, 0x7f0e50cd, 0x172ff691, 0x768dd64d, 0x434db0ef, 0xcc544daa, 0xe4df0496, 0x9ee3b5d1,
36348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x4c1b886a, 0xc1b81f2c, 0x467f5165, 0x9d04ea5e, 0x015d358c, 0xfa737487, 0xfb2e410b, 0xb35a1d67, 0x9252d2db,
36448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xe9335610, 0x6d1347d6, 0x9a8c61d7, 0x377a0ca1, 0x598e14f8, 0xeb893c13, 0xceee27a9, 0xb735c961, 0xe1ede51c,
36548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x7a3cb147, 0x9c59dfd2, 0x553f73f2, 0x1879ce14, 0x73bf37c7, 0x53eacdf7, 0x5f5baafd, 0xdf146f3d, 0x7886db44,
36648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0xca81f3af, 0xb93ec468, 0x382c3424, 0xc25f40a3, 0x1672c31d, 0xbc0c25e2, 0x288b493c, 0xff41950d, 0x397101a8,
36748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x08deb30c, 0xd89ce4b4, 0x6490c156, 0x7b6184cb, 0xd570b632, 0x48745c6c, 0xd04257b8 };
36848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
36948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private int shift(int r, int shift)
37048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
37148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		return (((r >>> shift) | (r << (32 - shift))));
37248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
37348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
37448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	/* multiply four bytes in GF(2^8) by 'x' {02} in parallel */
37548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
37648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private static final int m1 = 0x80808080;
37748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private static final int m2 = 0x7f7f7f7f;
37848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private static final int m3 = 0x0000001b;
37948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
38048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private int FFmulX(int x)
38148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
38248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		return (((x & m2) << 1) ^ (((x & m1) >>> 7) * m3));
38348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
38448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
38548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	/*
38648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * The following defines provide alternative definitions of FFmulX that
38748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * might give improved performance if a fast 32-bit multiply is not
38848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * available.
38948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 *
39048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * private int FFmulX(int x) { int u = x & m1; u |= (u >> 1); return ((x &
39148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * m2) < < 1) ^ ((u >>> 3) | (u >>> 6)); } private static final int m4 =
39248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * 0x1b1b1b1b; private int FFmulX(int x) { int u = x & m1; return ((x & m2) < <
39348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * 1) ^ ((u - (u >>> 7)) & m4); }
39448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 *
39548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 */
39648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
39748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private int inv_mcol(int x)
39848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
39948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		int f2 = FFmulX(x);
40048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		int f4 = FFmulX(f2);
40148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		int f8 = FFmulX(f4);
40248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		int f9 = x ^ f8;
40348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
40448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		return f2 ^ f4 ^ f8 ^ shift(f2 ^ f9, 8) ^ shift(f4 ^ f9, 16) ^ shift(f9, 24);
40548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
40648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
40748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private int subWord(int x)
40848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
40948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		return (S[x & 255] & 255 | ((S[(x >> 8) & 255] & 255) << 8) | ((S[(x >> 16) & 255] & 255) << 16) | S[(x >> 24) & 255] << 24);
41048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
41148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
41248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	/**
41348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * Calculate the necessary round keys The number of calculations depends on
41448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * key size and block size AES specified a fixed block size of 128 bits and
41548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * key sizes 128/192/256 bits This code is written assuming those are the
41648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * only possible values
41748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 */
41848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private int[][] generateWorkingKey(byte[] key, boolean forEncryption)
41948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
42048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		int KC = key.length / 4; // key length in words
42148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		int t;
42248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
42348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		if (((KC != 4) && (KC != 6) && (KC != 8)) || ((KC * 4) != key.length))
42448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		{
42548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			throw new IllegalArgumentException("Key length not 128/192/256 bits.");
42648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		}
42748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
42848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		ROUNDS = KC + 6; // This is not always true for the generalized
42948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		// Rijndael that allows larger block sizes
43048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		int[][] W = new int[ROUNDS + 1][4]; // 4 words in a block
43148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
43248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		//
43348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		// copy the key into the round key array
43448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		//
43548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
43648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		t = 0;
43748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		for (int i = 0; i < key.length; t++)
43848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		{
43948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			W[t >> 2][t & 3] = (key[i] & 0xff) | ((key[i + 1] & 0xff) << 8) | ((key[i + 2] & 0xff) << 16)
44048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood					| (key[i + 3] << 24);
44148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			i += 4;
44248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		}
44348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
44448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		//
44548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		// while not enough round key material calculated
44648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		// calculate new values
44748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		//
44848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		int k = (ROUNDS + 1) << 2;
44948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		for (int i = KC; (i < k); i++)
45048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		{
45148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			int temp = W[(i - 1) >> 2][(i - 1) & 3];
45248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			if ((i % KC) == 0)
45348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			{
45448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				temp = subWord(shift(temp, 8)) ^ rcon[(i / KC) - 1];
45548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			}
45648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			else if ((KC > 6) && ((i % KC) == 4))
45748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			{
45848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				temp = subWord(temp);
45948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			}
46048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
46148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			W[i >> 2][i & 3] = W[(i - KC) >> 2][(i - KC) & 3] ^ temp;
46248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		}
46348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
46448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		if (!forEncryption)
46548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		{
46648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			for (int j = 1; j < ROUNDS; j++)
46748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			{
46848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				for (int i = 0; i < 4; i++)
46948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				{
47048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood					W[j][i] = inv_mcol(W[j][i]);
47148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				}
47248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			}
47348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		}
47448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
47548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		return W;
47648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
47748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
47848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private int ROUNDS;
47948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private int[][] WorkingKey = null;
48048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private int C0, C1, C2, C3;
48148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private boolean doEncrypt;
48248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
48348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private static final int BLOCK_SIZE = 16;
48448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
48548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	/**
48648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * default constructor - 128 bit block size.
48748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 */
48848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	public AES()
48948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
49048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
49148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
49248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	/**
49348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * initialise an AES cipher.
49448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 *
49548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * @param forEncryption
49648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 *            whether or not we are for encryption.
49748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * @param key
49848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 *            the key required to set up the cipher.
49948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * @exception IllegalArgumentException
50048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 *                if the params argument is inappropriate.
50148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 */
50248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
50348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	public final void init(boolean forEncryption, byte[] key)
50448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
50548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		WorkingKey = generateWorkingKey(key, forEncryption);
50648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		this.doEncrypt = forEncryption;
50748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
50848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
50948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	public final String getAlgorithmName()
51048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
51148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		return "AES";
51248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
51348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
51448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	public final int getBlockSize()
51548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
51648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		return BLOCK_SIZE;
51748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
51848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
51948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	public final int processBlock(byte[] in, int inOff, byte[] out, int outOff)
52048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
52148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		if (WorkingKey == null)
52248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		{
52348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			throw new IllegalStateException("AES engine not initialised");
52448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		}
52548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
52648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		if ((inOff + (32 / 2)) > in.length)
52748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		{
52848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			throw new IllegalArgumentException("input buffer too short");
52948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		}
53048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
53148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		if ((outOff + (32 / 2)) > out.length)
53248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		{
53348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			throw new IllegalArgumentException("output buffer too short");
53448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		}
53548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
53648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		if (doEncrypt)
53748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		{
53848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			unpackBlock(in, inOff);
53948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			encryptBlock(WorkingKey);
54048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			packBlock(out, outOff);
54148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		}
54248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		else
54348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		{
54448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			unpackBlock(in, inOff);
54548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			decryptBlock(WorkingKey);
54648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			packBlock(out, outOff);
54748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		}
54848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
54948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		return BLOCK_SIZE;
55048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
55148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
55248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	public final void reset()
55348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
55448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
55548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
55648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private void unpackBlock(byte[] bytes, int off)
55748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
55848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		int index = off;
55948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
56048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C0 = (bytes[index++] & 0xff);
56148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C0 |= (bytes[index++] & 0xff) << 8;
56248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C0 |= (bytes[index++] & 0xff) << 16;
56348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C0 |= bytes[index++] << 24;
56448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
56548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C1 = (bytes[index++] & 0xff);
56648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C1 |= (bytes[index++] & 0xff) << 8;
56748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C1 |= (bytes[index++] & 0xff) << 16;
56848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C1 |= bytes[index++] << 24;
56948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
57048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C2 = (bytes[index++] & 0xff);
57148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C2 |= (bytes[index++] & 0xff) << 8;
57248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C2 |= (bytes[index++] & 0xff) << 16;
57348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C2 |= bytes[index++] << 24;
57448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
57548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C3 = (bytes[index++] & 0xff);
57648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C3 |= (bytes[index++] & 0xff) << 8;
57748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C3 |= (bytes[index++] & 0xff) << 16;
57848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C3 |= bytes[index++] << 24;
57948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
58048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
58148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private void packBlock(byte[] bytes, int off)
58248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
58348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		int index = off;
58448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
58548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		bytes[index++] = (byte) C0;
58648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		bytes[index++] = (byte) (C0 >> 8);
58748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		bytes[index++] = (byte) (C0 >> 16);
58848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		bytes[index++] = (byte) (C0 >> 24);
58948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
59048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		bytes[index++] = (byte) C1;
59148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		bytes[index++] = (byte) (C1 >> 8);
59248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		bytes[index++] = (byte) (C1 >> 16);
59348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		bytes[index++] = (byte) (C1 >> 24);
59448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
59548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		bytes[index++] = (byte) C2;
59648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		bytes[index++] = (byte) (C2 >> 8);
59748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		bytes[index++] = (byte) (C2 >> 16);
59848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		bytes[index++] = (byte) (C2 >> 24);
59948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
60048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		bytes[index++] = (byte) C3;
60148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		bytes[index++] = (byte) (C3 >> 8);
60248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		bytes[index++] = (byte) (C3 >> 16);
60348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		bytes[index++] = (byte) (C3 >> 24);
60448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
60548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
60648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private void encryptBlock(int[][] KW)
60748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
60848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		int r, r0, r1, r2, r3;
60948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
61048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C0 ^= KW[0][0];
61148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C1 ^= KW[0][1];
61248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C2 ^= KW[0][2];
61348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C3 ^= KW[0][3];
61448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
61548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		for (r = 1; r < ROUNDS - 1;)
61648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		{
61748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			r0 = T0[C0 & 255] ^ T1[(C1 >> 8) & 255] ^ T2[(C2 >> 16) & 255] ^ T3[(C3 >> 24) & 255] ^ KW[r][0];
61848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			r1 = T0[C1 & 255] ^ T1[(C2 >> 8) & 255] ^ T2[(C3 >> 16) & 255] ^ T3[(C0 >> 24) & 255] ^ KW[r][1];
61948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			r2 = T0[C2 & 255] ^ T1[(C3 >> 8) & 255] ^ T2[(C0 >> 16) & 255] ^ T3[(C1 >> 24) & 255] ^ KW[r][2];
62048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			r3 = T0[C3 & 255] ^ T1[(C0 >> 8) & 255] ^ T2[(C1 >> 16) & 255] ^ T3[(C2 >> 24) & 255] ^ KW[r++][3];
62148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			C0 = T0[r0 & 255] ^ T1[(r1 >> 8) & 255] ^ T2[(r2 >> 16) & 255] ^ T3[(r3 >> 24) & 255] ^ KW[r][0];
62248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			C1 = T0[r1 & 255] ^ T1[(r2 >> 8) & 255] ^ T2[(r3 >> 16) & 255] ^ T3[(r0 >> 24) & 255] ^ KW[r][1];
62348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			C2 = T0[r2 & 255] ^ T1[(r3 >> 8) & 255] ^ T2[(r0 >> 16) & 255] ^ T3[(r1 >> 24) & 255] ^ KW[r][2];
62448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			C3 = T0[r3 & 255] ^ T1[(r0 >> 8) & 255] ^ T2[(r1 >> 16) & 255] ^ T3[(r2 >> 24) & 255] ^ KW[r++][3];
62548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		}
62648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
62748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		r0 = T0[C0 & 255] ^ T1[(C1 >> 8) & 255] ^ T2[(C2 >> 16) & 255] ^ T3[(C3 >> 24) & 255] ^ KW[r][0];
62848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		r1 = T0[C1 & 255] ^ T1[(C2 >> 8) & 255] ^ T2[(C3 >> 16) & 255] ^ T3[(C0 >> 24) & 255] ^ KW[r][1];
62948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		r2 = T0[C2 & 255] ^ T1[(C3 >> 8) & 255] ^ T2[(C0 >> 16) & 255] ^ T3[(C1 >> 24) & 255] ^ KW[r][2];
63048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		r3 = T0[C3 & 255] ^ T1[(C0 >> 8) & 255] ^ T2[(C1 >> 16) & 255] ^ T3[(C2 >> 24) & 255] ^ KW[r++][3];
63148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
63248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		// the final round's table is a simple function of S so we don't use a
63348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		// whole other four tables for it
63448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
63548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C0 = (S[r0 & 255] & 255) ^ ((S[(r1 >> 8) & 255] & 255) << 8) ^ ((S[(r2 >> 16) & 255] & 255) << 16)
63648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				^ (S[(r3 >> 24) & 255] << 24) ^ KW[r][0];
63748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C1 = (S[r1 & 255] & 255) ^ ((S[(r2 >> 8) & 255] & 255) << 8) ^ ((S[(r3 >> 16) & 255] & 255) << 16)
63848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				^ (S[(r0 >> 24) & 255] << 24) ^ KW[r][1];
63948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C2 = (S[r2 & 255] & 255) ^ ((S[(r3 >> 8) & 255] & 255) << 8) ^ ((S[(r0 >> 16) & 255] & 255) << 16)
64048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				^ (S[(r1 >> 24) & 255] << 24) ^ KW[r][2];
64148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C3 = (S[r3 & 255] & 255) ^ ((S[(r0 >> 8) & 255] & 255) << 8) ^ ((S[(r1 >> 16) & 255] & 255) << 16)
64248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				^ (S[(r2 >> 24) & 255] << 24) ^ KW[r][3];
64348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
64448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
64548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
64648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private void decryptBlock(int[][] KW)
64748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
64848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		int r, r0, r1, r2, r3;
64948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
65048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C0 ^= KW[ROUNDS][0];
65148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C1 ^= KW[ROUNDS][1];
65248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C2 ^= KW[ROUNDS][2];
65348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C3 ^= KW[ROUNDS][3];
65448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
65548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		for (r = ROUNDS - 1; r > 1;)
65648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		{
65748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			r0 = Tinv0[C0 & 255] ^ Tinv1[(C3 >> 8) & 255] ^ Tinv2[(C2 >> 16) & 255] ^ Tinv3[(C1 >> 24) & 255]
65848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood					^ KW[r][0];
65948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			r1 = Tinv0[C1 & 255] ^ Tinv1[(C0 >> 8) & 255] ^ Tinv2[(C3 >> 16) & 255] ^ Tinv3[(C2 >> 24) & 255]
66048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood					^ KW[r][1];
66148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			r2 = Tinv0[C2 & 255] ^ Tinv1[(C1 >> 8) & 255] ^ Tinv2[(C0 >> 16) & 255] ^ Tinv3[(C3 >> 24) & 255]
66248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood					^ KW[r][2];
66348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			r3 = Tinv0[C3 & 255] ^ Tinv1[(C2 >> 8) & 255] ^ Tinv2[(C1 >> 16) & 255] ^ Tinv3[(C0 >> 24) & 255]
66448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood					^ KW[r--][3];
66548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			C0 = Tinv0[r0 & 255] ^ Tinv1[(r3 >> 8) & 255] ^ Tinv2[(r2 >> 16) & 255] ^ Tinv3[(r1 >> 24) & 255]
66648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood					^ KW[r][0];
66748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			C1 = Tinv0[r1 & 255] ^ Tinv1[(r0 >> 8) & 255] ^ Tinv2[(r3 >> 16) & 255] ^ Tinv3[(r2 >> 24) & 255]
66848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood					^ KW[r][1];
66948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			C2 = Tinv0[r2 & 255] ^ Tinv1[(r1 >> 8) & 255] ^ Tinv2[(r0 >> 16) & 255] ^ Tinv3[(r3 >> 24) & 255]
67048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood					^ KW[r][2];
67148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			C3 = Tinv0[r3 & 255] ^ Tinv1[(r2 >> 8) & 255] ^ Tinv2[(r1 >> 16) & 255] ^ Tinv3[(r0 >> 24) & 255]
67248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood					^ KW[r--][3];
67348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		}
67448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
67548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		r0 = Tinv0[C0 & 255] ^ Tinv1[(C3 >> 8) & 255] ^ Tinv2[(C2 >> 16) & 255] ^ Tinv3[(C1 >> 24) & 255] ^ KW[r][0];
67648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		r1 = Tinv0[C1 & 255] ^ Tinv1[(C0 >> 8) & 255] ^ Tinv2[(C3 >> 16) & 255] ^ Tinv3[(C2 >> 24) & 255] ^ KW[r][1];
67748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		r2 = Tinv0[C2 & 255] ^ Tinv1[(C1 >> 8) & 255] ^ Tinv2[(C0 >> 16) & 255] ^ Tinv3[(C3 >> 24) & 255] ^ KW[r][2];
67848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		r3 = Tinv0[C3 & 255] ^ Tinv1[(C2 >> 8) & 255] ^ Tinv2[(C1 >> 16) & 255] ^ Tinv3[(C0 >> 24) & 255] ^ KW[r--][3];
67948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
68048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		// the final round's table is a simple function of Si so we don't use a
68148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		// whole other four tables for it
68248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
68348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C0 = (Si[r0 & 255] & 255) ^ ((Si[(r3 >> 8) & 255] & 255) << 8) ^ ((Si[(r2 >> 16) & 255] & 255) << 16)
68448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				^ (Si[(r1 >> 24) & 255] << 24) ^ KW[0][0];
68548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C1 = (Si[r1 & 255] & 255) ^ ((Si[(r0 >> 8) & 255] & 255) << 8) ^ ((Si[(r3 >> 16) & 255] & 255) << 16)
68648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				^ (Si[(r2 >> 24) & 255] << 24) ^ KW[0][1];
68748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C2 = (Si[r2 & 255] & 255) ^ ((Si[(r1 >> 8) & 255] & 255) << 8) ^ ((Si[(r0 >> 16) & 255] & 255) << 16)
68848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				^ (Si[(r3 >> 24) & 255] << 24) ^ KW[0][2];
68948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		C3 = (Si[r3 & 255] & 255) ^ ((Si[(r2 >> 8) & 255] & 255) << 8) ^ ((Si[(r1 >> 16) & 255] & 255) << 16)
69048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				^ (Si[(r0 >> 24) & 255] << 24) ^ KW[0][3];
69148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
69248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
69348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	public void transformBlock(byte[] src, int srcoff, byte[] dst, int dstoff)
69448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
69548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		processBlock(src, srcoff, dst, dstoff);
69648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
69748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood}
698