14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.jcajce.provider.asymmetric.util;
24c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.AlgorithmParameters;
44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.InvalidKeyException;
54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.Key;
64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.KeyFactory;
74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.NoSuchAlgorithmException;
84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.NoSuchProviderException;
94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.PrivateKey;
104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.InvalidKeySpecException;
114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.PKCS8EncodedKeySpec;
124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.X509EncodedKeySpec;
134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.BadPaddingException;
154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.Cipher;
164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.CipherSpi;
174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.IllegalBlockSizeException;
184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.NoSuchPaddingException;
194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.spec.IvParameterSpec;
204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.spec.PBEParameterSpec;
214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom// BEGIN android-removed
224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom// import javax.crypto.spec.RC2ParameterSpec;
234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom// import javax.crypto.spec.RC5ParameterSpec;
244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom// END android-removed
254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.spec.SecretKeySpec;
264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.InvalidCipherTextException;
294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.Wrapper;
30028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giroimport org.bouncycastle.jcajce.util.BCJcaJceHelper;
31028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giroimport org.bouncycastle.jcajce.util.JcaJceHelper;
324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.jce.provider.BouncyCastleProvider;
334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic abstract class BaseCipherSpi
354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends CipherSpi
364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{
374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    //
384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    // specs we can handle.
394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    //
404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private Class[]                 availableSpecs =
414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                    {
424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                        IvParameterSpec.class,
434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                        PBEParameterSpec.class,
444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                        // BEGIN android-removed
454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                        // RC2ParameterSpec.class,
464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                        // RC5ParameterSpec.class
474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                        // END android-removed
484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                    };
494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
50028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro    private final JcaJceHelper helper = new BCJcaJceHelper();
514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected AlgorithmParameters     engineParams = null;
534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected Wrapper                 wrapEngine = null;
554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private int                       ivSize;
574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private byte[]                    iv;
584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected BaseCipherSpi()
604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected int engineGetBlockSize()
644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return 0;
664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected byte[] engineGetIV()
694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return null;
714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected int engineGetKeySize(
744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        Key     key)
754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return key.getEncoded().length;
774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected int engineGetOutputSize(
804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        int     inputLen)
814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return -1;
834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected AlgorithmParameters engineGetParameters()
864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return null;
884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
90028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro    protected final AlgorithmParameters createParametersInstance(String algorithm)
91028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro        throws NoSuchAlgorithmException, NoSuchProviderException
92028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro    {
93028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro        return helper.createAlgorithmParameters(algorithm);
94028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro    }
95028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro
964c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected void engineSetMode(
974c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        String  mode)
984c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws NoSuchAlgorithmException
994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throw new NoSuchAlgorithmException("can't support mode " + mode);
1014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1024c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1034c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected void engineSetPadding(
1044c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        String  padding)
1054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    throws NoSuchPaddingException
1064c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throw new NoSuchPaddingException("Padding " + padding + " unknown.");
1084c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1094c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected byte[] engineWrap(
1114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        Key     key)
1124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    throws IllegalBlockSizeException, InvalidKeyException
1134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        byte[] encoded = key.getEncoded();
1154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (encoded == null)
1164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new InvalidKeyException("Cannot wrap key, null encoding.");
1184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        try
1214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            if (wrapEngine == null)
1234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
1244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                return engineDoFinal(encoded, 0, encoded.length);
1254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
1264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            else
1274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
1284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                return wrapEngine.wrap(encoded, 0, encoded.length);
1294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
1304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        catch (BadPaddingException e)
1324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new IllegalBlockSizeException(e.getMessage());
1344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected Key engineUnwrap(
1384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        byte[]  wrappedKey,
1394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        String  wrappedKeyAlgorithm,
1404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        int     wrappedKeyType)
1414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    throws InvalidKeyException
1424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        byte[] encoded;
1444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        try
1454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            if (wrapEngine == null)
1474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
1484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                encoded = engineDoFinal(wrappedKey, 0, wrappedKey.length);
1494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
1504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            else
1514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
1524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                encoded = wrapEngine.unwrap(wrappedKey, 0, wrappedKey.length);
1534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
1544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        catch (InvalidCipherTextException e)
1564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new InvalidKeyException(e.getMessage());
1584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        catch (BadPaddingException e)
1604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new InvalidKeyException(e.getMessage());
1624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        catch (IllegalBlockSizeException e2)
1644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new InvalidKeyException(e2.getMessage());
1664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (wrappedKeyType == Cipher.SECRET_KEY)
1694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new SecretKeySpec(encoded, wrappedKeyAlgorithm);
1714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else if (wrappedKeyAlgorithm.equals("") && wrappedKeyType == Cipher.PRIVATE_KEY)
1734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            /*
1754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                 * The caller doesn't know the algorithm as it is part of
1764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                 * the encrypted data.
1774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                 */
1784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            try
1794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
1804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                PrivateKeyInfo       in = PrivateKeyInfo.getInstance(encoded);
1814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                PrivateKey privKey = BouncyCastleProvider.getPrivateKey(in);
1834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                if (privKey != null)
1854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                {
1864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                    return privKey;
1874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                }
1884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                else
1894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                {
1904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                    throw new InvalidKeyException("algorithm " + in.getPrivateKeyAlgorithm().getAlgorithm() + " not supported");
1914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                }
1924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
1934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            catch (Exception e)
1944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
1954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                throw new InvalidKeyException("Invalid key encoding.");
1964c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
1974c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1984c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else
1994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
2004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            try
2014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
202028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro                KeyFactory kf = helper.createKeyFactory(wrappedKeyAlgorithm);
2034c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
2044c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                if (wrappedKeyType == Cipher.PUBLIC_KEY)
2054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                {
2064c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                    return kf.generatePublic(new X509EncodedKeySpec(encoded));
2074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                }
2084c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                else if (wrappedKeyType == Cipher.PRIVATE_KEY)
2094c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                {
2104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                    return kf.generatePrivate(new PKCS8EncodedKeySpec(encoded));
2114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                }
2124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
213028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro            catch (NoSuchAlgorithmException e)
2144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
2154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                throw new InvalidKeyException("Unknown key type " + e.getMessage());
2164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
217028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro            catch (InvalidKeySpecException e)
2184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
2194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                throw new InvalidKeyException("Unknown key type " + e.getMessage());
2204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
221028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro            catch (NoSuchProviderException e)
2224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
223028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro                throw new InvalidKeyException("Unknown key type " + e.getMessage());
2244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
2254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
2264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new InvalidKeyException("Unknown key type " + wrappedKeyType);
2274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
2284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
2294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom}
230