ECKeyPairGenerator
using Renci.SshNet.Security.Org.BouncyCastle.Crypto.Parameters;
using Renci.SshNet.Security.Org.BouncyCastle.Math;
using Renci.SshNet.Security.Org.BouncyCastle.Math.EC;
using Renci.SshNet.Security.Org.BouncyCastle.Math.EC.Multiplier;
using Renci.SshNet.Security.Org.BouncyCastle.Security;
using System;
namespace Renci.SshNet.Security.Org.BouncyCastle.Crypto.Generators
{
internal class ECKeyPairGenerator : IAsymmetricCipherKeyPairGenerator
{
private readonly string algorithm;
private ECDomainParameters parameters;
private SecureRandom random;
public ECKeyPairGenerator()
: this("EC")
{
}
public ECKeyPairGenerator(string algorithm)
{
if (algorithm == null)
throw new ArgumentNullException("algorithm");
this.algorithm = ECKeyParameters.VerifyAlgorithmName(algorithm);
}
public void Init(KeyGenerationParameters parameters)
{
if (parameters is ECKeyGenerationParameters) {
ECKeyGenerationParameters eCKeyGenerationParameters = (ECKeyGenerationParameters)parameters;
this.parameters = eCKeyGenerationParameters.DomainParameters;
}
random = parameters.Random;
if (random == null)
random = new SecureRandom();
}
public AsymmetricCipherKeyPair GenerateKeyPair()
{
BigInteger n = parameters.N;
int num = n.BitLength >> 2;
BigInteger bigInteger;
do {
bigInteger = new BigInteger(n.BitLength, random);
} while (bigInteger.CompareTo(BigInteger.Two) < 0 || bigInteger.CompareTo(n) >= 0 || WNafUtilities.GetNafWeight(bigInteger) < num);
ECPoint q = CreateBasePointMultiplier().Multiply(parameters.G, bigInteger);
return new AsymmetricCipherKeyPair(new ECPublicKeyParameters(algorithm, q, parameters), new ECPrivateKeyParameters(algorithm, bigInteger, parameters));
}
protected virtual ECMultiplier CreateBasePointMultiplier()
{
return new FixedPointCombMultiplier();
}
internal static ECPublicKeyParameters GetCorrespondingPublicKey(ECPrivateKeyParameters privKey)
{
ECDomainParameters eCDomainParameters = privKey.Parameters;
ECPoint q = new FixedPointCombMultiplier().Multiply(eCDomainParameters.G, privKey.D);
return new ECPublicKeyParameters(privKey.AlgorithmName, q, eCDomainParameters);
}
}
}