public override void ImportParameters(DSAParameters parameters)
{
if (parameters.P == null || parameters.Q == null || parameters.G == null || parameters.Y == null)
throw new ArgumentException(SR.Cryptography_InvalidDsaParameters_MissingFields);
// J is not required and is not even used on CNG blobs. It should however be less than P (J == (P-1) / Q). This validation check
// is just to maintain parity with DSACNG and DSACryptoServiceProvider, which also perform this check.
if (parameters.J != null && parameters.J.Length >= parameters.P.Length)
throw new ArgumentException(SR.Cryptography_InvalidDsaParameters_MismatchedPJ);
bool hasPrivateKey = parameters.X != null;
int keySize = parameters.P.Length;
if (parameters.G.Length != keySize || parameters.Y.Length != keySize)
throw new ArgumentException(SR.Cryptography_InvalidDsaParameters_MismatchedPGY);
if (hasPrivateKey && parameters.X.Length != parameters.Q.Length)
throw new ArgumentException(SR.Cryptography_InvalidDsaParameters_MismatchedQX);
SafeDsaHandle key;
if (!Interop.Crypto.DsaKeyCreateByExplicitParameters(
out key,
parameters.P, parameters.P.Length,
parameters.Q, parameters.Q.Length,
parameters.G, parameters.G.Length,
parameters.Y, parameters.Y.Length,
parameters.X, parameters.X != null ? parameters.X.Length : 0))
{
throw Interop.Crypto.CreateOpenSslCryptographicException();
}
SetKey(key);
}