Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

gnu.javax.crypto.mode
Class ICM  view ICM download ICM.java

java.lang.Object
  extended bygnu.javax.crypto.mode.BaseMode
      extended bygnu.javax.crypto.mode.ICM
All Implemented Interfaces:
java.lang.Cloneable, gnu.javax.crypto.cipher.IBlockCipher, IMode

public class ICM
extends BaseMode
implements java.lang.Cloneable

An implementation of David McGrew Integer Counter Mode (ICM) as an IMode.

ICM is a way to define a pseudorandom keystream generator using a block cipher. The keystream can be used for additive encryption, key derivation, or any other application requiring pseudorandom data. In the case of this class, it is used as additive encryption, XOR-ing the keystream with the input text --for both encryption and decryption.

In ICM, the keystream is logically broken into segments. Each segment is identified with a segment index, and the segments have equal lengths. This segmentation makes ICM especially appropriate for securing packet-based protocols. ICM also allows a variety of configurations based, among other things, on two parameters: the block index length and the segment index length. A constraint on those two values exists: The sum of segment index length and block index length must not half the block size of the underlying cipher. This requirement protects the ICM keystream generator from potentially failing to be pseudorandom.

For simplicity, this implementation, fixes these two values to the following:

For a 128-bit block cipher, the above values imply a maximum keystream length of 295,147,905,179,352,825,856 octets, since in ICM, each segment must not exceed the value (256 ^ block index length) * block length octets.

Finally, for this implementation of the ICM, the IV placeholder will be used to pass the value of the Offset in the keystream segment.

References:

  1. Integer Counter Mode, David A. McGrew.


Field Summary
private  java.math.BigInteger blockNdx
          The index of the next block for a given keystream segment.
private  java.math.BigInteger C0
          The initial counter for a given keystream segment.
private  java.math.BigInteger counterRange
          A work constant.
private  java.math.BigInteger maxBlocksPerSegment
          Maximum number of blocks per segment.
private static java.math.BigInteger TWO_FIFTY_SIX
          The integer value 256 as a BigInteger.
 
Fields inherited from class gnu.javax.crypto.mode.BaseMode
cipher, cipherBlockSize, iv, lock, modeBlockSize, name, state
 
Fields inherited from interface gnu.javax.crypto.mode.IMode
DECRYPTION, ENCRYPTION, IV, MODE_BLOCK_SIZE, STATE
 
Fields inherited from interface gnu.javax.crypto.cipher.IBlockCipher
CIPHER_BLOCK_SIZE, KEY_MATERIAL
 
Constructor Summary
(package private) ICM(gnu.javax.crypto.cipher.IBlockCipher underlyingCipher, int cipherBlockSize)
          Trivial package-private constructor for use by the Factory class.
private ICM(ICM that)
          Private constructor for cloning purposes.
 
Method Summary
 java.lang.Object clone()
          Returns a clone of this instance.
 void decryptBlock(byte[] in, int i, byte[] out, int o)
          Decrypts exactly one block of ciphertext.
 void encryptBlock(byte[] in, int i, byte[] out, int o)
          Encrypts exactly one block of plaintext.
private  void icm(byte[] in, int inOffset, byte[] out, int outOffset)
           
 void setup()
          The initialisation phase of the concrete mode implementation.
 void teardown()
          The termination phase of the concrete mode implementation.
 
Methods inherited from class gnu.javax.crypto.mode.BaseMode
blockSizes, currentBlockSize, defaultBlockSize, defaultKeySize, init, keySizes, name, reset, selfTest, update
 
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

TWO_FIFTY_SIX

private static final java.math.BigInteger TWO_FIFTY_SIX
The integer value 256 as a BigInteger.


maxBlocksPerSegment

private java.math.BigInteger maxBlocksPerSegment
Maximum number of blocks per segment.


counterRange

private java.math.BigInteger counterRange
A work constant.


C0

private java.math.BigInteger C0
The initial counter for a given keystream segment.


blockNdx

private java.math.BigInteger blockNdx
The index of the next block for a given keystream segment.

Constructor Detail

ICM

ICM(gnu.javax.crypto.cipher.IBlockCipher underlyingCipher,
    int cipherBlockSize)

Trivial package-private constructor for use by the Factory class.


ICM

private ICM(ICM that)

Private constructor for cloning purposes.

Method Detail

clone

public java.lang.Object clone()
Description copied from interface: gnu.javax.crypto.cipher.IBlockCipher

Returns a clone of this instance.

Specified by:
clone in interface gnu.javax.crypto.cipher.IBlockCipher
Specified by:
clone in class BaseMode

setup

public void setup()
Description copied from class: BaseMode
The initialisation phase of the concrete mode implementation.

Specified by:
setup in class BaseMode

teardown

public void teardown()
Description copied from class: BaseMode
The termination phase of the concrete mode implementation.

Specified by:
teardown in class BaseMode

encryptBlock

public void encryptBlock(byte[] in,
                         int i,
                         byte[] out,
                         int o)
Description copied from interface: gnu.javax.crypto.cipher.IBlockCipher

Encrypts exactly one block of plaintext.

Specified by:
encryptBlock in interface gnu.javax.crypto.cipher.IBlockCipher
Specified by:
encryptBlock in class BaseMode

decryptBlock

public void decryptBlock(byte[] in,
                         int i,
                         byte[] out,
                         int o)
Description copied from interface: gnu.javax.crypto.cipher.IBlockCipher

Decrypts exactly one block of ciphertext.

Specified by:
decryptBlock in interface gnu.javax.crypto.cipher.IBlockCipher
Specified by:
decryptBlock in class BaseMode

icm

private void icm(byte[] in,
                 int inOffset,
                 byte[] out,
                 int outOffset)