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 ISO10126-2 padding to a block. 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class ISO10126d2Padding 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project implements BlockCipherPadding 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project SecureRandom random; 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Initialise the padder. 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param random a SecureRandom if available. 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void init(SecureRandom random) 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throws IllegalArgumentException 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (random != null) 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.random = random; 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project else 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.random = new SecureRandom(); 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the name of the algorithm the padder implements. 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the name of the algorithm the padder implements. 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String getPaddingName() 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return "ISO10126-2"; 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * add the pad bytes to the passed in block, returning the 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * number of bytes added. 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int addPadding( 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] in, 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int inOff) 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte code = (byte)(in.length - inOff); 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (inOff < (in.length - 1)) 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project in[inOff] = (byte)random.nextInt(); 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project inOff++; 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project in[inOff] = code; 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return code; 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return the number of pad bytes present in the block. 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int padCount(byte[] in) 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throws InvalidCipherTextException 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int count = in[in.length - 1] & 0xff; 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (count > in.length) 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new InvalidCipherTextException("pad block corrupted"); 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return count; 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 80