Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/quite/humla-spongycastle.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/src/main/java/org/bouncycastle/asn1/sec/SECCustomNamedCurves.java119
-rw-r--r--pg/src/main/java/org/bouncycastle/bcpg/ECPublicBCPGKey.java7
-rw-r--r--pkix/src/test/java/org/bouncycastle/eac/test/AllTests.java6
-rw-r--r--prov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/BCECPublicKey.java2
-rw-r--r--prov/src/main/java/org/bouncycastle/jce/ECNamedCurveTable.java22
-rw-r--r--prov/src/test/java/org/bouncycastle/jce/provider/test/ECDSA5Test.java20
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());