/// <summary>
        /// Create the private key from DER.
        /// </summary>
        /// <param name="key">DER Base64 coded string.</param>
        /// <returns></returns>
        public static GXPrivateKey FromDer(string der)
        {
            der = der.Replace("\r\n", "");
            der = der.Replace("\n", "");
            byte[]         key = GXCommon.FromBase64(der);
            GXAsn1Sequence seq = (GXAsn1Sequence)GXAsn1Converter.FromByteArray(key);

            if ((sbyte)seq[0] > 3)
            {
                throw new ArgumentOutOfRangeException("Invalid private key version.");
            }
            List <object>      tmp   = (List <object>)seq[2];
            GXPrivateKey       value = new GXPrivateKey();
            X9ObjectIdentifier id    = X9ObjectIdentifierConverter.FromString(tmp[0].ToString());

            switch (id)
            {
            case X9ObjectIdentifier.Prime256v1:
                value.Scheme = Ecc.P256;
                break;

            case X9ObjectIdentifier.Secp384r1:
                value.Scheme = Ecc.P384;
                break;

            default:
                if (id == X9ObjectIdentifier.None)
                {
                    throw new ArgumentOutOfRangeException("Invalid private key " + tmp[0].ToString() + ".");
                }
                else
                {
                    throw new ArgumentOutOfRangeException("Invalid private key " + id + " " + tmp[0].ToString() + ".");
                }
            }
            value.RawValue = (byte[])seq[1];
            if (seq[3] is byte[])
            {
                value.publicKey = GXPublicKey.FromRawBytes((byte[])seq[3]);
            }
            else
            {
                //Open SSL PEM.
                value.publicKey = GXPublicKey.FromRawBytes(((GXAsn1BitString)((List <object>)seq[3])[0]).Value);
            }
            return(value);
        }
示例#2
0
        public static string GetString(X9ObjectIdentifier value)
        {
            switch (value)
            {
            case X9ObjectIdentifier.IdFieldType:
                return("1.2.840.10045.1");

            case X9ObjectIdentifier.PrimeField:
                return("1.2.840.10045.1");

            case X9ObjectIdentifier.CharacteristicTwoField:
                return("1.2.840.10045.1.2");

            case X9ObjectIdentifier.GNBasis:
                return("1.2.840.10045.1.2.3.1");

            case X9ObjectIdentifier.TPBasis:
                return("1.2.840.10045.1.2.3.2");

            case X9ObjectIdentifier.PPBasis:
                return("1.2.840.10045.1.2.3.3");

            case X9ObjectIdentifier.ECDsaWithSha1:
                return("1.2.840.10045.4.1");

            case X9ObjectIdentifier.IdECPublicKey:
                return("1.2.840.10045.2.1");

            case X9ObjectIdentifier.ECDsaWithSha2:
                return("1.2.840.10045.4.3");

            case X9ObjectIdentifier.ECDsaWithSha224:
                return("1.2.840.10045.4.31");

            case X9ObjectIdentifier.ECDsaWithSha256:
                return("1.2.840.10045.4.32");

            case X9ObjectIdentifier.ECDsaWithSha384:
                return("1.2.840.10045.4.33");

            case X9ObjectIdentifier.ECDsaWithSha512:
                return("1.2.840.10045.4.34");

            case X9ObjectIdentifier.EllipticCurve:
                return("1.2.840.10045.3");

            case X9ObjectIdentifier.CTwoCurve:
                return("1.2.840.10045.3.0");

            case X9ObjectIdentifier.C2Pnb163v1:
                return("1.2.840.10045.3.0.1");

            case X9ObjectIdentifier.C2Pnb163v2:
                return("1.2.840.10045.3.0.2");

            case X9ObjectIdentifier.C2Pnb163v3:
                return("1.2.840.10045.3.0.3");

            case X9ObjectIdentifier.C2Pnb176w1:
                return("1.2.840.10045.3.0.4");

            case X9ObjectIdentifier.C2Tnb191v1:
                return("1.2.840.10045.3.0.5");

            case X9ObjectIdentifier.C2Tnb191v2:
                return("1.2.840.10045.3.0.6");

            case X9ObjectIdentifier.C2Tnb191v3:
                return("1.2.840.10045.3.0.7");

            case X9ObjectIdentifier.C2Onb191v4:
                return("1.2.840.10045.3.0.8");

            case X9ObjectIdentifier.C2Onb191v5:
                return("1.2.840.10045.3.0.9");

            case X9ObjectIdentifier.C2Pnb208w1:
                return("1.2.840.10045.3.0.10");

            case X9ObjectIdentifier.C2Tnb239v1:
                return("1.2.840.10045.3.0.11");

            case X9ObjectIdentifier.C2Tnb239v2:
                return("1.2.840.10045.3.0.12");

            case X9ObjectIdentifier.C2Tnb239v3:
                return("1.2.840.10045.3.0.13");

            case X9ObjectIdentifier.C2Onb239v4:
                return("1.2.840.10045.3.0.14");

            case X9ObjectIdentifier.C2Onb239v5:
                return("1.2.840.10045.3.0.15");

            case X9ObjectIdentifier.C2Pnb272w1:
                return("1.2.840.10045.3.0.16");

            case X9ObjectIdentifier.C2Pnb304w1:
                return("1.2.840.10045.3.0.17");

            case X9ObjectIdentifier.C2Tnb359v1:
                return("1.2.840.10045.3.0.18");

            case X9ObjectIdentifier.C2Pnb368w1:
                return("1.2.840.10045.3.0.19");

            case X9ObjectIdentifier.C2Tnb431r1:
                return("1.2.840.10045.3.0.20");

            case X9ObjectIdentifier.PrimeCurve:
                return("1.2.840.10045.3.1");

            case X9ObjectIdentifier.Prime192v1:
                return("1.2.840.10045.3.1.1");

            case X9ObjectIdentifier.Prime192v2:
                return("1.2.840.10045.3.1.2");

            case X9ObjectIdentifier.Prime192v3:
                return("1.2.840.10045.3.1.3");

            case X9ObjectIdentifier.Prime239v1:
                return("1.2.840.10045.3.1.4");

            case X9ObjectIdentifier.Prime239v2:
                return("1.2.840.10045.3.1.5");

            case X9ObjectIdentifier.Prime239v3:
                return("1.2.840.10045.3.1.6");

            case X9ObjectIdentifier.Prime256v1:
                return("1.2.840.10045.3.1.7");

            case X9ObjectIdentifier.IdDsa:
                return("1.2.840.10040.4.1");

            case X9ObjectIdentifier.IdDsaWithSha1:
                return("1.2.840.10040.4.3");

            case X9ObjectIdentifier.X9x63Scheme:
                return("1.3.133.16.840.63.0");

            case X9ObjectIdentifier.DHSinglePassStdDHSha1KdfScheme:
                return("1.3.133.16.840.63.0.2");

            case X9ObjectIdentifier.DHSinglePassCofactorDHSha1KdfScheme:
                return("1.3.133.16.840.63.0.3");

            case X9ObjectIdentifier.MqvSinglePassSha1KdfScheme:
                return("1.3.133.16.840.63.0.16");

            case X9ObjectIdentifier.ansi_x9_42:
                return("1.2.840.10046");

            case X9ObjectIdentifier.DHPublicNumber:
                return("1.2.840.10046.2.1");

            case X9ObjectIdentifier.X9x42Schemes:
                return("1.2.840.10046.2.3");

            case X9ObjectIdentifier.DHStatic:
                return("1.2.840.10046.2.3.1");

            case X9ObjectIdentifier.DHEphem:
                return("1.2.840.10046.2.3.2");

            case X9ObjectIdentifier.DHOneFlow:
                return("1.2.840.10046.2.3.3");

            case X9ObjectIdentifier.DHHybrid1:
                return("1.2.840.10046.2.3.4");

            case X9ObjectIdentifier.DHHybrid2:
                return("1.2.840.10046.2.3.5");

            case X9ObjectIdentifier.DHHybridOneFlow:
                return("1.2.840.10046.2.3.6");

            case X9ObjectIdentifier.Mqv2:
                return("1.2.840.10046.2.3.7");

            case X9ObjectIdentifier.Mqv1:
                return("1.2.840.10046.2.3.8");

            default:
                throw new ArgumentOutOfRangeException("Invalid X509Name. " + value);
            }
        }