Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
CK_OBJECT_CLASS ocData = CKO_DATA;
CK_BYTE         label[] = {'f','i','l','e','n','a','m','e','.','t','x','t'};;
CK_BBOOL        ckTrue = CK_TRUE;
CK_BBOOL        ckFalse = CK_FALSE;

CK_OBJECT_HANDLE_PTR objects;                     // Массив найденных объектов
CK_ULONG objectCount;                             // Количество хэндлов объектов в массиве

CK_RV           rv = CKR_OK;

CK_UTF8CHAR     ckUserPIN[]     =   {'1','2','3','4','5','6','7','8'};


CK_ATTRIBUTE attrDataReadTmpl[] = {
  {CKA_CLASS, &ocData, sizeof(ocData)},
  {CKA_LABEL, label, sizeof(label) - 1},
  {CKA_PRIVATE, &ckTrue, sizeof(ckTrue)},                      // Файл доступен по PIN-коду
  {CKA_TOKEN, &ckTrue, sizeof(ckTrue)}                         // хранить файл на токене
};

rv = C_Login(hSession,
             CKU_USER,
             ckUserPIN,
             sizeof(ckUserPIN));
if (rv != CKR_OK)
    return;

rv = findObjects(functionList, session, attrDataReadTmpl, arraysize(attrDataReadTmpl), &objects, &objectCount);
.
.

if (objectCount == 1) {
    CK_ATTRIBUTE attrValue = { CKA_VALUE, NULL_PTR, 0 };

    rv = functionList->C_GetAttributeValue(session,           // Хэндл открытой с правами Пользователя сессии
                                          objects[0],         // Хэндл объекта из поиска
                                          &attrValue,         // Шаблон получения значения атрибута
                                          1);                 // Количество атрибутов в шаблоне
    if (rv != CKR_OK)
        return;


    /* Выделить необходимое количество памяти для значения атрибута */
    attrValue.pValue = (CK_BYTE*)malloc(attrValue.ulValueLen);
    if (attrValue.pValue == NULL)
        return;

    memset(attrValue.pValue, 0, (attrValue.ulValueLen * sizeof(CK_BYTE)));

    /* Получить значение объекта */
    printf("Getting object value");
    rv = functionList->C_GetAttributeValue(session,            // Хэндл открытой с правами Пользователя сессии
                                           objects[0],         // Хэндл объекта 
                                           &attrValue,         // Шаблон получения значения атрибута
                                           1);                 // Количество атрибутов в шаблоне
    if (rv != CKR_OK)
        return;

    /* Распечатать буфер со значением объекта */
    printf("Data is:\n");

    printf("%.*s", attrValue.ulValueLen, (const char*)attrValue.pValue);

    free(attrValue.pValue);
}




Warning

Устройства Рутокен, сертифицированные ФСБ, не поддерживают создание (импорт) ключей функцией C_CreateObject по алгоритмам ГОСТ 28147-89, ГОСТ 34.10-2001 и ГОСТ 34.10-2012 в долговременную память (с флагом CKA_TOKEN = TRUE).

...