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