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