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 Trailing-Bit-Compliment padding to a block.
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p>
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This padding pads the block out with the compliment of the last bit
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * of the plain text.
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </p>
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class TBCPadding
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    implements BlockCipherPadding
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Initialise the padder.
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param random - a SecureRandom if available.
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void init(SecureRandom random)
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throws IllegalArgumentException
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // nothing to do.
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return the name of the algorithm the padder implements.
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the name of the algorithm the padder implements.
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getPaddingName()
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return "TBC";
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * add the pad bytes to the passed in block, returning the
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * number of bytes added.
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <p>
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: this assumes that the last block of plain text is always
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * passed to it inside in. i.e. if inOff is zero, indicating the
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * entire block is to be overwritten with padding the value of in
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * should be the same as the last block of plain text.
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * </p>
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int addPadding(
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[]  in,
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     inOff)
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     count = in.length - inOff;
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte    code;
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (inOff > 0)
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            code = (byte)((in[inOff - 1] & 0x01) == 0 ? 0xff : 0x00);
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            code = (byte)((in[in.length - 1] & 0x01) == 0 ? 0xff : 0x00);
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (inOff < in.length)
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            in[inOff] = code;
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            inOff++;
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return count;
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * return the number of pad bytes present in the block.
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int padCount(byte[] in)
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throws InvalidCipherTextException
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte code = in[in.length - 1];
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int index = in.length - 1;
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (index > 0 && in[index - 1] == code)
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            index--;
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return in.length - index;
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
90