Токен со старыми алгоритмами дайжеста

Добрый день, коллеги.
В процессе внедрения выяснилось, что часть РУ-токенов в KG используют для дайджеста древний алгоритм 1.2.643.2.2.9 gostDigest (GOST R 34.11-94 digest), причем ключи выпущены в январе этого года.
хотя я ориентировался на алгоритм 2012.
У нас все документы подписываются через хэш.
поэтому возник вопрос - с какими параметрами надо запустить openssl, чтобы получить хэш именно в формате GOST R 34.11-94 digest?

у меня в коде прописано вот такое примечание:
// openssl dgst -md_gost94 results in GOST R 34.11-2012 digest calculation (using OpenSSL 1.1.0i + engine from openssl_1_1_0 branch


я его сделал еще полгода назад.
И теперь возник вопрос как получить хэш в более старом оригинальном формате и где взять такой openssl?

сорри за дебильный вопрос.

Re: Токен со старыми алгоритмами дайжеста

slpodpishi, добрый день!
ну для начала хотелось бы понять, вы хешируютк\е с помощью токена или openssl?
ГОСТ 34.11-94 поддерживается во всех носителях Рутокен, включая линейку 3.0.
Опишите пожалуйста сценарий.

Re: Токен со старыми алгоритмами дайжеста

Здравствуйте, Никита.

openssl делает хэш документа, отсылает его в браузер, браузер стандартным Рутокен-плагином создает подпись

v ar sign_options  detached true, addUserCertificate true, addSignTime true
v ar signedData  await plugin.sign login_device_id, login_cert_id, dataToSign, plugin.DATA_FORMAT_HASH, sign_options

где dataToSign - хэш документа.



УЦ, который подписывает ключ клиента, божиться, что используются только новые  алгоритмы. Но после того. как уже поступила третья жалоба от третьего клиента на неправильную подпись - я думаю, что там бардак и таких случаев будет много и надо поднимать поддержку вышедшего в тираж протокола.

поэтому попросил помощи.

Re: Токен со старыми алгоритмами дайжеста

slpodpishi пишет:

plugin.DATA_FORMAT_HASH

Какие параметры вы указываете в этой структуре?
Какая ошибка возникает у клиента?
Какой формат ключей используется у клиента? ГОСТ 2001 или ГОСТ 2012-256?

Re: Токен со старыми алгоритмами дайжеста

Аверченко Кирилл пишет:

Какие параметры вы указываете в этой структуре?

А разве plugin.DATA_FORMAT_HASH это структура? по документации это константа типа number
https://plugin.api.rutoken.ru/CryptoPlugin.html

Если вы о параметрах sign_options - она состоит из трех полей  detached true, addUserCertificate true, addSignTime true

У вас форум блокирует код javascript  теле сообщения. приходится удалять служебные символы, чтоы отправить вам сообщение
форму блокирует отправку сообщения, если я пытаюсь в конце фразы plugin.sign поставить две скобки.

Access to resource was blocked.
Reason or support ID: 01983c80-06a1-7e25-9bc9-0f0cbe27b11a.
Additional information: 12-02 24/Jul/2025:12:54:38 +0000.



у меня с формованием подписи криптоплугином нет ошибок, все нормально проходит, не проходит проверка подписи, так как на вход plugin.sign надо подать хэш в формате 1.2.643.2.2.9 gostDigest (GOST R 34.11-94 digest)

и мой вопрос в связи с этим звучал так: "И теперь возник вопрос как получить хэш в более старом оригинальном формате и где взять такой openssl?"

потому что рекомендованный openssl с параметром -md_gost94 дает формат хэша. который при проверке подписи вызывает ошибку
139740313272576:error:21071065:PKCS7 routines:PKCS7_signatureVerify:digest failure:crypto/pkcs7/pk7_doit.c:1011:

Re: Токен со старыми алгоритмами дайжеста

slpodpishi пишет:

у меня в коде прописано вот такое примечание:
// openssl dgst -md_gost94 results in GOST R 34.11-2012 digest calculation (using OpenSSL 1.1.0i + engine from openssl_1_1_0 branch


я его сделал еще полгода назад.
И теперь возник вопрос как получить хэш в более старом оригинальном формате и где взять такой openssl?

сорри за дебильный вопрос.

Добрый день!

Я бы не сильно верил комментарию, пока не перепроверил.

Мой на коленке собранный openssl3.4 с gost-engine считает значения хеша, совпадающие с заявленными в википедии (с парамсетом CryptoPro -- https://en.wikipedia.org/wiki/GOST_(has … parameters), за исключением хеша от пустой строки (на это есть баг в gost-engine: https://github.com/gost-engine/engine/issues/142):

mironenko@mbp2-rutoken gost-engine % echo -n "" | ./build/bin/openssl dgst -md_gost94 
id-GostR3411-94(stdin)= 3f25bc1fbbce27ca10fb1958f319473ae7e17482c3b53ecf47a7e2de8aabe4c8
mironenko@mbp2-rutoken gost-engine % echo -n "abc" | ./build/bin/openssl dgst -md_gost94
id-GostR3411-94(stdin)= b285056dbf18d7392d7677369524dd14747459ed8143997e163b2986f92fd42c
mironenko@mbp2-rutoken gost-engine % echo -n "The quick brown fox jumps over the lazy dog" | ./build/bin/openssl dgst -md_gost94
id-GostR3411-94(stdin)= 9004294a361a508c586fe53d1f1b02746765e71b765472786e4770d565830a76

С высокой долей вероятности, ваш openssl-1.1.1 с gost-engine тоже считает md_gost94 правильно.

Недоумение вызывают эти слова:

В процессе внедрения выяснилось, что часть РУ-токенов в KG используют для дайджеста древний алгоритм 1.2.643.2.2.9 gostDigest (GOST R 34.11-94 digest), причем ключи выпущены в январе этого года.
хотя я ориентировался на алгоритм 2012.

Функция `plugin.sign` для алгоритмов ГОСТ34.10-2001 и ГОСТ34.10-2012 не позволяет выбирать алгоритм хеширования, который используется и указывается при формировании CMS. Для ключей алгоритма ГОСТ34.10-2001 используется алгоритм хеширования ГОСТ34.11-94; для ключей алгоритма ГОСТ34.10-2012 используется алгоритм хеширования ГОСТ34.11-2012. Если вы в функцию `plugin.sign` передаете значение хеша ГОСТ34.11-94, но подпись выполняете с использованием ключа ГОСТ34.10-2012, оказывается, что CMS не может быть проверена, потому что в полученном CMS указан в качестве используемого идентификатор хеша ГОСТ34.11-2012, а значение хеша, на самом деле, посчитано вами вручную (в openssl) алгоритмом ГОСТ34.11-94.

Один из вариантов, как получать валидные CMS с вашими вводными (возможно, вам не подойдет из-за каких-то других ограничений):
1. Определять алгоритм ключа по сертификату пользователя.
2. Если алгоритм ключа ГОСТ34.10-2001, хешировать документ по алгоритму ГОСТ34.11-94 и вызывать `plugin.sign`.
2. Если алгоритм ключа ГОСТ34.10-2012, хешировать документ по алгоритму ГОСТ34.11-2012 и вызывать `plugin.sign`.

Re: Токен со старыми алгоритмами дайжеста

Спасибо, большое, я в принципе так и делаю ( вычисляю сразу хэш под 3 алгоритма, а потом нужный беру из уже высчитанного)
утром проведу опыты и напишу результат.