org.bouncycastle.crypto.modes
Class EAXBlockCipher

java.lang.Object
  extended by org.bouncycastle.crypto.modes.EAXBlockCipher
All Implemented Interfaces:
AEADBlockCipher

public class EAXBlockCipher
extends java.lang.Object
implements AEADBlockCipher

A Two-Pass Authenticated-Encryption Scheme Optimized for Simplicity and Efficiency - by M. Bellare, P. Rogaway, D. Wagner. http://www.cs.ucdavis.edu/~rogaway/papers/eax.pdf EAX is an AEAD scheme based on CTR and OMAC1/CMAC, that uses a single block cipher to encrypt and authenticate data. It's on-line (the length of a message isn't needed to begin processing it), has good performances, it's simple and provably secure (provided the underlying block cipher is secure). Of course, this implementations is NOT thread-safe.


Field Summary
private  byte[] associatedTextMac
           
private  int blockSize
           
private  byte[] bufBlock
           
private  int bufOff
           
private  SICBlockCipher cipher
           
private static byte cTAG
           
private  boolean forEncryption
           
private static byte hTAG
           
private  Mac mac
           
private  byte[] macBlock
           
private  int macSize
           
private  byte[] nonceMac
           
private static byte nTAG
           
 
Constructor Summary
EAXBlockCipher(BlockCipher cipher)
          Constructor that accepts an instance of a block cipher engine.
 
Method Summary
private  void calculateMac()
           
 int doFinal(byte[] out, int outOff)
          Finish the operation either appending or verifying the MAC at the end of the data.
 java.lang.String getAlgorithmName()
          Return the name of the algorithm.
 int getBlockSize()
           
 byte[] getMac()
          Return the value of the MAC associated with the last stream processed.
 int getOutputSize(int len)
          return the size of the output buffer required for a processBytes plus a doFinal with an input of len bytes.
 BlockCipher getUnderlyingCipher()
          return the cipher this object wraps.
 int getUpdateOutputSize(int len)
          return the size of the output buffer required for a processBytes an input of len bytes.
 void init(boolean forEncryption, CipherParameters params)
          initialise the underlying cipher.
private  int process(byte b, byte[] out, int outOff)
           
 int processByte(byte in, byte[] out, int outOff)
          encrypt/decrypt a single byte.
 int processBytes(byte[] in, int inOff, int len, byte[] out, int outOff)
          process a block of bytes from in putting the result into out.
 void reset()
          Reset the cipher.
private  boolean verifyMac(byte[] mac, int off)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

nTAG

private static final byte nTAG
See Also:
Constant Field Values

hTAG

private static final byte hTAG
See Also:
Constant Field Values

cTAG

private static final byte cTAG
See Also:
Constant Field Values

cipher

private SICBlockCipher cipher

forEncryption

private boolean forEncryption

blockSize

private int blockSize

mac

private Mac mac

nonceMac

private byte[] nonceMac

associatedTextMac

private byte[] associatedTextMac

macBlock

private byte[] macBlock

macSize

private int macSize

bufBlock

private byte[] bufBlock

bufOff

private int bufOff
Constructor Detail

EAXBlockCipher

public EAXBlockCipher(BlockCipher cipher)
Constructor that accepts an instance of a block cipher engine.

Parameters:
cipher - the engine to use
Method Detail

getAlgorithmName

public java.lang.String getAlgorithmName()
Description copied from interface: AEADBlockCipher
Return the name of the algorithm.

Specified by:
getAlgorithmName in interface AEADBlockCipher
Returns:
the algorithm name.

getUnderlyingCipher

public BlockCipher getUnderlyingCipher()
Description copied from interface: AEADBlockCipher
return the cipher this object wraps.

Specified by:
getUnderlyingCipher in interface AEADBlockCipher
Returns:
the cipher this object wraps.

getBlockSize

public int getBlockSize()

init

public void init(boolean forEncryption,
                 CipherParameters params)
          throws java.lang.IllegalArgumentException
Description copied from interface: AEADBlockCipher
initialise the underlying cipher. Parameter can either be an AEADParameters or a ParametersWithIV object.

Specified by:
init in interface AEADBlockCipher
Parameters:
forEncryption - true if we are setting up for encryption, false otherwise.
params - the necessary parameters for the underlying cipher to be initialised.
Throws:
java.lang.IllegalArgumentException - if the params argument is inappropriate.

calculateMac

private void calculateMac()

reset

public void reset()
Description copied from interface: AEADBlockCipher
Reset the cipher. After resetting the cipher is in the same state as it was after the last init (if there was one).

Specified by:
reset in interface AEADBlockCipher

processByte

public int processByte(byte in,
                       byte[] out,
                       int outOff)
                throws DataLengthException
Description copied from interface: AEADBlockCipher
encrypt/decrypt a single byte.

Specified by:
processByte in interface AEADBlockCipher
Parameters:
in - the byte to be processed.
out - the output buffer the processed byte goes into.
outOff - the offset into the output byte array the processed data starts at.
Returns:
the number of bytes written to out.
Throws:
DataLengthException - if the output buffer is too small.

processBytes

public int processBytes(byte[] in,
                        int inOff,
                        int len,
                        byte[] out,
                        int outOff)
                 throws DataLengthException
Description copied from interface: AEADBlockCipher
process a block of bytes from in putting the result into out.

Specified by:
processBytes in interface AEADBlockCipher
Parameters:
in - the input byte array.
inOff - the offset into the in array where the data to be processed starts.
len - the number of bytes to be processed.
out - the output buffer the processed bytes go into.
outOff - the offset into the output byte array the processed data starts at.
Returns:
the number of bytes written to out.
Throws:
DataLengthException - if the output buffer is too small.

doFinal

public int doFinal(byte[] out,
                   int outOff)
            throws java.lang.IllegalStateException,
                   InvalidCipherTextException
Description copied from interface: AEADBlockCipher
Finish the operation either appending or verifying the MAC at the end of the data.

Specified by:
doFinal in interface AEADBlockCipher
Parameters:
out - space for any resulting output data.
outOff - offset into out to start copying the data at.
Returns:
number of bytes written into out.
Throws:
java.lang.IllegalStateException - if the cipher is in an inappropriate state.
InvalidCipherTextException - if the MAC fails to match.

getMac

public byte[] getMac()
Description copied from interface: AEADBlockCipher
Return the value of the MAC associated with the last stream processed.

Specified by:
getMac in interface AEADBlockCipher
Returns:
MAC for plaintext data.

getUpdateOutputSize

public int getUpdateOutputSize(int len)
Description copied from interface: AEADBlockCipher
return the size of the output buffer required for a processBytes an input of len bytes.

Specified by:
getUpdateOutputSize in interface AEADBlockCipher
Parameters:
len - the length of the input.
Returns:
the space required to accommodate a call to processBytes with len bytes of input.

getOutputSize

public int getOutputSize(int len)
Description copied from interface: AEADBlockCipher
return the size of the output buffer required for a processBytes plus a doFinal with an input of len bytes.

Specified by:
getOutputSize in interface AEADBlockCipher
Parameters:
len - the length of the input.
Returns:
the space required to accommodate a call to processBytes and doFinal with len bytes of input.

process

private int process(byte b,
                    byte[] out,
                    int outOff)

verifyMac

private boolean verifyMac(byte[] mac,
                          int off)