private static DHDomainParameters DecodeDomainParameters(AlgorithmIdentifier algorithmIdentifier) { DerObjectIdentifier id = algorithmIdentifier.Algorithm; Asn1Encodable parameters = algorithmIdentifier.Parameters; if (parameters == null) { throw new ArgumentException("AlgorithmIdentifier parameters cannot be empty"); } if (id.Equals(OiwObjectIdentifiers.ElGamalAlgorithm)) { ElGamalParameter elg = ElGamalParameter.GetInstance(parameters); return(new DHDomainParameters(elg.P, elg.G)); } // we need the PKCS check to handle older keys marked with the X9 oid. if (id.Equals(PkcsObjectIdentifiers.DhKeyAgreement) || KeyUtils.IsDHPkcsParam(parameters)) { DHParameter dhParameters = DHParameter.GetInstance(parameters); if (dhParameters.L != null) { return(new DHDomainParameters(dhParameters.P, null, dhParameters.G, dhParameters.L.IntValue)); } else { return(new DHDomainParameters(dhParameters.P, dhParameters.G)); } } else if (id.Equals(X9ObjectIdentifiers.DHPublicNumber)) { Asn1.X9.DHDomainParameters dhParameters = Asn1.X9.DHDomainParameters.GetInstance(parameters); if (dhParameters.ValidationParms != null) { return(new DHDomainParameters(GetValue(dhParameters.P), GetValue(dhParameters.Q), GetValue(dhParameters.G), GetValue(dhParameters.J), new DHValidationParameters(dhParameters.ValidationParms.Seed.GetBytes(), dhParameters.ValidationParms.PgenCounter.Value.IntValue))); } else { return(new DHDomainParameters(GetValue(dhParameters.P), GetValue(dhParameters.Q), GetValue(dhParameters.G), GetValue(dhParameters.J), null)); } } else { throw new ArgumentException("Unknown algorithm type: " + id); } }