// Path: mobile/blackberry/src/org/bouncycastle/crypto/ExtendedDigest.java
// public interface ExtendedDigest 
//     extends Digest
// {
//     /**
//      * Return the size in bytes of the internal buffer the digest applies it's compression
//      * function to.
//      * 
//      * @return byte length of the digests internal buffer.
//      */
//     public int getByteLength();
// }
// 
// Path: mobile/blackberry/src/org/bouncycastle/crypto/Mac.java
// public interface Mac
// {
//     /**
//      * Initialise the MAC.
//      *
//      * @param params the key and other data required by the MAC.
//      * @exception IllegalArgumentException if the params argument is
//      * inappropriate.
//      */
//     public void init(CipherParameters params)
//         throws IllegalArgumentException;
// 
//     /**
//      * Return the name of the algorithm the MAC implements.
//      *
//      * @return the name of the algorithm the MAC implements.
//      */
//     public String getAlgorithmName();
// 
//     /**
//      * Return the block size for this MAC (in bytes).
//      *
//      * @return the block size for this MAC in bytes.
//      */
//     public int getMacSize();
// 
//     /**
//      * add a single byte to the mac for processing.
//      *
//      * @param in the byte to be processed.
//      * @exception IllegalStateException if the MAC is not initialised.
//      */
//     public void update(byte in)
//         throws IllegalStateException;
// 
//     /**
//      * @param in the array containing the input.
//      * @param inOff the index in the array the data begins at.
//      * @param len the length of the input starting at inOff.
//      * @exception IllegalStateException if the MAC is not initialised.
//      * @exception DataLengthException if there isn't enough data in in.
//      */
//     public void update(byte[] in, int inOff, int len)
//         throws DataLengthException, IllegalStateException;
// 
//     /**
//      * Compute the final stage of the MAC writing the output to the out
//      * parameter.
//      * <p>
//      * doFinal leaves the MAC in the same state it was after the last init.
//      *
//      * @param out the array the MAC is to be output to.
//      * @param outOff the offset into the out buffer the output is to start at.
//      * @exception DataLengthException if there isn't enough space in out.
//      * @exception IllegalStateException if the MAC is not initialised.
//      */
//     public int doFinal(byte[] out, int outOff)
//         throws DataLengthException, IllegalStateException;
// 
//     /**
//      * Reset the MAC. At the end of resetting the MAC should be in the
//      * in the same state it was after the last init (if there was one).
//      */
//     public void reset();
// }
// 
// Path: mobile/blackberry/src/org/bouncycastle/crypto/params/KeyParameter.java
// public class KeyParameter
//     implements CipherParameters
// {
//     private byte[]  key;
// 
//     public KeyParameter(
//         byte[]  key)
//     {
//         this(key, 0, key.length);
//     }
// 
//     public KeyParameter(
//         byte[]  key,
//         int     keyOff,
//         int     keyLen)
//     {
//         this.key = new byte[keyLen];
// 
//         System.arraycopy(key, keyOff, this.key, 0, keyLen);
//     }
// 
//     public byte[] getKey()
//     {
//         return key;
//     }
// }


import java.util.Hashtable;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.ExtendedDigest;
import org.bouncycastle.crypto.Mac;
import org.bouncycastle.crypto.params.KeyParameter;
    private byte[] outputPad;

    private static Hashtable blockLengths;
    
    static
    {
        blockLengths = new Hashtable();
        
        blockLengths.put("GOST3411", new Integer(32));
        
        blockLengths.put("MD2", new Integer(16));
        blockLengths.put("MD4", new Integer(64));
        blockLengths.put("MD5", new Integer(64));
        
        blockLengths.put("RIPEMD128", new Integer(64));
        blockLengths.put("RIPEMD160", new Integer(64));
        
        blockLengths.put("SHA-1", new Integer(64));
        blockLengths.put("SHA-224", new Integer(64));
        blockLengths.put("SHA-256", new Integer(64));
        blockLengths.put("SHA-384", new Integer(128));
        blockLengths.put("SHA-512", new Integer(128));
        
        blockLengths.put("Tiger", new Integer(64));
        blockLengths.put("Whirlpool", new Integer(64));
    }
    
    private static int getByteLength(
        Digest digest)
    {
// Path: mobile/blackberry/src/org/bouncycastle/crypto/ExtendedDigest.java
// public interface ExtendedDigest 
//     extends Digest
// {
//     /**
//      * Return the size in bytes of the internal buffer the digest applies it's compression
//      * function to.
//      * 
//      * @return byte length of the digests internal buffer.
//      */
//     public int getByteLength();
// }
// 
// Path: mobile/blackberry/src/org/bouncycastle/crypto/Mac.java
// public interface Mac
// {
//     /**
//      * Initialise the MAC.
//      *
//      * @param params the key and other data required by the MAC.
//      * @exception IllegalArgumentException if the params argument is
//      * inappropriate.
//      */
//     public void init(CipherParameters params)
//         throws IllegalArgumentException;
// 
//     /**
//      * Return the name of the algorithm the MAC implements.
//      *
//      * @return the name of the algorithm the MAC implements.
//      */
//     public String getAlgorithmName();
// 
//     /**
//      * Return the block size for this MAC (in bytes).
//      *
//      * @return the block size for this MAC in bytes.
//      */
//     public int getMacSize();
// 
//     /**
//      * add a single byte to the mac for processing.
//      *
//      * @param in the byte to be processed.
//      * @exception IllegalStateException if the MAC is not initialised.
//      */
//     public void update(byte in)
//         throws IllegalStateException;
// 
//     /**
//      * @param in the array containing the input.
//      * @param inOff the index in the array the data begins at.
//      * @param len the length of the input starting at inOff.
//      * @exception IllegalStateException if the MAC is not initialised.
//      * @exception DataLengthException if there isn't enough data in in.
//      */
//     public void update(byte[] in, int inOff, int len)
//         throws DataLengthException, IllegalStateException;
// 
//     /**
//      * Compute the final stage of the MAC writing the output to the out
//      * parameter.
//      * <p>
//      * doFinal leaves the MAC in the same state it was after the last init.
//      *
//      * @param out the array the MAC is to be output to.
//      * @param outOff the offset into the out buffer the output is to start at.
//      * @exception DataLengthException if there isn't enough space in out.
//      * @exception IllegalStateException if the MAC is not initialised.
//      */
//     public int doFinal(byte[] out, int outOff)
//         throws DataLengthException, IllegalStateException;
// 
//     /**
//      * Reset the MAC. At the end of resetting the MAC should be in the
//      * in the same state it was after the last init (if there was one).
//      */
//     public void reset();
// }
// 
// Path: mobile/blackberry/src/org/bouncycastle/crypto/params/KeyParameter.java
// public class KeyParameter
//     implements CipherParameters
// {
//     private byte[]  key;
// 
//     public KeyParameter(
//         byte[]  key)
//     {
//         this(key, 0, key.length);
//     }
// 
//     public KeyParameter(
//         byte[]  key,
//         int     keyOff,
//         int     keyLen)
//     {
//         this.key = new byte[keyLen];
// 
//         System.arraycopy(key, keyOff, this.key, 0, keyLen);
//     }
// 
//     public byte[] getKey()
//     {
//         return key;
//     }
// }


// Path: mobile/blackberry/src/org/bouncycastle/crypto/macs/HMac.java
import java.util.Hashtable;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.ExtendedDigest;
import org.bouncycastle.crypto.Mac;
import org.bouncycastle.crypto.params.KeyParameter;

    private byte[] outputPad;

    private static Hashtable blockLengths;
    
    static
    {
        blockLengths = new Hashtable();
        
        blockLengths.put("GOST3411", new Integer(32));
        
        blockLengths.put("MD2", new Integer(16));
        blockLengths.put("MD4", new Integer(64));
        blockLengths.put("MD5", new Integer(64));
        
        blockLengths.put("RIPEMD128", new Integer(64));
        blockLengths.put("RIPEMD160", new Integer(64));
        
        blockLengths.put("SHA-1", new Integer(64));
        blockLengths.put("SHA-224", new Integer(64));
        blockLengths.put("SHA-256", new Integer(64));
        blockLengths.put("SHA-384", new Integer(128));
        blockLengths.put("SHA-512", new Integer(128));
        
        blockLengths.put("Tiger", new Integer(64));
        blockLengths.put("Whirlpool", new Integer(64));
    }
    
    private static int getByteLength(
        Digest digest)
    {
        if (digest instanceof ExtendedDigest)