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