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`.