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