package org.bouncycastle.pqc.jcajce.provider.newhope; import java.security.InvalidAlgorithmParameterException; import java.security.KeyPair; import java.security.SecureRandom; import java.security.spec.AlgorithmParameterSpec; import org.bouncycastle.crypto.AsymmetricCipherKeyPair; import org.bouncycastle.crypto.KeyGenerationParameters; import org.bouncycastle.pqc.crypto.newhope.NHKeyPairGenerator; import org.bouncycastle.pqc.crypto.newhope.NHPrivateKeyParameters; import org.bouncycastle.pqc.crypto.newhope.NHPublicKeyParameters; public class NHKeyPairGeneratorSpi extends java.security.KeyPairGenerator { NHKeyPairGenerator engine = new NHKeyPairGenerator(); SecureRandom random = new SecureRandom(); boolean initialised = false; public NHKeyPairGeneratorSpi() { super("NH"); } public void initialize( int strength, SecureRandom random) { if (strength != 1024) { throw new IllegalArgumentException("strength must be 1024 bits"); } engine.init(new KeyGenerationParameters(random, 1024)); initialised = true; } public void initialize( AlgorithmParameterSpec params, SecureRandom random) throws InvalidAlgorithmParameterException { throw new InvalidAlgorithmParameterException("parameter object not recognised"); } public KeyPair generateKeyPair() { if (!initialised) { engine.init(new KeyGenerationParameters(random, 1024)); initialised = true; } AsymmetricCipherKeyPair pair = engine.generateKeyPair(); NHPublicKeyParameters pub = (NHPublicKeyParameters)pair.getPublic(); NHPrivateKeyParameters priv = (NHPrivateKeyParameters)pair.getPrivate(); return new KeyPair(new BCNHPublicKey(pub), new BCNHPrivateKey(priv)); } }