/// <summary> /// Generate a new set of DSA domain parameters. /// </summary> /// <returns>A new set of DSADomainParameters</returns> public DsaDomainParameters GenerateDomainParameters() { if (parameters.P != null) { byte[] seed = parameters.GetSeed(); if (seed != null && parameters.UsageIndex >= 0) { BigInteger g = DsaParametersGenerator.CalculateGenerator_FIPS186_3_Verifiable(FipsShs.CreateDigest(digestAlgorithm), parameters.P, parameters.Q, seed, parameters.UsageIndex); return(new DsaDomainParameters(parameters.P, parameters.Q, g, new Org.BouncyCastle.Crypto.Asymmetric.DsaValidationParameters(seed, -1, parameters.UsageIndex))); } else { BigInteger g = DsaParametersGenerator.CalculateGenerator_FIPS186_3_Unverifiable(parameters.P, parameters.Q, random); return(new DsaDomainParameters(parameters.P, parameters.Q, g, null)); } } else { DsaParametersGenerator pGen = new DsaParametersGenerator(FipsShs.CreateDigest(digestAlgorithm)); DsaParameterGenerationParameters dsaGenParameters = new DsaParameterGenerationParameters( parameters.L, parameters.N, parameters.Certainty, random, parameters.UsageIndex); pGen.Init(dsaGenParameters); DsaParameters p = pGen.GenerateParameters(); Org.BouncyCastle.Crypto.Internal.Parameters.DsaValidationParameters validationParameters = p.ValidationParameters; return(new DsaDomainParameters(p.P, p.Q, p.G, new Org.BouncyCastle.Crypto.Asymmetric.DsaValidationParameters(validationParameters.GetSeed(), validationParameters.Counter, validationParameters.UsageIndex))); } }