public static AsymmetricKeyParameter CreateKey(Stream inStr)
 {
     return(PublicKeyFactory.CreateKey(SubjectPublicKeyInfo.GetInstance(Asn1Object.FromStream(inStr))));
 }
        public static AsymmetricKeyParameter CreateKey(SubjectPublicKeyInfo keyInfo)
        {
            AlgorithmIdentifier algorithmID = keyInfo.AlgorithmID;
            DerObjectIdentifier objectID    = algorithmID.ObjectID;

            if (objectID.Equals(PkcsObjectIdentifiers.RsaEncryption) || objectID.Equals(X509ObjectIdentifiers.IdEARsa) || objectID.Equals(PkcsObjectIdentifiers.IdRsassaPss) || objectID.Equals(PkcsObjectIdentifiers.IdRsaesOaep))
            {
                RsaPublicKeyStructure instance = RsaPublicKeyStructure.GetInstance(keyInfo.GetPublicKey());
                return(new RsaKeyParameters(false, instance.Modulus, instance.PublicExponent));
            }
            if (objectID.Equals(X9ObjectIdentifiers.DHPublicNumber))
            {
                Asn1Sequence instance2 = Asn1Sequence.GetInstance(algorithmID.Parameters.ToAsn1Object());
                DHPublicKey  instance3 = DHPublicKey.GetInstance(keyInfo.GetPublicKey());
                BigInteger   value     = instance3.Y.Value;
                if (PublicKeyFactory.IsPkcsDHParam(instance2))
                {
                    return(PublicKeyFactory.ReadPkcsDHParam(objectID, value, instance2));
                }
                DHDomainParameters instance4 = DHDomainParameters.GetInstance(instance2);
                BigInteger         value2    = instance4.P.Value;
                BigInteger         value3    = instance4.G.Value;
                BigInteger         value4    = instance4.Q.Value;
                BigInteger         j         = null;
                if (instance4.J != null)
                {
                    j = instance4.J.Value;
                }
                DHValidationParameters validation      = null;
                DHValidationParms      validationParms = instance4.ValidationParms;
                if (validationParms != null)
                {
                    byte[]     bytes  = validationParms.Seed.GetBytes();
                    BigInteger value5 = validationParms.PgenCounter.Value;
                    validation = new DHValidationParameters(bytes, value5.IntValue);
                }
                return(new DHPublicKeyParameters(value, new DHParameters(value2, value3, value4, j, validation)));
            }
            else
            {
                if (objectID.Equals(PkcsObjectIdentifiers.DhKeyAgreement))
                {
                    Asn1Sequence instance5  = Asn1Sequence.GetInstance(algorithmID.Parameters.ToAsn1Object());
                    DerInteger   derInteger = (DerInteger)keyInfo.GetPublicKey();
                    return(PublicKeyFactory.ReadPkcsDHParam(objectID, derInteger.Value, instance5));
                }
                if (objectID.Equals(OiwObjectIdentifiers.ElGamalAlgorithm))
                {
                    ElGamalParameter elGamalParameter = new ElGamalParameter(Asn1Sequence.GetInstance(algorithmID.Parameters.ToAsn1Object()));
                    DerInteger       derInteger2      = (DerInteger)keyInfo.GetPublicKey();
                    return(new ElGamalPublicKeyParameters(derInteger2.Value, new ElGamalParameters(elGamalParameter.P, elGamalParameter.G)));
                }
                if (objectID.Equals(X9ObjectIdentifiers.IdDsa) || objectID.Equals(OiwObjectIdentifiers.DsaWithSha1))
                {
                    DerInteger    derInteger3 = (DerInteger)keyInfo.GetPublicKey();
                    Asn1Encodable parameters  = algorithmID.Parameters;
                    DsaParameters parameters2 = null;
                    if (parameters != null)
                    {
                        DsaParameter instance6 = DsaParameter.GetInstance(parameters.ToAsn1Object());
                        parameters2 = new DsaParameters(instance6.P, instance6.Q, instance6.G);
                    }
                    return(new DsaPublicKeyParameters(derInteger3.Value, parameters2));
                }
                if (objectID.Equals(X9ObjectIdentifiers.IdECPublicKey))
                {
                    X962Parameters x962Parameters = new X962Parameters(algorithmID.Parameters.ToAsn1Object());
                    X9ECParameters x9ECParameters;
                    if (x962Parameters.IsNamedCurve)
                    {
                        x9ECParameters = ECKeyPairGenerator.FindECCurveByOid((DerObjectIdentifier)x962Parameters.Parameters);
                    }
                    else
                    {
                        x9ECParameters = new X9ECParameters((Asn1Sequence)x962Parameters.Parameters);
                    }
                    Asn1OctetString s         = new DerOctetString(keyInfo.PublicKeyData.GetBytes());
                    X9ECPoint       x9ECPoint = new X9ECPoint(x9ECParameters.Curve, s);
                    ECPoint         point     = x9ECPoint.Point;
                    if (x962Parameters.IsNamedCurve)
                    {
                        return(new ECPublicKeyParameters("EC", point, (DerObjectIdentifier)x962Parameters.Parameters));
                    }
                    ECDomainParameters parameters3 = new ECDomainParameters(x9ECParameters.Curve, x9ECParameters.G, x9ECParameters.N, x9ECParameters.H, x9ECParameters.GetSeed());
                    return(new ECPublicKeyParameters(point, parameters3));
                }
                else if (objectID.Equals(CryptoProObjectIdentifiers.GostR3410x2001))
                {
                    Gost3410PublicKeyAlgParameters gost3410PublicKeyAlgParameters = new Gost3410PublicKeyAlgParameters((Asn1Sequence)algorithmID.Parameters);
                    Asn1OctetString asn1OctetString;
                    try
                    {
                        asn1OctetString = (Asn1OctetString)keyInfo.GetPublicKey();
                    }
                    catch (IOException)
                    {
                        throw new ArgumentException("invalid info structure in GOST3410 public key");
                    }
                    byte[] octets = asn1OctetString.GetOctets();
                    byte[] array  = new byte[32];
                    byte[] array2 = new byte[32];
                    for (int num = 0; num != array2.Length; num++)
                    {
                        array[num] = octets[31 - num];
                    }
                    for (int num2 = 0; num2 != array.Length; num2++)
                    {
                        array2[num2] = octets[63 - num2];
                    }
                    ECDomainParameters byOid = ECGost3410NamedCurves.GetByOid(gost3410PublicKeyAlgParameters.PublicKeyParamSet);
                    if (byOid == null)
                    {
                        return(null);
                    }
                    ECPoint q = byOid.Curve.CreatePoint(new BigInteger(1, array), new BigInteger(1, array2));
                    return(new ECPublicKeyParameters("ECGOST3410", q, gost3410PublicKeyAlgParameters.PublicKeyParamSet));
                }
                else
                {
                    if (objectID.Equals(CryptoProObjectIdentifiers.GostR3410x94))
                    {
                        Gost3410PublicKeyAlgParameters gost3410PublicKeyAlgParameters2 = new Gost3410PublicKeyAlgParameters((Asn1Sequence)algorithmID.Parameters);
                        DerOctetString derOctetString;
                        try
                        {
                            derOctetString = (DerOctetString)keyInfo.GetPublicKey();
                        }
                        catch (IOException)
                        {
                            throw new ArgumentException("invalid info structure in GOST3410 public key");
                        }
                        byte[] octets2 = derOctetString.GetOctets();
                        byte[] array3  = new byte[octets2.Length];
                        for (int num3 = 0; num3 != octets2.Length; num3++)
                        {
                            array3[num3] = octets2[octets2.Length - 1 - num3];
                        }
                        BigInteger y = new BigInteger(1, array3);
                        return(new Gost3410PublicKeyParameters(y, gost3410PublicKeyAlgParameters2.PublicKeyParamSet));
                    }
                    throw new SecurityUtilityException("algorithm identifier in key not recognised: " + objectID);
                }
            }
        }
 public static AsymmetricKeyParameter CreateKey(byte[] keyInfoData)
 {
     return(PublicKeyFactory.CreateKey(SubjectPublicKeyInfo.GetInstance(Asn1Object.FromByteArray(keyInfoData))));
 }