FileDocCategorySizeDatePackage
JCEIESCipher.javaAPI DocAndroid 1.5 API11404Wed May 06 22:41:06 BST 2009org.bouncycastle.jce.provider

JCEIESCipher

public class JCEIESCipher extends WrapCipherSpi

Fields Summary
private org.bouncycastle.crypto.engines.IESEngine
cipher
private int
state
private ByteArrayOutputStream
buffer
private AlgorithmParameters
engineParam
private org.bouncycastle.jce.spec.IESParameterSpec
engineParams
private Class[]
availableSpecs
Constructors Summary
public JCEIESCipher(org.bouncycastle.crypto.engines.IESEngine engine)


     
           
    
        cipher = engine;
    
Methods Summary
protected byte[]engineDoFinal(byte[] input, int inputOffset, int inputLen)

        if (inputLen != 0)
        {
            buffer.write(input, inputOffset, inputLen);
        }

        try
        {
            byte[]  buf = buffer.toByteArray();

            buffer.reset();

            return cipher.processBlock(buf, 0, buf.length);
        }
        catch (InvalidCipherTextException e)
        {
            throw new BadPaddingException(e.getMessage());
        }
    
protected intengineDoFinal(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset)

        if (inputLen != 0)
        {
            buffer.write(input, inputOffset, inputLen);
        }

        try
        {
            byte[]  buf = buffer.toByteArray();

            buffer.reset();

            buf = cipher.processBlock(buf, 0, buf.length);

            System.arraycopy(buf, 0, output, outputOffset, buf.length);

            return buf.length;
        }
        catch (InvalidCipherTextException e)
        {
            throw new BadPaddingException(e.getMessage());
        }
    
protected intengineGetBlockSize()

        return 0;
    
protected byte[]engineGetIV()

        return null;
    
protected intengineGetKeySize(java.security.Key key)

        IESKey   ieKey = (IESKey)key;

        if (ieKey.getPrivate() instanceof DHPrivateKey)
        {
            DHPrivateKey   k = (DHPrivateKey)ieKey.getPrivate();

            return k.getX().bitLength();
        }
        // BEGIN android-removed
        // else if (ieKey.getPrivate() instanceof ECPrivateKey)
        // {
        //     ECPrivateKey   k = (ECPrivateKey)ieKey.getPrivate();
        //
        //     return k.getD().bitLength();
        // }
        // END android-removed

        throw new IllegalArgumentException("not an IE key!");
    
protected intengineGetOutputSize(int inputLen)

        if (state == Cipher.ENCRYPT_MODE || state == Cipher.WRAP_MODE)
        {
            return buffer.size() + inputLen + 20; /* SHA1 MAC size */
        }
        else if (state == Cipher.DECRYPT_MODE || state == Cipher.UNWRAP_MODE)
        {
            return buffer.size() + inputLen - 20;
        }
        else
        {
            throw new IllegalStateException("cipher not initialised");
        }
    
protected java.security.AlgorithmParametersengineGetParameters()

        if (engineParam == null)
        {
            if (engineParams != null)
            {
                String  name = "IES";

                try
                {
                    engineParam = AlgorithmParameters.getInstance(name, "BC");
                    engineParam.init(engineParams);
                }
                catch (Exception e)
                {
                    throw new RuntimeException(e.toString());
                }
            }
        }

        return engineParam;
    
protected voidengineInit(int opmode, java.security.Key key, java.security.AlgorithmParameters params, java.security.SecureRandom random)

        AlgorithmParameterSpec  paramSpec = null;

        if (params != null)
        {
            for (int i = 0; i != availableSpecs.length; i++)
            {
                try
                {
                    paramSpec = params.getParameterSpec(availableSpecs[i]);
                    break;
                }
                catch (Exception e)
                {
                    continue;
                }
            }

            if (paramSpec == null)
            {
                throw new InvalidAlgorithmParameterException("can't handle parameter " + params.toString());
            }
        }

        engineParam = params;
        engineInit(opmode, key, paramSpec, random);
    
protected voidengineInit(int opmode, java.security.Key key, java.security.SecureRandom random)

        if (opmode == Cipher.ENCRYPT_MODE || opmode == Cipher.WRAP_MODE)
        {
            try
            {
                engineInit(opmode, key, (AlgorithmParameterSpec)null, random);
                return;
            }
            catch (InvalidAlgorithmParameterException e)
            {
                // fall through...
            }
        }

        throw new IllegalArgumentException("can't handle null parameter spec in IES");
    
protected voidengineInit(int opmode, java.security.Key key, java.security.spec.AlgorithmParameterSpec params, java.security.SecureRandom random)

        if (!(key instanceof IESKey))
        {
            throw new InvalidKeyException("must be passed IE key");
        }

        if (params == null && (opmode == Cipher.ENCRYPT_MODE || opmode == Cipher.WRAP_MODE))
        {
            //
            // if nothing is specified we set up for a 128 bit mac, with
            // 128 bit derivation vectors.
            //
            byte[]  d = new byte[16];
            byte[]  e = new byte[16];

            if (random == null)
            {
                random = new SecureRandom();
            }

            random.nextBytes(d);
            random.nextBytes(e);

            params = new IESParameterSpec(d, e, 128);
        }
        else if (!(params instanceof IESParameterSpec))
        {
            throw new InvalidAlgorithmParameterException("must be passed IES parameters");
        }

        IESKey       ieKey = (IESKey)key;

        CipherParameters pubKey;
        CipherParameters privKey;

        // BEGIN android-removed
        // if (ieKey.getPublic() instanceof ECPublicKey)
        // {
        //     pubKey = ECUtil.generatePublicKeyParameter(ieKey.getPublic());
        //     privKey = ECUtil.generatePrivateKeyParameter(ieKey.getPrivate());
        // }
        // else
        // {
        // END android-removed
            pubKey = DHUtil.generatePublicKeyParameter(ieKey.getPublic());
            privKey = DHUtil.generatePrivateKeyParameter(ieKey.getPrivate());
        // BEGIN android-removed
        // }
        // END android-removed

        this.engineParams = (IESParameterSpec)params;

        IESParameters       p = new IESParameters(engineParams.getDerivationV(), engineParams.getEncodingV(), engineParams.getMacKeySize());

        this.state = opmode;

        buffer.reset();

        switch (opmode)
        {
        case Cipher.ENCRYPT_MODE:
        case Cipher.WRAP_MODE:
            cipher.init(true, privKey, pubKey, p);
            break;
        case Cipher.DECRYPT_MODE:
        case Cipher.UNWRAP_MODE:
            cipher.init(false, privKey, pubKey, p);
            break;
        default:
            System.out.println("eeek!");
        }
    
protected voidengineSetMode(java.lang.String mode)

        throw new IllegalArgumentException("can't support mode " + mode);
    
protected voidengineSetPadding(java.lang.String padding)

        throw new NoSuchPaddingException(padding + " unavailable with RSA.");
    
protected byte[]engineUpdate(byte[] input, int inputOffset, int inputLen)

        buffer.write(input, inputOffset, inputLen);
        return null;
    
protected intengineUpdate(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset)

        buffer.write(input, inputOffset, inputLen);
        return 0;