Подпись GOST 34.310

Здравствуйте!
Подскажите, пожалуйста, можно ли подписать сырую строку с помощью GOST сертификата используя алгоритм GOST 34.310-kz A?
Используем библиотеку kalkan С(Linux) из последней SDK.

В файле test.cpp есть пример хэширования с помощью HashData и подписания SignData, но обе функции, согласно документации, принимают только алгоритмы sha256 или Gost34311_95.

Здравствуйте!
sha256 и Gost34311_95 - алгоритмы хэширования. Соответственно применяются в HashData. SignData подписывается через алгоритм GOST 34.310

Спасибо!

При использовании SignData указываем флаги KC_SIGN_DRAFT и KC_OUT_BASE64, но при проверке полученной подписи через VerifySign получаем ошибку 0x8f00042 “Срок действия сертификата истек либо еще не наступил”.
Если при вызове VerifyData передать еще флаг KC_NOCHECKCERTTIME, получаем уже 0x8f0004b Неправильная длина хэша.

Используем тестовый сертификат:
SDK 2.0/Keys and Certs/CERT/2022.01.18_valid/Юридическое лицо/сотрудник организации/ДЕЙСТВУЮЩИЕ/GOSTKNCA_3c650c4c6ce1cb5900152e0d2798d92c53f7824c.p12

Загружаем через KC_LoadKeyStore и X509ExportCertificateFromStore.

На входе в SignData отдаем inData=“Hello, Sasori” и получаем “qdKhWS8rnBU9lC5ZNoDUDfSgW+jVdx6g0x2aCq3MbB0Zx0o3cm0ap/3VkSylrvWpojJ89x0T68SiTGU+MU/09g==88”
В VerifyData в качестве inData отдаем ту же строку, а inSign - подписанные данные.

В чем может быть проблема?

На KalkanCrypt_VerifyData какими флагами проверяете? Если sign c флагами KC_SIGN_DRAFT и KC_OUT_BASE64, то проверка c флагами KC_SIGN_DRAFT + KC_IN2_BASE64

Спасибо, так подпись проходит проверку.
Но так и не получилось исправить ошибку 0x8f00042 “Срок действия сертификата истек либо еще не наступил” .

Подскажите, пожалуйста, с чем это может быть связанно?
Используем ключ, что был описан в предыдущем сообщении.
Может при формировании подписи должен быть указан еще какой-то флаг?

У вас на компьютере дата на актуальное время настроена?

Да, настройки актуальные:
Time zone: Asia/Almaty (+06, +0600)

Можете сделать CMS-подпись какого-то текста, например $inData = “test”, и показать полученную подпись? Для подписи включите флаги $flags_sign = $KC_SIGN_CMS + $KC_OUT_PEM.

Входящий текст: test
Подпись:

-----BEGIN CMS-----
MIIFXwYJKoZIhvcNAQcCoIIFUDCCBUwCAQExDjAMBggqgw4DCgEDAQUAMBMGCSqG
SIb3DQEHAaAGBAR0ZXN0oIIDyTCCA8UwggNvoAMCAQICFHmz5lDOdKuXkrgZAlBO
HWaWBsUtMA0GCSqDDgMKAQEBAgUAMC4xCzAJBgNVBAYTAktaMR8wHQYDVQQDDBbS
sNCa0J4gMy4wIChHT1NUIFRFU1QpMB4XDTIyMDExODA2MzI1MVoXDTIzMDExODA2
MzI1MVowga0xHjAcBgNVBAMMFdCi0JXQodCi0J7QkiDQotCV0KHQojEVMBMGA1UE
BAwM0KLQldCh0KLQntCSMRgwFgYDVQQFEw9JSU4xMjM0NTY3ODkwMTExCzAJBgNV
BAYTAktaMRgwFgYDVQQKDA/QkNCeICLQotCV0KHQoiIxGDAWBgNVBAsMD0JJTjEy
MzQ1Njc4OTAyMTEZMBcGA1UEKgwQ0KLQldCh0KLQntCS0JjQpzBsMCUGCSqDDgMK
AQEBATAYBgoqgw4DCgEBAQEBBgoqgw4DCgEDAQEAA0MABEAjB42XUyUJeMWOyJHF
/Z+Z63jZPM789E6gYqLsS7eFdr35rDAIEgBSwAYmz5Icnda7DZYsrvKrdG6JRVXj
HzOdo4IB0zCCAc8wDgYDVR0PAQH/BAQDAgbAMCgGA1UdJQQhMB8GCCsGAQUFBwME
Bggqgw4DAwQBAgYJKoMOAwMEAQIFMB8GA1UdIwQYMBaAFAe+0hxgCERWsCcV6Fc3
Q0e711RQMB0GA1UdDgQWBBQ8ZQxMbOHLWQAVLg0nmNksU/eCTDBeBgNVHSAEVzBV
MFMGByqDDgMDAgEwSDAhBggrBgEFBQcCARYVaHR0cDovL3BraS5nb3Yua3ovY3Bz
MCMGCCsGAQUFBwICMBcMFWh0dHA6Ly9wa2kuZ292Lmt6L2NwczA9BgNVHR8ENjA0
MDKgMKAuhixodHRwOi8vdGVzdC5wa2kuZ292Lmt6L2NybC9uY2FfZ29zdF90ZXN0
LmNybDA/BgNVHS4EODA2MDSgMqAwhi5odHRwOi8vdGVzdC5wa2kuZ292Lmt6L2Ny
bC9uY2FfZF9nb3N0X3Rlc3QuY3JsMHMGCCsGAQUFBwEBBGcwZTA5BggrBgEFBQcw
AoYtaHR0cDovL3Rlc3QucGtpLmdvdi5rei9jZXJ0L25jYV9nb3N0X3Rlc3QuY2Vy
MCgGCCsGAQUFBzABhhxodHRwOi8vdGVzdC5wa2kuZ292Lmt6L29jc3AvMA0GCSqD
DgMKAQEBAgUAA0EAFeLO7LHHKeAOF8cLKXUeMgiR6isijXON6ZTQ+iZhJNnP6Exj
rdwdDEQziHwgU7HS36BhipDOkR0bv+JE9K4dRjGCAVMwggFPAgEBMEYwLjELMAkG
A1UEBhMCS1oxHzAdBgNVBAMMFtKw0JrQniAzLjAgKEdPU1QgVEVTVCkCFHmz5lDO
dKuXkrgZAlBOHWaWBsUtMAwGCCqDDgMKAQMBBQCggaIwGAYJKoZIhvcNAQkDMQsG
CSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMjIwMjE1MDgzMDE2WjAvBgkqhkiG
9w0BCQQxIgQgpuGs3QzH4A0CuQvMsuIYkiidHpP2Irh2DLDgdt7x9CswNwYLKoZI
hvcNAQkQAi8xKDAmMCQwIgQgl4Uttu5w5LBPw03WWkfrDHCxcjjB/pm5uxg6+9Xc
WyMwDQYJKoMOAwoBAQEBBQAEQMq8GytFvfwZZk7RuYwk4BWugyETALNdDHdTFlQJ
62tTKizTnbOF3vusNV2vv7p93DIoo7yqi/JYQXuxm1rxtrs=
-----END CMS-----

Повторили Ваш пример у себя, у нас все без ошибки работает. Попробуйте следить по примеру в SDK\C\Linux\C\test.cpp или его же запустить.

Проверили еще раз, действительно CMS-подпись проходит проверку.
Ошибка возникает, когда мы формируем сырую подпись:

Входящий текст: test
Флаги для подписи: KC_SIGN_DRAFT + KC_OUT_BASE64
Подпись: +dThbkim++wfib633GX+bGdLEjwuDLcFfdnUjRz5r8timItNVErUP+9aXhes+Q4f3jUVbnKDjwUs1ME6FYx2FQ==
Флаги для проверки: KC_SIGN_DRAFT + KC_IN2_BASE64

Подскажите, пожалуйста, получилось ли у вас восстановить ошибку на своей стороне? Или это все же чисто локальная проблема?

На нашей стороне все без ошибки работает. В точности повторили Ваш пример. Пример в SDK\C\Linux\C\test.cpp смотрели?

А можете, пожалуйста, предоставить версию библиотеки, с которой вы проводите тесты?

Сейчас с вашим тестовым ключом подпись и проверка проходя успешно, но при попытке проверить подпись с недавно выпущенной ЭЦП падает ошибка: ERROR 0x8f00042: Load certificate from system store - failed to load root or intermediate certificate. Unable convert to X509.

Тестируем с SDK\C\Linux\C\test.cpp.

Судя по ошибке у Вас скорее всего не установлены боевые корневые сертификаты, а установлены только тестовые. Боевые корневые сертификаты можете найти в SDK\Keys and Certs\CA CERTS\бой

Устанавливали боевые сертификаты с помощью SDK.C/Linux/ca-certs/Ubuntu/install_бой/install_production.sh
Или верно устанавливать только те, что лежат в SDK\Keys and Certs\CA CERTS\бой?

Да, также через production.sh можете устанавливать. Похоже у Вас старый SDK. В старом SDK боевые сертификаты в формате DER, они не устанавливается в ubuntu. Вам необходимо обновить SDK на актуальную версию, либо конвертировать все сертификаты в SDK.C/Linux/ca-certs/Ubuntu/install_бой/ в формат PEM и заново установить их.

Спасибо, обновили версию SDK и сертификаты, все получилось!

1 Симпатия

@Daniyar, добрый день
Подскажите, вы можете помочь нам с установкой новой версии ЭЦП?

Здравствуйте! Что Вы имеете в виду под установкой ЭЦП? Можете описать где именно у Вас возникают трудности? В SDK есть инструкции по установке библиотек на разные ОС и для разных языков программирования.