PKCS#11 - Как получить список ключей?

Добрый день!

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

Получаю список объектов с помощью функции FindObjects (из примера
PKCS11_Common.cpp) с параметрами pTemplates = NULL_PTR, ulCount = 0
На выходе у меня три объекта, почему три не понятно... на сайте
php.rutokenweb.ru у меня отображается два ключа.

Далее:

rv = pFunctionList->C_GetAttributeValue(hSession, hObject, &attrValue, 1);
   if (rv == CKR_OK) {
       pValueTmp = (CK_BYTE_PTR) malloc(attrValue.ulValueLen);
       attrValue.pValue = pValueTmp;
       rv = pFunctionList->C_GetAttributeValue(hSession, hObject,
&attrValue, 1);
       if (rv == CKR_OK) {
           // attrValue.pValue выводит числа типа 45462952, 45464104,
45464360 каждый раз разные....
       }
}

Как мне получить читаемые имена ключей?

Спасибо!

Re: PKCS#11 - Как получить список ключей?

Добрый день!

Поиск без параметров возвращает все видимые библиотекой PKCS#11-объекты. Ключи с точки зрения PKCS#11 - это объекты классов CKO_PUBLIC_KEY, CKO_PRIVATE_KEY, CKO_SECRET_KEY (значение CKA_CLASS).
Третьем найденным объектом с высокой вероятностью является сертификат.

Для идентификации ключей как правило используют атрибуты CKA_ID и/или CKA_LABEL.

(2012-04-19 14:46:51 отредактировано sopov)

Re: PKCS#11 - Как получить список ключей?

Тип объекта определяем по:

CKO_DATA 0x00000000
CKO_CERTIFICATE 0x00000001
CKO_PUBLIC_KEY 0x00000002
CKO_PRIVATE_KEY 0x00000003
CKO_SECRET_KEY 0x00000004
CKO_HW_FEATURE 0x00000005
CKO_DOMAIN_PARAMETERS 0x00000006
CKO_MECHANISM 0x00000007
CKO_VENDOR_DEFINED 0x80000000

Верно?
Если да, то у меня два объекта = 0x00000002, и один 0x00000001

Re: PKCS#11 - Как получить список ключей?

Класс объекта можно узнать из атрибута CKA_CLASS - считать значение этого атрибута с помощью функции C_GetAttributeValue:

    CK_FUNCTION_LIST_PTR pfLst;
    CK_SESSION_HANDLE hSession;
    CK_OBJECT_HANDLE hObject;
    CK_OBJECT_CLASS ckClass;

    CK_ATTRIBUTE classTemplate[]        =    {
        {    CKA_CLASS, &ckClass, sizeof (CK_OBJECT_CLASS) } // шаблон для считывания одного атрибута
    };
    CK_RV rv = pfLst->C_GetAttributeValue (
        hSession, 
        hObject, 
        classTemplate, 
        sizeof(classTemplate)/sizeof(classTemplate[0])
        );
    printf ("\nObject class: 0x%08X\n", ckClass);

Re: PKCS#11 - Как получить список ключей?

Спасибо, получилось.

Как решить следующую задачу?

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

Re: PKCS#11 - Как получить список ключей?

Для решения этой задачи можно импортировать один и тот же симметричный ключ (CKO_SECRET_KEY) на несколько токенов (импортировать ключи можно с помощью функции C_CreateObject).
Имея токен с ключом, для зашифрования или расшифрования данных можно будет использовать ключ и механизм CKM_GOST28147 и функции C_EncryptInit, C_Encrypt или C_DecryptInit, C_Decrypt соответственно.

Re: PKCS#11 - Как получить список ключей?

Алексей Караваев пишет:

можно будет использовать ключ и механизм CKM_GOST28147

Разве Рутокен Web поддерживает данный механизм?

Вот какой список доступных механизмов:
CKM_RSA_PKCS_KEY_PAIR_GEN - 0x00000000
CKM_RSA_PKCS - 0x00000001
CKM_MD5 - 0x00000210
CKM_SHA_1 - 0x00000220
CKM_GOSTR3410_KEY_PAIR_GEN - 0x00001200
CKM_GOSTR3410 - 0x00001201
CKM_GOSTR3410_WITH_GOSTR3411 - 0x00001202
CKM_GOSTR3410_DERIVE - 0x00001204
CKM_GOSTR3411 - 0x00001210
CKM_GOST28147_KEY_WRAP - 0x00001224

Re: PKCS#11 - Как получить список ключей?

Прошу прощения. Действительно указанный мною механизм пока не входит в ПО для Рутокен Web. Добавить его планируется в ближайшее время. Пожалуйста, следите за обновлениями.

Re: PKCS#11 - Как получить список ключей?

Алексей Караваев пишет:

Прошу прощения. Действительно указанный мною механизм пока не входит в ПО для Рутокен Web. Добавить его планируется в ближайшее время. Пожалуйста, следите за обновлениями.

Нужно будет прошивать токен или это в рамках библиотеки?

(2012-05-28 12:00:24 отредактировано Алексей Караваев)

Re: PKCS#11 - Как получить список ключей?

sopov пишет:
Алексей Караваев пишет:

Прошу прощения. Действительно указанный мною механизм пока не входит в ПО для Рутокен Web. Добавить его планируется в ближайшее время. Пожалуйста, следите за обновлениями.

Нужно будет прошивать токен или это в рамках библиотеки?

Извините за длительное ожидание.
Достаточно будет обновить библиотеку.