protected void VerifyXml(string payload) { var xmlDoc = new XmlDocument { PreserveWhitespace = true }; xmlDoc.LoadXml(payload); var sigDoc = new CustomSignedXml(xmlDoc) { Namespaces = Namespaces, SignatureKey = Config.Bank.AuthKeys.PublicKey, SignaturePadding = RSASignaturePadding.Pkcs1, CanonicalizationAlgorithm = SignedXml.XmlDsigC14NTransformUrl, SignatureAlgorithm = s_signatureAlg, DigestAlgorithm = s_digestAlg, ReferenceUri = CustomSignedXml.DefaultReferenceUri }; if (sigDoc.VerifySignature()) { s_logger.LogDebug($"Authentication OK for {OrderType} response"); return; } s_logger.LogError($"Authentication erroneous for {OrderType} response"); throw new DeserializationException($"Authentication erroneous for {OrderType} response", payload); }
protected XmlDocument AuthenticateXml(XmlDocument doc, string referenceUri, IDictionary <string, string> cnm) { using (new MethodLogger(s_logger)) { doc.PreserveWhitespace = true; var sigDoc = new CustomSignedXml(doc) { SignatureKey = Config.User.AuthKeys.PrivateKey, SignaturePadding = RSASignaturePadding.Pkcs1, CanonicalizationAlgorithm = SignedXml.XmlDsigC14NTransformUrl, SignatureAlgorithm = s_signatureAlg, DigestAlgorithm = s_digestAlg, ReferenceUri = referenceUri ?? CustomSignedXml.DefaultReferenceUri }; var nm = new XmlNamespaceManager(doc.NameTable); nm.AddNamespace(Namespaces.EbicsPrefix, Namespaces.Ebics); if (cnm != null && cnm.Count > 0) { foreach (var kv in cnm) { nm.AddNamespace(kv.Key, kv.Value); } } sigDoc.NamespaceManager = nm; sigDoc.ComputeSignature(); var xmlDigitalSignature = sigDoc.GetXml(); var headerNode = doc.SelectSingleNode($"//{Namespaces.EbicsPrefix}:{XmlNames.AuthSignature}", nm); foreach (XmlNode child in xmlDigitalSignature.ChildNodes) { headerNode.AppendChild(headerNode.OwnerDocument.ImportNode(child, true)); } return(doc); } }