public override void LoadXml(XmlElement value) { if (value == null) { throw new ArgumentNullException(nameof(value)); } if (value.Name != KeyValueElementName || value.NamespaceURI != XmlNameSpace.Url[NS.XmlDsigNamespaceUrl]) { throw new System.Security.Cryptography.CryptographicException($"Root element must be {KeyValueElementName} element in namepsace {NS.XmlDsigNamespaceUrl}"); } const string xmlDsigNamespacePrefix = "dsig"; XmlNamespaceManager xmlNamespaceManager = new XmlNamespaceManager(value.OwnerDocument.NameTable); xmlNamespaceManager.AddNamespace(xmlDsigNamespacePrefix, XmlNameSpace.Url[NS.XmlDsigNamespaceUrl]); XmlNode dsaKeyValueElement = value.SelectSingleNode($"{xmlDsigNamespacePrefix}:{DSAKeyValueElementName}", xmlNamespaceManager); if (dsaKeyValueElement == null) { throw new System.Security.Cryptography.CryptographicException($"{KeyValueElementName} must contain child element {DSAKeyValueElementName}"); } XmlNode yNode = dsaKeyValueElement.SelectSingleNode($"{xmlDsigNamespacePrefix}:{YElementName}", xmlNamespaceManager); if (yNode == null) { throw new System.Security.Cryptography.CryptographicException($"{YElementName} is missing"); } XmlNode pNode = dsaKeyValueElement.SelectSingleNode($"{xmlDsigNamespacePrefix}:{PElementName}", xmlNamespaceManager); XmlNode qNode = dsaKeyValueElement.SelectSingleNode($"{xmlDsigNamespacePrefix}:{QElementName}", xmlNamespaceManager); if ((pNode == null && qNode != null) || (pNode != null && qNode == null)) { throw new System.Security.Cryptography.CryptographicException($"{PElementName} and {QElementName} can only occour in combination"); } XmlNode gNode = dsaKeyValueElement.SelectSingleNode($"{xmlDsigNamespacePrefix}:{GElementName}", xmlNamespaceManager); _ = dsaKeyValueElement.SelectSingleNode($"{xmlDsigNamespacePrefix}:{JElementName}", xmlNamespaceManager); XmlNode seedNode = dsaKeyValueElement.SelectSingleNode($"{xmlDsigNamespacePrefix}:{SeedElementName}", xmlNamespaceManager); XmlNode pgenCounterNode = dsaKeyValueElement.SelectSingleNode($"{xmlDsigNamespacePrefix}:{PgenCounterElementName}", xmlNamespaceManager); if ((seedNode == null && pgenCounterNode != null) || (seedNode != null && pgenCounterNode == null)) { throw new System.Security.Cryptography.CryptographicException($"{SeedElementName} and {PgenCounterElementName} can only occur in combination"); } try { _key = new DsaPublicKeyParameters(new Math.BigInteger(1, Convert.FromBase64String(yNode.InnerText)), new DsaParameters( new Math.BigInteger(1, (pNode != null) ? Convert.FromBase64String(pNode.InnerText) : null), new Math.BigInteger(1, (qNode != null) ? Convert.FromBase64String(qNode.InnerText) : null), new Math.BigInteger(1, (gNode != null) ? Convert.FromBase64String(gNode.InnerText) : null), new DsaValidationParameters( (seedNode != null) ? Convert.FromBase64String(seedNode.InnerText) : null, (pgenCounterNode != null) ? EncodingUtils.ConvertByteArrayToInt(Convert.FromBase64String(pgenCounterNode.InnerText)) : 0))); } catch (Exception ex) { throw new System.Security.Cryptography.CryptographicException($"An error occurred parsing the key components", ex); } }