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); }
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); }
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); }