Результат проверки в моей программке:
1) подпись treatPeriod: SignatureValue верно, DigestValue верно = подпись верна
2) подпись row: SignatureValue верно, DigestValue отличается = подпись неверна
Код:=== WARNING: digest differ:
[DgbbIIMj414dCRT09Ga8APCVWFFiGELqlouAaIT1OI4=] fact // вычислено фактически
[fFJW3cFMxSVUITu0SVJhq574r7gpuN9haMvXXJd0QXs=] expected // ожидалось, указано в Reference
В данном случае трансформ каноникализации указан в Reference, так что каконикализация применена при проверке. Текст, полученный для вычисления хэша (но могу и ошибаться в плане представления некоторых символов и порядка пространств имен, так как может быть у меня включено отступление от стандарта для СМЭВ):
Код:<row xmlns="http://www.fss.ru/integration/types/eln/mo/v01" xmlns:NS2="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" NS2:Id="ELN_900000585992"><unconditional>false</unconditional><snils>16585732610</snils><surname>Иванов</surname><name>Иван</name><patronymic>Иванович</patronymic><lnCode>900000585992</lnCode><primaryFlag>true</primaryFlag><duplicateFlag>false</duplicateFlag><lnDate>2021-08-11</lnDate><lpuName>ГБУЗ ЦРБ №1</lpuName><lpuAddress>Г.НИЖНИЙ НОВГОРОД, УЛ. ГОРЬКОГО 117</lpuAddress><lpuOgrn>1207700165023</lpuOgrn><birthday>2000-08-24</birthday><gender>1</gender><reason1>05</reason1><diagnos>0000000000</diagnos><date1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"></date1><date2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"></date2><mseDt1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"></mseDt1><mseDt2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"></mseDt2><mseDt3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"></mseDt3><mseInvalidGroup>0</mseInvalidGroup><treatPeriods><treatFullPeriod><treatPeriod xmlns="http://www.fss.ru/integration/types/eln/v01" NS2:Id="ELN_900000585992_1_doc"><treatDt1>2021-08-12</treatDt1><treatDt2>2021-08-18</treatDt2><treatDoctorRole>ПЕДИАТР</treatDoctorRole><treatDoctor>ГАБЕЕВА ИЧ</treatDoctor></treatPeriod></treatFullPeriod></treatPeriods><lnState>020</lnState><writtenAgreementFlag>true</writtenAgreementFlag></row>
На всякий случай перепроверил, что данный текст сохраненный в файл в кодировке UTF8 без ByteOrderMark (длина 1585) дает вычисленный хэш.
Код:0E06DB208323E35E1D0914F4F466BC00F0955851621842EA968B806884F5388E
DgbbIIMj414dCRT09Ga8APCVWFFiGELqlouAaIT1OI4=
FLIP RESULT:
8E38F58468808B96EA421862515895F000BC66F4F414091D5EE3238320DB060E
jjj1hGiAi5bqQhhiUViV8AC8ZvT0FAkdXuMjgyDbBg4=
Для гибкости, когда трансформ нужен, а когда нет, у меня при подписании сначала добавляются предполагаемые трансформы в референс. При подписании такая обработка референса:
1) содержимое референса (URI, Id, Type, список трансформов, алгоритм хэша) блокируется;
2) выполняется процедура как при проверке референса: выбирается фрагмент по URI, для каждого трансформа в референсе по общему списку алгоритмов ищется нужный и применяется к фрагменту, вычисляется хэш согласно алгоритму из референса (аналогично по общему списку алгоритмов ищется нужный алгоритм хэша и применяется);
3) вычисленное значение хэша заносится в референс.
Потом все референсы составляются в SignedInfo, который блокируется и к нему применяется CanonicalizationMethod, потом SignatureMethod, заносится SignatureValue.
Алгоритмы стандартизированы по процедурному типу - исходный буфер, конечный буфер, аргумент-флаг, до 3 аргументов специфичных для алгоритма. Для хэша это числовой AlgId и дескриптор ключа (0 для гост-2012), для подписи алгоритм хэша, hProv и dwKeySpec, для эксклюзивной каноникализации строка InclusiveNamespaces, для xpath строка преобразования и т.д. Специальный объект хранит таблицу соответствия текстового идентификатора алгоритма в xml файле и переменных процедурного типа, также предоставляет методы для добавления/удаления, поиска, применения алгоритмов с 1/2/3 аргументами. При добавлении указывается флаг типа алгоритма (например, каноникализация, расчет хэша, расчет значения подписи), количество аргументов и аргумент-флаг, который будет передан с процедуру (например, каноникализация эксклюзивная и с комментариями обозначаются разными значениями флага для одной и той же процедуры). В одном из вариантов реализации процедуры каноникализации туда же до кучи включен трансформ для смэв. Перед алгоритмами с флагом каноникализации автоматически вызывается нормализация фрагмента (замена сочетания символов #13#10 на #10 и #13 на #10). Если в документе несколько подписей на один и тот же фрагмент (с одинаковыми URI, трансформами и алгоритмом хэша), то считается хэш только раз, для последующих подписей значение копируется из первой подписи.
При проверке референса:
1) считывается список трансформов, URI, Id, Type, алгоритм хэша и значение хэша.
2) выбирается фрагмент по URI, для каждого трансформа в референсе по общему списку алгоритмов ищется нужный и применяется к фрагменту, вычисляется хэш согласно алгоритму из референса (аналогично по общему списку алгоритмов ищется нужный алгоритм хэша и применяется);
3) вычисленное значение хэша сравнивается со считанным значением.
Отредактировано пользователем 13 августа 2021 г. 7:12:02(UTC)
| Причина: Не указана