Не находится открытый ключ на токене

Здравствуйте. Проблема следующая: на токене есть сертификат. Сертификат найти могу через шаблон, а вот открытых ключей почему-то ноль. Почему так? Шаблонный поиск свёл к мининуму, т.к. на токене всего лишь 1 сертификат и из него нужен открытый ключ. Как получить открытый ключ для дальнейшей проверки подписи? Спасибо.

...

CK_ATTRIBUTE publicKeyTemplate[] =
{
    { CKA_CLASS, &publicKeyObject, sizeof(publicKeyObject) }
};

...

r = findObjects(functionList, session, publicKeyTemplate, arraysize(publicKeyTemplate),
        &objects, &objectCount);
CHECK(" findObjects", r == 0, free_signature);

CHECK_AND_LOG(" Checking number of keys found", objectCount > 0, "No objects found\n", free_signature); //здесь получаю ошибку, т.к. objectCount = 0

Re: Не находится открытый ключ на токене

Binger, добрый день!

Покажите, пожалуйста, содержимое токена.
Отправьте скриншот Панели Управления Рутокен на вкладке Сертификаты (нужно установить Драйверы Рутокен) или результат команды
pkcs11-tool --list-objects --module=<путь к PKCS#11> --login --pin 12345678

Какой функцией вы проверяете подпись?

Re: Не находится открытый ключ на токене

Павел Анфимов пишет:

Binger, добрый день!

Покажите, пожалуйста, содержимое токена.
Отправьте скриншот Панели Управления Рутокен на вкладке Сертификаты (нужно установить Драйверы Рутокен) или результат команды
pkcs11-tool --list-objects --module=<путь к PKCS#11> --login --pin 12345678

Какой функцией вы проверяете подпись?

C_Verify

https://forum.rutoken.ru/uploads/images/2020/07/b0f3b2f659b7b300aee02643f46dc044.png

Re: Не находится открытый ключ на токене

Павел Анфимов, можно вам ещё один вопрос? Не в тему, конечно. Вы, как человек хорошо разбирающийся в криптографии, можете мне подсказать почему в значениях подписи сертификатов и списков отзыва первый байт(он же последний после переворота подписи) всегда = 0? В pkcs7, например, нет такого (при подписывании каких-либо данных). На просторах интернета что-то не нашёл ничего толкового на этот счёт. Прикрепил скрин с примером одного из сертификатов:
https://forum.rutoken.ru/uploads/images/2020/07/b02e77bc3ba13b27b4aaf8441d3b92ec.png
https://forum.rutoken.ru/uploads/images/2020/07/43946f9a2b70aaed183c32b35b7dd4f4.png

Данные сертификата:

MIICXDCCAcigAwIBAgIJAMfG35czsLOYMAoGCCqFAwcBAQMDMHoxDzANBgNVBAgMBk1vc2NvdzEPMA0G
A1UEBwwGTW9zY293MRYwFAYDVQQKDA1BTyBBa3Rpdi1Tb2Z0MRAwDgYDVQQLDAdSdXRva2VuMSwwKgYD
VQQDDCNSdXRva2VuIFRFU1QgQ0EgKFApIEdPU1QgUiAyMDEyLTUxMjAeFw0xOTExMDgwODEzMjNaFw0y
MDExMDgwODEzMjNaMDoxFDASBgNVBAMMC1N1cGVyS2V5MjU2MQswCQYDVQQGEwJSVTEVMBMGA1UECAwM
0JzQvtGB0LrQstCwMGYwHwYIKoUDBwEBAQEwEwYHKoUDAgIjAQYIKoUDBwEBAgIDQwAEQC6nxHhV73uK
L0c3yuFGuPFxph29Z6kAWYJDBDEYZfPwr7WUGCsquM9sjMVNfe/OxwJazA7yLJoYM+bXFcA4COKjajBo
MAsGA1UdDwQEAwIGwDATBgNVHSUEDDAKBggrBgEFBQcDBDATBgNVHSAEDDAKMAgGBiqFA2RxATAvBgUq
hQNkbwQmDCTQodCa0JfQmCAi0KDRg9GC0L7QutC10L0g0K3QptCfIDIuMCIwCgYIKoUDBwEBAwMDgYEA
48ufGMN9mm0qb2t8BNZ2vfGCC3BQyGOVJP0eu53wr49mFrsLYLZ49/722wMq51X5dvEcniyrH9WWtvwI
n7rwCRLsTUENpWh6aTnYgcNVgReULKsAHbg8C0cUKhs/a2kBTqDi2+5H3gRlfAVBzbWSldmWndZI5y07
a4k7ne0gjRs===

Re: Не находится открытый ключ на токене

Binger, у вас на токене сертификат без ключевой пары, поэтому не ищется открытый ключ.

По второму вопросу: в первом октете значения bitstring указывается количество неиспользуемых бит.
Согласно п. 8.6.2.2 X.690

(2022-12-16 14:47:30 отредактировано Евгений Шебардин)

Re: Не находится открытый ключ на токене

Павел Анфимов пишет:

Binger, у вас на токене сертификат без ключевой пары, поэтому не ищется открытый ключ.

По второму вопросу: в первом октете значения bitstring указывается количество неиспользуемых бит.
Согласно п. 8.6.2.2 X.690

Здравствуйте, вот у меня есть сертификат с открытым ключом, а ошибка та же самая.
https://forum.rutoken.ru/uploads/images/2022/12/0ec80a12a976020b1aaf1185d6cbc32c.png
Возможно, что я не понимаю как использовать privateKeyTemplate из примера в SDK (SignGOST34.10-2012-256WithHash). Потому что после проверки.

  r = findObjects(functionList, session, privateKeyTemplate, arraysize(privateKeyTemplate) 

r - равен нулю.

Signing data...
 Getting signing key...
  C_FindObjectsInit -> OK
  Memory allocation for object handles -> OK
  C_FindObjects -> OK
  C_FindObjectsFinal -> OK
 findObjects -> OK
 Checking number of keys found -> Failed
No objects found

Re: Не находится открытый ключ на токене

Евгений Шебардин, добрый день!

пример SignGOST34.10-2012-256WithHash ищет пару, созданную примером CreateGOST34.10-2012-256.

Чтобы пример нашел вашу пару, нужно указать в шаблоне поиска закрытого ключа (privateKeyTemplate) CKA_ID вашей пары (можно посмотреть с помощью утилиты Pkcs11admin) или закомментировать ее указание. Т.е так:

CK_ATTRIBUTE privateKeyTemplate[] =
{
    // { CKA_ID, &keyPairIdGost2012_256_1, sizeof(keyPairIdGost2012_256_1) - 1},   // ID пары
    { CKA_CLASS, &privateKeyObject, sizeof(privateKeyObject)}                   // Класс - закрытый ключ
};