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