57 lines
1.5 KiB
C#
57 lines
1.5 KiB
C#
using System;
|
|
using Org.BouncyCastle.Math;
|
|
using Org.BouncyCastle.Security;
|
|
using Org.BouncyCastle.Crypto;
|
|
using Org.BouncyCastle.Crypto.Parameters;
|
|
|
|
namespace Org.BouncyCastle.Crypto.Generators
|
|
{
|
|
/**
|
|
* a DSA key pair generator.
|
|
*
|
|
* This Generates DSA keys in line with the method described
|
|
* in FIPS 186-2.
|
|
*/
|
|
public class DsaKeyPairGenerator
|
|
: IAsymmetricCipherKeyPairGenerator
|
|
{
|
|
private DsaKeyGenerationParameters param;
|
|
|
|
public void Init(
|
|
KeyGenerationParameters parameters)
|
|
{
|
|
if (parameters == null)
|
|
throw new ArgumentNullException("parameters");
|
|
|
|
// Note: If we start accepting instances of KeyGenerationParameters,
|
|
// must apply constraint checking on strength (see DsaParametersGenerator.Init)
|
|
|
|
this.param = (DsaKeyGenerationParameters) parameters;
|
|
}
|
|
|
|
public AsymmetricCipherKeyPair GenerateKeyPair()
|
|
{
|
|
DsaParameters dsaParams = param.Parameters;
|
|
SecureRandom random = param.Random;
|
|
|
|
BigInteger q = dsaParams.Q;
|
|
BigInteger x;
|
|
|
|
do
|
|
{
|
|
x = new BigInteger(160, random);
|
|
}
|
|
while (x.SignValue == 0 || x.CompareTo(q) >= 0);
|
|
|
|
//
|
|
// calculate the public key.
|
|
//
|
|
BigInteger y = dsaParams.G.ModPow(x, dsaParams.P);
|
|
|
|
return new AsymmetricCipherKeyPair(
|
|
new DsaPublicKeyParameters(y, dsaParams),
|
|
new DsaPrivateKeyParameters(x, dsaParams));
|
|
}
|
|
}
|
|
}
|