Home | History | Annotate | Download | only in crypto
      1 package org.bouncycastle.crypto;
      2 
      3 /**
      4  * A parent class for block cipher modes that do not require block aligned data to be processed, but can function in
      5  * a streaming mode.
      6  */
      7 public abstract class StreamBlockCipher
      8     implements BlockCipher, StreamCipher
      9 {
     10     private final BlockCipher cipher;
     11 
     12     protected StreamBlockCipher(BlockCipher cipher)
     13     {
     14         this.cipher = cipher;
     15     }
     16 
     17     /**
     18      * return the underlying block cipher that we are wrapping.
     19      *
     20      * @return the underlying block cipher that we are wrapping.
     21      */
     22     public BlockCipher getUnderlyingCipher()
     23     {
     24         return cipher;
     25     }
     26 
     27     public final byte returnByte(byte in)
     28     {
     29         return calculateByte(in);
     30     }
     31 
     32     public int processBytes(byte[] in, int inOff, int len, byte[] out, int outOff)
     33         throws DataLengthException
     34     {
     35         if (outOff + len > out.length)
     36         {
     37             throw new DataLengthException("output buffer too short");
     38         }
     39 
     40         if (inOff + len > in.length)
     41         {
     42             throw new DataLengthException("input buffer too small");
     43         }
     44 
     45         int inStart = inOff;
     46         int inEnd = inOff + len;
     47         int outStart = outOff;
     48 
     49         while (inStart < inEnd)
     50         {
     51              out[outStart++] = calculateByte(in[inStart++]);
     52         }
     53 
     54         return len;
     55     }
     56 
     57     protected abstract byte calculateByte(byte b);
     58 }