diff options
Diffstat (limited to 'prov/src/main/java/org/spongycastle/jcajce/provider/asymmetric/gost/KeyPairGeneratorSpi.java')
-rw-r--r-- | prov/src/main/java/org/spongycastle/jcajce/provider/asymmetric/gost/KeyPairGeneratorSpi.java | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/prov/src/main/java/org/spongycastle/jcajce/provider/asymmetric/gost/KeyPairGeneratorSpi.java b/prov/src/main/java/org/spongycastle/jcajce/provider/asymmetric/gost/KeyPairGeneratorSpi.java new file mode 100644 index 00000000..67ac1b91 --- /dev/null +++ b/prov/src/main/java/org/spongycastle/jcajce/provider/asymmetric/gost/KeyPairGeneratorSpi.java @@ -0,0 +1,81 @@ +package org.spongycastle.jcajce.provider.asymmetric.gost; + +import java.security.InvalidAlgorithmParameterException; +import java.security.KeyPair; +import java.security.SecureRandom; +import java.security.spec.AlgorithmParameterSpec; + +import org.spongycastle.asn1.cryptopro.CryptoProObjectIdentifiers; +import org.spongycastle.crypto.AsymmetricCipherKeyPair; +import org.spongycastle.crypto.generators.GOST3410KeyPairGenerator; +import org.spongycastle.crypto.params.GOST3410KeyGenerationParameters; +import org.spongycastle.crypto.params.GOST3410Parameters; +import org.spongycastle.crypto.params.GOST3410PrivateKeyParameters; +import org.spongycastle.crypto.params.GOST3410PublicKeyParameters; +import org.spongycastle.jce.spec.GOST3410ParameterSpec; +import org.spongycastle.jce.spec.GOST3410PublicKeyParameterSetSpec; + +public class KeyPairGeneratorSpi + extends java.security.KeyPairGenerator +{ + GOST3410KeyGenerationParameters param; + GOST3410KeyPairGenerator engine = new GOST3410KeyPairGenerator(); + GOST3410ParameterSpec gost3410Params; + int strength = 1024; + SecureRandom random = null; + boolean initialised = false; + + public KeyPairGeneratorSpi() + { + super("GOST3410"); + } + + public void initialize( + int strength, + SecureRandom random) + { + this.strength = strength; + this.random = random; + } + + private void init( + GOST3410ParameterSpec gParams, + SecureRandom random) + { + GOST3410PublicKeyParameterSetSpec spec = gParams.getPublicKeyParameters(); + + param = new GOST3410KeyGenerationParameters(random, new GOST3410Parameters(spec.getP(), spec.getQ(), spec.getA())); + + engine.init(param); + + initialised = true; + gost3410Params = gParams; + } + + public void initialize( + AlgorithmParameterSpec params, + SecureRandom random) + throws InvalidAlgorithmParameterException + { + if (!(params instanceof GOST3410ParameterSpec)) + { + throw new InvalidAlgorithmParameterException("parameter object not a GOST3410ParameterSpec"); + } + + init((GOST3410ParameterSpec)params, random); + } + + public KeyPair generateKeyPair() + { + if (!initialised) + { + init(new GOST3410ParameterSpec(CryptoProObjectIdentifiers.gostR3410_94_CryptoPro_A.getId()), new SecureRandom()); + } + + AsymmetricCipherKeyPair pair = engine.generateKeyPair(); + GOST3410PublicKeyParameters pub = (GOST3410PublicKeyParameters)pair.getPublic(); + GOST3410PrivateKeyParameters priv = (GOST3410PrivateKeyParameters)pair.getPrivate(); + + return new KeyPair(new BCGOST3410PublicKey(pub, gost3410Params), new BCGOST3410PrivateKey(priv, gost3410Params)); + } +} |