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