14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.jcajce.provider.asymmetric.x509;
24c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.InvalidKeyException;
44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.Key;
54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.KeyFactorySpi;
64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.PrivateKey;
74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.PublicKey;
84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.InvalidKeySpecException;
94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.KeySpec;
104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.PKCS8EncodedKeySpec;
114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.X509EncodedKeySpec;
124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.jce.provider.BouncyCastleProvider;
164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic class KeyFactory
184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends KeyFactorySpi
194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{
204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected PrivateKey engineGeneratePrivate(
224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        KeySpec keySpec)
234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws InvalidKeySpecException
244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (keySpec instanceof PKCS8EncodedKeySpec)
264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            try
284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                PrivateKeyInfo info = PrivateKeyInfo.getInstance(((PKCS8EncodedKeySpec)keySpec).getEncoded());
304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                PrivateKey     key = BouncyCastleProvider.getPrivateKey(info);
314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                if (key != null)
334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                {
344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                    return key;
354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                }
364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                throw new InvalidKeySpecException("no factory found for OID: " + info.getPrivateKeyAlgorithm().getAlgorithm());
384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            catch (Exception e)
404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                throw new InvalidKeySpecException(e.toString());
424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throw new InvalidKeySpecException("Unknown KeySpec type: " + keySpec.getClass().getName());
464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected PublicKey engineGeneratePublic(
494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        KeySpec keySpec)
504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws InvalidKeySpecException
514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (keySpec instanceof X509EncodedKeySpec)
534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            try
554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                SubjectPublicKeyInfo info = SubjectPublicKeyInfo.getInstance(((X509EncodedKeySpec)keySpec).getEncoded());
574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                PublicKey            key = BouncyCastleProvider.getPublicKey(info);
584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                if (key != null)
604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                {
614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                    return key;
624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                }
634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                throw new InvalidKeySpecException("no factory found for OID: " + info.getAlgorithm().getAlgorithm());
654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            catch (Exception e)
674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                throw new InvalidKeySpecException(e.toString());
694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throw new InvalidKeySpecException("Unknown KeySpec type: " + keySpec.getClass().getName());
734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected KeySpec engineGetKeySpec(Key key, Class keySpec)
764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws InvalidKeySpecException
774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (keySpec.isAssignableFrom(PKCS8EncodedKeySpec.class) && key.getFormat().equals("PKCS#8"))
794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new PKCS8EncodedKeySpec(key.getEncoded());
814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else if (keySpec.isAssignableFrom(X509EncodedKeySpec.class) && key.getFormat().equals("X.509"))
834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new X509EncodedKeySpec(key.getEncoded());
854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throw new InvalidKeySpecException("not implemented yet " + key + " " + keySpec);
884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected Key engineTranslateKey(Key key)
914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws InvalidKeyException
924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throw new InvalidKeyException("not implemented yet " + key);
944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom}