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