148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodpackage ch.ethz.ssh2.crypto.cipher;
248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood/*
448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood This file is based on the 3DES implementation 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 * DES.
3148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood *
3248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * @author See comments in the source file
3348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * @version 2.50, 03/15/10
3448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood *
3548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */
3648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodpublic class DES implements BlockCipher
3748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood{
3848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	private int[] workingKey = null;
3948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
4048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	/**
4148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * standard constructor.
4248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 */
4348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	public DES()
4448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
4548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
4648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
4748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	/**
4848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * initialise a DES cipher.
4948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 *
5048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * @param encrypting
5148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 *            whether or not we are for encryption.
5248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * @param key
5348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 *            the parameters required to set up the cipher.
5448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * @exception IllegalArgumentException
5548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 *                if the params argument is inappropriate.
5648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 */
5748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	public void init(boolean encrypting, byte[] key)
5848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
5948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		this.workingKey = generateWorkingKey(encrypting, key, 0);
6048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
6148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
6248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	public String getAlgorithmName()
6348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
6448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		return "DES";
6548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
6648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
6748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	public int getBlockSize()
6848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
6948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		return 8;
7048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
7148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
7248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	public void transformBlock(byte[] in, int inOff, byte[] out, int outOff)
7348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
7448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		if (workingKey == null)
7548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		{
7648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			throw new IllegalStateException("DES engine not initialised!");
7748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		}
7848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
7948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		desFunc(workingKey, in, inOff, out, outOff);
8048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
8148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
8248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	public void reset()
8348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
8448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
8548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
8648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	/**
8748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * what follows is mainly taken from "Applied Cryptography", by Bruce
8848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * Schneier, however it also bears great resemblance to Richard
8948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * Outerbridge's D3DES...
9048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 */
9148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
9248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	static short[] Df_Key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32,
9348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x10, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67 };
9448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
9548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	static short[] bytebit = { 0200, 0100, 040, 020, 010, 04, 02, 01 };
9648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
9748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	static int[] bigbyte = { 0x800000, 0x400000, 0x200000, 0x100000, 0x80000, 0x40000, 0x20000, 0x10000, 0x8000,
9848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x4000, 0x2000, 0x1000, 0x800, 0x400, 0x200, 0x100, 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1 };
9948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
10048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	/*
10148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * Use the key schedule specified in the Standard (ANSI X3.92-1981).
10248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 */
10348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
10448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	static byte[] pc1 = { 56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2,
10548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			59, 51, 43, 35, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 60, 52, 44, 36, 28, 20, 12,
10648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			4, 27, 19, 11, 3 };
10748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
10848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	static byte[] totrot = { 1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28 };
10948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
11048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	static byte[] pc2 = { 13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9, 22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1, 40,
11148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47, 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 };
11248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
11348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	static int[] SP1 = { 0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404, 0x00000004,
11448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400, 0x01000404, 0x01010004, 0x01000000, 0x00000004,
11548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00000404, 0x01000400, 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404, 0x00010004,
11648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404, 0x00010404, 0x01000000, 0x00010000, 0x01010404,
11748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00000004, 0x01010000, 0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000, 0x00010400,
11848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404, 0x01010404, 0x00010004, 0x01010000, 0x01000404,
11948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x01000004, 0x00000404, 0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000, 0x00010004,
12048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00010400, 0x00000000, 0x01010004 };
12148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
12248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	static int[] SP2 = { 0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020, 0x80100020,
12348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000, 0x80008000, 0x00100000, 0x00000020, 0x80100020,
12448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00108000, 0x00100020, 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000, 0x00100020,
12548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000, 0x80100000, 0x00008020, 0x00000000, 0x00108020,
12648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x80100020, 0x00100000, 0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000, 0x00000020,
12748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000, 0x00008020, 0x80108000, 0x00100000, 0x80000020,
12848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00100020, 0x80008020, 0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020, 0x80000000,
12948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x80100020, 0x80108020, 0x00108000 };
13048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
13148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	static int[] SP3 = { 0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000, 0x00020208,
13248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000, 0x08020208, 0x00020008, 0x08020000, 0x00000208,
13348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x08000000, 0x00000008, 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208, 0x08000208,
13448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208, 0x00000200, 0x08000000, 0x08020200, 0x08000000,
13548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00020008, 0x00000208, 0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008, 0x08020208,
13648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008, 0x08000208, 0x00020000, 0x08000000, 0x08020208,
13748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00000008, 0x00020208, 0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000, 0x00020208,
13848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00000008, 0x08020008, 0x00020200 };
13948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
14048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	static int[] SP4 = { 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081, 0x00800001,
14148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00800080, 0x00800001,
14248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00000001, 0x00002000, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080, 0x00800081,
14348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080, 0x00802081, 0x00000081, 0x00800080, 0x00800001,
14448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080, 0x00800081,
14548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802081, 0x00000081, 0x00000001, 0x00002000,
14648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00800001, 0x00002001, 0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001, 0x00000080,
14748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00800000, 0x00002000, 0x00802080 };
14848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
14948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	static int[] SP5 = { 0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100, 0x40000000,
15048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100, 0x42000100, 0x42080000, 0x00080100, 0x40000000,
15148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x02000000, 0x40080000, 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100, 0x42080000,
15248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000, 0x42000000, 0x00080100, 0x00080000, 0x42000100,
15348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00000100, 0x02000000, 0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000, 0x42080000,
15448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000, 0x42080100, 0x00080100, 0x42000000, 0x42080100,
15548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x02080000, 0x00000000, 0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000, 0x00000000,
15648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x40080000, 0x02080100, 0x40000100 };
15748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
15848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	static int[] SP6 = { 0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010, 0x20404010,
15948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010, 0x00400010, 0x20004000, 0x20000000, 0x00004010,
16048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00000000, 0x00400010, 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010, 0x20400010,
16148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000, 0x20404000, 0x20000000, 0x20004000, 0x00000010,
16248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x20400010, 0x00404000, 0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000, 0x20000000,
16348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000, 0x00404010, 0x20404000, 0x00000000, 0x20400010,
16448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00000010, 0x00004000, 0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000, 0x20404000,
16548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x20000000, 0x00400010, 0x20004010 };
16648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
16748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	static int[] SP7 = { 0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802, 0x00200802,
16848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002, 0x00000002, 0x04000000, 0x04200002, 0x00000802,
16948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x04000800, 0x00200802, 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002, 0x04200000,
17048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002, 0x04000000, 0x00200800, 0x04000000, 0x00200800,
17148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00200000, 0x04000802, 0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000, 0x04000800,
17248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800, 0x00000802, 0x04000002, 0x04200802, 0x04200000,
17348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00200800, 0x00000000, 0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800, 0x04000002,
17448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x04000800, 0x00000800, 0x00200002 };
17548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
17648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	static int[] SP8 = { 0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040, 0x00000040,
17748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000, 0x10041000, 0x00041040, 0x00001000, 0x00000040,
17848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x10040000, 0x10000040, 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000, 0x00001040,
17948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000, 0x00041040, 0x00040000, 0x00041040, 0x00040000,
18048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x10041000, 0x00001000, 0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040, 0x10000040,
18148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040, 0x00000000, 0x10041040, 0x00040040, 0x10000040,
18248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x10040000, 0x10001000, 0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040, 0x00001040,
18348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			0x00040040, 0x10000000, 0x10041000 };
18448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
18548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	/**
18648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * generate an integer based working key based on our secret key and what we
18748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * processing we are planning to do.
18848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 *
18948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * Acknowledgements for this routine go to James Gillogly & Phil Karn.
19048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * (whoever, and wherever they are!).
19148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 */
19248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	protected int[] generateWorkingKey(boolean encrypting, byte[] key, int off)
19348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
19448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		int[] newKey = new int[32];
19548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		boolean[] pc1m = new boolean[56], pcr = new boolean[56];
19648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
19748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		for (int j = 0; j < 56; j++)
19848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		{
19948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			int l = pc1[j];
20048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
20148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			pc1m[j] = ((key[off + (l >>> 3)] & bytebit[l & 07]) != 0);
20248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		}
20348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
20448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		for (int i = 0; i < 16; i++)
20548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		{
20648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			int l, m, n;
20748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
20848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			if (encrypting)
20948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			{
21048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				m = i << 1;
21148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			}
21248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			else
21348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			{
21448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				m = (15 - i) << 1;
21548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			}
21648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
21748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			n = m + 1;
21848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			newKey[m] = newKey[n] = 0;
21948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
22048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			for (int j = 0; j < 28; j++)
22148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			{
22248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				l = j + totrot[i];
22348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				if (l < 28)
22448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				{
22548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood					pcr[j] = pc1m[l];
22648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				}
22748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				else
22848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				{
22948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood					pcr[j] = pc1m[l - 28];
23048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				}
23148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			}
23248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
23348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			for (int j = 28; j < 56; j++)
23448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			{
23548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				l = j + totrot[i];
23648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				if (l < 56)
23748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				{
23848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood					pcr[j] = pc1m[l];
23948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				}
24048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				else
24148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				{
24248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood					pcr[j] = pc1m[l - 28];
24348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				}
24448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			}
24548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
24648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			for (int j = 0; j < 24; j++)
24748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			{
24848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				if (pcr[pc2[j]])
24948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				{
25048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood					newKey[m] |= bigbyte[j];
25148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				}
25248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
25348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				if (pcr[pc2[j + 24]])
25448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				{
25548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood					newKey[n] |= bigbyte[j];
25648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood				}
25748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			}
25848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		}
25948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
26048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		//
26148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		// store the processed key
26248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		//
26348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		for (int i = 0; i != 32; i += 2)
26448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		{
26548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			int i1, i2;
26648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
26748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			i1 = newKey[i];
26848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			i2 = newKey[i + 1];
26948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
27048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			newKey[i] = ((i1 & 0x00fc0000) << 6) | ((i1 & 0x00000fc0) << 10) | ((i2 & 0x00fc0000) >>> 10)
27148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood					| ((i2 & 0x00000fc0) >>> 6);
27248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
27348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			newKey[i + 1] = ((i1 & 0x0003f000) << 12) | ((i1 & 0x0000003f) << 16) | ((i2 & 0x0003f000) >>> 4)
27448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood					| (i2 & 0x0000003f);
27548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		}
27648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
27748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		return newKey;
27848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
27948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
28048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	/**
28148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 * the DES engine.
28248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	 */
28348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	protected void desFunc(int[] wKey, byte[] in, int inOff, byte[] out, int outOff)
28448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
28548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		int work, right, left;
28648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
28748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		left = (in[inOff + 0] & 0xff) << 24;
28848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		left |= (in[inOff + 1] & 0xff) << 16;
28948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		left |= (in[inOff + 2] & 0xff) << 8;
29048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		left |= (in[inOff + 3] & 0xff);
29148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
29248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		right = (in[inOff + 4] & 0xff) << 24;
29348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		right |= (in[inOff + 5] & 0xff) << 16;
29448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		right |= (in[inOff + 6] & 0xff) << 8;
29548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		right |= (in[inOff + 7] & 0xff);
29648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
29748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		work = ((left >>> 4) ^ right) & 0x0f0f0f0f;
29848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		right ^= work;
29948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		left ^= (work << 4);
30048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		work = ((left >>> 16) ^ right) & 0x0000ffff;
30148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		right ^= work;
30248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		left ^= (work << 16);
30348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		work = ((right >>> 2) ^ left) & 0x33333333;
30448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		left ^= work;
30548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		right ^= (work << 2);
30648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		work = ((right >>> 8) ^ left) & 0x00ff00ff;
30748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		left ^= work;
30848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		right ^= (work << 8);
30948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		right = ((right << 1) | ((right >>> 31) & 1)) & 0xffffffff;
31048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		work = (left ^ right) & 0xaaaaaaaa;
31148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		left ^= work;
31248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		right ^= work;
31348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		left = ((left << 1) | ((left >>> 31) & 1)) & 0xffffffff;
31448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
31548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		for (int round = 0; round < 8; round++)
31648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		{
31748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			int fval;
31848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
31948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			work = (right << 28) | (right >>> 4);
32048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			work ^= wKey[round * 4 + 0];
32148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			fval = SP7[work & 0x3f];
32248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			fval |= SP5[(work >>> 8) & 0x3f];
32348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			fval |= SP3[(work >>> 16) & 0x3f];
32448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			fval |= SP1[(work >>> 24) & 0x3f];
32548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			work = right ^ wKey[round * 4 + 1];
32648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			fval |= SP8[work & 0x3f];
32748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			fval |= SP6[(work >>> 8) & 0x3f];
32848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			fval |= SP4[(work >>> 16) & 0x3f];
32948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			fval |= SP2[(work >>> 24) & 0x3f];
33048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			left ^= fval;
33148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			work = (left << 28) | (left >>> 4);
33248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			work ^= wKey[round * 4 + 2];
33348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			fval = SP7[work & 0x3f];
33448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			fval |= SP5[(work >>> 8) & 0x3f];
33548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			fval |= SP3[(work >>> 16) & 0x3f];
33648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			fval |= SP1[(work >>> 24) & 0x3f];
33748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			work = left ^ wKey[round * 4 + 3];
33848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			fval |= SP8[work & 0x3f];
33948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			fval |= SP6[(work >>> 8) & 0x3f];
34048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			fval |= SP4[(work >>> 16) & 0x3f];
34148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			fval |= SP2[(work >>> 24) & 0x3f];
34248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			right ^= fval;
34348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		}
34448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
34548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		right = (right << 31) | (right >>> 1);
34648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		work = (left ^ right) & 0xaaaaaaaa;
34748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		left ^= work;
34848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		right ^= work;
34948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		left = (left << 31) | (left >>> 1);
35048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		work = ((left >>> 8) ^ right) & 0x00ff00ff;
35148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		right ^= work;
35248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		left ^= (work << 8);
35348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		work = ((left >>> 2) ^ right) & 0x33333333;
35448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		right ^= work;
35548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		left ^= (work << 2);
35648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		work = ((right >>> 16) ^ left) & 0x0000ffff;
35748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		left ^= work;
35848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		right ^= (work << 16);
35948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		work = ((right >>> 4) ^ left) & 0x0f0f0f0f;
36048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		left ^= work;
36148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		right ^= (work << 4);
36248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
36348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		out[outOff + 0] = (byte) ((right >>> 24) & 0xff);
36448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		out[outOff + 1] = (byte) ((right >>> 16) & 0xff);
36548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		out[outOff + 2] = (byte) ((right >>> 8) & 0xff);
36648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		out[outOff + 3] = (byte) (right & 0xff);
36748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		out[outOff + 4] = (byte) ((left >>> 24) & 0xff);
36848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		out[outOff + 5] = (byte) ((left >>> 16) & 0xff);
36948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		out[outOff + 6] = (byte) ((left >>> 8) & 0xff);
37048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		out[outOff + 7] = (byte) (left & 0xff);
37148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
37248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood}
373