org.bouncycastle.crypto.engines
Class AESFastEngine

java.lang.Object
  extended by org.bouncycastle.crypto.engines.AESFastEngine
All Implemented Interfaces:
BlockCipher

public class AESFastEngine
extends java.lang.Object
implements BlockCipher

an implementation of the AES (Rijndael), from FIPS-197.

For further details see: http://csrc.nist.gov/encryption/aes/. This implementation is based on optimizations from Dr. Brian Gladman's paper and C code at http://fp.gladman.plus.com/cryptography_technology/rijndael/ There are three levels of tradeoff of speed vs memory Because java has no preprocessor, they are written as three separate classes from which to choose The fastest uses 8Kbytes of static tables to precompute round calculations, 4 256 word tables for encryption and 4 for decryption. The middle performance version uses only one 256 word table for each, for a total of 2Kbytes, adding 12 rotate operations per round to compute the values contained in the other tables from the contents of the first The slowest version uses no static tables at all and computes the values in each round

This file contains the fast version with 8Kbytes of static tables for round precomputation


Field Summary
private static int BLOCK_SIZE
           
private  int C0
           
private  int C1
           
private  int C2
           
private  int C3
           
private  boolean forEncryption
           
private static int m1
           
private static int m2
           
private static int m3
           
private static int[] rcon
           
private  int ROUNDS
           
private static byte[] S
           
private static byte[] Si
           
private static int[] T0
           
private static int[] T1
           
private static int[] T2
           
private static int[] T3
           
private static int[] Tinv0
           
private static int[] Tinv1
           
private static int[] Tinv2
           
private static int[] Tinv3
           
private  int[][] WorkingKey
           
 
Constructor Summary
AESFastEngine()
          default constructor - 128 bit block size.
 
Method Summary
private  void decryptBlock(int[][] KW)
           
private  void encryptBlock(int[][] KW)
           
private  int FFmulX(int x)
           
private  int[][] generateWorkingKey(byte[] key, boolean forEncryption)
          Calculate the necessary round keys The number of calculations depends on key size and block size AES specified a fixed block size of 128 bits and key sizes 128/192/256 bits This code is written assuming those are the only possible values
 java.lang.String getAlgorithmName()
          Return the name of the algorithm the cipher implements.
 int getBlockSize()
          Return the block size for this cipher (in bytes).
 void init(boolean forEncryption, CipherParameters params)
          initialise an AES cipher.
private  int inv_mcol(int x)
           
private  void packBlock(byte[] bytes, int off)
           
 int processBlock(byte[] in, int inOff, byte[] out, int outOff)
          Process one block of input from the array in and write it to the out array.
 void reset()
          Reset the cipher.
private  int shift(int r, int shift)
           
private  int subWord(int x)
           
private  void unpackBlock(byte[] bytes, int off)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

S

private static final byte[] S

Si

private static final byte[] Si

rcon

private static final int[] rcon

T0

private static final int[] T0

T1

private static final int[] T1

T2

private static final int[] T2

T3

private static final int[] T3

Tinv0

private static final int[] Tinv0

Tinv1

private static final int[] Tinv1

Tinv2

private static final int[] Tinv2

Tinv3

private static final int[] Tinv3

m1

private static final int m1
See Also:
Constant Field Values

m2

private static final int m2
See Also:
Constant Field Values

m3

private static final int m3
See Also:
Constant Field Values

ROUNDS

private int ROUNDS

WorkingKey

private int[][] WorkingKey

C0

private int C0

C1

private int C1

C2

private int C2

C3

private int C3

forEncryption

private boolean forEncryption

BLOCK_SIZE

private static final int BLOCK_SIZE
See Also:
Constant Field Values
Constructor Detail

AESFastEngine

public AESFastEngine()
default constructor - 128 bit block size.

Method Detail

shift

private int shift(int r,
                  int shift)

FFmulX

private int FFmulX(int x)

inv_mcol

private int inv_mcol(int x)

subWord

private int subWord(int x)

generateWorkingKey

private int[][] generateWorkingKey(byte[] key,
                                   boolean forEncryption)
Calculate the necessary round keys The number of calculations depends on key size and block size AES specified a fixed block size of 128 bits and key sizes 128/192/256 bits This code is written assuming those are the only possible values


init

public void init(boolean forEncryption,
                 CipherParameters params)
initialise an AES cipher.

Specified by:
init in interface BlockCipher
Parameters:
forEncryption - whether or not we are for encryption.
params - the parameters required to set up the cipher.
Throws:
java.lang.IllegalArgumentException - if the params argument is inappropriate.

getAlgorithmName

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

Specified by:
getAlgorithmName in interface BlockCipher
Returns:
the name of the algorithm the cipher implements.

getBlockSize

public int getBlockSize()
Description copied from interface: BlockCipher
Return the block size for this cipher (in bytes).

Specified by:
getBlockSize in interface BlockCipher
Returns:
the block size for this cipher in bytes.

processBlock

public int processBlock(byte[] in,
                        int inOff,
                        byte[] out,
                        int outOff)
Description copied from interface: BlockCipher
Process one block of input from the array in and write it to the out array.

Specified by:
processBlock in interface BlockCipher
Parameters:
in - the array containing the input data.
inOff - offset into the in array the data starts at.
out - the array the output data will be copied into.
outOff - the offset into the out array the output will start at.
Returns:
the number of bytes processed and produced.

reset

public void reset()
Description copied from interface: BlockCipher
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 BlockCipher

unpackBlock

private final void unpackBlock(byte[] bytes,
                               int off)

packBlock

private final void packBlock(byte[] bytes,
                             int off)

encryptBlock

private final void encryptBlock(int[][] KW)

decryptBlock

private final void decryptBlock(int[][] KW)