/// <summary> /// Initializes an instance of <see cref="EnvelopedSignatureReader"/> /// </summary> /// <param name="reader">a <see cref="XmlReader"/> pointing to XML that may contain an enveloped signature.</param> /// <remarks>If a <Signature> element is found, the <see cref="Signature"/> will be set.</remarks> /// <exception cref="ArgumentNullException">if <paramref name="reader"/> is null.</exception> public EnvelopedSignatureReader(XmlReader reader) { if (reader == null) { throw LogArgumentNullException(nameof(reader)); } _tokenStreamReader = new XmlTokenStreamReader(CreateDictionaryReader(reader)); InnerReader = _tokenStreamReader; }
/// <summary> /// Initializes a new instance of <see cref="XmlTokenStreamReader"/> for creating a <see cref="XmlTokenStream"/>. /// </summary> /// <param name="reader">an <see cref="XmlDictionaryReader"/> to capture the <see cref="XmlTokenStream"/>.</param> /// <exception cref="ArgumentNullException">if <paramref name="reader"/> if null.</exception> /// <exception cref="ArgumentException">if <paramref name="reader"/>.IsStartElement() is false.</exception> public XmlTokenStreamReader(XmlDictionaryReader reader) { if (reader == null) { throw LogArgumentNullException(nameof(reader)); } if (!reader.IsStartElement()) { throw LogExceptionMessage(new ArgumentException(FormatInvariant(LogMessages.IDX30026, reader.NodeType))); } // When multiple signed elements are being processed, the EnvelopedSignatureReader always creates a new XmlTokenStreamReader. // This creates a chain of readers. // The outer reader need to record the position of its 'Signature' element. // When calculating the digest all inner 'Signatures' are considered as inner text. // This allows for embedded signed elements. _innerTokenStreamReader = reader as XmlTokenStreamReader; TokenStream = new XmlTokenStream(); InnerReader = reader; Record(); }