package org.bouncycastle.crypto.test; import org.bouncycastle.crypto.AsymmetricCipherKeyPair; import org.bouncycastle.crypto.generators.DHKeyPairGenerator; import org.bouncycastle.crypto.generators.ElGamalKeyPairGenerator; import org.bouncycastle.crypto.params.DHKeyGenerationParameters; import org.bouncycastle.crypto.params.DHKeyParameters; import org.bouncycastle.crypto.params.DHParameters; import org.bouncycastle.crypto.params.DHPrivateKeyParameters; import org.bouncycastle.crypto.params.DHPublicKeyParameters; import org.bouncycastle.crypto.params.DHValidationParameters; import org.bouncycastle.crypto.params.DSAParameters; import org.bouncycastle.crypto.params.DSAValidationParameters; import org.bouncycastle.crypto.params.ElGamalKeyGenerationParameters; import org.bouncycastle.crypto.params.ElGamalKeyParameters; import org.bouncycastle.crypto.params.ElGamalParameters; import org.bouncycastle.crypto.params.ElGamalPrivateKeyParameters; import org.bouncycastle.crypto.params.ElGamalPublicKeyParameters; import org.bouncycastle.crypto.params.GOST3410Parameters; import org.bouncycastle.crypto.params.GOST3410ValidationParameters; import org.bouncycastle.util.test.SimpleTest; import java.math.BigInteger; import java.security.SecureRandom; class DHTestKeyParameters extends DHKeyParameters { protected DHTestKeyParameters(boolean isPrivate, DHParameters params) { super(isPrivate, params); } } class ElGamalTestKeyParameters extends ElGamalKeyParameters { protected ElGamalTestKeyParameters(boolean isPrivate, ElGamalParameters params) { super(isPrivate, params); } } public class EqualsHashCodeTest extends SimpleTest { private static Object OTHER = new Object(); public String getName() { return "EqualsHashCode"; } private void doTest(Object a, Object equalsA, Object notEqualsA) { if (a.equals(null)) { fail("a equaled null"); } if (!a.equals(equalsA) || !equalsA.equals(a)) { fail("equality failed"); } if (a.equals(OTHER)) { fail("other inequality failed"); } if (a.equals(notEqualsA) || notEqualsA.equals(a)) { fail("inequality failed"); } if (a.hashCode() != equalsA.hashCode()) { fail("hashCode equality failed"); } } private void dhTest() { BigInteger g512 = new BigInteger("153d5d6172adb43045b68ae8e1de1070b6137005686d29d3d73a7749199681ee5b212c9b96bfdcfa5b20cd5e3fd2044895d609cf9b410b7a0f12ca1cb9a428cc", 16); BigInteger p512 = new BigInteger("9494fec095f3b85ee286542b3836fc81a5dd0a0349b4c239dd38744d488cf8e31db8bcb7d33b41abb9e5a33cca9144b1cef332c94bf0573bf047a3aca98cdf3b", 16); DHParameters dhParams = new DHParameters(p512, g512); DHKeyGenerationParameters params = new DHKeyGenerationParameters(new SecureRandom(), dhParams); DHKeyPairGenerator kpGen = new DHKeyPairGenerator(); kpGen.init(params); AsymmetricCipherKeyPair pair = kpGen.generateKeyPair(); DHPublicKeyParameters pu1 = (DHPublicKeyParameters)pair.getPublic(); DHPrivateKeyParameters pv1 = (DHPrivateKeyParameters)pair.getPrivate(); DHPublicKeyParameters pu2 = new DHPublicKeyParameters(pu1.getY(), pu1.getParameters()); DHPrivateKeyParameters pv2 = new DHPrivateKeyParameters(pv1.getX(), pv1.getParameters()); DHPublicKeyParameters pu3 = new DHPublicKeyParameters(pv1.getX(), pu1.getParameters()); DHPrivateKeyParameters pv3 = new DHPrivateKeyParameters(pu1.getY(), pu1.getParameters()); doTest(pu1, pu2, pu3); doTest(pv1, pv2, pv3); DHParameters pr1 = pu1.getParameters(); DHParameters pr2 = new DHParameters(pr1.getP(), pr1.getG(), pr1.getQ(), pr1.getM(), pr1.getL(), pr1.getJ(), pr1.getValidationParameters()); DHParameters pr3 = new DHParameters(pr1.getG(), pr1.getP(), pr1.getQ(), pr1.getM(), pr1.getL(), pr1.getJ(), pr1.getValidationParameters()); doTest(pr1, pr2, pr3); pr3 = new DHParameters(pr1.getG(), pr1.getP(), null, pr1.getM(), pr1.getL(), pr1.getJ(), pr1.getValidationParameters()); doTest(pr1, pr2, pr3); pu2 = new DHPublicKeyParameters(pu1.getY(), pr2); pv2 = new DHPrivateKeyParameters(pv1.getX(), pr2); doTest(pu1, pu2, pu3); doTest(pv1, pv2, pv3); DHValidationParameters vp1 = new DHValidationParameters(new byte[20], 1024); DHValidationParameters vp2 = new DHValidationParameters(new byte[20], 1024); DHValidationParameters vp3 = new DHValidationParameters(new byte[24], 1024); doTest(vp1, vp1, vp3); doTest(vp1, vp2, vp3); byte[] bytes = new byte[20]; bytes[0] = 1; vp3 = new DHValidationParameters(bytes, 1024); doTest(vp1, vp2, vp3); vp3 = new DHValidationParameters(new byte[20], 2048); doTest(vp1, vp2, vp3); DHTestKeyParameters k1 = new DHTestKeyParameters(false, null); DHTestKeyParameters k2 = new DHTestKeyParameters(false, null); DHTestKeyParameters k3 = new DHTestKeyParameters(false, pu1.getParameters()); doTest(k1, k2, k3); } private void elGamalTest() { BigInteger g512 = new BigInteger("153d5d6172adb43045b68ae8e1de1070b6137005686d29d3d73a7749199681ee5b212c9b96bfdcfa5b20cd5e3fd2044895d609cf9b410b7a0f12ca1cb9a428cc", 16); BigInteger p512 = new BigInteger("9494fec095f3b85ee286542b3836fc81a5dd0a0349b4c239dd38744d488cf8e31db8bcb7d33b41abb9e5a33cca9144b1cef332c94bf0573bf047a3aca98cdf3b", 16); ElGamalParameters dhParams = new ElGamalParameters(p512, g512); ElGamalKeyGenerationParameters params = new ElGamalKeyGenerationParameters(new SecureRandom(), dhParams); ElGamalKeyPairGenerator kpGen = new ElGamalKeyPairGenerator(); kpGen.init(params); AsymmetricCipherKeyPair pair = kpGen.generateKeyPair(); ElGamalPublicKeyParameters pu1 = (ElGamalPublicKeyParameters)pair.getPublic(); ElGamalPrivateKeyParameters pv1 = (ElGamalPrivateKeyParameters)pair.getPrivate(); ElGamalPublicKeyParameters pu2 = new ElGamalPublicKeyParameters(pu1.getY(), pu1.getParameters()); ElGamalPrivateKeyParameters pv2 = new ElGamalPrivateKeyParameters(pv1.getX(), pv1.getParameters()); ElGamalPublicKeyParameters pu3 = new ElGamalPublicKeyParameters(pv1.getX(), pu1.getParameters()); ElGamalPrivateKeyParameters pv3 = new ElGamalPrivateKeyParameters(pu1.getY(), pu1.getParameters()); doTest(pu1, pu2, pu3); doTest(pv1, pv2, pv3); ElGamalParameters pr1 = pu1.getParameters(); ElGamalParameters pr2 = new ElGamalParameters(pr1.getP(), pr1.getG()); ElGamalParameters pr3 = new ElGamalParameters(pr1.getG(), pr1.getP()); doTest(pr1, pr2, pr3); pu2 = new ElGamalPublicKeyParameters(pu1.getY(), pr2); pv2 = new ElGamalPrivateKeyParameters(pv1.getX(), pr2); doTest(pu1, pu2, pu3); doTest(pv1, pv2, pv3); ElGamalTestKeyParameters k1 = new ElGamalTestKeyParameters(false, null); ElGamalTestKeyParameters k2 = new ElGamalTestKeyParameters(false, null); ElGamalTestKeyParameters k3 = new ElGamalTestKeyParameters(false, pu1.getParameters()); doTest(k1, k2, k3); } private void dsaTest() { BigInteger a = BigInteger.valueOf(1), b = BigInteger.valueOf(2), c = BigInteger.valueOf(3); DSAParameters dsaP1 = new DSAParameters(a, b, c); DSAParameters dsaP2 = new DSAParameters(a, b, c); DSAParameters dsaP3 = new DSAParameters(b, c, a); doTest(dsaP1, dsaP2, dsaP3); DSAValidationParameters vp1 = new DSAValidationParameters(new byte[20], 1024); DSAValidationParameters vp2 = new DSAValidationParameters(new byte[20], 1024); DSAValidationParameters vp3 = new DSAValidationParameters(new byte[24], 1024); doTest(vp1, vp1, vp3); doTest(vp1, vp2, vp3); byte[] bytes = new byte[20]; bytes[0] = 1; vp3 = new DSAValidationParameters(bytes, 1024); doTest(vp1, vp2, vp3); vp3 = new DSAValidationParameters(new byte[20], 2048); doTest(vp1, vp2, vp3); } private void gost3410Test() { BigInteger a = BigInteger.valueOf(1), b = BigInteger.valueOf(2), c = BigInteger.valueOf(3); GOST3410Parameters g1 = new GOST3410Parameters(a, b, c); GOST3410Parameters g2 = new GOST3410Parameters(a, b, c); GOST3410Parameters g3 = new GOST3410Parameters(a, c, c); doTest(g1, g2, g3); GOST3410ValidationParameters v1 = new GOST3410ValidationParameters(100, 1); GOST3410ValidationParameters v2 = new GOST3410ValidationParameters(100, 1); GOST3410ValidationParameters v3 = new GOST3410ValidationParameters(101, 1); doTest(v1, v2, v3); v3 = new GOST3410ValidationParameters(100, 2); doTest(v1, v2, v3); v1 = new GOST3410ValidationParameters(100L, 1L); v2 = new GOST3410ValidationParameters(100L, 1L); v3 = new GOST3410ValidationParameters(101L, 1L); doTest(v1, v2, v3); v3 = new GOST3410ValidationParameters(100L, 2L); doTest(v1, v2, v3); } public void performTest() throws Exception { dhTest(); elGamalTest(); gost3410Test(); dsaTest(); } public static void main( String[] args) { runTest(new EqualsHashCodeTest()); } }