aboutsummaryrefslogtreecommitdiffstats
path: root/libraries/spongycastle/pg/src/test/java/org/spongycastle/openpgp/test/DSA2Test.java
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/spongycastle/pg/src/test/java/org/spongycastle/openpgp/test/DSA2Test.java')
-rw-r--r--libraries/spongycastle/pg/src/test/java/org/spongycastle/openpgp/test/DSA2Test.java290
1 files changed, 290 insertions, 0 deletions
diff --git a/libraries/spongycastle/pg/src/test/java/org/spongycastle/openpgp/test/DSA2Test.java b/libraries/spongycastle/pg/src/test/java/org/spongycastle/openpgp/test/DSA2Test.java
new file mode 100644
index 000000000..eb8adcd46
--- /dev/null
+++ b/libraries/spongycastle/pg/src/test/java/org/spongycastle/openpgp/test/DSA2Test.java
@@ -0,0 +1,290 @@
+package org.spongycastle.openpgp.test;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import org.spongycastle.bcpg.BCPGOutputStream;
+import org.spongycastle.bcpg.PublicKeyAlgorithmTags;
+import org.spongycastle.openpgp.PGPCompressedData;
+import org.spongycastle.openpgp.PGPLiteralData;
+import org.spongycastle.openpgp.PGPLiteralDataGenerator;
+import org.spongycastle.openpgp.PGPObjectFactory;
+import org.spongycastle.openpgp.PGPOnePassSignature;
+import org.spongycastle.openpgp.PGPOnePassSignatureList;
+import org.spongycastle.openpgp.PGPPublicKeyRing;
+import org.spongycastle.openpgp.PGPSecretKeyRing;
+import org.spongycastle.openpgp.PGPSignature;
+import org.spongycastle.openpgp.PGPSignatureGenerator;
+import org.spongycastle.openpgp.PGPSignatureList;
+import org.spongycastle.openpgp.PGPUtil;
+import org.spongycastle.util.test.UncloseableOutputStream;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.security.Security;
+import java.util.Date;
+
+/**
+ * GPG compatability test vectors
+ */
+public class DSA2Test
+ extends TestCase
+{
+ private static final String TEST_DATA_HOME = "bc.test.data.home";
+
+ public void setUp()
+ {
+ if (Security.getProvider("SC") == null)
+ {
+ Security.addProvider(new org.spongycastle.jce.provider.BouncyCastleProvider());
+ }
+ }
+
+ public void testK1024H160()
+ throws Exception
+ {
+ doSigVerifyTest("DSA-1024-160.pub", "dsa-1024-160-sign.gpg");
+ }
+
+ public void testK1024H224()
+ throws Exception
+ {
+ doSigVerifyTest("DSA-1024-160.pub", "dsa-1024-224-sign.gpg");
+ }
+
+ public void testK1024H256()
+ throws Exception
+ {
+ doSigVerifyTest("DSA-1024-160.pub", "dsa-1024-256-sign.gpg");
+ }
+
+ public void testK1024H384()
+ throws Exception
+ {
+ doSigVerifyTest("DSA-1024-160.pub", "dsa-1024-384-sign.gpg");
+ }
+
+ public void testK1024H512()
+ throws Exception
+ {
+ doSigVerifyTest("DSA-1024-160.pub", "dsa-1024-512-sign.gpg");
+ }
+
+ public void testK2048H224()
+ throws Exception
+ {
+ doSigVerifyTest("DSA-2048-224.pub", "dsa-2048-224-sign.gpg");
+ }
+
+ public void testK3072H256()
+ throws Exception
+ {
+ doSigVerifyTest("DSA-3072-256.pub", "dsa-3072-256-sign.gpg");
+ }
+
+ public void testK7680H384()
+ throws Exception
+ {
+ doSigVerifyTest("DSA-7680-384.pub", "dsa-7680-384-sign.gpg");
+ }
+
+ public void testK15360H512()
+ throws Exception
+ {
+ doSigVerifyTest("DSA-15360-512.pub", "dsa-15360-512-sign.gpg");
+ }
+
+ public void testGenerateK1024H224()
+ throws Exception
+ {
+ doSigGenerateTest("DSA-1024-160.sec", "DSA-1024-160.pub", PGPUtil.SHA224);
+ }
+
+ public void testGenerateK1024H256()
+ throws Exception
+ {
+ doSigGenerateTest("DSA-1024-160.sec", "DSA-1024-160.pub", PGPUtil.SHA256);
+ }
+
+ public void testGenerateK1024H384()
+ throws Exception
+ {
+ doSigGenerateTest("DSA-1024-160.sec", "DSA-1024-160.pub", PGPUtil.SHA384);
+ }
+
+ public void testGenerateK1024H512()
+ throws Exception
+ {
+ doSigGenerateTest("DSA-1024-160.sec", "DSA-1024-160.pub", PGPUtil.SHA512);
+ }
+
+ public void testGenerateK2048H256()
+ throws Exception
+ {
+ doSigGenerateTest("DSA-2048-224.sec", "DSA-2048-224.pub", PGPUtil.SHA256);
+ }
+
+ public void testGenerateK2048H512()
+ throws Exception
+ {
+ doSigGenerateTest("DSA-2048-224.sec", "DSA-2048-224.pub", PGPUtil.SHA512);
+ }
+
+ private void doSigGenerateTest(String privateKeyFile, String publicKeyFile, int digest)
+ throws Exception
+ {
+ PGPSecretKeyRing secRing = loadSecretKey(privateKeyFile);
+ PGPPublicKeyRing pubRing = loadPublicKey(publicKeyFile);
+ String data = "hello world!";
+ ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+ ByteArrayInputStream testIn = new ByteArrayInputStream(data.getBytes());
+ PGPSignatureGenerator sGen = new PGPSignatureGenerator(PublicKeyAlgorithmTags.DSA, digest, "SC");
+
+ sGen.initSign(PGPSignature.BINARY_DOCUMENT, secRing.getSecretKey().extractPrivateKey("test".toCharArray(), "SC"));
+
+ BCPGOutputStream bcOut = new BCPGOutputStream(bOut);
+
+ sGen.generateOnePassVersion(false).encode(bcOut);
+
+ PGPLiteralDataGenerator lGen = new PGPLiteralDataGenerator();
+
+ Date testDate = new Date((System.currentTimeMillis() / 1000) * 1000);
+ OutputStream lOut = lGen.open(
+ new UncloseableOutputStream(bcOut),
+ PGPLiteralData.BINARY,
+ "_CONSOLE",
+ data.getBytes().length,
+ testDate);
+
+ int ch;
+ while ((ch = testIn.read()) >= 0)
+ {
+ lOut.write(ch);
+ sGen.update((byte)ch);
+ }
+
+ lGen.close();
+
+ sGen.generate().encode(bcOut);
+
+ PGPObjectFactory pgpFact = new PGPObjectFactory(bOut.toByteArray());
+ PGPOnePassSignatureList p1 = (PGPOnePassSignatureList)pgpFact.nextObject();
+ PGPOnePassSignature ops = p1.get(0);
+
+ assertEquals(digest, ops.getHashAlgorithm());
+ assertEquals(PublicKeyAlgorithmTags.DSA, ops.getKeyAlgorithm());
+
+ PGPLiteralData p2 = (PGPLiteralData)pgpFact.nextObject();
+ if (!p2.getModificationTime().equals(testDate))
+ {
+ fail("Modification time not preserved");
+ }
+
+ InputStream dIn = p2.getInputStream();
+
+ ops.initVerify(pubRing.getPublicKey(), "SC");
+
+ while ((ch = dIn.read()) >= 0)
+ {
+ ops.update((byte)ch);
+ }
+
+ PGPSignatureList p3 = (PGPSignatureList)pgpFact.nextObject();
+ PGPSignature sig = p3.get(0);
+
+ assertEquals(digest, sig.getHashAlgorithm());
+ assertEquals(PublicKeyAlgorithmTags.DSA, sig.getKeyAlgorithm());
+
+ assertTrue(ops.verify(sig));
+ }
+
+ private void doSigVerifyTest(
+ String publicKeyFile,
+ String sigFile)
+ throws Exception
+ {
+ PGPPublicKeyRing publicKey = loadPublicKey(publicKeyFile);
+ PGPObjectFactory pgpFact = loadSig(sigFile);
+
+ PGPCompressedData c1 = (PGPCompressedData)pgpFact.nextObject();
+
+ pgpFact = new PGPObjectFactory(c1.getDataStream());
+
+ PGPOnePassSignatureList p1 = (PGPOnePassSignatureList)pgpFact.nextObject();
+ PGPOnePassSignature ops = p1.get(0);
+
+ PGPLiteralData p2 = (PGPLiteralData)pgpFact.nextObject();
+
+ InputStream dIn = p2.getInputStream();
+
+ ops.initVerify(publicKey.getPublicKey(), "SC");
+
+ int ch;
+ while ((ch = dIn.read()) >= 0)
+ {
+ ops.update((byte)ch);
+ }
+
+ PGPSignatureList p3 = (PGPSignatureList)pgpFact.nextObject();
+
+ assertTrue(ops.verify(p3.get(0)));
+ }
+
+ private PGPObjectFactory loadSig(
+ String sigName)
+ throws Exception
+ {
+ FileInputStream fIn = new FileInputStream(getDataHome() + "/sigs/" + sigName);
+
+ return new PGPObjectFactory(fIn);
+ }
+
+ private PGPPublicKeyRing loadPublicKey(
+ String keyName)
+ throws Exception
+ {
+ FileInputStream fIn = new FileInputStream(getDataHome() + "/keys/" + keyName);
+
+ return new PGPPublicKeyRing(fIn);
+ }
+
+ private PGPSecretKeyRing loadSecretKey(
+ String keyName)
+ throws Exception
+ {
+ FileInputStream fIn = new FileInputStream(getDataHome() + "/keys/" + keyName);
+
+ return new PGPSecretKeyRing(fIn);
+ }
+
+ private String getDataHome()
+ {
+ String dataHome = System.getProperty(TEST_DATA_HOME);
+
+ if (dataHome == null)
+ {
+ throw new IllegalStateException(TEST_DATA_HOME + " property not set");
+ }
+
+ return dataHome + "/openpgp/dsa";
+ }
+
+ public static void main (String[] args)
+ throws Exception
+ {
+ junit.textui.TestRunner.run(suite());
+ }
+
+ public static Test suite()
+ throws Exception
+ {
+ TestSuite suite = new TestSuite("GPG DSA2 tests");
+
+ suite.addTestSuite(DSA2Test.class);
+
+ return suite;
+ }
+}