public string AddSignature(string xml)
        {
            _logger.Log("signing xml...");
            var xmlDoc = new XmlDocument {
                PreserveWhitespace = true
            };

            xmlDoc.LoadXml(xml);

            var certificate = _configuration.MerchantCertificate;

            XmlSignature.Sign(ref xmlDoc, certificate, xmlDoc.DocumentElement);

            var stringWriter  = new StringWriter();
            var xmlTextWriter = XmlWriter.Create(stringWriter);

            xmlDoc.WriteTo(xmlTextWriter);
            xmlTextWriter.Flush();
            xml = stringWriter.GetStringBuilder().ToString();

            return(xml);
        }
Пример #2
0
 internal BankIdSignature(IConfiguration configuration)
 {
     XmlSignature.RegisterSignatureAlghorighm();
     _logger = configuration.GetLogger();
 }
Пример #3
0
        /// <summary>
        /// Tries to verify the specified XML text signature.
        /// </summary>
        /// <param name="xmlText">The XML text.</param>
        /// <param name="elementName">The name of the element signature to be verified.</param>
        /// <param name="elementNamespace">The namespace of the element signature to be verified.</param>
        /// <param name="isValidSignature">True if the signature is valid and placed properly, false otherwise.</param>
        /// <returns>True if the verifying was possible, false otherwise.</returns>
        public bool TryVerifyElement(string xmlText, string elementName, string elementNamespace, out bool isValidSignature)
        {
            _logger.Log("Debug: TryVerifyElement, xml={0}, elname={1}", xmlText, elementName);

            isValidSignature = false;

            if (string.IsNullOrEmpty(elementName))
            {
                _logger.Log("Debug: The element name is empty. There is no element to verify the signature for.");
                return(false);
            }

            var xmlDoc = new XmlDocument {
                PreserveWhitespace = true
            };

            xmlDoc.LoadXml(xmlText);

            var elements = xmlDoc.GetElementsByTagName(elementName, elementNamespace);

            if (elements.Count == 0)
            {
                _logger.Log("Debug: Cannot verify the signature of the '{0}' element. No '{0}' element was found in the document.", elementName);
                return(false);
            }

            // not eligible to have signature
            if (!IsEligibleForBankIdSignature(xmlDoc))
            {
                throw new CommunicatorException("Response should not have a BankId signature.");
            }

            var elementToSign = elements[0] as XmlElement;

            var xmlElementDoc = new XmlDocument {
                PreserveWhitespace = true
            };

            Debug.Assert(elementToSign != null, "elementToSign != null");
            xmlElementDoc.LoadXml(elementToSign.OuterXml);

            // the signature should have been placed inside the 'Assertion' element (more specific, right after the <Issuer> element)
            var element = GetBankIdSignatureElement(xmlElementDoc.DocumentElement);

            if (element == null)
            {
                _logger.Log("Debug: No 'Signature' element was found in the document at the expected location.", elementName);
                return(false);
            }

            var keyInfo         = XmlSignature.GetElementUnderRoot(element, "KeyInfo");
            var x509Data        = XmlSignature.GetElementUnderRoot(keyInfo as XmlElement, "X509Data");
            var x509Certificate = XmlSignature.GetElementUnderRoot(x509Data as XmlElement, "X509Certificate");

            var certificate = Convert.FromBase64String(x509Certificate.InnerText);
            var cert        = new X509Certificate2(certificate);

            isValidSignature = XmlSignature.CheckSignature(xmlElementDoc, cert, GetBankIdSignatureElement(xmlElementDoc.DocumentElement));
            _logger.Log("Debug: TryVerifyElement, isvalid={0}", isValidSignature);
            return(true);
        }
Пример #4
0
        private static XmlElement GetBankIdSignatureElement(XmlElement xmlElement)
        {
            var signatureElement = XmlSignature.GetElementUnderRoot(xmlElement, "Signature", "http://www.w3.org/2000/09/xmldsig#") as XmlElement;

            return(signatureElement);
        }