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