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