/* * Copyright 2006-2008 Sxip Identity Corporation */ package org.openid4java.association; import junit.framework.Test; import junit.framework.TestSuite; import junit.framework.TestCase; import javax.crypto.spec.DHParameterSpec; import javax.crypto.interfaces.DHPublicKey; import javax.crypto.interfaces.DHPrivateKey; import java.security.KeyPair; import java.security.GeneralSecurityException; import java.math.BigInteger; import org.apache.commons.codec.binary.Base64; /** * @author Marius Scurtescu, Johnny Bufu */ public class DiffieHellmanSessionTest extends TestCase { public DiffieHellmanSessionTest(String name) { super(name); } public void testGetDefaultParameterSha1() throws Exception { DHParameterSpec parameterSpec = DiffieHellmanSession.getDefaultParameter(); assertNotNull(parameterSpec); assertEquals(2, parameterSpec.getG().intValue()); assertEquals(DiffieHellmanSession.DEFAULT_MODULUS_HEX.length() * 4, parameterSpec.getP().bitLength()); } public void testGetDefaultParameterSha256() throws Exception { DHParameterSpec parameterSpec = DiffieHellmanSession.getDefaultParameter(); assertNotNull(parameterSpec); assertEquals(2, parameterSpec.getG().intValue()); assertEquals(DiffieHellmanSession.DEFAULT_MODULUS_HEX.length() * 4, parameterSpec.getP().bitLength()); } public void testGenerateRandomParameterSha1() throws Exception { DHParameterSpec parameterSpec = DiffieHellmanSession.generateRandomParameter(512, 256); assertNotNull(parameterSpec); assertEquals(512, parameterSpec.getP().bitLength()); } public void testGenerateRandomParameterSha256() throws Exception { DHParameterSpec parameterSpec = DiffieHellmanSession.generateRandomParameter(512, 256); assertNotNull(parameterSpec); assertEquals(512, parameterSpec.getP().bitLength()); } public void testGenerateKeyPairSha1Default() { DHParameterSpec parameterSpec = DiffieHellmanSession.getDefaultParameter(); KeyPair keyPair = DiffieHellmanSession.generateKeyPair(parameterSpec); assertNotNull(keyPair); } public void testGenerateKeyPairSha256Default() { DHParameterSpec parameterSpec = DiffieHellmanSession.getDefaultParameter(); KeyPair keyPair = DiffieHellmanSession.generateKeyPair(parameterSpec); assertNotNull(keyPair); } public void testGenerateKeyPairSha1Random() { DHParameterSpec parameterSpec = DiffieHellmanSession.generateRandomParameter(512, 256); KeyPair keyPair = DiffieHellmanSession.generateKeyPair(parameterSpec); assertNotNull(keyPair); } public void testGenerateKeyPairSha256Random() { DHParameterSpec parameterSpec = DiffieHellmanSession.generateRandomParameter(512, 256); KeyPair keyPair = DiffieHellmanSession.generateKeyPair(parameterSpec); assertNotNull(keyPair); } public void testPublicKeyConversion() throws AssociationException { DHParameterSpec dhParameterSpec = DiffieHellmanSession.getDefaultParameter(); DiffieHellmanSession diffieHellmanSession = DiffieHellmanSession.create(AssociationSessionType.DH_SHA1, dhParameterSpec); String publicKeyBase64 = diffieHellmanSession.getPublicKey(); assertNotNull(publicKeyBase64); DHPublicKey publicKey = diffieHellmanSession.stringToPublicKey(publicKeyBase64); assertNotNull(publicKey); assertEquals(publicKeyBase64, DiffieHellmanSession.publicKeyToString(publicKey)); } public void testEncryptDecryptMacKeySha1() throws GeneralSecurityException, AssociationException { DHParameterSpec dhParameterSpec = DiffieHellmanSession.getDefaultParameter(); assertNotNull(dhParameterSpec); DiffieHellmanSession consumerDiffieHellmanSession = DiffieHellmanSession.create(AssociationSessionType.DH_SHA1, dhParameterSpec); byte[] macKey = Association.generateMacKey(Association.HMAC_SHA1_ALGORITHM, Association.HMAC_SHA1_KEYSIZE).getEncoded(); testEncryptDecryptMacKey(consumerDiffieHellmanSession, macKey); } public void testEncryptDecryptMacKeySha1Random() throws GeneralSecurityException, AssociationException { DHParameterSpec dhParameterSpec = DiffieHellmanSession.generateRandomParameter(512, 256); assertNotNull(dhParameterSpec); DiffieHellmanSession consumerDiffieHellmanSession = DiffieHellmanSession.create(AssociationSessionType.DH_SHA1, dhParameterSpec); byte[] macKey = Association.generateMacKey(Association.HMAC_SHA1_ALGORITHM, Association.HMAC_SHA1_KEYSIZE).getEncoded(); testEncryptDecryptMacKey(consumerDiffieHellmanSession, macKey); } public void testEncryptDecryptMacKeySha256() throws GeneralSecurityException, AssociationException { DHParameterSpec dhParameterSpec = DiffieHellmanSession.getDefaultParameter(); assertNotNull(dhParameterSpec); DiffieHellmanSession consumerDiffieHellmanSession = DiffieHellmanSession.create(AssociationSessionType.DH_SHA256, dhParameterSpec); byte[] macKey = Association.generateMacKey(Association.HMAC_SHA256_ALGORITHM, Association.HMAC_SHA256_KEYSIZE).getEncoded(); testEncryptDecryptMacKey(consumerDiffieHellmanSession, macKey); } public void testEncryptDecryptMacKeySha256Random() throws GeneralSecurityException, AssociationException { DHParameterSpec dhParameterSpec = DiffieHellmanSession.generateRandomParameter(512, 256); assertNotNull(dhParameterSpec); DiffieHellmanSession consumerDiffieHellmanSession = DiffieHellmanSession.create(AssociationSessionType.DH_SHA256, dhParameterSpec); byte[] macKey = Association.generateMacKey(Association.HMAC_SHA256_ALGORITHM, Association.HMAC_SHA256_KEYSIZE).getEncoded(); testEncryptDecryptMacKey(consumerDiffieHellmanSession, macKey); } private void testEncryptDecryptMacKey(DiffieHellmanSession consumerDiffieHellmanSession, byte[] macKey) throws AssociationException { AssociationSessionType type = consumerDiffieHellmanSession.getType(); String modulusBase64 = consumerDiffieHellmanSession.getModulus(); String generatorBase64 = consumerDiffieHellmanSession.getGenerator(); String consumerPublicKeyBase64 = consumerDiffieHellmanSession.getPublicKey(); String consumerPrivateKeyBase64 = privateKeyToString(consumerDiffieHellmanSession.getPrivateKey()); DiffieHellmanSession serverDiffieHellmanSession = DiffieHellmanSession.create(type, modulusBase64, generatorBase64); assertEquals(type, serverDiffieHellmanSession.getType()); assertEquals(modulusBase64, serverDiffieHellmanSession.getModulus()); assertEquals(generatorBase64, serverDiffieHellmanSession.getGenerator()); String serverPublicKeyBase64 = serverDiffieHellmanSession.getPublicKey(); String serverPrivateKeyBase64 = privateKeyToString(serverDiffieHellmanSession.getPrivateKey()); String macKeyBase64 = new String(Base64.encodeBase64(macKey)); String encMacBase64 = serverDiffieHellmanSession.encryptMacKey(macKey, consumerPublicKeyBase64); byte[] macKey2 = consumerDiffieHellmanSession.decryptMacKey(encMacBase64, serverPublicKeyBase64); assertEquals(macKey.length, macKey2.length); for (int i = 0; i < macKey.length; i++) { assertEquals(macKey[i], macKey2[i]); } } public void testPublicKey() throws AssociationException { DHParameterSpec dhParameterSpec = DiffieHellmanSession.getDefaultParameter(); DiffieHellmanSession diffieHellmanSession = DiffieHellmanSession.create(AssociationSessionType.DH_SHA1, dhParameterSpec); String dhPublicKeyBase64 = diffieHellmanSession.getPublicKey(); DHPublicKey dhPublicKey = diffieHellmanSession.stringToPublicKey(dhPublicKeyBase64); BigInteger two = new BigInteger("2"); BigInteger y = dhPublicKey.getY(); BigInteger p = dhParameterSpec.getP(); assertTrue(y.compareTo(two) != -1); assertTrue(y.compareTo(p) == -1); } private static String privateKeyToString(DHPrivateKey dhPrivateKey) { return new String(Base64.encodeBase64(dhPrivateKey.getX().toByteArray())); } public static Test suite() { return new TestSuite(DiffieHellmanSessionTest.class); } }