Example #1
0
        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);
            }
        }