1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.bouncycastle.crypto.modes; 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.crypto.BlockCipher; 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.crypto.CipherParameters; 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.crypto.DataLengthException; 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.crypto.params.ParametersWithIV; 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * implements the GOST 28147 OFB counter mode (GCTR). 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class GOFBBlockCipher 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project implements BlockCipher 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private byte[] IV; 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private byte[] ofbV; 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private byte[] ofbOutV; 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final int blockSize; 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final BlockCipher cipher; 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean firstStep = true; 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int N3; 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int N4; 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static final int C1 = 16843012; //00000001000000010000000100000100 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project static final int C2 = 16843009; //00000001000000010000000100000001 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Basic constructor. 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param cipher the block cipher to be used as the basis of the 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * counter mode (must have a 64 bit block size). 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public GOFBBlockCipher( 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project BlockCipher cipher) 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.cipher = cipher; 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.blockSize = cipher.getBlockSize(); 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (blockSize != 8) 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IllegalArgumentException("GTCR only for 64 bit block ciphers"); 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.IV = new byte[cipher.getBlockSize()]; 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.ofbV = new byte[cipher.getBlockSize()]; 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.ofbOutV = new byte[cipher.getBlockSize()]; 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return the underlying block cipher that we are wrapping. 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the underlying block cipher that we are wrapping. 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public BlockCipher getUnderlyingCipher() 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return cipher; 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Initialise the cipher and, possibly, the initialisation vector (IV). 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If an IV isn't passed as part of the parameter, the IV will be all zeros. 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * An IV which is too short is handled in FIPS compliant fashion. 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param encrypting if true the cipher is initialised for 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * encryption, if false for decryption. 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param params the key and other data required by the cipher. 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @exception IllegalArgumentException if the params argument is 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * inappropriate. 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void init( 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean encrypting, //ignored by this CTR mode 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CipherParameters params) 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throws IllegalArgumentException 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project firstStep = true; 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project N3 = 0; 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project N4 = 0; 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (params instanceof ParametersWithIV) 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ParametersWithIV ivParam = (ParametersWithIV)params; 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] iv = ivParam.getIV(); 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (iv.length < IV.length) 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // prepend the supplied IV with zeros (per FIPS PUB 81) 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.arraycopy(iv, 0, IV, IV.length - iv.length, iv.length); 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < IV.length - iv.length; i++) 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project IV[i] = 0; 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.arraycopy(iv, 0, IV, 0, IV.length); 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project reset(); 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cipher.init(true, ivParam.getParameters()); 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project reset(); 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cipher.init(true, params); 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return the algorithm name and mode. 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the name of the underlying algorithm followed by "/GCTR" 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and the block size in bits 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String getAlgorithmName() 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return cipher.getAlgorithmName() + "/GCTR"; 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return the block size we are operating at (in bytes). 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the block size we are operating at (in bytes). 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int getBlockSize() 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return blockSize; 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Process one block of input from the array in and write it to 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the out array. 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param in the array containing the input data. 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param inOff offset into the in array the data starts at. 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param out the array the output data will be copied into. 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param outOff the offset into the out array the output will start at. 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @exception DataLengthException if there isn't enough data in in, or 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * space in out. 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @exception IllegalStateException if the cipher isn't initialised. 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the number of bytes processed and produced. 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int processBlock( 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] in, 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int inOff, 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] out, 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int outOff) 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throws DataLengthException, IllegalStateException 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((inOff + blockSize) > in.length) 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new DataLengthException("input buffer too short"); 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((outOff + blockSize) > out.length) 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new DataLengthException("output buffer too short"); 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (firstStep) 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project firstStep = false; 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cipher.processBlock(ofbV, 0, ofbOutV, 0); 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project N3 = bytesToint(ofbOutV, 0); 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project N4 = bytesToint(ofbOutV, 4); 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project N3 += C2; 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project N4 += C1; 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project intTobytes(N3, ofbV, 0); 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project intTobytes(N4, ofbV, 4); 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cipher.processBlock(ofbV, 0, ofbOutV, 0); 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // XOR the ofbV with the plaintext producing the cipher text (and 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // the next input block). 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < blockSize; i++) 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out[outOff + i] = (byte)(ofbOutV[i] ^ in[inOff + i]); 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // change over the input block. 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.arraycopy(ofbV, blockSize, ofbV, 0, ofbV.length - blockSize); 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.arraycopy(ofbOutV, 0, ofbV, ofbV.length - blockSize, blockSize); 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return blockSize; 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * reset the feedback vector back to the IV and reset the underlying 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * cipher. 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void reset() 200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project System.arraycopy(IV, 0, ofbV, 0, IV.length); 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cipher.reset(); 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project //array of bytes to type int 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private int bytesToint( 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] in, 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int inOff) 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return ((in[inOff + 3] << 24) & 0xff000000) + ((in[inOff + 2] << 16) & 0xff0000) + 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ((in[inOff + 1] << 8) & 0xff00) + (in[inOff] & 0xff); 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project //int to array of bytes 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private void intTobytes( 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int num, 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] out, 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int outOff) 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out[outOff + 3] = (byte)(num >>> 24); 222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out[outOff + 2] = (byte)(num >>> 16); 223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out[outOff + 1] = (byte)(num >>> 8); 224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out[outOff] = (byte)num; 225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 227