Home | History | Annotate | Download | only in paddings
      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 X9.23 padding to a block - if a SecureRandom is
      9  * passed in random padding is assumed, otherwise padding with zeros is used.
     10  */
     11 public class X923Padding
     12     implements BlockCipherPadding
     13 {
     14     SecureRandom    random = null;
     15 
     16     /**
     17      * Initialise the padder.
     18      *
     19      * @param random a SecureRandom if one is available.
     20      */
     21     public void init(SecureRandom random)
     22         throws IllegalArgumentException
     23     {
     24         this.random = random;
     25     }
     26 
     27     /**
     28      * Return the name of the algorithm the padder implements.
     29      *
     30      * @return the name of the algorithm the padder implements.
     31      */
     32     public String getPaddingName()
     33     {
     34         return "X9.23";
     35     }
     36 
     37     /**
     38      * add the pad bytes to the passed in block, returning the
     39      * number of bytes added.
     40      */
     41     public int addPadding(
     42         byte[]  in,
     43         int     inOff)
     44     {
     45         byte code = (byte)(in.length - inOff);
     46 
     47         while (inOff < in.length - 1)
     48         {
     49             if (random == null)
     50             {
     51                 in[inOff] = 0;
     52             }
     53             else
     54             {
     55                 in[inOff] = (byte)random.nextInt();
     56             }
     57             inOff++;
     58         }
     59 
     60         in[inOff] = code;
     61 
     62         return code;
     63     }
     64 
     65     /**
     66      * return the number of pad bytes present in the block.
     67      */
     68     public int padCount(byte[] in)
     69         throws InvalidCipherTextException
     70     {
     71         int count = in[in.length - 1] & 0xff;
     72 
     73         if (count > in.length)
     74         {
     75             throw new InvalidCipherTextException("pad block corrupted");
     76         }
     77 
     78         return count;
     79     }
     80 }
     81