Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline navrocky  
#1 Оставлено : 21 апреля 2023 г. 19:23:45(UTC)
navrocky

Статус: Активный участник

Группы: Участники
Зарегистрирован: 19.10.2022(UTC)
Сообщений: 30
Российская Федерация

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 2 раз в 2 постах
У меня есть следующий код, который подписывает данные: https://github.com/navro...pto/blob/master/main.cpp .

Сертификат и ключ я сделал так и импортировал в контейнер CSP:
Код:
openssl-1_1 req -x509 -newkey gost2012_256 -pkeyopt paramset:A -nodes -keyout key.pem -out cert.pem -days 365

openssl-1_1 pkcs12 -export -engine gost -inkey key.pem -in cert.pem -out test_gost12_256.pfx -password pass:123456 -macalg md_gost12_256 -keypbe gost89 -certpbe gost89 -name test_gost12_256 -keysig

/opt/cprocsp/bin/amd64/certmgr -install -pfx -file test_gost12_256.pfx -pin 123456 -to-container


Создал тестовые данные для подписи:
Код:
echo "test data" > test_data


Запустил тестовое приложение:
Код:
test_cryptopro test_data


И проверил подпись:
Код:
openssl-1_1 x509 -pubkey -in cert.pem -out pubkey.pem

openssl-1_1 dgst -c -md_gost12_256 -verify pubkey.pem -keyform PEM -signature signature test_data


В результате получил "Verification Failure"

Если я подписываю через openssl, то верификация проходит "Verified OK":
Код:
openssl-1_1 dgst -md_gost12_256 -sign key.pem -keyform PEM test_data > openssl_signature

openssl-1_1 dgst -c -md_gost12_256 -verify pubkey.pem -keyform PEM -signature openssl_signature test_data


Что я делаю не так, что упустил?

PS: хэши сверил, что при помощи CSP я получаю, что и при помощи openssl - совпадают.

Здесь полный код проекта: https://github.com/navrocky/test_cryptopto

Отредактировано пользователем 24 апреля 2023 г. 19:15:22(UTC)  | Причина: Не указана

Offline Eduard Iskandarov  
#2 Оставлено : 24 апреля 2023 г. 13:37:18(UTC)
Eduard Iskandarov

Статус: Новичок

Группы: Участники
Зарегистрирован: 24.04.2023(UTC)
Сообщений: 4
Российская Федерация

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 1 раз в 1 постах
У меня тоже не получается верифицировать сырую подпись с openssl.

В моем случае подпись формируется в браузере с плагином cadesplugin.

Исходник страницы тут https://gist.github.com/...86da5c9cd610cb6716fa0e8e

Получаемая подпись приходит в виде

Код:
14769BB28F8CEAFE5A0166D6B439870569BFD296565D47AB040F48BFE80CE79A7AE541FF9A94C8BB6EC6989393C3BC51C05B31F2A4DAA83FD1F8535ADF3B52AE


Дальше ее преобразую в бинарный вид с командой
Код:
$ xxd -r -p message.txt.sig.hex > message.txt.sig
$ openssl dgst -md_gost12_256 -verify ../pubkey.pem -signature message.txt.sig message.txt
Verification failure
809B6343567F0000:error:4000007B:lib(128):ERR_GOST_error:signature mismatch:./gost_ec_sign.c:413:


На соседних страницах советовали перевернуть текст подпись и/или поменять порядок байт. (получилось 4 варианта (как оказалось тут у меня была ошибка!))

Во всех случаях openssl выдает Verification failure.

(UPD) Помогло следуюущее:

Код:
$ cat message.txt.sig.hex | fold -w 2 | tac | xxd -p -r > message.txt.sig.r
$ openssl dgst -md_gost12_256 -verify ../pubkey.pem -signature message.txt.sig.r message.txt
Verified OK

Отредактировано пользователем 24 апреля 2023 г. 17:57:19(UTC)  | Причина: добавил пример с рабочей проверкой подписи

thanks 1 пользователь поблагодарил Eduard Iskandarov за этот пост.
navrocky оставлено 24.04.2023(UTC)
Offline navrocky  
#3 Оставлено : 24 апреля 2023 г. 14:23:55(UTC)
navrocky

Статус: Активный участник

Группы: Участники
Зарегистрирован: 19.10.2022(UTC)
Сообщений: 30
Российская Федерация

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 2 раз в 2 постах
Автор: Eduard Iskandarov Перейти к цитате

На соседних страницах советовали перевернуть текст подпись и/или поменять порядок байт. (получилось 4 варианта)


Хм, помог переворот результирующей подписи. Спасибо!

Скорее всего переворот данных не поможет, так как повлияет на хэш. А хэш вычисляется одинаково в обоих библиотеках.

Ещё остается вопрос с CMS подписью, она тоже не валидируется, но как её перевернуть? Think

Да, и последний вопрос, а какой порядок всё-таки правильный, перевернутый или нет относительно openssl? Так как подпись потом может использоваться в JWT, например.

Отредактировано пользователем 24 апреля 2023 г. 14:28:54(UTC)  | Причина: Не указана

Offline Eduard Iskandarov  
#4 Оставлено : 24 апреля 2023 г. 16:17:47(UTC)
Eduard Iskandarov

Статус: Новичок

Группы: Участники
Зарегистрирован: 24.04.2023(UTC)
Сообщений: 4
Российская Федерация

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 1 раз в 1 постах
о, мне тоже помог разворот бинарного файла с подписью 🎉

Код:
$ < message.txt.sig xxd -p -c1 | tac | xxd -p -r > message.txt.sig.r
$ openssl dgst -md_gost12_256 -verify ../pubkey.pem -signature message.txt.sig.r message.txt
Verified OK
Offline Eduard Iskandarov  
#5 Оставлено : 24 апреля 2023 г. 16:45:36(UTC)
Eduard Iskandarov

Статус: Новичок

Группы: Участники
Зарегистрирован: 24.04.2023(UTC)
Сообщений: 4
Российская Федерация

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 1 раз в 1 постах
про CMS подпись не знаю. вероятно можно отредактировать файл и развернуть подпись в нем

напишите пожалуйста сюда что получилось
Offline navrocky  
#6 Оставлено : 24 апреля 2023 г. 17:10:17(UTC)
navrocky

Статус: Активный участник

Группы: Участники
Зарегистрирован: 19.10.2022(UTC)
Сообщений: 30
Российская Федерация

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 2 раз в 2 постах
Автор: Eduard Iskandarov Перейти к цитате
про CMS подпись не знаю. вероятно можно отредактировать файл и развернуть подпись в нем

напишите пожалуйста сюда что получилось

Пока вижу только один способ: собирать CMS руками с развернутой подписью, используя ASN1 функции (

Вообще странно всё это очень. Хотелось бы чтобы кто-нибудь из разработчиков прокомментировал

UPD. CMS подпись я победил. Оказалось, что CSP тут не виновата. Проблема у меня была в OpenSSL коде, я не указал флаг CMS_BINARY при создании и верификации подписи. С этим флагом все кросс верификации проходят между OpenSSL и CSP.

Отредактировано пользователем 25 апреля 2023 г. 16:13:07(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил navrocky за этот пост.
Eduard Iskandarov оставлено 25.04.2023(UTC)
Offline Eduard Iskandarov  
#7 Оставлено : 25 апреля 2023 г. 14:01:58(UTC)
Eduard Iskandarov

Статус: Новичок

Группы: Участники
Зарегистрирован: 24.04.2023(UTC)
Сообщений: 4
Российская Федерация

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 1 раз в 1 постах
Цитата:
Да, и последний вопрос, а какой порядок всё-таки правильный, перевернутый или нет относительно openssl?


В браузер плагин от рутокен, сырая подпись не требует преобразований(кроме hex -> bin) для проверки в openssl.

https://plugin.api.rutok...ryptoPlugin.html#rawSign
Offline navrocky  
#8 Оставлено : 25 апреля 2023 г. 16:11:51(UTC)
navrocky

Статус: Активный участник

Группы: Участники
Зарегистрирован: 19.10.2022(UTC)
Сообщений: 30
Российская Федерация

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 2 раз в 2 постах
Автор: Eduard Iskandarov Перейти к цитате
Цитата:
Да, и последний вопрос, а какой порядок всё-таки правильный, перевернутый или нет относительно openssl?


В браузер плагин от рутокен, сырая подпись не требует преобразований(кроме hex -> bin) для проверки в openssl.

https://plugin.api.rutok...ryptoPlugin.html#rawSign


Серийный номер сертификата в CSP тоже надо разворачивать для правильного отображения на экране. Видимо это какое-то общее правило.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.