1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.bouncycastle.crypto.paddings; 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.SecureRandom; 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.crypto.InvalidCipherTextException; 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * A padder that adds Trailing-Bit-Compliment padding to a block. 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p> 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This padding pads the block out with the compliment of the last bit 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * of the plain text. 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </p> 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class TBCPadding 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project implements BlockCipherPadding 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Initialise the padder. 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param random - a SecureRandom if available. 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void init(SecureRandom random) 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throws IllegalArgumentException 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // nothing to do. 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the name of the algorithm the padder implements. 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the name of the algorithm the padder implements. 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String getPaddingName() 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return "TBC"; 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * add the pad bytes to the passed in block, returning the 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * number of bytes added. 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p> 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: this assumes that the last block of plain text is always 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * passed to it inside in. i.e. if inOff is zero, indicating the 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * entire block is to be overwritten with padding the value of in 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * should be the same as the last block of plain text. 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </p> 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int addPadding( 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] in, 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int inOff) 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int count = in.length - inOff; 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte code; 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (inOff > 0) 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project code = (byte)((in[inOff - 1] & 0x01) == 0 ? 0xff : 0x00); 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project code = (byte)((in[in.length - 1] & 0x01) == 0 ? 0xff : 0x00); 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (inOff < in.length) 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project in[inOff] = code; 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project inOff++; 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return count; 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return the number of pad bytes present in the block. 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int padCount(byte[] in) 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throws InvalidCipherTextException 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte code = in[in.length - 1]; 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int index = in.length - 1; 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (index > 0 && in[index - 1] == code) 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project index--; 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return in.length - index; 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 90