diff options
6 files changed, 48 insertions, 128 deletions
diff --git a/core/src/main/java/org/bouncycastle/asn1/sec/SECCustomNamedCurves.java b/core/src/main/java/org/bouncycastle/asn1/sec/SECCustomNamedCurves.java deleted file mode 100644 index 6e85c012..00000000 --- a/core/src/main/java/org/bouncycastle/asn1/sec/SECCustomNamedCurves.java +++ /dev/null @@ -1,119 +0,0 @@ -package org.bouncycastle.asn1.sec; - -import java.util.Enumeration; -import java.util.Hashtable; - -import org.bouncycastle.asn1.ASN1ObjectIdentifier; -import org.bouncycastle.asn1.x9.X9ECParameters; -import org.bouncycastle.asn1.x9.X9ECParametersHolder; -import org.bouncycastle.math.ec.ECCurve; -import org.bouncycastle.math.ec.ECPoint; -import org.bouncycastle.math.ec.custom.sec.SecP256K1Curve; -import org.bouncycastle.math.ec.custom.sec.SecP256R1Curve; -import org.bouncycastle.util.Strings; -import org.bouncycastle.util.encoders.Hex; - -public class SECCustomNamedCurves -{ - private static ECCurve configureCurve(ECCurve curve) - { - return curve; - } - - /* - * secp256k1 - */ - static X9ECParametersHolder secp256k1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - byte[] S = null; - ECCurve curve = configureCurve(new SecP256K1Curve()); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798" - + "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8")); - return new X9ECParameters(curve, G, curve.getOrder(), curve.getCofactor(), S); - } - }; - - /* - * secp256r1 - */ - static X9ECParametersHolder secp256r1 = new X9ECParametersHolder() - { - protected X9ECParameters createParameters() - { - byte[] S = Hex.decode("C49D360886E704936A6678E1139D26B7819F7E90"); - ECCurve curve = configureCurve(new SecP256R1Curve()); - ECPoint G = curve.decodePoint(Hex.decode("04" - + "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296" - + "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5")); - return new X9ECParameters(curve, G, curve.getOrder(), curve.getCofactor(), S); - } - }; - - static final Hashtable objIds = new Hashtable(); - static final Hashtable curves = new Hashtable(); - static final Hashtable names = new Hashtable(); - - static void defineCurve(String name, ASN1ObjectIdentifier oid, X9ECParametersHolder holder) - { - objIds.put(name, oid); - names.put(oid, name); - curves.put(oid, holder); - } - - static - { - defineCurve("secp256k1", SECObjectIdentifiers.secp256k1, secp256k1); - defineCurve("secp256r1", SECObjectIdentifiers.secp256r1, secp256r1); - - objIds.put(Strings.toLowerCase("P-256"), SECObjectIdentifiers.secp256r1); - } - - public static X9ECParameters getByName(String name) - { - ASN1ObjectIdentifier oid = (ASN1ObjectIdentifier)objIds.get(Strings.toLowerCase(name)); - return oid == null ? null : getByOID(oid); - } - - /** - * return the X9ECParameters object for the named curve represented by the passed in object - * identifier. Null if the curve isn't present. - * - * @param oid - * an object identifier representing a named curve, if present. - */ - public static X9ECParameters getByOID(ASN1ObjectIdentifier oid) - { - X9ECParametersHolder holder = (X9ECParametersHolder)curves.get(oid); - return holder == null ? null : holder.getParameters(); - } - - /** - * return the object identifier signified by the passed in name. Null if there is no object - * identifier associated with name. - * - * @return the object identifier associated with name, if present. - */ - public static ASN1ObjectIdentifier getOID(String name) - { - return (ASN1ObjectIdentifier)objIds.get(Strings.toLowerCase(name)); - } - - /** - * return the named curve name represented by the given object identifier. - */ - public static String getName(ASN1ObjectIdentifier oid) - { - return (String)names.get(oid); - } - - /** - * returns an enumeration containing the name strings for curves contained in this structure. - */ - public static Enumeration getNames() - { - return objIds.keys(); - } -} diff --git a/pg/src/main/java/org/bouncycastle/bcpg/ECPublicBCPGKey.java b/pg/src/main/java/org/bouncycastle/bcpg/ECPublicBCPGKey.java index 5983b325..9464af7c 100644 --- a/pg/src/main/java/org/bouncycastle/bcpg/ECPublicBCPGKey.java +++ b/pg/src/main/java/org/bouncycastle/bcpg/ECPublicBCPGKey.java @@ -10,6 +10,8 @@ import org.bouncycastle.asn1.x9.ECNamedCurveTable; import org.bouncycastle.asn1.x9.X9ECParameters; import org.bouncycastle.math.ec.ECCurve; import org.bouncycastle.math.ec.ECPoint; +import org.bouncycastle.math.ec.custom.sec.SecP256R1Curve; +import org.bouncycastle.util.BigIntegers; /** * base class for an EC Public Key. @@ -136,11 +138,12 @@ public abstract class ECPublicBCPGKey { throw new IOException(oid.getId() + " does not match any known curve."); } - if (!(curve.getCurve() instanceof ECCurve.Fp)) + // TODO: fix when custom curves have common interface + if (!((curve.getCurve() instanceof ECCurve.Fp) || (curve.getCurve() instanceof SecP256R1Curve))) { throw new IOException("Only FPCurves are supported."); } - return curve.getCurve().decodePoint(encodedPoint.toByteArray()); + return curve.getCurve().decodePoint(BigIntegers.asUnsignedByteArray(encodedPoint)); } } diff --git a/pkix/src/test/java/org/bouncycastle/eac/test/AllTests.java b/pkix/src/test/java/org/bouncycastle/eac/test/AllTests.java index a427e334..f8198556 100644 --- a/pkix/src/test/java/org/bouncycastle/eac/test/AllTests.java +++ b/pkix/src/test/java/org/bouncycastle/eac/test/AllTests.java @@ -119,7 +119,7 @@ public class AllTests if (!certHolder.isSignatureValid(verifier)) { - fail("first signature test failed"); + fail("second signature test failed"); } } @@ -157,7 +157,7 @@ public class AllTests if (!certHolder.isSignatureValid(verifier)) { - fail("first signature test failed"); + fail("second signature test failed"); } } @@ -192,7 +192,7 @@ public class AllTests public static Test suite() throws Exception { - TestSuite suite= new TestSuite("EAC tests"); + TestSuite suite = new TestSuite("EAC tests"); suite.addTestSuite(AllTests.class); diff --git a/prov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/BCECPublicKey.java b/prov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/BCECPublicKey.java index 0c0edeed..5695e2ef 100644 --- a/prov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/BCECPublicKey.java +++ b/prov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/BCECPublicKey.java @@ -82,6 +82,8 @@ public class BCECPublicKey ECCurve curve = spec.getParams().getCurve(); EllipticCurve ellipticCurve = EC5Util.convertCurve(curve, spec.getParams().getSeed()); + // this may seem a little long-winded but it's how we pick up the custom curve. + this.q = EC5Util.convertCurve(ellipticCurve).createPoint(spec.getQ().getAffineXCoord().toBigInteger(), spec.getQ().getAffineYCoord().toBigInteger()); this.ecSpec = EC5Util.convertSpec(ellipticCurve, spec.getParams()); } else diff --git a/prov/src/main/java/org/bouncycastle/jce/ECNamedCurveTable.java b/prov/src/main/java/org/bouncycastle/jce/ECNamedCurveTable.java index 941f4763..5ad207ac 100644 --- a/prov/src/main/java/org/bouncycastle/jce/ECNamedCurveTable.java +++ b/prov/src/main/java/org/bouncycastle/jce/ECNamedCurveTable.java @@ -21,19 +21,35 @@ public class ECNamedCurveTable public static ECNamedCurveParameterSpec getParameterSpec( String name) { - X9ECParameters ecP = org.bouncycastle.asn1.x9.ECNamedCurveTable.getByName(name); + X9ECParameters ecP = org.bouncycastle.crypto.ec.CustomNamedCurves.getByName(name); if (ecP == null) { try { - ecP = org.bouncycastle.asn1.x9.ECNamedCurveTable.getByOID(new ASN1ObjectIdentifier(name)); + ecP = org.bouncycastle.crypto.ec.CustomNamedCurves.getByOID(new ASN1ObjectIdentifier(name)); } catch (IllegalArgumentException e) { // ignore - not an oid } + + if (ecP == null) + { + ecP = org.bouncycastle.asn1.x9.ECNamedCurveTable.getByName(name); + if (ecP == null) + { + try + { + ecP = org.bouncycastle.asn1.x9.ECNamedCurveTable.getByOID(new ASN1ObjectIdentifier(name)); + } + catch (IllegalArgumentException e) + { + // ignore - not an oid + } + } + } } - + if (ecP == null) { return null; diff --git a/prov/src/test/java/org/bouncycastle/jce/provider/test/ECDSA5Test.java b/prov/src/test/java/org/bouncycastle/jce/provider/test/ECDSA5Test.java index 292ac46e..24354c80 100644 --- a/prov/src/test/java/org/bouncycastle/jce/provider/test/ECDSA5Test.java +++ b/prov/src/test/java/org/bouncycastle/jce/provider/test/ECDSA5Test.java @@ -40,11 +40,14 @@ import org.bouncycastle.asn1.sec.SECObjectIdentifiers; import org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers; import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; import org.bouncycastle.asn1.x9.X962Parameters; +import org.bouncycastle.asn1.x9.X9ECParameters; import org.bouncycastle.asn1.x9.X9ObjectIdentifiers; +import org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil; import org.bouncycastle.jce.ECKeyUtil; import org.bouncycastle.jce.ECNamedCurveTable; import org.bouncycastle.jce.ECPointUtil; import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.math.ec.ECCurve; import org.bouncycastle.util.BigIntegers; import org.bouncycastle.util.encoders.Hex; import org.bouncycastle.util.test.FixedSecureRandom; @@ -739,7 +742,22 @@ public class ECDSA5Test private void testNamedCurveSigning() throws Exception { - AlgorithmParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("secp256r1"); + testCustomNamedCurveSigning("secp256r1"); + testCustomNamedCurveSigning("secp256k1"); + } + + private void testCustomNamedCurveSigning(String name) + throws Exception + { + X9ECParameters x9Params = ECUtil.getNamedCurveByOid(ECUtil.getNamedCurveOid(name)); + + // TODO: one day this may have to change + if (x9Params.getCurve() instanceof ECCurve.Fp) + { + fail("curve not custom curve!!"); + } + + AlgorithmParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec(name); KeyPairGenerator keygen = KeyPairGenerator.getInstance("EC", "BC"); keygen.initialize(ecSpec, new ECRandom()); |