• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package org.bouncycastle.crypto.paddings;
2 
3 import java.security.SecureRandom;
4 
5 import 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  */
14 public class TBCPadding
15     implements BlockCipherPadding
16 {
17     /**
18      * Initialise the padder.
19      *
20      * @param random - a SecureRandom if available.
21      */
init(SecureRandom random)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      */
getPaddingName()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      */
addPadding( byte[] in, int inOff)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      */
padCount(byte[] in)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