/// <summary> /// Reads XML conforming to https://www.w3.org/TR/2001/PR-xmldsig-core-20010820/#sec-SignatureMethod /// </summary> /// <param name="reader">a <see cref="XmlReader"/>positioned on a <SignatureMethod> element.</param> /// <exception cref="ArgumentNullException">if <paramref name="reader"/> is null.</exception> /// <exception cref="XmlReadException">if there is a problem reading the XML.</exception> /// <returns>A string with the signature method.</returns> public virtual string ReadSignatureMethod(XmlReader reader) { XmlUtil.CheckReaderOnEntry(reader, XmlSignatureConstants.Elements.SignatureMethod, XmlSignatureConstants.Namespace); try { bool isEmptyElement = reader.IsEmptyElement; var signatureMethod = reader.GetAttribute(XmlSignatureConstants.Attributes.Algorithm, null); if (signatureMethod == null) { throw XmlUtil.OnRequiredAttributeMissing(XmlSignatureConstants.Elements.SignatureMethod, XmlSignatureConstants.Attributes.Algorithm); } reader.Read(); reader.MoveToContent(); if (!isEmptyElement) { reader.MoveToContent(); reader.ReadEndElement(); } return(signatureMethod); } catch (Exception ex) { if (ex is XmlReadException) { throw; } throw XmlUtil.LogReadException(LogMessages.IDX30016, ex, XmlSignatureConstants.Elements.Transform); } }
/// <summary> /// Reads XML conforming to https://www.w3.org/TR/2001/PR-xmldsig-core-20010820/#sec-Reference /// </summary> /// <param name="reader">a <see cref="XmlReader"/>positioned on a <Reference> element.</param> /// <exception cref="ArgumentNullException">if <paramref name="reader"/> is null.</exception> /// <exception cref="XmlReadException">if there is a problem reading the XML.</exception> /// <returns><see cref="Reference"/></returns> public virtual Reference ReadReference(XmlReader reader) { XmlUtil.CheckReaderOnEntry(reader, XmlSignatureConstants.Elements.Reference, XmlSignatureConstants.Namespace); try { var reference = new Reference { Prefix = reader.Prefix, Id = reader.GetAttribute(XmlSignatureConstants.Attributes.Id, null), Type = reader.GetAttribute(XmlSignatureConstants.Attributes.Type, null), Uri = reader.GetAttribute(XmlSignatureConstants.Attributes.URI, null) }; reader.Read(); ReadTransforms(reader, reference); // <DigestMethod> - required XmlUtil.CheckReaderOnEntry(reader, XmlSignatureConstants.Elements.DigestMethod, XmlSignatureConstants.Namespace); bool isEmptyElement = reader.IsEmptyElement; var digestMethod = reader.GetAttribute(XmlSignatureConstants.Attributes.Algorithm, null); if (string.IsNullOrEmpty(digestMethod)) { throw XmlUtil.OnRequiredAttributeMissing(XmlSignatureConstants.Elements.DigestMethod, XmlSignatureConstants.Attributes.Algorithm); } reference.DigestMethod = digestMethod; reader.Read(); reader.MoveToContent(); if (!isEmptyElement) { reader.ReadEndElement(); } // <DigestValue> XmlUtil.CheckReaderOnEntry(reader, XmlSignatureConstants.Elements.DigestValue, XmlSignatureConstants.Namespace); var digestValue = reader.ReadElementContentAsString().Trim(); if (string.IsNullOrEmpty(digestValue)) { throw XmlUtil.LogReadException(LogMessages.IDX30206, reference.Uri ?? reference.Id); } reference.DigestValue = digestValue; // </Reference> reader.MoveToContent(); reader.ReadEndElement(); return(reference); } catch (Exception ex) { if (ex is XmlReadException) { throw; } throw XmlUtil.LogReadException(LogMessages.IDX30016, ex, XmlSignatureConstants.Elements.Reference); } }