Atom Лента - Форум КриптоПро - Тема:Валидация подписи XML документов - 10Форум КриптоПро - Atom Лентаurn:https:--www-cryptopro-ru:AtomLenta:ForumKriptoPro:Tema:ValidacijapodpisiXMLdokumentov-10:1Copyright 2024 Форум КриптоПро2024-03-29T08:23:43Zhttps://www.cryptopro.ru/forum2/Images/YAFLogo.pngForum Adminhttps://www.cryptopro.ruforum@cryptopro.ruСтепан Зhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=49678&name=Степан ЗСтепан Зhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=49678&name=Степан Зtwo_oceanshttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=36490&name=two_oceansСтепан Зhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=49678&name=Степан Зtwo_oceanshttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=36490&name=two_oceansСтепан Зhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=49678&name=Степан ЗСтепан Зhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=49678&name=Степан ЗВладимир(theone)https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=50478&name=Владимир(theone)Степан Зhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=49678&name=Степан ЗВладимир(theone)https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=50478&name=Владимир(theone)Степан Зhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=49678&name=Степан ЗYetAnotherForum.NETurn:https:--www-cryptopro-ru:ftPosts:st1:meid96544:1Валидация подписи XML документов<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: two_oceans <a href="/forum2/default.aspx?g=posts&m=96533#post96533"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Вероятно, потому что в оригинале exclusive С14N трансформ хоть и разработан с прицелом на стандарт xmldsig, но все же не является его частью.</div></div><br />Видимо, да. Тогда вопрос к наименованию этого класса. Делает только exclusive С14N transform — называли бы соответственно и без лишних префиксов. Но это, похоже, уже другая история )<br /></td></tr></table>2018-10-23T14:29:37+03:002018-10-23T14:29:37+03:00Степан З<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: two_oceans <a href="/forum2/default.aspx?g=posts&m=96533#post96533"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Вероятно, потому что в оригинале exclusive С14N трансформ хоть и разработан с прицелом на стандарт xmldsig, но все же не является его частью.</div></div><br />Видимо, да. Тогда вопрос к наименованию этого класса. Делает только exclusive С14N transform — называли бы соответственно и без лишних префиксов. Но это, похоже, уже другая история )<br /></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid96533:1Валидация подписи XML документов<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Степан З <a href="/forum2/default.aspx?g=posts&m=96520#post96520"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Но, видимо, не обязан.</div></div>"or by using some other method such that the characters passed to the application are the same as if it did this translation" Похоже на то, что он может выполнять это при передаче данных куда-то еще. Фиктивная такая замена, потому и поведение разное. А если мы вырываем у него фрагмент не предусмотренным способом эта замена не срабатывает.<div class="quote"><span class="quotetitle">Цитата:</span><blockquote> Но мне не понятно пока, почему они эту функциональность в XmlDsigExcC14NTransform не втащили... </div></div>Вероятно, потому что в оригинале exclusive С14N трансформ хоть и разработан с прицелом на стандарт xmldsig, но все же не является его частью. Поэтому в трансформе предусмотрена замена символов \r на &#xD; хотя при нормализации с учетом пункта 7.1 xmldsig их вообще не должно остаться к моменту применения трансформа. По крайней мере, в фрагменте выбранном способом, при котором срабатывает фиктивная замена на \n.<br /><br /></td></tr></table>2018-10-23T11:58:13+03:002018-10-23T11:58:13+03:00two_oceans<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Степан З <a href="/forum2/default.aspx?g=posts&m=96520#post96520"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Но, видимо, не обязан.</div></div>"or by using some other method such that the characters passed to the application are the same as if it did this translation" Похоже на то, что он может выполнять это при передаче данных куда-то еще. Фиктивная такая замена, потому и поведение разное. А если мы вырываем у него фрагмент не предусмотренным способом эта замена не срабатывает.<div class="quote"><span class="quotetitle">Цитата:</span><blockquote> Но мне не понятно пока, почему они эту функциональность в XmlDsigExcC14NTransform не втащили... </div></div>Вероятно, потому что в оригинале exclusive С14N трансформ хоть и разработан с прицелом на стандарт xmldsig, но все же не является его частью. Поэтому в трансформе предусмотрена замена символов \r на &#xD; хотя при нормализации с учетом пункта 7.1 xmldsig их вообще не должно остаться к моменту применения трансформа. По крайней мере, в фрагменте выбранном способом, при котором срабатывает фиктивная замена на \n.<br /><br /></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid96520:1Валидация подписи XML документов<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: two_oceans <a href="/forum2/default.aspx?g=posts&m=96515#post96515"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Я так понимаю, когда в стандарте написано #xA это просто одиночный символ с кодом 10</div></div><br />Ну, кстати, да. Я сначала за управляющую последовательность это принял.<br /><br /><div class="quote"><span class="quotetitle">Автор: two_oceans <a href="/forum2/default.aspx?g=posts&m=96515#post96515"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>по основному стандарту XML процессор должен выполнить замену</div></div><br />Но, видимо, не обязан. И в том же .Net-е разные механизмы (XmlDocument, XmlReader и XmlTextReader) ведут себя по-разному.<br />А вот при формировании подписи, да, надо обязательно в канонизацию передавать данные из нормализирующей читалки (об этом есть в стандарте <a rel="nofollow" href="https://www.w3.org/TR/xmldsig-core/" title="https://www.w3.org/TR/xmldsig-core/">XMLDSign пункт 7.1</a>). Я же использовал XmlDocument, а надо было использовать, например, XmlReader. <br /><br />P.S.<br /><div class="quote"><span class="quotetitle">Автор: Степан З <a href="/forum2/default.aspx?g=posts&m=94456#post94456"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote><br />В потрохах .Net есть код, который при проверке в методе SignedXml.CheckSignature() подменяет \r на \n, а \r\n на \n — они это называют нормализацией документа. На самом деле, просто прогоняет документ через XmlTextReader. Зачем? Я не понимаю.<br /></div></div><br />Кажется, что тот самый <a rel="nofollow" href="https://www.w3.org/TR/xmldsig-core/" title="https://www.w3.org/TR/xmldsig-core/">пункт 7.1</a> отвечает на этот вопрос. Но мне не понятно пока, почему они эту функциональность в XmlDsigExcC14NTransform не втащили...</td></tr></table>2018-10-23T09:45:44+03:002018-10-23T09:45:44+03:00Степан З<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: two_oceans <a href="/forum2/default.aspx?g=posts&m=96515#post96515"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Я так понимаю, когда в стандарте написано #xA это просто одиночный символ с кодом 10</div></div><br />Ну, кстати, да. Я сначала за управляющую последовательность это принял.<br /><br /><div class="quote"><span class="quotetitle">Автор: two_oceans <a href="/forum2/default.aspx?g=posts&m=96515#post96515"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>по основному стандарту XML процессор должен выполнить замену</div></div><br />Но, видимо, не обязан. И в том же .Net-е разные механизмы (XmlDocument, XmlReader и XmlTextReader) ведут себя по-разному.<br />А вот при формировании подписи, да, надо обязательно в канонизацию передавать данные из нормализирующей читалки (об этом есть в стандарте <a rel="nofollow" href="https://www.w3.org/TR/xmldsig-core/" title="https://www.w3.org/TR/xmldsig-core/">XMLDSign пункт 7.1</a>). Я же использовал XmlDocument, а надо было использовать, например, XmlReader. <br /><br />P.S.<br /><div class="quote"><span class="quotetitle">Автор: Степан З <a href="/forum2/default.aspx?g=posts&m=94456#post94456"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote><br />В потрохах .Net есть код, который при проверке в методе SignedXml.CheckSignature() подменяет \r на \n, а \r\n на \n — они это называют нормализацией документа. На самом деле, просто прогоняет документ через XmlTextReader. Зачем? Я не понимаю.<br /></div></div><br />Кажется, что тот самый <a rel="nofollow" href="https://www.w3.org/TR/xmldsig-core/" title="https://www.w3.org/TR/xmldsig-core/">пункт 7.1</a> отвечает на этот вопрос. Но мне не понятно пока, почему они эту функциональность в XmlDsigExcC14NTransform не втащили...</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid96515:1Валидация подписи XML документов<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Цитата:</span><blockquote><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>Выдержка из стандарта канонизации XML:<br />Line breaks normalized to #xA on input, before parsing</div></div><br />При этом дальше идут примеры, где они в innerText-е меняют \r на &#xD; и не меняют \n, а наоборот &#xA; меняют на \n! В атрибутах все спецсимволы меняют на последовательность &#..;.</div></div>Я так понимаю, когда в стандарте написано #xA это просто одиночный символ с кодом 10, то что Вы называете \n ведь в цитате <u>не написано перед #xA амперсанда и в конце точки с запятой</u>, как могло быть: &#xA; Таким образом, все правильно последовательность &#xA; меняют на одиночный символ #xA (он же \n) и не меняют \n.<br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>https://www.w3.org/TR/2000/WD-xml-2e-20000814<br />2.11 End-of-Line Handling<br /><br />XML parsed entities are often stored in computer files which, for editing convenience, are organized into lines. These lines are typically separated by some combination of the characters carriage-return (#xD) and line-feed (#xA).<br /><br /> [E86]To simplify the tasks of applications , an XML processor must normalize line breaks in parsed entities to #xA either by translating the two-character sequence #xD #xA and any #xD that is not followed by #xA to #xA on input before parsing, or by using some other method such that the characters passed to the application are the same as if it did this translation.<br /></div></div>То есть по основному стандарту XML процессор <u>должен</u> выполнить замену: \r\n заменяется на \n, "одиночные" \r без непосредственно следующего \n заменяются на \n.<div class="quote"><span class="quotetitle">Цитата:</span><blockquote>Фишка в том, что процессы нормализации и канонизации — это разные вещи.</div></div>Верно, а еще дело в том, что при выборе фрагмента xpath может не выбрать ни одного перевода строки вообще - все в одну строку и по идее именно этот вариант должен передаваться на каноникализацию. А мы выбираем фрагмент для подписи непонятно каким образом и у нас во фрагменте оказываются переводы строк которых вообще в принципе быть не должно во фрагменте.</td></tr></table>2018-10-23T07:01:30+03:002018-10-23T07:01:30+03:00two_oceans<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Цитата:</span><blockquote><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>Выдержка из стандарта канонизации XML:<br />Line breaks normalized to #xA on input, before parsing</div></div><br />При этом дальше идут примеры, где они в innerText-е меняют \r на &#xD; и не меняют \n, а наоборот &#xA; меняют на \n! В атрибутах все спецсимволы меняют на последовательность &#..;.</div></div>Я так понимаю, когда в стандарте написано #xA это просто одиночный символ с кодом 10, то что Вы называете \n ведь в цитате <u>не написано перед #xA амперсанда и в конце точки с запятой</u>, как могло быть: &#xA; Таким образом, все правильно последовательность &#xA; меняют на одиночный символ #xA (он же \n) и не меняют \n.<br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>https://www.w3.org/TR/2000/WD-xml-2e-20000814<br />2.11 End-of-Line Handling<br /><br />XML parsed entities are often stored in computer files which, for editing convenience, are organized into lines. These lines are typically separated by some combination of the characters carriage-return (#xD) and line-feed (#xA).<br /><br /> [E86]To simplify the tasks of applications , an XML processor must normalize line breaks in parsed entities to #xA either by translating the two-character sequence #xD #xA and any #xD that is not followed by #xA to #xA on input before parsing, or by using some other method such that the characters passed to the application are the same as if it did this translation.<br /></div></div>То есть по основному стандарту XML процессор <u>должен</u> выполнить замену: \r\n заменяется на \n, "одиночные" \r без непосредственно следующего \n заменяются на \n.<div class="quote"><span class="quotetitle">Цитата:</span><blockquote>Фишка в том, что процессы нормализации и канонизации — это разные вещи.</div></div>Верно, а еще дело в том, что при выборе фрагмента xpath может не выбрать ни одного перевода строки вообще - все в одну строку и по идее именно этот вариант должен передаваться на каноникализацию. А мы выбираем фрагмент для подписи непонятно каким образом и у нас во фрагменте оказываются переводы строк которых вообще в принципе быть не должно во фрагменте.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid96499:1Валидация подписи XML документов<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Степан З <a href="/forum2/default.aspx?g=posts&m=96498#post96498"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Никаких преобразований line breaks to #xA на выходе нет.</div></div> Это я про innerText<br /><br /></td></tr></table>2018-10-22T16:39:21+03:002018-10-22T16:39:21+03:00Степан З<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Степан З <a href="/forum2/default.aspx?g=posts&m=96498#post96498"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>Никаких преобразований line breaks to #xA на выходе нет.</div></div> Это я про innerText<br /><br /></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid96498:1Валидация подписи XML документов<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Владимир(theone) <a href="/forum2/default.aspx?g=posts&m=96496#post96496"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote><br />Выдержка из <a rel="nofollow" href="https://www.w3.org/TR/xml-c14n/" title="https://www.w3.org/TR/xml-c14n/">стандарта канонизации XML</a>:<br /><br />Line breaks normalized to #xA on input, before parsing</div></div><br /><br />При этом дальше идут примеры, где они в innerText-е меняют \r на &#xD; и не меняют \n, а наоборот &#xA; меняют на \n! В атрибутах все спецсимволы меняют на последовательность &#..;.<br />Дотнетовский класс трансформации System.Security.Cryptography.Xml.XmlDsigExcC14NTransform ведет себя именно так, как показано в примерах. Никаких преобразований line breaks to #xA на выходе нет. Но вроде и написано, что до парсинга документа это происходит, а не на выходе после канонизации.<br />Фишка в том, что процессы нормализации и канонизации — это разные вещи. При формировании подписи я нормализацию не делал, делал только канонизацию, а при проверке классом SignedXml происходит еще и нормализация документа перед канонизацией.</td></tr></table>2018-10-22T16:28:53+03:002018-10-22T16:28:53+03:00Степан З<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Владимир(theone) <a href="/forum2/default.aspx?g=posts&m=96496#post96496"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote><br />Выдержка из <a rel="nofollow" href="https://www.w3.org/TR/xml-c14n/" title="https://www.w3.org/TR/xml-c14n/">стандарта канонизации XML</a>:<br /><br />Line breaks normalized to #xA on input, before parsing</div></div><br /><br />При этом дальше идут примеры, где они в innerText-е меняют \r на &#xD; и не меняют \n, а наоборот &#xA; меняют на \n! В атрибутах все спецсимволы меняют на последовательность &#..;.<br />Дотнетовский класс трансформации System.Security.Cryptography.Xml.XmlDsigExcC14NTransform ведет себя именно так, как показано в примерах. Никаких преобразований line breaks to #xA на выходе нет. Но вроде и написано, что до парсинга документа это происходит, а не на выходе после канонизации.<br />Фишка в том, что процессы нормализации и канонизации — это разные вещи. При формировании подписи я нормализацию не делал, делал только канонизацию, а при проверке классом SignedXml происходит еще и нормализация документа перед канонизацией.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid96496:1Валидация подписи XML документов<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Степан З <a href="/forum2/default.aspx?g=posts&m=94456#post94456"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>подменяет \r на \n, а \r\n на \n — они это называют нормализацией документа.</div></div><br /><br />Выдержка из <a rel="nofollow" href="https://www.w3.org/TR/xml-c14n/" title="https://www.w3.org/TR/xml-c14n/">стандарта канонизации XML</a>:<br /><br />Line breaks normalized to #xA on input, before parsing<br /><br />Так что возможно ребята из MS все правильно делают. С другой стороны, почему точно такая же нормализация не произошла при подписании.</td></tr></table>2018-10-22T15:32:46+03:002018-10-22T15:32:46+03:00Владимир(theone)<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Степан З <a href="/forum2/default.aspx?g=posts&m=94456#post94456"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>подменяет \r на \n, а \r\n на \n — они это называют нормализацией документа.</div></div><br /><br />Выдержка из <a rel="nofollow" href="https://www.w3.org/TR/xml-c14n/" title="https://www.w3.org/TR/xml-c14n/">стандарта канонизации XML</a>:<br /><br />Line breaks normalized to #xA on input, before parsing<br /><br />Так что возможно ребята из MS все правильно делают. С другой стороны, почему точно такая же нормализация не произошла при подписании.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid96493:1Валидация подписи XML документов<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Владимир(theone) <a href="/forum2/default.aspx?g=posts&m=96492#post96492"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>А удалось решить эту проблему?</div></div><br />Нет, не представляю себе, как это можно решить на этапе проверки подписи. Ведь надо для этого переделать библиотеки MS и/или переписать код всех сторонних сервисов, проверяющих подпись.<br />Но, понимая в чем суть проблемы, можно перед канонизацией делать точно такой же прогон документа через XmlReader, и только потом остальные преобразования.<br />Соответственно, можно решить проблему «невалидной подписи» еще на этапе ее формирования.<br /></td></tr></table>2018-10-22T13:48:43+03:002018-10-22T13:48:43+03:00Степан З<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Владимир(theone) <a href="/forum2/default.aspx?g=posts&m=96492#post96492"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote>А удалось решить эту проблему?</div></div><br />Нет, не представляю себе, как это можно решить на этапе проверки подписи. Ведь надо для этого переделать библиотеки MS и/или переписать код всех сторонних сервисов, проверяющих подпись.<br />Но, понимая в чем суть проблемы, можно перед канонизацией делать точно такой же прогон документа через XmlReader, и только потом остальные преобразования.<br />Соответственно, можно решить проблему «невалидной подписи» еще на этапе ее формирования.<br /></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid96492:1Валидация подписи XML документов<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Степан З <a href="/forum2/default.aspx?g=posts&m=94456#post94456"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote><br />В потрохах .Net есть код, который при проверке в методе SignedXml.CheckSignature() подменяет \r на \n, а \r\n на \n — они это называют нормализацией документа. На самом деле, просто прогоняет документ через XmlTextReader. <br /></div></div><br /><br />А удалось решить эту проблему?</td></tr></table>2018-10-22T13:22:16+03:002018-10-22T13:22:16+03:00Владимир(theone)<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Автор: Степан З <a href="/forum2/default.aspx?g=posts&m=94456#post94456"><img src="/forum2/Themes/soclean/icon_latest_reply.gif" title="Перейти к цитате" alt="Перейти к цитате" /></a></span><blockquote><br />В потрохах .Net есть код, который при проверке в методе SignedXml.CheckSignature() подменяет \r на \n, а \r\n на \n — они это называют нормализацией документа. На самом деле, просто прогоняет документ через XmlTextReader. <br /></div></div><br /><br />А удалось решить эту проблему?</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid94456:1Валидация подписи XML документов<table class="content postContainer" width="100%"><tr><td>Данные, которые будут подписаны формируем таким образом:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-csharp">
public static SignedInfo GenerateSignedInfo(XmlDocument xml)
{
var xmlTransform = new XmlDsigExcC14NTransform();
xmlTransform.LoadInput(xml);
var canonXmlStream = (MemoryStream)xmlTransform.GetOutput();
var algorithm = HashAlgorithm.Create("GOST3411");
var digestValue = algorithm.ComputeHash(canonXmlStream);
var signedInfo = new SignedInfo
{
CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl,
SignatureMethod = CPSignedXml.XmlDsigGost3410Url
};
var reference = new Reference(string.Empty)
{
DigestMethod = DigestMethod,
DigestValue = digestValue
};
reference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
reference.AddTransform(new XmlDsigExcC14NTransform());
signedInfo.AddReference(reference);
return signedInfo;
}
</code></pre>
</div></div><br />Далее подписываем и формируем окончательно тэг Signature<br /><br />На самом деле я уже разобрался кто всю малину портит.<br />В потрохах .Net есть код, который при проверке в методе SignedXml.CheckSignature() подменяет \r на \n, а \r\n на \n — они это называют нормализацией документа. На самом деле, просто прогоняет документ через XmlTextReader. Зачем? Я не понимаю.<br />В итоге я формируя digestValue считаю хэш от просто канонизированного документа: <Root a="1" v="2"><Value>part1&#xD;part2</Value></Root>, а ребята из MS прежде чем канонизировать делают сначала нормализацию, которая убирает \r и пересчитывают хэш уже от <Root a="1" v="2"><Value>part1\npart2</Value></Root>. Естественно, математика слетает.<br /><br />Вот выдержки из исходников .Net:<br />1. Препроцессинг документа в методе подсчета хэш-кода: <a rel="nofollow" href="https://referencesource.microsoft.com/#System.Security/system/security/cryptography/xml/reference.cs,357" title="https://referencesource.microsoft.com/#System.Security/system/security/cryptography/xml/reference.cs,357">https://referencesource....phy/xml/reference.cs,357</a><br />2. Нормализация в препроцессинге: <a rel="nofollow" href="https://referencesource.microsoft.com/#System.Security/system/security/cryptography/xml/utils.cs,508" title="https://referencesource.microsoft.com/#System.Security/system/security/cryptography/xml/utils.cs,508">https://referencesource....ography/xml/utils.cs,508</a><br />3. Там дальше кодина TextReader и самые кишочки в методе чтения текстового узла ParseText: <a rel="nofollow" href="https://referencesource.microsoft.com/#system.xml/System/Xml/Core/XmlTextReaderImpl.cs,5052" title="https://referencesource.microsoft.com/#system.xml/System/Xml/Core/XmlTextReaderImpl.cs,5052">https://referencesource....mlTextReaderImpl.cs,5052</a> <br /><br /></td></tr></table>2018-08-17T18:56:27+03:002018-08-17T18:56:27+03:00Степан З<table class="content postContainer" width="100%"><tr><td>Данные, которые будут подписаны формируем таким образом:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-csharp">
public static SignedInfo GenerateSignedInfo(XmlDocument xml)
{
var xmlTransform = new XmlDsigExcC14NTransform();
xmlTransform.LoadInput(xml);
var canonXmlStream = (MemoryStream)xmlTransform.GetOutput();
var algorithm = HashAlgorithm.Create("GOST3411");
var digestValue = algorithm.ComputeHash(canonXmlStream);
var signedInfo = new SignedInfo
{
CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl,
SignatureMethod = CPSignedXml.XmlDsigGost3410Url
};
var reference = new Reference(string.Empty)
{
DigestMethod = DigestMethod,
DigestValue = digestValue
};
reference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
reference.AddTransform(new XmlDsigExcC14NTransform());
signedInfo.AddReference(reference);
return signedInfo;
}
</code></pre>
</div></div><br />Далее подписываем и формируем окончательно тэг Signature<br /><br />На самом деле я уже разобрался кто всю малину портит.<br />В потрохах .Net есть код, который при проверке в методе SignedXml.CheckSignature() подменяет \r на \n, а \r\n на \n — они это называют нормализацией документа. На самом деле, просто прогоняет документ через XmlTextReader. Зачем? Я не понимаю.<br />В итоге я формируя digestValue считаю хэш от просто канонизированного документа: <Root a="1" v="2"><Value>part1&#xD;part2</Value></Root>, а ребята из MS прежде чем канонизировать делают сначала нормализацию, которая убирает \r и пересчитывают хэш уже от <Root a="1" v="2"><Value>part1\npart2</Value></Root>. Естественно, математика слетает.<br /><br />Вот выдержки из исходников .Net:<br />1. Препроцессинг документа в методе подсчета хэш-кода: <a rel="nofollow" href="https://referencesource.microsoft.com/#System.Security/system/security/cryptography/xml/reference.cs,357" title="https://referencesource.microsoft.com/#System.Security/system/security/cryptography/xml/reference.cs,357">https://referencesource....phy/xml/reference.cs,357</a><br />2. Нормализация в препроцессинге: <a rel="nofollow" href="https://referencesource.microsoft.com/#System.Security/system/security/cryptography/xml/utils.cs,508" title="https://referencesource.microsoft.com/#System.Security/system/security/cryptography/xml/utils.cs,508">https://referencesource....ography/xml/utils.cs,508</a><br />3. Там дальше кодина TextReader и самые кишочки в методе чтения текстового узла ParseText: <a rel="nofollow" href="https://referencesource.microsoft.com/#system.xml/System/Xml/Core/XmlTextReaderImpl.cs,5052" title="https://referencesource.microsoft.com/#system.xml/System/Xml/Core/XmlTextReaderImpl.cs,5052">https://referencesource....mlTextReaderImpl.cs,5052</a> <br /><br /></td></tr></table>