Exemple #1
0
        public override void FromXmlString(string xmlString)
        {
            // ParseDocument does the nullcheck for us.
            XmlKeyHelper.ParseState state = XmlKeyHelper.ParseDocument(xmlString);

            byte[] n = ReadRequiredElement(ref state, nameof(RSAParameters.Modulus));
            byte[] e = ReadRequiredElement(ref state, nameof(RSAParameters.Exponent));

            int halfN = (n.Length + 1) / 2;

            // .NET Framework doesn't report any element other than Modulus/Exponent as required,
            // it just lets import fail if they're imbalanced.
            byte[]? p    = XmlKeyHelper.ReadCryptoBinary(ref state, nameof(RSAParameters.P), halfN);
            byte[]? q    = XmlKeyHelper.ReadCryptoBinary(ref state, nameof(RSAParameters.Q), halfN);
            byte[]? dp   = XmlKeyHelper.ReadCryptoBinary(ref state, nameof(RSAParameters.DP), halfN);
            byte[]? dq   = XmlKeyHelper.ReadCryptoBinary(ref state, nameof(RSAParameters.DQ), halfN);
            byte[]? qInv = XmlKeyHelper.ReadCryptoBinary(ref state, nameof(RSAParameters.InverseQ), halfN);
            byte[]? d    = XmlKeyHelper.ReadCryptoBinary(ref state, nameof(RSAParameters.D), n.Length);

            RSAParameters keyParameters = new RSAParameters
            {
                Modulus  = n,
                Exponent = e,
                D        = d,
                P        = p,
                Q        = q,
                DP       = dp,
                DQ       = dq,
                InverseQ = qInv,
            };

            ImportParameters(keyParameters);
        }
Exemple #2
0
        public override void FromXmlString(string xmlString)
        {
            // ParseDocument does the nullcheck for us.
            XmlKeyHelper.ParseState state = XmlKeyHelper.ParseDocument(xmlString);

            byte[] p       = ReadRequiredElement(ref state, nameof(DSAParameters.P));
            byte[] q       = ReadRequiredElement(ref state, nameof(DSAParameters.Q));
            byte[] g       = ReadRequiredElement(ref state, nameof(DSAParameters.G), p.Length);
            byte[] y       = ReadRequiredElement(ref state, nameof(DSAParameters.Y), p.Length);
            byte[] j       = XmlKeyHelper.ReadCryptoBinary(ref state, nameof(DSAParameters.J));
            byte[] seed    = XmlKeyHelper.ReadCryptoBinary(ref state, nameof(DSAParameters.Seed));
            int    counter = 0;

            byte[] x = XmlKeyHelper.ReadCryptoBinary(ref state, nameof(DSAParameters.X), q.Length);

            if (seed != null)
            {
                byte[] counterBytes = ReadRequiredElement(ref state, CounterElementName);
                counter = XmlKeyHelper.ReadCryptoBinaryInt32(counterBytes);
            }

            DSAParameters dsaParameters = new DSAParameters
            {
                P       = p,
                Q       = q,
                G       = g,
                Y       = y,
                J       = j,
                Seed    = seed,
                Counter = counter,
                X       = x,
            };

            // Check for Counter without Seed after getting X, since that prevents an extra cycle in the
            // canonical element order.
            if (dsaParameters.Seed == null)
            {
                if (XmlKeyHelper.HasElement(ref state, CounterElementName))
                {
                    throw new CryptographicException(
                              SR.Format(
                                  SR.Cryptography_InvalidFromXmlString,
                                  nameof(DSA),
                                  nameof(DSAParameters.Seed)));
                }
            }

            ImportParameters(dsaParameters);
        }
Exemple #3
0
        private static byte[] ReadRequiredElement(
            ref XmlKeyHelper.ParseState state,
            string name,
            int sizeHint = -1)
        {
            byte[] ret = XmlKeyHelper.ReadCryptoBinary(ref state, name, sizeHint);

            if (ret == null)
            {
                throw new CryptographicException(
                          SR.Format(SR.Cryptography_InvalidFromXmlString, nameof(DSA), name));
            }

            return(ret);
        }