Skip to content

Commit 975c2cc

Browse files
committed
Generalized EC key processing for different providers, added use of X9.62 parameters for curve OID finding (relates to github #1671)
1 parent 72d922b commit 975c2cc

File tree

1 file changed

+26
-15
lines changed

1 file changed

+26
-15
lines changed

pg/src/main/java/org/bouncycastle/openpgp/operator/jcajce/JcaPGPKeyConverter.java

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
import java.security.AlgorithmParameters;
66
import java.security.GeneralSecurityException;
77
import java.security.KeyFactory;
8-
import java.security.NoSuchAlgorithmException;
9-
import java.security.NoSuchProviderException;
108
import java.security.PrivateKey;
119
import java.security.Provider;
1210
import java.security.PublicKey;
@@ -18,11 +16,9 @@
1816
import java.security.interfaces.RSAPublicKey;
1917
import java.security.spec.DSAPrivateKeySpec;
2018
import java.security.spec.DSAPublicKeySpec;
21-
import java.security.spec.ECGenParameterSpec;
2219
import java.security.spec.ECParameterSpec;
2320
import java.security.spec.ECPrivateKeySpec;
2421
import java.security.spec.ECPublicKeySpec;
25-
import java.security.spec.InvalidParameterSpecException;
2622
import java.security.spec.KeySpec;
2723
import java.security.spec.PKCS8EncodedKeySpec;
2824
import java.security.spec.RSAPrivateCrtKeySpec;
@@ -48,6 +44,7 @@
4844
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
4945
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
5046
import org.bouncycastle.asn1.x9.ECNamedCurveTable;
47+
import org.bouncycastle.asn1.x9.X962Parameters;
5148
import org.bouncycastle.asn1.x9.X9ECParameters;
5249
import org.bouncycastle.asn1.x9.X9ECParametersHolder;
5350
import org.bouncycastle.asn1.x9.X9ECPoint;
@@ -75,13 +72,13 @@
7572
import org.bouncycastle.bcpg.X25519SecretBCPGKey;
7673
import org.bouncycastle.bcpg.X448PublicBCPGKey;
7774
import org.bouncycastle.bcpg.X448SecretBCPGKey;
78-
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;
75+
import org.bouncycastle.crypto.CryptoServicesRegistrar;
7976
import org.bouncycastle.jcajce.util.DefaultJcaJceHelper;
8077
import org.bouncycastle.jcajce.util.NamedJcaJceHelper;
8178
import org.bouncycastle.jcajce.util.ProviderJcaJceHelper;
8279
import org.bouncycastle.jce.interfaces.ElGamalPublicKey;
80+
import org.bouncycastle.math.ec.ECCurve;
8381
import org.bouncycastle.math.ec.ECPoint;
84-
8582
import org.bouncycastle.math.ec.rfc7748.X25519;
8683
import org.bouncycastle.math.ec.rfc7748.X448;
8784
import org.bouncycastle.math.ec.rfc8032.Ed25519;
@@ -236,7 +233,7 @@ else if (EdECObjectIdentifiers.id_X448.equals(ecdhPub.getCurveOID()))
236233
}
237234
case PublicKeyAlgorithmTags.ECDSA:
238235
{
239-
return implGetPrivateKeyEC("ECDSA", (ECDSAPublicBCPGKey)pubPk.getKey(), (ECSecretBCPGKey)privPk);
236+
return implGetPrivateKeyEC("EC", (ECDSAPublicBCPGKey)pubPk.getKey(), (ECSecretBCPGKey)privPk);
240237
}
241238
// Legacy EdDSA (legacy Ed448, legacy Ed25519)
242239
case PublicKeyAlgorithmTags.EDDSA_LEGACY:
@@ -349,7 +346,7 @@ else if (ecdhK.getCurveOID().equals(EdECObjectIdentifiers.id_X448))
349346
}
350347
case PublicKeyAlgorithmTags.ECDSA:
351348
{
352-
return implGetPublicKeyEC("ECDSA", (ECDSAPublicBCPGKey) publicPk.getKey());
349+
return implGetPublicKeyEC("EC", (ECDSAPublicBCPGKey) publicPk.getKey());
353350
}
354351
// Legacy EdDSA (legacy Ed448, legacy Ed25519)
355352
case PublicKeyAlgorithmTags.EDDSA_LEGACY:
@@ -420,11 +417,11 @@ else if (ecdhK.getCurveOID().equals(EdECObjectIdentifiers.id_X448))
420417
}
421418

422419
private ECParameterSpec getECParameterSpec(ASN1ObjectIdentifier curveOid, X9ECParameters x9Params)
423-
throws InvalidParameterSpecException, NoSuchProviderException, NoSuchAlgorithmException
420+
throws IOException, GeneralSecurityException
424421
{
425422
AlgorithmParameters params = helper.createAlgorithmParameters("EC");
426423

427-
params.init(new ECGenParameterSpec(ECNamedCurveTable.getName(curveOid)));
424+
params.init(new X962Parameters(curveOid).getEncoded());
428425

429426
return params.getParameterSpec(ECParameterSpec.class);
430427
}
@@ -560,7 +557,7 @@ private BCPGKey getPublicBCPGKey(int algorithm, PGPAlgorithmParameters algorithm
560557
// BCECPublicKey uses explicit parameter encoding, so we need to find the named curve manually
561558
if (X9ObjectIdentifiers.id_ecPublicKey.equals(curveOid))
562559
{
563-
enc = getNamedCurveOID((BCECPublicKey) pubKey);
560+
enc = getNamedCurveOID(X962Parameters.getInstance(keyInfo.getAlgorithm().getParameters()));
564561
ASN1ObjectIdentifier nCurveOid = ASN1ObjectIdentifier.getInstance(enc);
565562
if (nCurveOid != null)
566563
{
@@ -685,15 +682,29 @@ else if (pubKey.getAlgorithm().regionMatches(true, 0, "XDH", 0, 3))
685682
}
686683
}
687684

688-
private ASN1Encodable getNamedCurveOID(BCECPublicKey pubKey)
685+
private ASN1Encodable getNamedCurveOID(X962Parameters ecParams)
689686
{
687+
ECCurve curve = null;
688+
if (ecParams.isNamedCurve())
689+
{
690+
return ASN1ObjectIdentifier.getInstance(ecParams.getParameters());
691+
}
692+
else if (ecParams.isImplicitlyCA())
693+
{
694+
curve = ((X9ECParameters)CryptoServicesRegistrar.getProperty(CryptoServicesRegistrar.Property.EC_IMPLICITLY_CA)).getCurve();
695+
}
696+
else
697+
{
698+
curve = X9ECParameters.getInstance(ecParams.getParameters()).getCurve();
699+
}
700+
690701
// Iterate through all registered curves to find applicable OID
691702
Enumeration names = ECNamedCurveTable.getNames();
692703
while (names.hasMoreElements())
693704
{
694-
String name = (String) names.nextElement();
705+
String name = (String)names.nextElement();
695706
X9ECParameters parms = ECNamedCurveTable.getByName(name);
696-
if (pubKey.getParameters().getCurve().equals(parms.getCurve()))
707+
if (curve.equals(parms.getCurve()))
697708
{
698709
return ECNamedCurveTable.getOID(name);
699710
}
@@ -763,7 +774,7 @@ private PublicKey implGetPublicKeyX509(byte[] pEnc, int pEncOff, ASN1ObjectIdent
763774
}
764775

765776
private PrivateKey implGetPrivateKeyEC(String keyAlgorithm, ECPublicBCPGKey ecPub, ECSecretBCPGKey ecPriv)
766-
throws GeneralSecurityException, PGPException
777+
throws GeneralSecurityException, PGPException, IOException
767778
{
768779
ASN1ObjectIdentifier curveOid = ecPub.getCurveOID();
769780
ECPrivateKeySpec ecPrivSpec = new ECPrivateKeySpec(ecPriv.getX(), getECParameterSpec(curveOid, JcaJcePGPUtil.getX9Parameters(curveOid)));

0 commit comments

Comments
 (0)