summaryrefslogtreecommitdiff
path: root/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec
diff options
context:
space:
mode:
Diffstat (limited to 'bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec')
-rw-r--r--bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/AlgorithmParametersSpi.java18
-rw-r--r--bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/BCECPrivateKey.java47
-rw-r--r--bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/BCECPublicKey.java119
-rw-r--r--bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/ECUtils.java51
-rw-r--r--bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyAgreementSpi.java162
-rw-r--r--bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyFactorySpi.java15
-rw-r--r--bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyPairGeneratorSpi.java12
-rw-r--r--bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/SignatureSpi.java145
8 files changed, 327 insertions, 242 deletions
diff --git a/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/AlgorithmParametersSpi.java b/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/AlgorithmParametersSpi.java
index 6af71e80..9f56a55a 100644
--- a/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/AlgorithmParametersSpi.java
+++ b/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/AlgorithmParametersSpi.java
@@ -14,6 +14,7 @@ import org.bouncycastle.asn1.x9.X9ECParameters;
import org.bouncycastle.jcajce.provider.asymmetric.util.EC5Util;
import org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.jce.spec.ECNamedCurveSpec;
import org.bouncycastle.math.ec.ECCurve;
public class AlgorithmParametersSpi
@@ -45,7 +46,14 @@ public class AlgorithmParametersSpi
}
else if (algorithmParameterSpec instanceof ECParameterSpec)
{
- curveName = null;
+ if (algorithmParameterSpec instanceof ECNamedCurveSpec)
+ {
+ curveName = ((ECNamedCurveSpec)algorithmParameterSpec).getName();
+ }
+ else
+ {
+ curveName = null;
+ }
ecParameterSpec = (ECParameterSpec)algorithmParameterSpec;
}
else
@@ -73,7 +81,13 @@ public class AlgorithmParametersSpi
if (params.isNamedCurve())
{
- curveName = ECNamedCurveTable.getName(ASN1ObjectIdentifier.getInstance(params.getParameters()));
+ ASN1ObjectIdentifier curveId = ASN1ObjectIdentifier.getInstance(params.getParameters());
+
+ curveName = ECNamedCurveTable.getName(curveId);
+ if (curveName == null)
+ {
+ curveName = curveId.getId();
+ }
}
ecParameterSpec = EC5Util.convertToSpec(params, curve);
diff --git a/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/BCECPrivateKey.java b/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/BCECPrivateKey.java
index e69942a2..815bcac0 100644
--- a/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/BCECPrivateKey.java
+++ b/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/BCECPrivateKey.java
@@ -17,12 +17,10 @@ import org.bouncycastle.asn1.ASN1Integer;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.DERBitString;
-import org.bouncycastle.asn1.DERNull;
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
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.crypto.params.ECDomainParameters;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
@@ -33,7 +31,6 @@ import org.bouncycastle.jcajce.provider.config.ProviderConfiguration;
import org.bouncycastle.jce.interfaces.ECPointEncoder;
import org.bouncycastle.jce.interfaces.PKCS12BagAttributeCarrier;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
-import org.bouncycastle.jce.spec.ECNamedCurveSpec;
import org.bouncycastle.math.ec.ECCurve;
import org.bouncycastle.util.Strings;
@@ -181,7 +178,14 @@ public class BCECPrivateKey
this.ecSpec = EC5Util.convertSpec(ellipticCurve, spec);
}
- publicKey = getPublicKeyDetails(pubKey);
+ try
+ {
+ publicKey = getPublicKeyDetails(pubKey);
+ }
+ catch (Exception e)
+ {
+ publicKey = null; // not all curves are encodable
+ }
}
public BCECPrivateKey(
@@ -253,38 +257,16 @@ public class BCECPrivateKey
*/
public byte[] getEncoded()
{
- X962Parameters params;
- int orderBitLength;
+ X962Parameters params = ECUtils.getDomainParametersFromName(ecSpec, withCompression);
- if (ecSpec instanceof ECNamedCurveSpec)
- {
- ASN1ObjectIdentifier curveOid = ECUtil.getNamedCurveOid(((ECNamedCurveSpec)ecSpec).getName());
- if (curveOid == null) // guess it's the OID
- {
- curveOid = new ASN1ObjectIdentifier(((ECNamedCurveSpec)ecSpec).getName());
- }
-
- params = new X962Parameters(curveOid);
- orderBitLength = ECUtil.getOrderBitLength(ecSpec.getOrder(), this.getS());
- }
- else if (ecSpec == null)
+ int orderBitLength;
+ if (ecSpec == null)
{
- params = new X962Parameters(DERNull.INSTANCE);
- orderBitLength = ECUtil.getOrderBitLength(null, this.getS());
+ orderBitLength = ECUtil.getOrderBitLength(configuration, null, this.getS());
}
else
{
- ECCurve curve = EC5Util.convertCurve(ecSpec.getCurve());
-
- X9ECParameters ecP = new X9ECParameters(
- curve,
- EC5Util.convertPoint(curve, ecSpec.getGenerator(), withCompression),
- ecSpec.getOrder(),
- BigInteger.valueOf(ecSpec.getCofactor()),
- ecSpec.getCurve().getSeed());
-
- params = new X962Parameters(ecP);
- orderBitLength = ECUtil.getOrderBitLength(ecSpec.getOrder(), this.getS());
+ orderBitLength = ECUtil.getOrderBitLength(configuration, ecSpec.getOrder(), this.getS());
}
PrivateKeyInfo info;
@@ -420,9 +402,10 @@ public class BCECPrivateKey
byte[] enc = (byte[])in.readObject();
+ this.configuration = BouncyCastleProvider.CONFIGURATION;
+
populateFromPrivKeyInfo(PrivateKeyInfo.getInstance(ASN1Primitive.fromByteArray(enc)));
- this.configuration = BouncyCastleProvider.CONFIGURATION;
this.attrCarrier = new PKCS12BagAttributeCarrierImpl();
}
diff --git a/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/BCECPublicKey.java b/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/BCECPublicKey.java
index c3f0dd02..443c5f63 100644
--- a/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/BCECPublicKey.java
+++ b/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/BCECPublicKey.java
@@ -3,7 +3,6 @@ package org.bouncycastle.jcajce.provider.asymmetric.ec;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
-import java.math.BigInteger;
import java.security.interfaces.ECPublicKey;
import java.security.spec.ECParameterSpec;
import java.security.spec.ECPoint;
@@ -11,16 +10,13 @@ import java.security.spec.ECPublicKeySpec;
import java.security.spec.EllipticCurve;
import org.bouncycastle.asn1.ASN1Encodable;
-import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.ASN1OctetString;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.DERBitString;
-import org.bouncycastle.asn1.DERNull;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
import org.bouncycastle.asn1.x9.X962Parameters;
-import org.bouncycastle.asn1.x9.X9ECParameters;
import org.bouncycastle.asn1.x9.X9ECPoint;
import org.bouncycastle.asn1.x9.X9IntegerConverter;
import org.bouncycastle.asn1.x9.X9ObjectIdentifiers;
@@ -32,7 +28,6 @@ import org.bouncycastle.jcajce.provider.asymmetric.util.KeyUtil;
import org.bouncycastle.jcajce.provider.config.ProviderConfiguration;
import org.bouncycastle.jce.interfaces.ECPointEncoder;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
-import org.bouncycastle.jce.spec.ECNamedCurveSpec;
import org.bouncycastle.math.ec.ECCurve;
import org.bouncycastle.util.Strings;
@@ -44,7 +39,7 @@ public class BCECPublicKey
private String algorithm = "EC";
private boolean withCompression;
- private transient org.bouncycastle.math.ec.ECPoint q;
+ private transient ECPublicKeyParameters ecPublicKey;
private transient ECParameterSpec ecSpec;
private transient ProviderConfiguration configuration;
@@ -53,7 +48,7 @@ public class BCECPublicKey
BCECPublicKey key)
{
this.algorithm = algorithm;
- this.q = key.q;
+ this.ecPublicKey = key.ecPublicKey;
this.ecSpec = key.ecSpec;
this.withCompression = key.withCompression;
this.configuration = key.configuration;
@@ -66,7 +61,7 @@ public class BCECPublicKey
{
this.algorithm = algorithm;
this.ecSpec = spec.getParams();
- this.q = EC5Util.convertPoint(ecSpec, spec.getW(), false);
+ this.ecPublicKey = new ECPublicKeyParameters(EC5Util.convertPoint(ecSpec, spec.getW(), false), EC5Util.getDomainParameters(configuration, spec.getParams()));
this.configuration = configuration;
}
@@ -76,7 +71,6 @@ public class BCECPublicKey
ProviderConfiguration configuration)
{
this.algorithm = algorithm;
- this.q = spec.getQ();
if (spec.getParams() != null) // can be null if implictlyCa
{
@@ -84,17 +78,15 @@ public class BCECPublicKey
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.ecPublicKey = new ECPublicKeyParameters(
+ spec.getQ(), ECUtil.getDomainParameters(configuration, spec.getParams()));
this.ecSpec = EC5Util.convertSpec(ellipticCurve, spec.getParams());
}
else
{
- if (q.getCurve() == null)
- {
- org.bouncycastle.jce.spec.ECParameterSpec s = configuration.getEcImplicitlyCa();
+ org.bouncycastle.jce.spec.ECParameterSpec s = configuration.getEcImplicitlyCa();
- q = s.getCurve().createPoint(q.getXCoord().toBigInteger(), q.getYCoord().toBigInteger(), false);
- }
+ this.ecPublicKey = new ECPublicKeyParameters(s.getCurve().createPoint(spec.getQ().getAffineXCoord().toBigInteger(), spec.getQ().getAffineYCoord().toBigInteger()), EC5Util.getDomainParameters(configuration, (ECParameterSpec)null));
this.ecSpec = null;
}
@@ -110,7 +102,7 @@ public class BCECPublicKey
ECDomainParameters dp = params.getParameters();
this.algorithm = algorithm;
- this.q = params.getQ();
+ this.ecPublicKey = params;
if (spec == null)
{
@@ -149,8 +141,7 @@ public class BCECPublicKey
this.ecSpec = EC5Util.convertSpec(ellipticCurve, spec);
}
- this.q = EC5Util.convertCurve(ecSpec.getCurve()).createPoint(params.getQ().getAffineXCoord().toBigInteger(), params.getQ().getAffineYCoord().toBigInteger());
-
+ this.ecPublicKey = params;
this.configuration = configuration;
}
@@ -163,7 +154,7 @@ public class BCECPublicKey
ProviderConfiguration configuration)
{
this.algorithm = algorithm;
- this.q = params.getQ();
+ this.ecPublicKey = params;
this.ecSpec = null;
this.configuration = configuration;
}
@@ -174,7 +165,7 @@ public class BCECPublicKey
{
this.algorithm = key.getAlgorithm();
this.ecSpec = key.getParams();
- this.q = EC5Util.convertPoint(this.ecSpec, key.getW(), false);
+ this.ecPublicKey = new ECPublicKeyParameters(EC5Util.convertPoint(this.ecSpec, key.getW(), false), EC5Util.getDomainParameters(configuration, key.getParams()));
}
BCECPublicKey(
@@ -200,7 +191,7 @@ public class BCECPublicKey
private void populateFromPubKeyInfo(SubjectPublicKeyInfo info)
{
- X962Parameters params = new X962Parameters((ASN1Primitive)info.getAlgorithm().getParameters());
+ X962Parameters params = X962Parameters.getInstance(info.getAlgorithm().getParameters());
ECCurve curve = EC5Util.getCurve(configuration, params);
ecSpec = EC5Util.convertToSpec(params, curve);
@@ -231,7 +222,7 @@ public class BCECPublicKey
X9ECPoint derQ = new X9ECPoint(curve, key);
- this.q = derQ.getPoint();
+ this.ecPublicKey = new ECPublicKeyParameters(derQ.getPoint(), ECUtil.getDomainParameters(configuration, params));
}
public String getAlgorithm()
@@ -246,72 +237,15 @@ public class BCECPublicKey
public byte[] getEncoded()
{
- ASN1Encodable params;
- SubjectPublicKeyInfo info;
-
- if (ecSpec instanceof ECNamedCurveSpec)
- {
- ASN1ObjectIdentifier curveOid = ECUtil.getNamedCurveOid(((ECNamedCurveSpec)ecSpec).getName());
- if (curveOid == null)
- {
- curveOid = new ASN1ObjectIdentifier(((ECNamedCurveSpec)ecSpec).getName());
- }
- params = new X962Parameters(curveOid);
- }
- else if (ecSpec == null)
- {
- params = new X962Parameters(DERNull.INSTANCE);
- }
- else
- {
- ECCurve curve = EC5Util.convertCurve(ecSpec.getCurve());
-
- X9ECParameters ecP = new X9ECParameters(
- curve,
- EC5Util.convertPoint(curve, ecSpec.getGenerator(), withCompression),
- ecSpec.getOrder(),
- BigInteger.valueOf(ecSpec.getCofactor()),
- ecSpec.getCurve().getSeed());
-
- params = new X962Parameters(ecP);
- }
-
- ECCurve curve = this.engineGetQ().getCurve();
- ASN1OctetString p;
+ ASN1Encodable params = ECUtils.getDomainParametersFromName(ecSpec, withCompression);
+ ASN1OctetString p = ASN1OctetString.getInstance(new X9ECPoint(ecPublicKey.getQ(), withCompression).toASN1Primitive());
// stored curve is null if ImplicitlyCa
- if (ecSpec == null)
- {
- p = (ASN1OctetString)
- new X9ECPoint(curve.createPoint(this.getQ().getXCoord().toBigInteger(), this.getQ().getYCoord().toBigInteger(), withCompression)).toASN1Primitive();
- }
- else
- {
- p = (ASN1OctetString)
- new X9ECPoint(curve.createPoint(this.getQ().getAffineXCoord().toBigInteger(), this.getQ().getAffineYCoord().toBigInteger(), withCompression)).toASN1Primitive();
- }
-
- info = new SubjectPublicKeyInfo(new AlgorithmIdentifier(X9ObjectIdentifiers.id_ecPublicKey, params), p.getOctets());
+ SubjectPublicKeyInfo info = new SubjectPublicKeyInfo(new AlgorithmIdentifier(X9ObjectIdentifiers.id_ecPublicKey, params), p.getOctets());
return KeyUtil.getEncodedSubjectPublicKeyInfo(info);
}
- private void extractBytes(byte[] encKey, int offSet, BigInteger bI)
- {
- byte[] val = bI.toByteArray();
- if (val.length < 32)
- {
- byte[] tmp = new byte[32];
- System.arraycopy(val, 0, tmp, tmp.length - val.length, val.length);
- val = tmp;
- }
-
- for (int i = 0; i != 32; i++)
- {
- encKey[offSet + i] = val[val.length - 1 - i];
- }
- }
-
public ECParameterSpec getParams()
{
return ecSpec;
@@ -329,11 +263,15 @@ public class BCECPublicKey
public ECPoint getW()
{
+ org.bouncycastle.math.ec.ECPoint q = ecPublicKey.getQ();
+
return new ECPoint(q.getAffineXCoord().toBigInteger(), q.getAffineYCoord().toBigInteger());
}
public org.bouncycastle.math.ec.ECPoint getQ()
{
+ org.bouncycastle.math.ec.ECPoint q = ecPublicKey.getQ();
+
if (ecSpec == null)
{
return q.getDetachedPoint();
@@ -342,9 +280,9 @@ public class BCECPublicKey
return q;
}
- public org.bouncycastle.math.ec.ECPoint engineGetQ()
+ ECPublicKeyParameters engineGetKeyParameters()
{
- return q;
+ return ecPublicKey;
}
org.bouncycastle.jce.spec.ECParameterSpec engineGetSpec()
@@ -361,10 +299,11 @@ public class BCECPublicKey
{
StringBuffer buf = new StringBuffer();
String nl = Strings.lineSeparator();
+ org.bouncycastle.math.ec.ECPoint q = ecPublicKey.getQ();
buf.append("EC Public Key").append(nl);
- buf.append(" X: ").append(this.q.getAffineXCoord().toBigInteger().toString(16)).append(nl);
- buf.append(" Y: ").append(this.q.getAffineYCoord().toBigInteger().toString(16)).append(nl);
+ buf.append(" X: ").append(q.getAffineXCoord().toBigInteger().toString(16)).append(nl);
+ buf.append(" Y: ").append(q.getAffineYCoord().toBigInteger().toString(16)).append(nl);
return buf.toString();
@@ -384,12 +323,12 @@ public class BCECPublicKey
BCECPublicKey other = (BCECPublicKey)o;
- return engineGetQ().equals(other.engineGetQ()) && (engineGetSpec().equals(other.engineGetSpec()));
+ return ecPublicKey.getQ().equals(other.ecPublicKey.getQ()) && (engineGetSpec().equals(other.engineGetSpec()));
}
public int hashCode()
{
- return engineGetQ().hashCode() ^ engineGetSpec().hashCode();
+ return ecPublicKey.getQ().hashCode() ^ engineGetSpec().hashCode();
}
private void readObject(
@@ -400,9 +339,9 @@ public class BCECPublicKey
byte[] enc = (byte[])in.readObject();
- populateFromPubKeyInfo(SubjectPublicKeyInfo.getInstance(ASN1Primitive.fromByteArray(enc)));
-
this.configuration = BouncyCastleProvider.CONFIGURATION;
+
+ populateFromPubKeyInfo(SubjectPublicKeyInfo.getInstance(ASN1Primitive.fromByteArray(enc)));
}
private void writeObject(
diff --git a/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/ECUtils.java b/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/ECUtils.java
index dc92e0e4..8a5c834c 100644
--- a/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/ECUtils.java
+++ b/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/ECUtils.java
@@ -1,13 +1,30 @@
package org.bouncycastle.jcajce.provider.asymmetric.ec;
+import java.math.BigInteger;
+import java.security.InvalidKeyException;
+import java.security.PublicKey;
import java.security.spec.ECGenParameterSpec;
+import java.security.spec.ECParameterSpec;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
+import org.bouncycastle.asn1.DERNull;
+import org.bouncycastle.asn1.x9.X962Parameters;
import org.bouncycastle.asn1.x9.X9ECParameters;
+import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
+import org.bouncycastle.jcajce.provider.asymmetric.util.EC5Util;
import org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil;
+import org.bouncycastle.jce.spec.ECNamedCurveSpec;
+import org.bouncycastle.math.ec.ECCurve;
class ECUtils
{
+ static AsymmetricKeyParameter generatePublicKeyParameter(
+ PublicKey key)
+ throws InvalidKeyException
+ {
+ return (key instanceof BCECPublicKey) ? ((BCECPublicKey)key).engineGetKeyParameters() : ECUtil.generatePublicKeyParameter(key);
+ }
+
static X9ECParameters getDomainParametersFromGenSpec(ECGenParameterSpec genSpec)
{
return getDomainParametersFromName(genSpec.getName());
@@ -42,4 +59,38 @@ class ECUtils
}
return domainParameters;
}
+
+ static X962Parameters getDomainParametersFromName(ECParameterSpec ecSpec, boolean withCompression)
+ {
+ X962Parameters params;
+
+ if (ecSpec instanceof ECNamedCurveSpec)
+ {
+ ASN1ObjectIdentifier curveOid = ECUtil.getNamedCurveOid(((ECNamedCurveSpec)ecSpec).getName());
+ if (curveOid == null)
+ {
+ curveOid = new ASN1ObjectIdentifier(((ECNamedCurveSpec)ecSpec).getName());
+ }
+ params = new X962Parameters(curveOid);
+ }
+ else if (ecSpec == null)
+ {
+ params = new X962Parameters(DERNull.INSTANCE);
+ }
+ else
+ {
+ ECCurve curve = EC5Util.convertCurve(ecSpec.getCurve());
+
+ X9ECParameters ecP = new X9ECParameters(
+ curve,
+ EC5Util.convertPoint(curve, ecSpec.getGenerator(), withCompression),
+ ecSpec.getOrder(),
+ BigInteger.valueOf(ecSpec.getCofactor()),
+ ecSpec.getCurve().getSeed());
+
+ params = new X962Parameters(ecP);
+ }
+
+ return params;
+ }
}
diff --git a/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyAgreementSpi.java b/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyAgreementSpi.java
index 004e2873..5d8e6b18 100644
--- a/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyAgreementSpi.java
+++ b/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyAgreementSpi.java
@@ -18,13 +18,6 @@ import org.bouncycastle.crypto.agreement.ECDHBasicAgreement;
// import org.bouncycastle.crypto.agreement.ECDHCBasicAgreement;
// import org.bouncycastle.crypto.agreement.ECMQVBasicAgreement;
// import org.bouncycastle.crypto.agreement.kdf.ConcatenationKDFGenerator;
-// END android-removed
-import org.bouncycastle.crypto.digests.SHA1Digest;
-import org.bouncycastle.crypto.digests.SHA224Digest;
-import org.bouncycastle.crypto.digests.SHA256Digest;
-import org.bouncycastle.crypto.digests.SHA384Digest;
-import org.bouncycastle.crypto.digests.SHA512Digest;
-// BEGIN android-removed
// import org.bouncycastle.crypto.generators.KDF2BytesGenerator;
// END android-removed
import org.bouncycastle.crypto.params.ECDomainParameters;
@@ -33,6 +26,7 @@ import org.bouncycastle.crypto.params.ECPublicKeyParameters;
// BEGIN android-removed
// import org.bouncycastle.crypto.params.MQVPrivateParameters;
// import org.bouncycastle.crypto.params.MQVPublicParameters;
+// import org.bouncycastle.crypto.util.DigestFactory;
// END android-removed
import org.bouncycastle.jcajce.provider.asymmetric.util.BaseAgreementSpi;
import org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil;
@@ -66,6 +60,7 @@ public class KeyAgreementSpi
// BEGIN android-removed
// private MQVParameterSpec mqvParameters;
// END android-removed
+ private BigInteger result;
protected KeyAgreementSpi(
String kaAlgorithm,
@@ -106,9 +101,9 @@ public class KeyAgreementSpi
// if (!(key instanceof MQVPublicKey))
// {
// ECPublicKeyParameters staticKey = (ECPublicKeyParameters)
- // ECUtil.generatePublicKeyParameter((PublicKey)key);
+ // ECUtils.generatePublicKeyParameter((PublicKey)key);
// ECPublicKeyParameters ephemKey = (ECPublicKeyParameters)
- // ECUtil.generatePublicKeyParameter(mqvParameters.getOtherPartyEphemeralKey());
+ // ECUtils.generatePublicKeyParameter(mqvParameters.getOtherPartyEphemeralKey());
//
// pubKey = new MQVPublicParameters(staticKey, ephemKey);
// }
@@ -116,13 +111,11 @@ public class KeyAgreementSpi
// {
// MQVPublicKey mqvPubKey = (MQVPublicKey)key;
// ECPublicKeyParameters staticKey = (ECPublicKeyParameters)
- // ECUtil.generatePublicKeyParameter(mqvPubKey.getStaticKey());
+ // ECUtils.generatePublicKeyParameter(mqvPubKey.getStaticKey());
// ECPublicKeyParameters ephemKey = (ECPublicKeyParameters)
- // ECUtil.generatePublicKeyParameter(mqvPubKey.getEphemeralKey());
+ // ECUtils.generatePublicKeyParameter(mqvPubKey.getEphemeralKey());
//
// pubKey = new MQVPublicParameters(staticKey, ephemKey);
- //
- // // TODO Validate that all the keys are using the same parameters?
// }
// }
// else
@@ -134,21 +127,27 @@ public class KeyAgreementSpi
+ getSimpleName(ECPublicKey.class) + " for doPhase");
}
- pubKey = ECUtil.generatePublicKeyParameter((PublicKey)key);
-
- // TODO Validate that all the keys are using the same parameters?
+ pubKey = ECUtils.generatePublicKeyParameter((PublicKey)key);
}
- // BEGIN android-added
- try {
- // END android-added
- result = agreement.calculateAgreement(pubKey);
- // BEGIN android-added
+ try
+ {
+ result = agreement.calculateAgreement(pubKey);
+ // BEGIN android-changed
+ // Was:
+ // } catch (final Exception e) {
+ // throw new InvalidKeyException("calculation failed: " + e.getMessage())
+ // {
+ // public Throwable getCause()
+ // {
+ // return e;
+ // }
+ // };
+ // }
+ // END android-changed
} catch (IllegalStateException e) {
- throw new InvalidKeyException("Invalid public key");
+ throw new InvalidKeyException("Invalid public key");
}
- // END android-added
-
return null;
}
@@ -170,7 +169,7 @@ public class KeyAgreementSpi
protected void engineInit(
Key key,
- SecureRandom random)
+ SecureRandom random)
throws InvalidKeyException
{
initFromKey(key, null);
@@ -204,7 +203,7 @@ public class KeyAgreementSpi
// if (mqvPrivKey.getEphemeralPublicKey() != null)
// {
// ephemPubKey = (ECPublicKeyParameters)
- // ECUtil.generatePublicKeyParameter(mqvPrivKey.getEphemeralPublicKey());
+ // ECUtils.generatePublicKeyParameter(mqvPrivKey.getEphemeralPublicKey());
// }
// }
// else
@@ -220,7 +219,7 @@ public class KeyAgreementSpi
// if (mqvParameterSpec.getEphemeralPublicKey() != null)
// {
// ephemPubKey = (ECPublicKeyParameters)
- // ECUtil.generatePublicKeyParameter(mqvParameterSpec.getEphemeralPublicKey());
+ // ECUtils.generatePublicKeyParameter(mqvParameterSpec.getEphemeralPublicKey());
// }
// mqvParameters = mqvParameterSpec;
// ukmParameters = mqvParameterSpec.getUserKeyingMaterial();
@@ -256,6 +255,12 @@ public class KeyAgreementSpi
return fullName.substring(fullName.lastIndexOf('.') + 1);
}
+
+ protected byte[] calcSecret()
+ {
+ return bigIntToBytes(result);
+ }
+
public static class DH
extends KeyAgreementSpi
{
@@ -274,7 +279,7 @@ public class KeyAgreementSpi
// super("ECDHC", new ECDHCBasicAgreement(), null);
// }
// }
- //
+
// public static class MQV
// extends KeyAgreementSpi
// {
@@ -283,229 +288,230 @@ public class KeyAgreementSpi
// super("ECMQV", new ECMQVBasicAgreement(), null);
// }
// }
- //
+
// public static class DHwithSHA1KDF
// extends KeyAgreementSpi
// {
// public DHwithSHA1KDF()
// {
- // super("ECDHwithSHA1KDF", new ECDHBasicAgreement(), new KDF2BytesGenerator(new SHA1Digest()));
+ // super("ECDHwithSHA1KDF", new ECDHBasicAgreement(), new KDF2BytesGenerator(DigestFactory.createSHA1()));
// }
// }
- //
+
// public static class DHwithSHA1KDFAndSharedInfo
// extends KeyAgreementSpi
// {
// public DHwithSHA1KDFAndSharedInfo()
// {
- // super("ECDHwithSHA1KDF", new ECDHBasicAgreement(), new KDF2BytesGenerator(new SHA1Digest()));
+ // super("ECDHwithSHA1KDF", new ECDHBasicAgreement(), new KDF2BytesGenerator(DigestFactory.createSHA1()));
// }
// }
- //
+
// public static class CDHwithSHA1KDFAndSharedInfo
// extends KeyAgreementSpi
// {
// public CDHwithSHA1KDFAndSharedInfo()
// {
- // super("ECCDHwithSHA1KDF", new ECDHCBasicAgreement(), new KDF2BytesGenerator(new SHA1Digest()));
+ // super("ECCDHwithSHA1KDF", new ECDHCBasicAgreement(), new KDF2BytesGenerator(DigestFactory.createSHA1()));
// }
// }
- //
+
// public static class DHwithSHA224KDFAndSharedInfo
// extends KeyAgreementSpi
// {
// public DHwithSHA224KDFAndSharedInfo()
// {
- // super("ECDHwithSHA224KDF", new ECDHBasicAgreement(), new KDF2BytesGenerator(new SHA224Digest()));
+ // super("ECDHwithSHA224KDF", new ECDHBasicAgreement(), new KDF2BytesGenerator(DigestFactory.createSHA224()));
// }
// }
- //
+
// public static class CDHwithSHA224KDFAndSharedInfo
// extends KeyAgreementSpi
// {
// public CDHwithSHA224KDFAndSharedInfo()
// {
- // super("ECCDHwithSHA224KDF", new ECDHCBasicAgreement(), new KDF2BytesGenerator(new SHA224Digest()));
+ // super("ECCDHwithSHA224KDF", new ECDHCBasicAgreement(), new KDF2BytesGenerator(DigestFactory.createSHA224()));
// }
// }
- //
+
// public static class DHwithSHA256KDFAndSharedInfo
// extends KeyAgreementSpi
// {
// public DHwithSHA256KDFAndSharedInfo()
// {
- // super("ECDHwithSHA256KDF", new ECDHBasicAgreement(), new KDF2BytesGenerator(new SHA256Digest()));
+ // super("ECDHwithSHA256KDF", new ECDHBasicAgreement(), new KDF2BytesGenerator(DigestFactory.createSHA256()));
// }
// }
- //
+
// public static class CDHwithSHA256KDFAndSharedInfo
// extends KeyAgreementSpi
// {
// public CDHwithSHA256KDFAndSharedInfo()
// {
- // super("ECCDHwithSHA256KDF", new ECDHCBasicAgreement(), new KDF2BytesGenerator(new SHA256Digest()));
+ // super("ECCDHwithSHA256KDF", new ECDHCBasicAgreement(), new KDF2BytesGenerator(DigestFactory.createSHA256()));
// }
// }
- //
+
// public static class DHwithSHA384KDFAndSharedInfo
// extends KeyAgreementSpi
// {
// public DHwithSHA384KDFAndSharedInfo()
// {
- // super("ECDHwithSHA384KDF", new ECDHBasicAgreement(), new KDF2BytesGenerator(new SHA384Digest()));
+ // super("ECDHwithSHA384KDF", new ECDHBasicAgreement(), new KDF2BytesGenerator(DigestFactory.createSHA384()));
// }
// }
- //
+
// public static class CDHwithSHA384KDFAndSharedInfo
// extends KeyAgreementSpi
// {
// public CDHwithSHA384KDFAndSharedInfo()
// {
- // super("ECCDHwithSHA384KDF", new ECDHCBasicAgreement(), new KDF2BytesGenerator(new SHA384Digest()));
+ // super("ECCDHwithSHA384KDF", new ECDHCBasicAgreement(), new KDF2BytesGenerator(DigestFactory.createSHA384()));
// }
// }
- //
+
// public static class DHwithSHA512KDFAndSharedInfo
// extends KeyAgreementSpi
// {
// public DHwithSHA512KDFAndSharedInfo()
// {
- // super("ECDHwithSHA512KDF", new ECDHBasicAgreement(), new KDF2BytesGenerator(new SHA512Digest()));
+ // super("ECDHwithSHA512KDF", new ECDHBasicAgreement(), new KDF2BytesGenerator(DigestFactory.createSHA512()));
// }
// }
- //
+
// public static class CDHwithSHA512KDFAndSharedInfo
// extends KeyAgreementSpi
// {
// public CDHwithSHA512KDFAndSharedInfo()
// {
- // super("ECCDHwithSHA512KDF", new ECDHCBasicAgreement(), new KDF2BytesGenerator(new SHA512Digest()));
+ // super("ECCDHwithSHA512KDF", new ECDHCBasicAgreement(), new KDF2BytesGenerator(DigestFactory.createSHA512()));
// }
// }
- //
+
// public static class MQVwithSHA1KDFAndSharedInfo
// extends KeyAgreementSpi
// {
// public MQVwithSHA1KDFAndSharedInfo()
// {
- // super("ECMQVwithSHA1KDF", new ECMQVBasicAgreement(), new KDF2BytesGenerator(new SHA1Digest()));
+ // super("ECMQVwithSHA1KDF", new ECMQVBasicAgreement(), new KDF2BytesGenerator(DigestFactory.createSHA1()));
// }
// }
- //
+
// public static class MQVwithSHA224KDFAndSharedInfo
// extends KeyAgreementSpi
// {
// public MQVwithSHA224KDFAndSharedInfo()
// {
- // super("ECMQVwithSHA224KDF", new ECMQVBasicAgreement(), new KDF2BytesGenerator(new SHA224Digest()));
+ // super("ECMQVwithSHA224KDF", new ECMQVBasicAgreement(), new KDF2BytesGenerator(DigestFactory.createSHA224()));
// }
// }
- //
+
// public static class MQVwithSHA256KDFAndSharedInfo
// extends KeyAgreementSpi
// {
// public MQVwithSHA256KDFAndSharedInfo()
// {
- // super("ECMQVwithSHA256KDF", new ECMQVBasicAgreement(), new KDF2BytesGenerator(new SHA256Digest()));
+ // super("ECMQVwithSHA256KDF", new ECMQVBasicAgreement(), new KDF2BytesGenerator(DigestFactory.createSHA256()));
// }
// }
- //
+
// public static class MQVwithSHA384KDFAndSharedInfo
// extends KeyAgreementSpi
// {
// public MQVwithSHA384KDFAndSharedInfo()
// {
- // super("ECMQVwithSHA384KDF", new ECMQVBasicAgreement(), new KDF2BytesGenerator(new SHA384Digest()));
+ // super("ECMQVwithSHA384KDF", new ECMQVBasicAgreement(), new KDF2BytesGenerator(DigestFactory.createSHA384()));
// }
// }
- //
+
// public static class MQVwithSHA512KDFAndSharedInfo
// extends KeyAgreementSpi
// {
// public MQVwithSHA512KDFAndSharedInfo()
// {
- // super("ECMQVwithSHA512KDF", new ECMQVBasicAgreement(), new KDF2BytesGenerator(new SHA512Digest()));
+ // super("ECMQVwithSHA512KDF", new ECMQVBasicAgreement(), new KDF2BytesGenerator(DigestFactory.createSHA512()));
// }
// }
- //
+
// public static class DHwithSHA1CKDF
// extends KeyAgreementSpi
// {
// public DHwithSHA1CKDF()
// {
- // super("ECDHwithSHA1CKDF", new ECDHCBasicAgreement(), new ConcatenationKDFGenerator(new SHA1Digest()));
+ // super("ECDHwithSHA1CKDF", new ECDHCBasicAgreement(), new ConcatenationKDFGenerator(DigestFactory.createSHA1()));
// }
// }
- //
+
// public static class DHwithSHA256CKDF
// extends KeyAgreementSpi
// {
// public DHwithSHA256CKDF()
// {
- // super("ECDHwithSHA256CKDF", new ECDHCBasicAgreement(), new ConcatenationKDFGenerator(new SHA256Digest()));
+ // super("ECDHwithSHA256CKDF", new ECDHCBasicAgreement(), new ConcatenationKDFGenerator(DigestFactory.createSHA256()));
// }
// }
- //
+
// public static class DHwithSHA384CKDF
// extends KeyAgreementSpi
// {
// public DHwithSHA384CKDF()
// {
- // super("ECDHwithSHA384CKDF", new ECDHCBasicAgreement(), new ConcatenationKDFGenerator(new SHA384Digest()));
+ // super("ECDHwithSHA384CKDF", new ECDHCBasicAgreement(), new ConcatenationKDFGenerator(DigestFactory.createSHA384()));
// }
// }
- //
+
// public static class DHwithSHA512CKDF
// extends KeyAgreementSpi
// {
// public DHwithSHA512CKDF()
// {
- // super("ECDHwithSHA512CKDF", new ECDHCBasicAgreement(), new ConcatenationKDFGenerator(new SHA512Digest()));
+ // super("ECDHwithSHA512CKDF", new ECDHCBasicAgreement(), new ConcatenationKDFGenerator(DigestFactory.createSHA512()));
// }
// }
- //
+
// public static class MQVwithSHA1CKDF
// extends KeyAgreementSpi
// {
// public MQVwithSHA1CKDF()
// {
- // super("ECMQVwithSHA1CKDF", new ECMQVBasicAgreement(), new ConcatenationKDFGenerator(new SHA1Digest()));
+ // super("ECMQVwithSHA1CKDF", new ECMQVBasicAgreement(), new ConcatenationKDFGenerator(DigestFactory.createSHA1()));
// }
// }
- //
+
// public static class MQVwithSHA224CKDF
// extends KeyAgreementSpi
// {
// public MQVwithSHA224CKDF()
// {
- // super("ECMQVwithSHA224CKDF", new ECMQVBasicAgreement(), new ConcatenationKDFGenerator(new SHA224Digest()));
+ // super("ECMQVwithSHA224CKDF", new ECMQVBasicAgreement(), new ConcatenationKDFGenerator(DigestFactory.createSHA224()));
// }
// }
- //
+
// public static class MQVwithSHA256CKDF
// extends KeyAgreementSpi
// {
// public MQVwithSHA256CKDF()
// {
- // super("ECMQVwithSHA256CKDF", new ECMQVBasicAgreement(), new ConcatenationKDFGenerator(new SHA256Digest()));
+ // super("ECMQVwithSHA256CKDF", new ECMQVBasicAgreement(), new ConcatenationKDFGenerator(DigestFactory.createSHA256()));
// }
// }
- //
+
// public static class MQVwithSHA384CKDF
// extends KeyAgreementSpi
// {
// public MQVwithSHA384CKDF()
// {
- // super("ECMQVwithSHA384CKDF", new ECMQVBasicAgreement(), new ConcatenationKDFGenerator(new SHA384Digest()));
+ // super("ECMQVwithSHA384CKDF", new ECMQVBasicAgreement(), new ConcatenationKDFGenerator(DigestFactory.createSHA384()));
// }
// }
- //
+
// public static class MQVwithSHA512CKDF
// extends KeyAgreementSpi
// {
// public MQVwithSHA512CKDF()
// {
- // super("ECMQVwithSHA512CKDF", new ECMQVBasicAgreement(), new ConcatenationKDFGenerator(new SHA512Digest()));
+ // super("ECMQVwithSHA512CKDF", new ECMQVBasicAgreement(), new ConcatenationKDFGenerator(DigestFactory.createSHA512()));
// }
// }
+ // END android-removed
}
diff --git a/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyFactorySpi.java b/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyFactorySpi.java
index 5769bacc..a749f114 100644
--- a/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyFactorySpi.java
+++ b/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyFactorySpi.java
@@ -141,13 +141,20 @@ public class KeyFactorySpi
KeySpec keySpec)
throws InvalidKeySpecException
{
- if (keySpec instanceof ECPublicKeySpec)
+ try
{
- return new BCECPublicKey(algorithm, (ECPublicKeySpec)keySpec, configuration);
+ if (keySpec instanceof ECPublicKeySpec)
+ {
+ return new BCECPublicKey(algorithm, (ECPublicKeySpec)keySpec, configuration);
+ }
+ else if (keySpec instanceof java.security.spec.ECPublicKeySpec)
+ {
+ return new BCECPublicKey(algorithm, (java.security.spec.ECPublicKeySpec)keySpec, configuration);
+ }
}
- else if (keySpec instanceof java.security.spec.ECPublicKeySpec)
+ catch (Exception e)
{
- return new BCECPublicKey(algorithm, (java.security.spec.ECPublicKeySpec)keySpec, configuration);
+ throw new InvalidKeySpecException("invalid KeySpec: " + e.getMessage(), e);
}
return super.engineGeneratePublic(keySpec);
diff --git a/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyPairGeneratorSpi.java b/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyPairGeneratorSpi.java
index 9a9c46be..5f8a901e 100644
--- a/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyPairGeneratorSpi.java
+++ b/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/KeyPairGeneratorSpi.java
@@ -8,6 +8,7 @@ import java.security.SecureRandom;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.ECGenParameterSpec;
import java.util.Hashtable;
+import java.util.Map;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.x9.ECNamedCurveTable;
@@ -194,7 +195,7 @@ public abstract class KeyPairGeneratorSpi
protected ECKeyGenerationParameters createKeyGenParamsBC(ECParameterSpec p, SecureRandom r)
{
- return new ECKeyGenerationParameters(new ECDomainParameters(p.getCurve(), p.getG(), p.getN()), r);
+ return new ECKeyGenerationParameters(new ECDomainParameters(p.getCurve(), p.getG(), p.getN(), p.getH()), r);
}
protected ECKeyGenerationParameters createKeyGenParamsJCE(java.security.spec.ECParameterSpec p, SecureRandom r)
@@ -221,7 +222,14 @@ public abstract class KeyPairGeneratorSpi
p = ECNamedCurveTable.getByOID(new ASN1ObjectIdentifier(curveName));
if (p == null)
{
- throw new InvalidAlgorithmParameterException("unknown curve OID: " + curveName);
+ Map extraCurves = configuration.getAdditionalECParameters();
+
+ p = (X9ECParameters)extraCurves.get(new ASN1ObjectIdentifier(curveName));
+
+ if (p == null)
+ {
+ throw new InvalidAlgorithmParameterException("unknown curve OID: " + curveName);
+ }
}
}
catch (IllegalArgumentException ex)
diff --git a/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/SignatureSpi.java b/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/SignatureSpi.java
index 26811d18..46aeec7e 100644
--- a/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/SignatureSpi.java
+++ b/bcprov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/ec/SignatureSpi.java
@@ -21,21 +21,18 @@ import org.bouncycastle.crypto.digests.AndroidDigestFactory;
// END android-added
// BEGIN android-removed
// import org.bouncycastle.crypto.digests.RIPEMD160Digest;
-// import org.bouncycastle.crypto.digests.SHA1Digest;
-// import org.bouncycastle.crypto.digests.SHA224Digest;
-// import org.bouncycastle.crypto.digests.SHA256Digest;
-// import org.bouncycastle.crypto.digests.SHA384Digest;
-// import org.bouncycastle.crypto.digests.SHA512Digest;
// END android-removed
import org.bouncycastle.crypto.params.ParametersWithRandom;
import org.bouncycastle.crypto.signers.ECDSASigner;
// BEGIN android-removed
// import org.bouncycastle.crypto.signers.ECNRSigner;
// import org.bouncycastle.crypto.signers.HMacDSAKCalculator;
+// import org.bouncycastle.crypto.util.DigestFactory;
// END android-removed
import org.bouncycastle.jcajce.provider.asymmetric.util.DSABase;
import org.bouncycastle.jcajce.provider.asymmetric.util.DSAEncoder;
import org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil;
+import org.bouncycastle.util.Arrays;
public class SignatureSpi
extends DSABase
@@ -48,7 +45,7 @@ public class SignatureSpi
protected void engineInitVerify(PublicKey publicKey)
throws InvalidKeyException
{
- CipherParameters param = ECUtil.generatePublicKeyParameter(publicKey);
+ CipherParameters param = ECUtils.generatePublicKeyParameter(publicKey);
digest.reset();
signer.init(false, param);
@@ -89,7 +86,7 @@ public class SignatureSpi
// {
// public ecDetDSA()
// {
- // super(new SHA1Digest(), new ECDSASigner(new HMacDSAKCalculator(new SHA1Digest())), new StdDSAEncoder());
+ // super(DigestFactory.createSHA1(), new ECDSASigner(new HMacDSAKCalculator(DigestFactory.createSHA1())), new StdDSAEncoder());
// }
// }
// END android-removed
@@ -120,7 +117,7 @@ public class SignatureSpi
// {
// public ecDetDSA224()
// {
- // super(new SHA224Digest(), new ECDSASigner(new HMacDSAKCalculator(new SHA224Digest())), new StdDSAEncoder());
+ // super(DigestFactory.createSHA224(), new ECDSASigner(new HMacDSAKCalculator(DigestFactory.createSHA224())), new StdDSAEncoder());
// }
// }
// END android-removed
@@ -142,7 +139,7 @@ public class SignatureSpi
// {
// public ecDetDSA256()
// {
- // super(new SHA256Digest(), new ECDSASigner(new HMacDSAKCalculator(new SHA256Digest())), new StdDSAEncoder());
+ // super(DigestFactory.createSHA256(), new ECDSASigner(new HMacDSAKCalculator(DigestFactory.createSHA256())), new StdDSAEncoder());
// }
// }
// END android-removed
@@ -164,11 +161,10 @@ public class SignatureSpi
// {
// public ecDetDSA384()
// {
- // super(new SHA384Digest(), new ECDSASigner(new HMacDSAKCalculator(new SHA384Digest())), new StdDSAEncoder());
+ // super(DigestFactory.createSHA384(), new ECDSASigner(new HMacDSAKCalculator(DigestFactory.createSHA384())), new StdDSAEncoder());
// }
// }
// END android-removed
-
static public class ecDSA512
extends SignatureSpi
{
@@ -186,10 +182,82 @@ public class SignatureSpi
// {
// public ecDetDSA512()
// {
- // super(new SHA512Digest(), new ECDSASigner(new HMacDSAKCalculator(new SHA512Digest())), new StdDSAEncoder());
+ // super(DigestFactory.createSHA512(), new ECDSASigner(new HMacDSAKCalculator(DigestFactory.createSHA512())), new StdDSAEncoder());
// }
// }
- //
+
+ // static public class ecDSASha3_224
+ // extends SignatureSpi
+ // {
+ // public ecDSASha3_224()
+ // {
+ // super(DigestFactory.createSHA3_224(), new ECDSASigner(), new StdDSAEncoder());
+ // }
+ // }
+
+ // static public class ecDetDSASha3_224
+ // extends SignatureSpi
+ // {
+ // public ecDetDSASha3_224()
+ // {
+ // super(DigestFactory.createSHA3_224(), new ECDSASigner(new HMacDSAKCalculator(DigestFactory.createSHA3_224())), new StdDSAEncoder());
+ // }
+ // }
+
+ // static public class ecDSASha3_256
+ // extends SignatureSpi
+ // {
+ // public ecDSASha3_256()
+ // {
+ // super(DigestFactory.createSHA3_256(), new ECDSASigner(), new StdDSAEncoder());
+ // }
+ // }
+
+ // static public class ecDetDSASha3_256
+ // extends SignatureSpi
+ // {
+ // public ecDetDSASha3_256()
+ // {
+ // super(DigestFactory.createSHA3_256(), new ECDSASigner(new HMacDSAKCalculator(DigestFactory.createSHA3_256())), new StdDSAEncoder());
+ // }
+ // }
+
+ // static public class ecDSASha3_384
+ // extends SignatureSpi
+ // {
+ // public ecDSASha3_384()
+ // {
+ // super(DigestFactory.createSHA3_384(), new ECDSASigner(), new StdDSAEncoder());
+ // }
+ // }
+
+ // static public class ecDetDSASha3_384
+ // extends SignatureSpi
+ // {
+ // public ecDetDSASha3_384()
+ // {
+ // super(DigestFactory.createSHA3_384(), new ECDSASigner(new HMacDSAKCalculator(DigestFactory.createSHA3_384())), new StdDSAEncoder());
+ // }
+ // }
+
+ // static public class ecDSASha3_512
+ // extends SignatureSpi
+ // {
+ // public ecDSASha3_512()
+ // {
+ // super(DigestFactory.createSHA3_512(), new ECDSASigner(), new StdDSAEncoder());
+ // }
+ // }
+
+ // static public class ecDetDSASha3_512
+ // extends SignatureSpi
+ // {
+ // public ecDetDSASha3_512()
+ // {
+ // super(DigestFactory.createSHA3_512(), new ECDSASigner(new HMacDSAKCalculator(DigestFactory.createSHA3_512())), new StdDSAEncoder());
+ // }
+ // }
+
// static public class ecDSARipeMD160
// extends SignatureSpi
// {
@@ -198,97 +266,97 @@ public class SignatureSpi
// super(new RIPEMD160Digest(), new ECDSASigner(), new StdDSAEncoder());
// }
// }
- //
+
// static public class ecNR
// extends SignatureSpi
// {
// public ecNR()
// {
- // super(new SHA1Digest(), new ECNRSigner(), new StdDSAEncoder());
+ // super(DigestFactory.createSHA1(), new ECNRSigner(), new StdDSAEncoder());
// }
// }
- //
+
// static public class ecNR224
// extends SignatureSpi
// {
// public ecNR224()
// {
- // super(new SHA224Digest(), new ECNRSigner(), new StdDSAEncoder());
+ // super(DigestFactory.createSHA224(), new ECNRSigner(), new StdDSAEncoder());
// }
// }
- //
+
// static public class ecNR256
// extends SignatureSpi
// {
// public ecNR256()
// {
- // super(new SHA256Digest(), new ECNRSigner(), new StdDSAEncoder());
+ // super(DigestFactory.createSHA256(), new ECNRSigner(), new StdDSAEncoder());
// }
// }
- //
+
// static public class ecNR384
// extends SignatureSpi
// {
// public ecNR384()
// {
- // super(new SHA384Digest(), new ECNRSigner(), new StdDSAEncoder());
+ // super(DigestFactory.createSHA384(), new ECNRSigner(), new StdDSAEncoder());
// }
// }
- //
+
// static public class ecNR512
// extends SignatureSpi
// {
// public ecNR512()
// {
- // super(new SHA512Digest(), new ECNRSigner(), new StdDSAEncoder());
+ // super(DigestFactory.createSHA512(), new ECNRSigner(), new StdDSAEncoder());
// }
// }
- //
+
// static public class ecCVCDSA
// extends SignatureSpi
// {
// public ecCVCDSA()
// {
- // super(new SHA1Digest(), new ECDSASigner(), new PlainDSAEncoder());
+ // super(DigestFactory.createSHA1(), new ECDSASigner(), new PlainDSAEncoder());
// }
// }
- //
+
// static public class ecCVCDSA224
// extends SignatureSpi
// {
// public ecCVCDSA224()
// {
- // super(new SHA224Digest(), new ECDSASigner(), new PlainDSAEncoder());
+ // super(DigestFactory.createSHA224(), new ECDSASigner(), new PlainDSAEncoder());
// }
// }
- //
+
// static public class ecCVCDSA256
// extends SignatureSpi
// {
// public ecCVCDSA256()
// {
- // super(new SHA256Digest(), new ECDSASigner(), new PlainDSAEncoder());
+ // super(DigestFactory.createSHA256(), new ECDSASigner(), new PlainDSAEncoder());
// }
// }
- //
+
// static public class ecCVCDSA384
// extends SignatureSpi
// {
// public ecCVCDSA384()
// {
- // super(new SHA384Digest(), new ECDSASigner(), new PlainDSAEncoder());
+ // super(DigestFactory.createSHA384(), new ECDSASigner(), new PlainDSAEncoder());
// }
// }
- //
+
// static public class ecCVCDSA512
// extends SignatureSpi
// {
// public ecCVCDSA512()
// {
- // super(new SHA512Digest(), new ECDSASigner(), new PlainDSAEncoder());
+ // super(DigestFactory.createSHA512(), new ECDSASigner(), new PlainDSAEncoder());
// }
// }
- //
+
// static public class ecPlainDSARP160
// extends SignatureSpi
// {
@@ -320,6 +388,15 @@ public class SignatureSpi
throws IOException
{
ASN1Sequence s = (ASN1Sequence)ASN1Primitive.fromByteArray(encoding);
+ if (s.size() != 2)
+ {
+ throw new IOException("malformed signature");
+ }
+ if (!Arrays.areEqual(encoding, s.getEncoded(ASN1Encoding.DER)))
+ {
+ throw new IOException("malformed signature");
+ }
+
BigInteger[] sig = new BigInteger[2];
sig[0] = ASN1Integer.getInstance(s.getObjectAt(0)).getValue();