package org.bouncycastle.pqc.jcajce.provider.test; import java.security.Key; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.SecureRandom; import java.security.Security; import javax.crypto.KeyAgreement; import junit.framework.Assert; import junit.framework.TestCase; import org.bouncycastle.pqc.jcajce.provider.BouncyCastlePQCProvider; import org.bouncycastle.util.Arrays; public class NewHopeTest extends TestCase { public void setUp() { if (Security.getProvider(BouncyCastlePQCProvider.PROVIDER_NAME) == null) { Security.addProvider(new BouncyCastlePQCProvider()); } } public void testKeyExchange() throws Exception { SecureRandom aliceRand = new SecureRandom(); SecureRandom bobRand = new SecureRandom(); for (int i = 0; i < 1000; ++i) { KeyPairGenerator kpGen = KeyPairGenerator.getInstance("NH", "BCPQC"); kpGen.initialize(1024, aliceRand); KeyPair aliceKp = kpGen.generateKeyPair(); KeyAgreement bobAgree = KeyAgreement.getInstance("NH", "BCPQC"); // responder has no private key, but needs a random number source. bobAgree.init(null, bobRand); Key bobSend = bobAgree.doPhase(aliceKp.getPublic(), true); KeyAgreement aliceAgree = KeyAgreement.getInstance("NH", "BCPQC"); // initiator uses both private key aliceAgree.init(aliceKp.getPrivate()); // and recipient's public key. aliceAgree.doPhase(bobSend, true); Assert.assertTrue("value mismatch", Arrays.areEqual(aliceAgree.generateSecret(), bobAgree.generateSecret())); } } }