14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.jcajce.provider.asymmetric.util;
24c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.io.IOException;
44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.Key;
54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.PrivateKey;
64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.PublicKey;
74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.InvalidKeySpecException;
84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.KeySpec;
94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.PKCS8EncodedKeySpec;
104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.X509EncodedKeySpec;
114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.jcajce.provider.util.AsymmetricKeyInfoConverter;
154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic abstract class BaseKeyFactorySpi
174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends java.security.KeyFactorySpi
184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    implements AsymmetricKeyInfoConverter
194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{
204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected PrivateKey engineGeneratePrivate(
214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        KeySpec keySpec)
224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws InvalidKeySpecException
234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (keySpec instanceof PKCS8EncodedKeySpec)
254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            try
274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                return generatePrivate(PrivateKeyInfo.getInstance(((PKCS8EncodedKeySpec)keySpec).getEncoded()));
294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
30517da5b1cf8927b100e5e1d9df870854b09aa2ceBrian Carlstrom            // BEGIN android-changed
31517da5b1cf8927b100e5e1d9df870854b09aa2ceBrian Carlstrom            catch (Exception e)
32517da5b1cf8927b100e5e1d9df870854b09aa2ceBrian Carlstrom            // END android-changed
334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                throw new InvalidKeySpecException("encoded key spec not recognised");
354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else
384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new InvalidKeySpecException("key spec not recognised");
404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected PublicKey engineGeneratePublic(
444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        KeySpec keySpec)
454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws InvalidKeySpecException
464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (keySpec instanceof X509EncodedKeySpec)
484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            try
504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                return generatePublic(SubjectPublicKeyInfo.getInstance(((X509EncodedKeySpec)keySpec).getEncoded()));
524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
53517da5b1cf8927b100e5e1d9df870854b09aa2ceBrian Carlstrom            // BEGIN android-changed
54517da5b1cf8927b100e5e1d9df870854b09aa2ceBrian Carlstrom            catch (Exception e)
55517da5b1cf8927b100e5e1d9df870854b09aa2ceBrian Carlstrom            // END android-changed
564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                throw new InvalidKeySpecException("encoded key spec not recognised");
584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else
614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new InvalidKeySpecException("key spec not recognised");
634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected KeySpec engineGetKeySpec(
674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        Key key,
684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        Class spec)
694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws InvalidKeySpecException
704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (spec.isAssignableFrom(PKCS8EncodedKeySpec.class) && key.getFormat().equals("PKCS#8"))
724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new PKCS8EncodedKeySpec(key.getEncoded());
744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else if (spec.isAssignableFrom(X509EncodedKeySpec.class) && key.getFormat().equals("X.509"))
764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new X509EncodedKeySpec(key.getEncoded());
784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throw new InvalidKeySpecException("not implemented yet " + key + " " + spec);
814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom}
83