FileDocCategorySizeDatePackage
Cipher.javaAPI DocphoneME MR2 API (J2ME)13298Wed May 02 18:00:24 BST 2007com.sun.midp.crypto

Cipher

public abstract class Cipher extends Object
Implements an abstract class that generalizes all ciphers. It is modelled after javax.crypto.Cipher.

Fields Summary
protected static final int
MODE_UNINITIALIZED
Flag to indicate the current cipher algorithm is unknown.
public static final int
ENCRYPT_MODE
Used in init to indicate encryption mode.
public static final int
DECRYPT_MODE
Used in init to indicate decryption mode.
Constructors Summary
protected Cipher()
Protected constructor.


       
      
    
Methods Summary
public abstract intdoFinal(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset)
Encrypts or decrypts data in a single-part operation, or finishes a multiple-part operation. The data is encrypted or decrypted, depending on how this cipher was initialized.

The first inputLen bytes in the input buffer, starting at inputOffset inclusive, and any input bytes that may have been buffered during a previous update operation, are processed, with padding (if requested) being applied. The result is stored in the output buffer, starting at outputOffset inclusive.

If the output buffer is too small to hold the result, a ShortBufferException is thrown. In this case, repeat this call with a larger output buffer.

Upon finishing, this method resets this cipher object to the state it was in when previously initialized via a call to init. That is, the object is reset and available to encrypt or decrypt (depending on the operation mode that was specified in the call to init) more data.

Note: if any exception is thrown, this cipher object may need to be reset before it can be used again.

Note: this method should be copy-safe, which means the input and output buffers can reference the same byte array and no unprocessed input data is overwritten when the result is copied into the output buffer.

param
input the input buffer
param
inputOffset the offset in input where the input starts
param
inputLen the input length
param
output the buffer for the result
param
outputOffset the offset in output where the result is stored
return
the number of bytes stored in output
exception
IllegalStateException if this cipher is in a wrong state (e.g., has not been initialized)
exception
IllegalBlockSizeException if this cipher is a block cipher, no padding has been requested (only in encryption mode), and the total input length of the data processed by this cipher is not a multiple of block size
exception
ShortBufferException if the given output buffer is too small to hold the result
exception
BadPaddingException if this cipher is in decryption mode, and (un)padding has been requested, but the decrypted data is not bounded by the appropriate padding bytes

public byte[]getIV()
Returns the initialization vector (IV) in a new buffer. This is useful in the case where a random IV was created.

return
the initialization vector in a new buffer, or null if the underlying algorithm does not use an IV, or if the IV has not yet been set.

        return null;
    
public static final com.sun.midp.crypto.CiphergetInstance(java.lang.String transformation)
Generates a Cipher object that implements the specified transformation.

param
transformation the name of the transformation, e.g., DES/CBC/PKCS5Padding. See Appendix A in the Java Cryptography Extension Reference Guide for information about standard transformation names.
return
a cipher that implements the requested transformation
exception
NoSuchAlgorithmException if the specified transformation is not available
exception
NoSuchPaddingException if transformation contains a padding scheme that is not available.


        Cipher cipher = null;
        String alg = ("" + transformation).toUpperCase().trim();
        String chainingMode = "";
        String padding = "";

        if (alg.indexOf("/") != -1) {
            int first = alg.indexOf("/");
            int second = alg.indexOf("/", first + 1);
            if (second == alg.lastIndexOf('/")) {
                chainingMode = alg.substring(first + 1, second).trim();
                padding = alg.substring(second + 1).trim();
                alg = alg.substring(0, first).trim();
            }
        }

        // We have the generic equivalent of RC4: ARC4 or ARCFOUR.
        if (alg.equals("RC4") || alg.equals("ARCFOUR")) {
            alg = "ARC4";
        }

        try {
            Class cipherClass;

            cipherClass = Class.forName("com.sun.midp.crypto." + alg);
            cipher = (Cipher)cipherClass.newInstance();
        } catch (Throwable t) {
            throw new NoSuchAlgorithmException(transformation);
        }

        try {
            cipher.setChainingModeAndPadding(chainingMode, padding);
        } catch (IllegalArgumentException iae) {
	    // throw NoSuchAlgorithmException if the chainingMode is invalid
	    // (setChainingModeAndPadding() throws IllegalArgumentException
	    // in this case)
            throw new NoSuchAlgorithmException(transformation);
	}
        
        return cipher;
    
public voidinit(int opmode, Key key)
Initializes this cipher with a key.

The cipher is initialized for one of the following operations: encryption, decryption, depending on the value of opmode.

If this cipher requires any algorithm parameters that cannot be derived from the given key, the underlying cipher implementation is supposed to generate the required parameters itself (using provider-specific default or random values) if it is being initialized for encryption, and raise an InvalidKeyException if it is being initialized for decryption.

Note that when a Cipher object is initialized, it loses all previously-acquired state. In other words, initializing a Cipher is equivalent to creating a new instance of that Cipher and initializing it.

param
opmode the operation mode of this cipher (this is one of the following: ENCRYPT_MODE or DECRYPT_MODE)
param
key the key
exception
InvalidKeyException if the given key is inappropriate for initializing this cipher, or if this cipher is being initialized for decryption and requires algorithm parameters that cannot be determined from the given key, or if the given key has a keysize that exceeds the maximum allowable keysize.

        try {
            init(opmode, key, null);
        } catch (InvalidAlgorithmParameterException e) {
            throw new InvalidKeyException();
        }
    
public abstract voidinit(int opmode, Key key, CryptoParameter params)
Initializes this cipher with a key and a set of algorithm parameters.

The cipher is initialized for one of the following operations: encryption or decryption depending on the value of opmode.

If this cipher requires any algorithm parameters and params is null, the underlying cipher implementation is supposed to generate the required parameters itself (using provider-specific default or random values) if it is being initialized for encryption, and raise an InvalidAlgorithmParameterException if it is being initialized for decryption.

Note that when a Cipher object is initialized, it loses all previously-acquired state. In other words, initializing a Cipher is equivalent to creating a new instance of that Cipher and initializing it.

param
opmode the operation mode of this cipher (this is one of the following: ENCRYPT_MODE or DECRYPT_MODE)
param
key the encryption key
param
params the algorithm parameters
exception
InvalidKeyException if the given key is inappropriate for initializing this cipher, or its keysize exceeds the maximum allowable keysize.
exception
InvalidAlgorithmParameterException if the given algorithm parameters are inappropriate for this cipher, or this cipher is being initialized for decryption and requires algorithm parameters and params is null, or the given algorithm parameters imply a cryptographic strength that would exceed the legal limits.

protected abstract voidsetChainingModeAndPadding(java.lang.String mode, java.lang.String padding)
Called by the factory method to set the mode and padding parameters. Need because Class.newInstance does not take args.

param
mode the chaining mode parsed from the transformation parameter of getInstance and upper cased
param
padding the paddinge parsed from the transformation parameter of getInstance and upper cased
exception
NoSuchPaddingException if transformation contains a padding scheme that is not available.

public abstract intupdate(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset)
Continues a multiple-part encryption or decryption operation (depending on how this cipher was initialized), processing another data part.

The first inputLen bytes in the input buffer, starting at inputOffset inclusive, are processed, and the result is stored in the output buffer, starting at outputOffset inclusive.

If the output buffer is too small to hold the result, a ShortBufferException is thrown. In this case, repeat this call with a larger output buffer.

If inputLen is zero, this method returns a length of zero.

Note: this method should be copy-safe, which means the input and output buffers can reference the same byte array and no unprocessed input data is overwritten when the result is copied into the output buffer.

param
input the input buffer
param
inputOffset the offset in input where the input starts
param
inputLen the input length
param
output the buffer for the result
param
outputOffset the offset in output where the result is stored
return
the number of bytes stored in output
exception
IllegalStateException if this cipher is in a wrong state (e.g., has not been initialized)
exception
ShortBufferException if the given output buffer is too small to hold the result