# HG changeset patch # User valeriep # Date 1418343557 0 # Node ID 66b8a06eeb9670642f34dd19cb6d353c1949ae72 # Parent 6494b13f88a867026ee316b444d9a4fa589dd6bd 8048819: Implement reliability test for DH algorithm Summary: Added DH test for up-to-4 parties key exchange Reviewed-by: valeriep Contributed-by: Amanda Jiang diff -r 6494b13f88a8 -r 66b8a06eeb96 jdk/test/com/sun/crypto/provider/KeyAgreement/SameDHKeyStressTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/com/sun/crypto/provider/KeyAgreement/SameDHKeyStressTest.java Fri Dec 12 00:19:17 2014 +0000 @@ -0,0 +1,169 @@ +/* + * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8048819 + * @summary This test stressful verifies the assertion of "The secret keys generated + * by all involved parties should be the same." for javax.crypto.KeyAgreement + * @run main SameDHKeyStressTest + */ +import java.security.AlgorithmParameterGenerator; +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.Key; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.security.spec.AlgorithmParameterSpec; +import java.util.Arrays; +import javax.crypto.KeyAgreement; +import javax.crypto.SecretKey; +import javax.crypto.spec.DHGenParameterSpec; +import javax.crypto.spec.DHParameterSpec; + +public class SameDHKeyStressTest { + + static final String[] ALGORITHMS = {"DH", "DiffieHellman", "dh", "diffieHELLMAN"}; + static final String[] SECRET_ALOGRITHMS = {"DES", "DESede", "blowfish"}; + static final int[] NUMBER_OF_PARTIES = {2, 3, 4}; + static final String[] PA_NAMES = {"Alice", "Bob", "Carol", "David"}; + + public static void main(String args[]) { + int failedCnt = 0; + StringBuilder failedList = new StringBuilder("Failed List:"); + + for (String algorithm : ALGORITHMS) { + for (int numOfParties : NUMBER_OF_PARTIES) { + for (String secretAlgorithm : SECRET_ALOGRITHMS) { + if (!runTest(algorithm, numOfParties, secretAlgorithm)) { + failedCnt++; + failedList.append("\n Altorightm = ").append(algorithm). + append(" Number of Parties = ").append(numOfParties). + append(" Secret Algorithm = ").append(secretAlgorithm); + } + } + } + } //end of for loop + + if (failedCnt > 0) { + System.out.println(failedList); + throw new RuntimeException("SameDHKeyStressTest Failed"); + } + } + + public static boolean runTest(String algo, int numParties, String secretAlgo) { + KAParticipant[] parties = new KAParticipant[numParties]; + Key[] keyArchives = new Key[numParties]; + try { + // generate AlogirhtmParameterSpec + AlgorithmParameterGenerator apg = AlgorithmParameterGenerator.getInstance("DH","SunJCE"); + AlgorithmParameterSpec aps = new DHGenParameterSpec(512, 64); + apg.init(aps); + DHParameterSpec spec = apg.generateParameters(). + getParameterSpec(DHParameterSpec.class); + + //initilize all KeyAgreement participants + for (int i = 0; i < numParties; i++) { + parties[i] = new KAParticipant(PA_NAMES[i], algo); + parties[i].initialize(spec); + keyArchives[i] = parties[i].getPublicKey(); + } + + // Do all phases in the KeyAgreement for all participants + Key[] keyBuffer = new Key[numParties]; + boolean lastPhase = false; + for (int j = 0; j < numParties - 1; j++) { + if (j == numParties - 2) { + lastPhase = true; + } + for (int k = 0; k < numParties; k++) { + if (k == numParties - 1) { + keyBuffer[k] = parties[k].doPhase(keyArchives[0], lastPhase); + } else { + keyBuffer[k] = parties[k].doPhase(keyArchives[k + 1], lastPhase); + } + } + System.arraycopy(keyBuffer, 0, keyArchives, 0, numParties); + } + + //Comparison: The secret keys generated by all involved parties should be the same + SecretKey[] sKeys = new SecretKey[numParties]; + for (int n = 0; n < numParties; n++) { + sKeys[n] = parties[n].generateSecret(secretAlgo); + } + for (int q = 0; q < numParties - 1; q++) { + if (!Arrays.equals(sKeys[q].getEncoded(), sKeys[q + 1].getEncoded())) { + return false; + } + } + return true; + } catch (Exception ex) { + ex.printStackTrace(); + return false; + } + + } + +} + +class KAParticipant { + + private String name = null; + private String algorithm = null; + private KeyPairGenerator keyGen = null; + private KeyPair keys = null; + private KeyAgreement ka = null; + + public KAParticipant(String pName, String algo) throws NoSuchAlgorithmException, NoSuchProviderException { + name = pName; + algorithm = algo; + keyGen = KeyPairGenerator.getInstance(algo,"SunJCE"); + ka = KeyAgreement.getInstance(algo,"SunJCE"); + } + + public void initialize(AlgorithmParameterSpec spec) throws InvalidAlgorithmParameterException, InvalidKeyException { + keyGen.initialize(spec); + keys = keyGen.generateKeyPair(); + ka.init(keys.getPrivate()); + } + + public Key doPhase(Key key, boolean lastPhase) throws InvalidKeyException { + return ka.doPhase(key, lastPhase); + } + + public Key getPublicKey() { + return keys.getPublic(); + } + + public byte[] generateSecret() { + return ka.generateSecret(); + } + + public SecretKey generateSecret(String algo) throws java.lang.IllegalStateException, + java.security.NoSuchAlgorithmException, + java.security.InvalidKeyException { + return ka.generateSecret(algo); + } +}