14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.jcajce.provider.asymmetric.dh;
24c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.io.IOException;
44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.InvalidKeyException;
54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.Key;
64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.PrivateKey;
74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.PublicKey;
84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.InvalidKeySpecException;
94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.KeySpec;
104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.interfaces.DHPrivateKey;
124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.interfaces.DHPublicKey;
134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.spec.DHPrivateKeySpec;
144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.spec.DHPublicKeySpec;
154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1ObjectIdentifier;
174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.x9.X9ObjectIdentifiers;
214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.jcajce.provider.asymmetric.util.BaseKeyFactorySpi;
224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic class KeyFactorySpi
244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends BaseKeyFactorySpi
254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{
264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public KeyFactorySpi()
274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected KeySpec engineGetKeySpec(
314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        Key key,
324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        Class spec)
334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws InvalidKeySpecException
344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (spec.isAssignableFrom(DHPrivateKeySpec.class) && key instanceof DHPrivateKey)
364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            DHPrivateKey k = (DHPrivateKey)key;
384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new DHPrivateKeySpec(k.getX(), k.getParams().getP(), k.getParams().getG());
404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else if (spec.isAssignableFrom(DHPublicKeySpec.class) && key instanceof DHPublicKey)
424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            DHPublicKey k = (DHPublicKey)key;
444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new DHPublicKeySpec(k.getY(), k.getParams().getP(), k.getParams().getG());
464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return super.engineGetKeySpec(key, spec);
494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected Key engineTranslateKey(
524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        Key key)
534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws InvalidKeyException
544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (key instanceof DHPublicKey)
564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new BCDHPublicKey((DHPublicKey)key);
584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else if (key instanceof DHPrivateKey)
604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new BCDHPrivateKey((DHPrivateKey)key);
624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throw new InvalidKeyException("key type unknown");
654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected PrivateKey engineGeneratePrivate(
684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        KeySpec keySpec)
694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws InvalidKeySpecException
704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (keySpec instanceof DHPrivateKeySpec)
724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new BCDHPrivateKey((DHPrivateKeySpec)keySpec);
744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return super.engineGeneratePrivate(keySpec);
774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected PublicKey engineGeneratePublic(
804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        KeySpec keySpec)
814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws InvalidKeySpecException
824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (keySpec instanceof DHPublicKeySpec)
844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new BCDHPublicKey((DHPublicKeySpec)keySpec);
864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return super.engineGeneratePublic(keySpec);
894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public PrivateKey generatePrivate(PrivateKeyInfo keyInfo)
924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws IOException
934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1ObjectIdentifier algOid = keyInfo.getPrivateKeyAlgorithm().getAlgorithm();
954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
964c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (algOid.equals(PKCSObjectIdentifiers.dhKeyAgreement))
974c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
984c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new BCDHPrivateKey(keyInfo);
994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else if (algOid.equals(X9ObjectIdentifiers.dhpublicnumber))
1014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1024c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new BCDHPrivateKey(keyInfo);
1034c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1044c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else
1054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1064c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new IOException("algorithm identifier " + algOid + " in key not recognised");
1074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1084c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1094c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public PublicKey generatePublic(SubjectPublicKeyInfo keyInfo)
1114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws IOException
1124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1ObjectIdentifier algOid = keyInfo.getAlgorithm().getAlgorithm();
1144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (algOid.equals(PKCSObjectIdentifiers.dhKeyAgreement))
1164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new BCDHPublicKey(keyInfo);
1184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else if (algOid.equals(X9ObjectIdentifiers.dhpublicnumber))
1204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new BCDHPublicKey(keyInfo);
1224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else
1244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new IOException("algorithm identifier " + algOid + " in key not recognised");
1264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom}
129