summaryrefslogtreecommitdiffstats
path: root/bcprov/src/main/java/org/bouncycastle/jce/provider/test/DSATest.java
diff options
context:
space:
mode:
Diffstat (limited to 'bcprov/src/main/java/org/bouncycastle/jce/provider/test/DSATest.java')
-rw-r--r--bcprov/src/main/java/org/bouncycastle/jce/provider/test/DSATest.java1016
1 files changed, 0 insertions, 1016 deletions
diff --git a/bcprov/src/main/java/org/bouncycastle/jce/provider/test/DSATest.java b/bcprov/src/main/java/org/bouncycastle/jce/provider/test/DSATest.java
deleted file mode 100644
index 3e2ebd4..0000000
--- a/bcprov/src/main/java/org/bouncycastle/jce/provider/test/DSATest.java
+++ /dev/null
@@ -1,1016 +0,0 @@
-package org.bouncycastle.jce.provider.test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.math.BigInteger;
-import java.security.AlgorithmParameterGenerator;
-import java.security.AlgorithmParameters;
-import java.security.InvalidKeyException;
-import java.security.KeyFactory;
-import java.security.KeyPair;
-import java.security.KeyPairGenerator;
-import java.security.PrivateKey;
-import java.security.PublicKey;
-import java.security.SecureRandom;
-import java.security.Security;
-import java.security.Signature;
-import java.security.SignatureException;
-import java.security.interfaces.DSAPrivateKey;
-import java.security.interfaces.DSAPublicKey;
-import java.security.spec.DSAParameterSpec;
-import java.security.spec.PKCS8EncodedKeySpec;
-import java.security.spec.X509EncodedKeySpec;
-
-import org.bouncycastle.asn1.ASN1InputStream;
-import org.bouncycastle.asn1.ASN1Integer;
-import org.bouncycastle.asn1.ASN1ObjectIdentifier;
-import org.bouncycastle.asn1.ASN1Primitive;
-import org.bouncycastle.asn1.ASN1Sequence;
-import org.bouncycastle.asn1.eac.EACObjectIdentifiers;
-import org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers;
-import org.bouncycastle.asn1.x9.X9ObjectIdentifiers;
-import org.bouncycastle.crypto.params.DSAParameters;
-import org.bouncycastle.crypto.params.DSAPublicKeyParameters;
-import org.bouncycastle.crypto.signers.DSASigner;
-import org.bouncycastle.jce.interfaces.PKCS12BagAttributeCarrier;
-import org.bouncycastle.jce.provider.BouncyCastleProvider;
-import org.bouncycastle.jce.spec.ECNamedCurveGenParameterSpec;
-import org.bouncycastle.jce.spec.ECParameterSpec;
-import org.bouncycastle.jce.spec.ECPrivateKeySpec;
-import org.bouncycastle.jce.spec.ECPublicKeySpec;
-import org.bouncycastle.math.ec.ECCurve;
-import org.bouncycastle.util.Arrays;
-import org.bouncycastle.util.BigIntegers;
-import org.bouncycastle.util.encoders.Hex;
-import org.bouncycastle.util.test.FixedSecureRandom;
-import org.bouncycastle.util.test.SimpleTest;
-
-public class DSATest
- extends SimpleTest
-{
- byte[] k1 = Hex.decode("d5014e4b60ef2ba8b6211b4062ba3224e0427dd3");
- byte[] k2 = Hex.decode("345e8d05c075c3a508df729a1685690e68fcfb8c8117847e89063bca1f85d968fd281540b6e13bd1af989a1fbf17e06462bf511f9d0b140fb48ac1b1baa5bded");
-
- SecureRandom random = new FixedSecureRandom(new byte[][] { k1, k2 });
-
- private void testCompat()
- throws Exception
- {
- if (Security.getProvider("SUN") == null)
- {
- return;
- }
-
- Signature s = Signature.getInstance("DSA", "SUN");
- KeyPairGenerator g = KeyPairGenerator.getInstance("DSA", "SUN");
- byte[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
-
- g.initialize(512, new SecureRandom());
-
- KeyPair p = g.generateKeyPair();
-
- PrivateKey sKey = p.getPrivate();
- PublicKey vKey = p.getPublic();
-
- //
- // sign SUN - verify with BC
- //
- s.initSign(sKey);
-
- s.update(data);
-
- byte[] sigBytes = s.sign();
-
- s = Signature.getInstance("DSA", "BC");
-
- s.initVerify(vKey);
-
- s.update(data);
-
- if (!s.verify(sigBytes))
- {
- fail("SUN -> BC verification failed");
- }
-
- //
- // sign BC - verify with SUN
- //
-
- s.initSign(sKey);
-
- s.update(data);
-
- sigBytes = s.sign();
-
- s = Signature.getInstance("DSA", "SUN");
-
- s.initVerify(vKey);
-
- s.update(data);
-
- if (!s.verify(sigBytes))
- {
- fail("BC -> SUN verification failed");
- }
-
- //
- // key encoding test - BC decoding Sun keys
- //
- KeyFactory f = KeyFactory.getInstance("DSA", "BC");
- X509EncodedKeySpec x509s = new X509EncodedKeySpec(vKey.getEncoded());
-
- DSAPublicKey k1 = (DSAPublicKey)f.generatePublic(x509s);
-
- checkPublic(k1, vKey);
-
- PKCS8EncodedKeySpec pkcs8 = new PKCS8EncodedKeySpec(sKey.getEncoded());
-
- DSAPrivateKey k2 = (DSAPrivateKey)f.generatePrivate(pkcs8);
-
- checkPrivateKey(k2, sKey);
-
- //
- // key decoding test - SUN decoding BC keys
- //
- f = KeyFactory.getInstance("DSA", "SUN");
- x509s = new X509EncodedKeySpec(k1.getEncoded());
-
- vKey = (DSAPublicKey)f.generatePublic(x509s);
-
- checkPublic(k1, vKey);
-
- pkcs8 = new PKCS8EncodedKeySpec(k2.getEncoded());
- sKey = f.generatePrivate(pkcs8);
-
- checkPrivateKey(k2, sKey);
- }
-
- private void testNONEwithDSA()
- throws Exception
- {
- byte[] dummySha1 = Hex.decode("01020304050607080910111213141516");
-
- KeyPairGenerator kpGen = KeyPairGenerator.getInstance("DSA", "BC");
-
- kpGen.initialize(512);
-
- KeyPair kp = kpGen.generateKeyPair();
-
- Signature sig = Signature.getInstance("NONEwithDSA", "BC");
-
- sig.initSign(kp.getPrivate());
-
- sig.update(dummySha1);
-
- byte[] sigBytes = sig.sign();
-
- sig.initVerify(kp.getPublic());
-
- sig.update(dummySha1);
-
- sig.verify(sigBytes);
-
- // reset test
-
- sig.update(dummySha1);
-
- if (!sig.verify(sigBytes))
- {
- fail("NONEwithDSA failed to reset");
- }
-
- // lightweight test
- DSAPublicKey key = (DSAPublicKey)kp.getPublic();
- DSAParameters params = new DSAParameters(key.getParams().getP(), key.getParams().getQ(), key.getParams().getG());
- DSAPublicKeyParameters keyParams = new DSAPublicKeyParameters(key.getY(), params);
- DSASigner signer = new DSASigner();
- ASN1Sequence derSig = ASN1Sequence.getInstance(ASN1Primitive.fromByteArray(sigBytes));
-
- signer.init(false, keyParams);
-
- if (!signer.verifySignature(dummySha1, ASN1Integer.getInstance(derSig.getObjectAt(0)).getValue(), ASN1Integer.getInstance(derSig.getObjectAt(1)).getValue()))
- {
- fail("NONEwithDSA not really NONE!");
- }
- }
-
- private void checkPublic(DSAPublicKey k1, PublicKey vKey)
- {
- if (!k1.getY().equals(((DSAPublicKey)vKey).getY()))
- {
- fail("public number not decoded properly");
- }
-
- if (!k1.getParams().getG().equals(((DSAPublicKey)vKey).getParams().getG()))
- {
- fail("public generator not decoded properly");
- }
-
- if (!k1.getParams().getP().equals(((DSAPublicKey)vKey).getParams().getP()))
- {
- fail("public p value not decoded properly");
- }
-
- if (!k1.getParams().getQ().equals(((DSAPublicKey)vKey).getParams().getQ()))
- {
- fail("public q value not decoded properly");
- }
- }
-
- private void checkPrivateKey(DSAPrivateKey k2, PrivateKey sKey)
- {
- if (!k2.getX().equals(((DSAPrivateKey)sKey).getX()))
- {
- fail("private number not decoded properly");
- }
-
- if (!k2.getParams().getG().equals(((DSAPrivateKey)sKey).getParams().getG()))
- {
- fail("private generator not decoded properly");
- }
-
- if (!k2.getParams().getP().equals(((DSAPrivateKey)sKey).getParams().getP()))
- {
- fail("private p value not decoded properly");
- }
-
- if (!k2.getParams().getQ().equals(((DSAPrivateKey)sKey).getParams().getQ()))
- {
- fail("private q value not decoded properly");
- }
- }
-
- private Object serializeDeserialize(Object o)
- throws Exception
- {
- ByteArrayOutputStream bOut = new ByteArrayOutputStream();
- ObjectOutputStream oOut = new ObjectOutputStream(bOut);
-
- oOut.writeObject(o);
- oOut.close();
-
- ObjectInputStream oIn = new ObjectInputStream(new ByteArrayInputStream(bOut.toByteArray()));
-
- return oIn.readObject();
- }
-
- /**
- * X9.62 - 1998,<br>
- * J.3.2, Page 155, ECDSA over the field Fp<br>
- * an example with 239 bit prime
- */
- private void testECDSA239bitPrime()
- throws Exception
- {
- BigInteger r = new BigInteger("308636143175167811492622547300668018854959378758531778147462058306432176");
- BigInteger s = new BigInteger("323813553209797357708078776831250505931891051755007842781978505179448783");
-
- byte[] kData = BigIntegers.asUnsignedByteArray(new BigInteger("700000017569056646655505781757157107570501575775705779575555657156756655"));
-
- SecureRandom k = new FixedSecureRandom(kData);
-
- ECCurve curve = new ECCurve.Fp(
- new BigInteger("883423532389192164791648750360308885314476597252960362792450860609699839"), // q
- new BigInteger("7fffffffffffffffffffffff7fffffffffff8000000000007ffffffffffc", 16), // a
- new BigInteger("6b016c3bdcf18941d0d654921475ca71a9db2fb27d1d37796185c2942c0a", 16)); // b
-
- ECParameterSpec spec = new ECParameterSpec(
- curve,
- curve.decodePoint(Hex.decode("020ffa963cdca8816ccc33b8642bedf905c3d358573d3f27fbbd3b3cb9aaaf")), // G
- new BigInteger("883423532389192164791648750360308884807550341691627752275345424702807307")); // n
-
-
- ECPrivateKeySpec priKey = new ECPrivateKeySpec(
- new BigInteger("876300101507107567501066130761671078357010671067781776716671676178726717"), // d
- spec);
-
- ECPublicKeySpec pubKey = new ECPublicKeySpec(
- curve.decodePoint(Hex.decode("025b6dc53bc61a2548ffb0f671472de6c9521a9d2d2534e65abfcbd5fe0c70")), // Q
- spec);
-
- Signature sgr = Signature.getInstance("ECDSA", "BC");
- KeyFactory f = KeyFactory.getInstance("ECDSA", "BC");
- PrivateKey sKey = f.generatePrivate(priKey);
- PublicKey vKey = f.generatePublic(pubKey);
-
- sgr.initSign(sKey, k);
-
- byte[] message = new byte[] { (byte)'a', (byte)'b', (byte)'c' };
-
- sgr.update(message);
-
- byte[] sigBytes = sgr.sign();
-
- sgr.initVerify(vKey);
-
- sgr.update(message);
-
- if (!sgr.verify(sigBytes))
- {
- fail("239 Bit EC verification failed");
- }
-
- BigInteger[] sig = derDecode(sigBytes);
-
- if (!r.equals(sig[0]))
- {
- fail("r component wrong." + System.getProperty("line.separator")
- + " expecting: " + r + System.getProperty("line.separator")
- + " got : " + sig[0]);
- }
-
- if (!s.equals(sig[1]))
- {
- fail("s component wrong." + System.getProperty("line.separator")
- + " expecting: " + s + System.getProperty("line.separator")
- + " got : " + sig[1]);
- }
- }
-
- private void testNONEwithECDSA239bitPrime()
- throws Exception
- {
- ECCurve curve = new ECCurve.Fp(
- new BigInteger("883423532389192164791648750360308885314476597252960362792450860609699839"), // q
- new BigInteger("7fffffffffffffffffffffff7fffffffffff8000000000007ffffffffffc", 16), // a
- new BigInteger("6b016c3bdcf18941d0d654921475ca71a9db2fb27d1d37796185c2942c0a", 16)); // b
-
- ECParameterSpec spec = new ECParameterSpec(
- curve,
- curve.decodePoint(Hex.decode("020ffa963cdca8816ccc33b8642bedf905c3d358573d3f27fbbd3b3cb9aaaf")), // G
- new BigInteger("883423532389192164791648750360308884807550341691627752275345424702807307")); // n
-
-
- ECPrivateKeySpec priKey = new ECPrivateKeySpec(
- new BigInteger("876300101507107567501066130761671078357010671067781776716671676178726717"), // d
- spec);
-
- ECPublicKeySpec pubKey = new ECPublicKeySpec(
- curve.decodePoint(Hex.decode("025b6dc53bc61a2548ffb0f671472de6c9521a9d2d2534e65abfcbd5fe0c70")), // Q
- spec);
-
- Signature sgr = Signature.getInstance("NONEwithECDSA", "BC");
- KeyFactory f = KeyFactory.getInstance("ECDSA", "BC");
- PrivateKey sKey = f.generatePrivate(priKey);
- PublicKey vKey = f.generatePublic(pubKey);
-
- byte[] message = "abc".getBytes();
- byte[] sig = Hex.decode("3040021e2cb7f36803ebb9c427c58d8265f11fc5084747133078fc279de874fbecb0021e64cb19604be06c57e761b3de5518f71de0f6e0cd2df677cec8a6ffcb690d");
-
- checkMessage(sgr, sKey, vKey, message, sig);
-
- message = "abcdefghijklmnopqrstuvwxyz".getBytes();
- sig = Hex.decode("3040021e2cb7f36803ebb9c427c58d8265f11fc5084747133078fc279de874fbecb0021e43fd65b3363d76aabef8630572257dbb67c82818ad9fad31256539b1b02c");
-
- checkMessage(sgr, sKey, vKey, message, sig);
-
- message = "a very very long message gauranteed to cause an overflow".getBytes();
- sig = Hex.decode("3040021e2cb7f36803ebb9c427c58d8265f11fc5084747133078fc279de874fbecb0021e7d5be84b22937a1691859a3c6fe45ed30b108574431d01b34025825ec17a");
-
- checkMessage(sgr, sKey, vKey, message, sig);
- }
-
- private void checkMessage(Signature sgr, PrivateKey sKey, PublicKey vKey, byte[] message, byte[] sig)
- throws InvalidKeyException, SignatureException
- {
- byte[] kData = BigIntegers.asUnsignedByteArray(new BigInteger("700000017569056646655505781757157107570501575775705779575555657156756655"));
-
- SecureRandom k = new FixedSecureRandom(kData);
-
- sgr.initSign(sKey, k);
-
- sgr.update(message);
-
- byte[] sigBytes = sgr.sign();
-
- if (!Arrays.areEqual(sigBytes, sig))
- {
- fail(new String(message) + " signature incorrect");
- }
-
- sgr.initVerify(vKey);
-
- sgr.update(message);
-
- if (!sgr.verify(sigBytes))
- {
- fail(new String(message) + " verification failed");
- }
- }
-
- /**
- * X9.62 - 1998,<br>
- * J.2.1, Page 100, ECDSA over the field F2m<br>
- * an example with 191 bit binary field
- */
- private void testECDSA239bitBinary()
- throws Exception
- {
- BigInteger r = new BigInteger("21596333210419611985018340039034612628818151486841789642455876922391552");
- BigInteger s = new BigInteger("197030374000731686738334997654997227052849804072198819102649413465737174");
-
- byte[] kData = BigIntegers.asUnsignedByteArray(new BigInteger("171278725565216523967285789236956265265265235675811949404040041670216363"));
-
- SecureRandom k = new FixedSecureRandom(kData);
-
- ECCurve curve = new ECCurve.F2m(
- 239, // m
- 36, // k
- new BigInteger("32010857077C5431123A46B808906756F543423E8D27877578125778AC76", 16), // a
- new BigInteger("790408F2EEDAF392B012EDEFB3392F30F4327C0CA3F31FC383C422AA8C16", 16)); // b
-
- ECParameterSpec params = new ECParameterSpec(
- curve,
- curve.decodePoint(Hex.decode("0457927098FA932E7C0A96D3FD5B706EF7E5F5C156E16B7E7C86038552E91D61D8EE5077C33FECF6F1A16B268DE469C3C7744EA9A971649FC7A9616305")), // G
- new BigInteger("220855883097298041197912187592864814557886993776713230936715041207411783"), // n
- BigInteger.valueOf(4)); // h
-
- ECPrivateKeySpec priKeySpec = new ECPrivateKeySpec(
- new BigInteger("145642755521911534651321230007534120304391871461646461466464667494947990"), // d
- params);
-
- ECPublicKeySpec pubKeySpec = new ECPublicKeySpec(
- curve.decodePoint(Hex.decode("045894609CCECF9A92533F630DE713A958E96C97CCB8F5ABB5A688A238DEED6DC2D9D0C94EBFB7D526BA6A61764175B99CB6011E2047F9F067293F57F5")), // Q
- params);
-
- Signature sgr = Signature.getInstance("ECDSA", "BC");
- KeyFactory f = KeyFactory.getInstance("ECDSA", "BC");
- PrivateKey sKey = f.generatePrivate(priKeySpec);
- PublicKey vKey = f.generatePublic(pubKeySpec);
- byte[] message = new byte[] { (byte)'a', (byte)'b', (byte)'c' };
-
- sgr.initSign(sKey, k);
-
- sgr.update(message);
-
- byte[] sigBytes = sgr.sign();
-
- sgr.initVerify(vKey);
-
- sgr.update(message);
-
- if (!sgr.verify(sigBytes))
- {
- fail("239 Bit EC verification failed");
- }
-
- BigInteger[] sig = derDecode(sigBytes);
-
- if (!r.equals(sig[0]))
- {
- fail("r component wrong." + System.getProperty("line.separator")
- + " expecting: " + r + System.getProperty("line.separator")
- + " got : " + sig[0]);
- }
-
- if (!s.equals(sig[1]))
- {
- fail("s component wrong." + System.getProperty("line.separator")
- + " expecting: " + s + System.getProperty("line.separator")
- + " got : " + sig[1]);
- }
- }
-
- private void testECDSA239bitBinary(String algorithm, ASN1ObjectIdentifier oid)
- throws Exception
- {
- byte[] kData = BigIntegers.asUnsignedByteArray(new BigInteger("171278725565216523967285789236956265265265235675811949404040041670216363"));
-
- SecureRandom k = new FixedSecureRandom(kData);
-
- ECCurve curve = new ECCurve.F2m(
- 239, // m
- 36, // k
- new BigInteger("32010857077C5431123A46B808906756F543423E8D27877578125778AC76", 16), // a
- new BigInteger("790408F2EEDAF392B012EDEFB3392F30F4327C0CA3F31FC383C422AA8C16", 16)); // b
-
- ECParameterSpec params = new ECParameterSpec(
- curve,
- curve.decodePoint(Hex.decode("0457927098FA932E7C0A96D3FD5B706EF7E5F5C156E16B7E7C86038552E91D61D8EE5077C33FECF6F1A16B268DE469C3C7744EA9A971649FC7A9616305")), // G
- new BigInteger("220855883097298041197912187592864814557886993776713230936715041207411783"), // n
- BigInteger.valueOf(4)); // h
-
- ECPrivateKeySpec priKeySpec = new ECPrivateKeySpec(
- new BigInteger("145642755521911534651321230007534120304391871461646461466464667494947990"), // d
- params);
-
- ECPublicKeySpec pubKeySpec = new ECPublicKeySpec(
- curve.decodePoint(Hex.decode("045894609CCECF9A92533F630DE713A958E96C97CCB8F5ABB5A688A238DEED6DC2D9D0C94EBFB7D526BA6A61764175B99CB6011E2047F9F067293F57F5")), // Q
- params);
-
- Signature sgr = Signature.getInstance(algorithm, "BC");
- KeyFactory f = KeyFactory.getInstance("ECDSA", "BC");
- PrivateKey sKey = f.generatePrivate(priKeySpec);
- PublicKey vKey = f.generatePublic(pubKeySpec);
- byte[] message = new byte[] { (byte)'a', (byte)'b', (byte)'c' };
-
- sgr.initSign(sKey, k);
-
- sgr.update(message);
-
- byte[] sigBytes = sgr.sign();
-
- sgr = Signature.getInstance(oid.getId(), "BC");
-
- sgr.initVerify(vKey);
-
- sgr.update(message);
-
- if (!sgr.verify(sigBytes))
- {
- fail("239 Bit EC RIPEMD160 verification failed");
- }
- }
-
- private void testGeneration()
- throws Exception
- {
- Signature s = Signature.getInstance("DSA", "BC");
- KeyPairGenerator g = KeyPairGenerator.getInstance("DSA", "BC");
- byte[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
-
-
- // test exception
- //
- try
- {
- g.initialize(513, new SecureRandom());
-
- fail("illegal parameter 513 check failed.");
- }
- catch (IllegalArgumentException e)
- {
- // expected
- }
-
- try
- {
- g.initialize(510, new SecureRandom());
-
- fail("illegal parameter 510 check failed.");
- }
- catch (IllegalArgumentException e)
- {
- // expected
- }
-
- try
- {
- g.initialize(1025, new SecureRandom());
-
- fail("illegal parameter 1025 check failed.");
- }
- catch (IllegalArgumentException e)
- {
- // expected
- }
-
- g.initialize(512, new SecureRandom());
-
- KeyPair p = g.generateKeyPair();
-
- PrivateKey sKey = p.getPrivate();
- PublicKey vKey = p.getPublic();
-
- s.initSign(sKey);
-
- s.update(data);
-
- byte[] sigBytes = s.sign();
-
- s = Signature.getInstance("DSA", "BC");
-
- s.initVerify(vKey);
-
- s.update(data);
-
- if (!s.verify(sigBytes))
- {
- fail("DSA verification failed");
- }
-
- //
- // key decoding test - serialisation test
- //
-
- DSAPublicKey k1 = (DSAPublicKey)serializeDeserialize(vKey);
-
- checkPublic(k1, vKey);
-
- checkEquals(k1, vKey);
-
- DSAPrivateKey k2 = (DSAPrivateKey)serializeDeserialize(sKey);
-
- checkPrivateKey(k2, sKey);
-
- checkEquals(k2, sKey);
-
- if (!(k2 instanceof PKCS12BagAttributeCarrier))
- {
- fail("private key not implementing PKCS12 attribute carrier");
- }
-
- //
- // ECDSA Fp generation test
- //
- s = Signature.getInstance("ECDSA", "BC");
- g = KeyPairGenerator.getInstance("ECDSA", "BC");
-
- ECCurve curve = new ECCurve.Fp(
- new BigInteger("883423532389192164791648750360308885314476597252960362792450860609699839"), // q
- new BigInteger("7fffffffffffffffffffffff7fffffffffff8000000000007ffffffffffc", 16), // a
- new BigInteger("6b016c3bdcf18941d0d654921475ca71a9db2fb27d1d37796185c2942c0a", 16)); // b
-
- ECParameterSpec ecSpec = new ECParameterSpec(
- curve,
- curve.decodePoint(Hex.decode("020ffa963cdca8816ccc33b8642bedf905c3d358573d3f27fbbd3b3cb9aaaf")), // G
- new BigInteger("883423532389192164791648750360308884807550341691627752275345424702807307")); // n
-
- g.initialize(ecSpec, new SecureRandom());
-
- p = g.generateKeyPair();
-
- sKey = p.getPrivate();
- vKey = p.getPublic();
-
- s.initSign(sKey);
-
- s.update(data);
-
- sigBytes = s.sign();
-
- s = Signature.getInstance("ECDSA", "BC");
-
- s.initVerify(vKey);
-
- s.update(data);
-
- if (!s.verify(sigBytes))
- {
- fail("ECDSA verification failed");
- }
-
- //
- // key decoding test - serialisation test
- //
-
- PublicKey eck1 = (PublicKey)serializeDeserialize(vKey);
-
- checkEquals(eck1, vKey);
-
- PrivateKey eck2 = (PrivateKey)serializeDeserialize(sKey);
-
- checkEquals(eck2, sKey);
-
- // Named curve parameter
- g.initialize(new ECNamedCurveGenParameterSpec("P-256"), new SecureRandom());
-
- p = g.generateKeyPair();
-
- sKey = p.getPrivate();
- vKey = p.getPublic();
-
- s.initSign(sKey);
-
- s.update(data);
-
- sigBytes = s.sign();
-
- s = Signature.getInstance("ECDSA", "BC");
-
- s.initVerify(vKey);
-
- s.update(data);
-
- if (!s.verify(sigBytes))
- {
- fail("ECDSA verification failed");
- }
-
- //
- // key decoding test - serialisation test
- //
-
- eck1 = (PublicKey)serializeDeserialize(vKey);
-
- checkEquals(eck1, vKey);
-
- eck2 = (PrivateKey)serializeDeserialize(sKey);
-
- checkEquals(eck2, sKey);
-
- //
- // ECDSA F2m generation test
- //
- s = Signature.getInstance("ECDSA", "BC");
- g = KeyPairGenerator.getInstance("ECDSA", "BC");
-
- curve = new ECCurve.F2m(
- 239, // m
- 36, // k
- new BigInteger("32010857077C5431123A46B808906756F543423E8D27877578125778AC76", 16), // a
- new BigInteger("790408F2EEDAF392B012EDEFB3392F30F4327C0CA3F31FC383C422AA8C16", 16)); // b
-
- ecSpec = new ECParameterSpec(
- curve,
- curve.decodePoint(Hex.decode("0457927098FA932E7C0A96D3FD5B706EF7E5F5C156E16B7E7C86038552E91D61D8EE5077C33FECF6F1A16B268DE469C3C7744EA9A971649FC7A9616305")), // G
- new BigInteger("220855883097298041197912187592864814557886993776713230936715041207411783"), // n
- BigInteger.valueOf(4)); // h
-
- g.initialize(ecSpec, new SecureRandom());
-
- p = g.generateKeyPair();
-
- sKey = p.getPrivate();
- vKey = p.getPublic();
-
- s.initSign(sKey);
-
- s.update(data);
-
- sigBytes = s.sign();
-
- s = Signature.getInstance("ECDSA", "BC");
-
- s.initVerify(vKey);
-
- s.update(data);
-
- if (!s.verify(sigBytes))
- {
- fail("ECDSA verification failed");
- }
-
- //
- // key decoding test - serialisation test
- //
-
- eck1 = (PublicKey)serializeDeserialize(vKey);
-
- checkEquals(eck1, vKey);
-
- eck2 = (PrivateKey)serializeDeserialize(sKey);
-
- checkEquals(eck2, sKey);
-
- if (!(eck2 instanceof PKCS12BagAttributeCarrier))
- {
- fail("private key not implementing PKCS12 attribute carrier");
- }
- }
-
- private void checkEquals(Object o1, Object o2)
- {
- if (!o1.equals(o2))
- {
- fail("comparison test failed");
- }
-
- if (o1.hashCode() != o2.hashCode())
- {
- fail("hashCode test failed");
- }
- }
-
- private void testParameters()
- throws Exception
- {
- AlgorithmParameterGenerator a = AlgorithmParameterGenerator.getInstance("DSA", "BC");
- a.init(512, random);
- AlgorithmParameters params = a.generateParameters();
-
- byte[] encodeParams = params.getEncoded();
-
- AlgorithmParameters a2 = AlgorithmParameters.getInstance("DSA", "BC");
- a2.init(encodeParams);
-
- // a and a2 should be equivalent!
- byte[] encodeParams_2 = a2.getEncoded();
-
- if (!areEqual(encodeParams, encodeParams_2))
- {
- fail("encode/decode parameters failed");
- }
-
- DSAParameterSpec dsaP = (DSAParameterSpec)params.getParameterSpec(DSAParameterSpec.class);
-
- KeyPairGenerator g = KeyPairGenerator.getInstance("DSA", "BC");
- g.initialize(dsaP, new SecureRandom());
- KeyPair p = g.generateKeyPair();
-
- PrivateKey sKey = p.getPrivate();
- PublicKey vKey = p.getPublic();
-
- Signature s = Signature.getInstance("DSA", "BC");
- byte[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
-
- s.initSign(sKey);
-
- s.update(data);
-
- byte[] sigBytes = s.sign();
-
- s = Signature.getInstance("DSA", "BC");
-
- s.initVerify(vKey);
-
- s.update(data);
-
- if (!s.verify(sigBytes))
- {
- fail("DSA verification failed");
- }
- }
-
- private void testDSA2Parameters()
- throws Exception
- {
- byte[] seed = Hex.decode("4783081972865EA95D43318AB2EAF9C61A2FC7BBF1B772A09017BDF5A58F4FF0");
-
- AlgorithmParameterGenerator a = AlgorithmParameterGenerator.getInstance("DSA", "BC");
- a.init(2048, new DSATestSecureRandom(seed));
- AlgorithmParameters params = a.generateParameters();
-
- DSAParameterSpec dsaP = (DSAParameterSpec)params.getParameterSpec(DSAParameterSpec.class);
-
- if (!dsaP.getQ().equals(new BigInteger("C24ED361870B61E0D367F008F99F8A1F75525889C89DB1B673C45AF5867CB467", 16)))
- {
- fail("Q incorrect");
- }
-
- if (!dsaP.getP().equals(new BigInteger(
- "F56C2A7D366E3EBDEAA1891FD2A0D099" +
- "436438A673FED4D75F594959CFFEBCA7BE0FC72E4FE67D91" +
- "D801CBA0693AC4ED9E411B41D19E2FD1699C4390AD27D94C" +
- "69C0B143F1DC88932CFE2310C886412047BD9B1C7A67F8A2" +
- "5909132627F51A0C866877E672E555342BDF9355347DBD43" +
- "B47156B2C20BAD9D2B071BC2FDCF9757F75C168C5D9FC431" +
- "31BE162A0756D1BDEC2CA0EB0E3B018A8B38D3EF2487782A" +
- "EB9FBF99D8B30499C55E4F61E5C7DCEE2A2BB55BD7F75FCD" +
- "F00E48F2E8356BDB59D86114028F67B8E07B127744778AFF" +
- "1CF1399A4D679D92FDE7D941C5C85C5D7BFF91BA69F9489D" +
- "531D1EBFA727CFDA651390F8021719FA9F7216CEB177BD75", 16)))
- {
- fail("P incorrect");
- }
-
- if (!dsaP.getG().equals(new BigInteger(
- "8DC6CC814CAE4A1C05A3E186A6FE27EA" +
- "BA8CDB133FDCE14A963A92E809790CBA096EAA26140550C1" +
- "29FA2B98C16E84236AA33BF919CD6F587E048C52666576DB" +
- "6E925C6CBE9B9EC5C16020F9A44C9F1C8F7A8E611C1F6EC2" +
- "513EA6AA0B8D0F72FED73CA37DF240DB57BBB27431D61869" +
- "7B9E771B0B301D5DF05955425061A30DC6D33BB6D2A32BD0" +
- "A75A0A71D2184F506372ABF84A56AEEEA8EB693BF29A6403" +
- "45FA1298A16E85421B2208D00068A5A42915F82CF0B858C8" +
- "FA39D43D704B6927E0B2F916304E86FB6A1B487F07D8139E" +
- "428BB096C6D67A76EC0B8D4EF274B8A2CF556D279AD267CC" +
- "EF5AF477AFED029F485B5597739F5D0240F67C2D948A6279", 16)))
- {
- fail("G incorrect");
- }
-
- KeyPairGenerator g = KeyPairGenerator.getInstance("DSA", "BC");
- g.initialize(dsaP, new FixedSecureRandom(Hex.decode("0CAF2EF547EC49C4F3A6FE6DF4223A174D01F2C115D49A6F73437C29A2A8458C")));
- KeyPair p = g.generateKeyPair();
-
- DSAPrivateKey sKey = (DSAPrivateKey)p.getPrivate();
- DSAPublicKey vKey = (DSAPublicKey)p.getPublic();
-
- if (!vKey.getY().equals(new BigInteger(
- "2828003D7C747199143C370FDD07A286" +
- "1524514ACC57F63F80C38C2087C6B795B62DE1C224BF8D1D" +
- "1424E60CE3F5AE3F76C754A2464AF292286D873A7A30B7EA" +
- "CBBC75AAFDE7191D9157598CDB0B60E0C5AA3F6EBE425500" +
- "C611957DBF5ED35490714A42811FDCDEB19AF2AB30BEADFF" +
- "2907931CEE7F3B55532CFFAEB371F84F01347630EB227A41" +
- "9B1F3F558BC8A509D64A765D8987D493B007C4412C297CAF" +
- "41566E26FAEE475137EC781A0DC088A26C8804A98C23140E" +
- "7C936281864B99571EE95C416AA38CEEBB41FDBFF1EB1D1D" +
- "C97B63CE1355257627C8B0FD840DDB20ED35BE92F08C49AE" +
- "A5613957D7E5C7A6D5A5834B4CB069E0831753ECF65BA02B", 16)))
- {
- fail("Y value incorrect");
- }
-
- if (!sKey.getX().equals(
- new BigInteger("0CAF2EF547EC49C4F3A6FE6DF4223A174D01F2C115D49A6F73437C29A2A8458C", 16)))
- {
- fail("X value incorrect");
- }
-
- byte[] encodeParams = params.getEncoded();
-
- AlgorithmParameters a2 = AlgorithmParameters.getInstance("DSA", "BC");
- a2.init(encodeParams);
-
- // a and a2 should be equivalent!
- byte[] encodeParams_2 = a2.getEncoded();
-
- if (!areEqual(encodeParams, encodeParams_2))
- {
- fail("encode/decode parameters failed");
- }
-
- Signature s = Signature.getInstance("DSA", "BC");
- byte[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
-
- s.initSign(sKey);
-
- s.update(data);
-
- byte[] sigBytes = s.sign();
-
- s = Signature.getInstance("DSA", "BC");
-
- s.initVerify(vKey);
-
- s.update(data);
-
- if (!s.verify(sigBytes))
- {
- fail("DSA verification failed");
- }
- }
-
- public void performTest()
- throws Exception
- {
- testCompat();
- testNONEwithDSA();
- testECDSA239bitPrime();
- testNONEwithECDSA239bitPrime();
- testECDSA239bitBinary();
- testECDSA239bitBinary("RIPEMD160withECDSA", TeleTrusTObjectIdentifiers.ecSignWithRipemd160);
- testECDSA239bitBinary("SHA1withECDSA", TeleTrusTObjectIdentifiers.ecSignWithSha1);
- testECDSA239bitBinary("SHA224withECDSA", X9ObjectIdentifiers.ecdsa_with_SHA224);
- testECDSA239bitBinary("SHA256withECDSA", X9ObjectIdentifiers.ecdsa_with_SHA256);
- testECDSA239bitBinary("SHA384withECDSA", X9ObjectIdentifiers.ecdsa_with_SHA384);
- testECDSA239bitBinary("SHA512withECDSA", X9ObjectIdentifiers.ecdsa_with_SHA512);
- testECDSA239bitBinary("SHA1withCVC-ECDSA", EACObjectIdentifiers.id_TA_ECDSA_SHA_1);
- testECDSA239bitBinary("SHA224withCVC-ECDSA", EACObjectIdentifiers.id_TA_ECDSA_SHA_224);
- testECDSA239bitBinary("SHA256withCVC-ECDSA", EACObjectIdentifiers.id_TA_ECDSA_SHA_256);
- testECDSA239bitBinary("SHA384withCVC-ECDSA", EACObjectIdentifiers.id_TA_ECDSA_SHA_384);
- testECDSA239bitBinary("SHA512withCVC-ECDSA", EACObjectIdentifiers.id_TA_ECDSA_SHA_512);
-
- testGeneration();
- testParameters();
- testDSA2Parameters();
- }
-
- protected BigInteger[] derDecode(
- byte[] encoding)
- throws IOException
- {
- ByteArrayInputStream bIn = new ByteArrayInputStream(encoding);
- ASN1InputStream aIn = new ASN1InputStream(bIn);
- ASN1Sequence s = (ASN1Sequence)aIn.readObject();
-
- BigInteger[] sig = new BigInteger[2];
-
- sig[0] = ((ASN1Integer)s.getObjectAt(0)).getValue();
- sig[1] = ((ASN1Integer)s.getObjectAt(1)).getValue();
-
- return sig;
- }
-
- public String getName()
- {
- return "DSA/ECDSA";
- }
-
- public static void main(
- String[] args)
- {
- Security.addProvider(new BouncyCastleProvider());
-
- runTest(new DSATest());
- }
-
- private class DSATestSecureRandom
- extends FixedSecureRandom
- {
- private boolean first = true;
-
- public DSATestSecureRandom(byte[] value)
- {
- super(value);
- }
-
- public void nextBytes(byte[] bytes)
- {
- if (first)
- {
- super.nextBytes(bytes);
- first = false;
- }
- else
- {
- bytes[bytes.length - 1] = 2;
- }
- }
- }
-}