Author: sback Date: 2007-04-02 14:40:36 +0000 (Mon, 02 Apr 2007) New Revision: 12524
Added: trunk/freenet/test/freenet/crypt/DSATest.java Log: DSA.java test cases. Some border cases are still missing Added: trunk/freenet/test/freenet/crypt/DSATest.java =================================================================== --- trunk/freenet/test/freenet/crypt/DSATest.java (rev 0) +++ trunk/freenet/test/freenet/crypt/DSATest.java 2007-04-02 14:40:36 UTC (rev 12524) @@ -0,0 +1,187 @@ +/* This code is part of Freenet. It is distributed under the GNU General + * Public License, version 2 (or at your option any later version). See + * http://www.gnu.org/ for further details of the GPL. + * + * DSATest.java + * JUnit based test + * + * @author sback + */ + +package freenet.crypt; + + +import java.math.BigInteger; +import java.util.Random; +import junit.framework.Test; +import junit.framework.TestCase; +import net.i2p.util.NativeBigInteger; + + +public class DSATest extends TestCase{ + + /*-------------FIPS-EXAMPLE-CONSTANTS--------------------------------------- + * These are the values as they appear in the Appendix 5 + * "Example of the DSA" of FIPS PUB 186-2. + * We can consider them sure examples */ + private static final BigInteger FIPS_P = new NativeBigInteger( + "8df2a494492276aa3d25759bb06869cbeac0d83afb8d0cf7"+ + "cbb8324f0d7882e5d0762fc5b7210eafc2e9adac32ab7aac"+ + "49693dfbf83724c2ec0736ee31c80291",16); + private static final BigInteger FIPS_Q = new NativeBigInteger( + "c773218c737ec8ee993b4f2ded30f48edace915f",16); + private static final BigInteger FIPS_G = new NativeBigInteger( + "626d027839ea0a13413163a55b4cb500299d5522956cefcb"+ + "3bff10f399ce2c2e71cb9de5fa24babf58e5b79521925c9c"+ + "c42e9f6f464b088cc572af53e6d78802",16); + private static final BigInteger FIPS_X = new NativeBigInteger( + "2070b3223dba372fde1c0ffc7b2e3b498b260614",16); + private static final BigInteger FIPS_Y = new NativeBigInteger( + "19131871d75b1612a819f29d78d1b0d7346f7aa77bb62a85"+ + "9bfd6c5675da9d212d3a36ef1672ef660b8c7c255cc0ec74"+ + "858fba33f44c06699630a76b030ee333",16); + private static final BigInteger FIPS_K = new NativeBigInteger( + "358dad571462710f50e254cf1a376b2bdeaadfbf",16); + private static final BigInteger FIPS_K_INV = new NativeBigInteger( + "0d5167298202e49b4116ac104fc3f415ae52f917",16); + private static final BigInteger FIPS_SHA1_M = new NativeBigInteger( + "a9993e364706816aba3e25717850c26c9cd0d89d",16); + private static final BigInteger FIPS_R = new NativeBigInteger( + "8bac1ab66410435cb7181f95b16ab97c92b341c0",16); + private static final BigInteger FIPS_S = new NativeBigInteger( + "41e2345f1f56df2458f426d155b4ba2db6dcd8c8",16); + private static final DSAGroup FIPS_DSA_GROUP = + new DSAGroup(FIPS_P,FIPS_Q,FIPS_G); + private static final DSAPrivateKey FIPS_DSA_PRIVATE_KEY = + new DSAPrivateKey(FIPS_X); + private static final DSAPublicKey FIPS_DSA_PUBLIC_KEY = + new DSAPublicKey(FIPS_DSA_GROUP,FIPS_Y); + private static final DSASignature FIPS_DSA_SIGNATURE = + new DSASignature(FIPS_R,FIPS_S); + /*------------------------------------------------------------------------*/ + + private RandomSource randomSource; + + public DSATest(String testName) { super(testName); } + + protected void setUp() throws Exception { + randomSource = new DummyRandomSource(); + } + + protected void tearDown() throws Exception {} + + /** + * Test of verify and sign method consistency using FIPS examples.*/ + public void testSignAndVerify() { + System.out.println("signAndVerify"); + + DSASignature aSignature = + DSA.sign(FIPS_DSA_GROUP, FIPS_DSA_PRIVATE_KEY, FIPS_K, FIPS_SHA1_M, randomSource); + + assertTrue(DSA.verify(FIPS_DSA_PUBLIC_KEY,aSignature,FIPS_SHA1_M,false)); + } + + /** Test of verify(DSAPublicKey kp, + DSASignature sig, + BigInteger m, boolean forceMod) + * method comparing it with the DSA values + * based on FIPS examples */ + public void testVerify() { + System.out.println("testVerify"); + + assertTrue(DSA.verify(FIPS_DSA_PUBLIC_KEY,FIPS_DSA_SIGNATURE,FIPS_SHA1_M,false)); + } + + /** + * Test sign method consistency + * It performs two signature of the same message + * and verifies if they are identical */ + public void testSameSignConsistency() { + System.out.println("sameSignConsistency"); + + DSASignature firstSignature = + DSA.sign(FIPS_DSA_GROUP, FIPS_DSA_PRIVATE_KEY, FIPS_K, FIPS_SHA1_M, randomSource); + + DSASignature secondSignature = + DSA.sign(FIPS_DSA_GROUP, FIPS_DSA_PRIVATE_KEY, FIPS_K, FIPS_SHA1_M, randomSource); + + assertEquals(firstSignature.getR(),secondSignature.getR()); + assertEquals(firstSignature.getS(),secondSignature.getS()); + } + + /** + * Test sign(DSAGroup g, DSAPrivateKey x, BigInteger m,RandomSource r) + * method, using a q value that is too small [shorter than DSAGroup.Q_BIT_LENGTH] + * to generate a correct k value */ + public void testSignSmallQValue(){ + System.out.println("signWithSmallQValue"); + try { + DSA.sign(FIPS_DSA_GROUP,FIPS_DSA_PRIVATE_KEY,FIPS_SHA1_M,randomSource); + } catch (AssertionError anAssertionError) { + assertNotNull(anAssertionError); + } + } + + /** + * Test sign(DSAGroup g, DSAPrivateKey x, + BigInteger r, BigInteger kInv, + BigInteger m, RandomSource random) + * method comparing it with the DSASignature + * based on FIPS examples */ + public void testSign_grp_pvtKey_r_kInv_m_rand() { + System.out.println("sign(grp,pvtKey,r,kInv,m,rand)"); + + DSASignature aSignature = + DSA.sign(FIPS_DSA_GROUP,FIPS_DSA_PRIVATE_KEY,FIPS_R,FIPS_K_INV,FIPS_SHA1_M,randomSource); + + assertEquals(aSignature.getR(),FIPS_R); + assertEquals(aSignature.getS(),FIPS_S); + } + + /** + * Test sign(DSAGroup g, + DSAPrivateKey x, + BigInteger k, + BigInteger m, + RandomSource random) + * method comparing it with the DSASignature + * based on FIPS examples */ + public void testSign_grp_pvtKey_k_m_rand() { + System.out.println("sign(grp,pvtKey,k,m,rand)"); + + DSASignature aSignature = + DSA.sign(FIPS_DSA_GROUP,FIPS_DSA_PRIVATE_KEY,FIPS_K,FIPS_SHA1_M,randomSource); + + assertEquals(aSignature.getR(),FIPS_R); + assertEquals(aSignature.getS(),FIPS_S); + } + + /** + * Test sign(DSAGroup g, DSAPrivateKey x, BigInteger m, + RandomSource r) + * method using verify method. + * As the verify test passed, then we can consider it + * a tested way to verify this sign method accuracy, + * since it is impossible to test it using + * FIPS Examples [as they are based on SHA1 and thus they use + * q values that are shorter than current DSAGroup.Q_BIT_LENGTH].*/ + public void testSign_grp_pvtKey_m_rand() { + System.out.println("sign(grp,pvtKey,m,rand)"); + + DSAGroup aDSAgroup = Global.DSAgroupBigA; + + System.out.println(aDSAgroup.getQ().bitCount()); + + DSAPrivateKey aDSAPrivKey=new DSAPrivateKey(aDSAgroup,randomSource); + DSAPublicKey aDSAPubKey=new DSAPublicKey(aDSAgroup,aDSAPrivKey); + DSASignature aSignature= + DSA.sign(aDSAgroup,aDSAPrivKey,BigInteger.ZERO,randomSource); + + assertTrue(DSA.verify(aDSAPubKey,aSignature,BigInteger.ZERO,false)); + } + + +} + + +
