package freenet.crypt; import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.PublicKey; import java.security.Security; import org.bouncycastle.jce.provider.BouncyCastleProvider; import freenet.crypt.ECDH.Curves; import junit.framework.TestCase; public class ECDHTest extends TestCase { ECDH.Curves curveToTest; ECDH alice; ECDH bob; protected void setUp() throws Exception { super.setUp(); Security.addProvider(new BouncyCastleProvider()); curveToTest = Curves.P256; alice = new ECDH(curveToTest); bob = new ECDH(curveToTest); } public void testGetAgreedSecret() throws InvalidKeyException, IllegalStateException, NoSuchAlgorithmException, InvalidAlgorithmParameterException { byte[] aliceS = alice.getAgreedSecret(bob.getPublicKey()); byte[] bobS = bob.getAgreedSecret(alice.getPublicKey()); assertNotNull(aliceS); assertNotNull(bobS); assertEquals(toHex(aliceS), toHex(bobS)); assertEquals(aliceS.length, curveToTest.derivedSecretSize); assertEquals(bobS.length, curveToTest.derivedSecretSize); } public void testGetPublicKey() { PublicKey aliceP = alice.getPublicKey(); PublicKey bobP = bob.getPublicKey(); assertNotNull(aliceP); assertNotSame(aliceP, bobP); assertEquals(aliceP.getEncoded().length, curveToTest.modulusSize); assertEquals(bobP.getEncoded().length, curveToTest.modulusSize); } public static void main(String[] args) throws InvalidKeyException, IllegalStateException, NoSuchAlgorithmException { Security.addProvider(new BouncyCastleProvider()); ECDH alice = new ECDH(Curves.P256); ECDH bob = new ECDH(Curves.P256); PublicKey bobP = bob.getPublicKey(); PublicKey aliceP = alice.getPublicKey(); System.out.println("Alice C: "+alice.curve); System.out.println("Bob C: "+bob.curve); System.out.println("Alice P: "+toHex(aliceP.getEncoded())); System.out.println("Bob P: "+toHex(bobP.getEncoded())); System.out.println("Alice S: "+toHex(alice.getAgreedSecret(bob.getPublicKey()))); System.out.println("Bob S: "+toHex(bob.getAgreedSecret(alice.getPublicKey()))); } public static String toHex(byte[] arg) { return String.format("%040x", new BigInteger(1,arg)); } public static String toHex(String arg) throws UnsupportedEncodingException { return toHex(arg.getBytes("utf-8")); } }