Пытаюсь получить свойство излекаемости ключа (EXTRACTABLE) вот таким способом (pkcs#11):
CK_ATTRIBUTE itemplate = {CKA_EXTRACTABLE, NULL_PTR, 0}; //
rv = pfn_C_GetAttributeValue(SessionHandle, PrivKey, &itemplate, 1);
if (rv == CKR_OK)
{
//Memo1->Lines->Add("template.value: "+AnsiString((char*)itemplate.pValue));
Memo1->Lines->Add("template.value: "+IntToStr(itemplate.pValue));
Memo1->Lines->Add("template.type: "+IntToStr(itemplate.type));
Memo1->Lines->Add("template.ulValueLen: "+IntToStr(itemplate.ulValueLen));
}
и ни чего не получается
Значение template.value всегда возвращает ноль.
Делаю что-то не так, скажите что именно?
а если так сделать (вроде более правильно):
CK_BYTE_PTR pModulus;
rv = pfn_C_GetAttributeValue(SessionHandle, PrivKey, &itemplate, 1);
if (rv == CKR_OK)
{
pModulus = (CK_BYTE_PTR) malloc(itemplate.ulValueLen);
itemplate.pValue = pModulus;
rv = pfn_C_GetAttributeValue(SessionHandle, PrivKey, &itemplate, 1);
if (rv == CKR_OK)
{
//Memo1->Lines->Add("template.value: "+AnsiString((char*)itemplate.pValue));
Memo1->Lines->Add("template.value: "+IntToStr(itemplate.pValue));
Memo1->Lines->Add("template.type: "+IntToStr(itemplate.type));
Memo1->Lines->Add("template.ulValueLen: "+IntToStr(itemplate.ulValueLen));
}
}
то itemplate.pValue = 1 в независимости от того, каким был создан приватный ключ (CKA_EXTRACTABLE = true или CKA_EXTRACTABLE = false)
Здравствуйте, irbis3003, Вы писали:
I>а если так сделать (вроде более правильно):
I>...
I>
I>то itemplate.pValue = 1 в независимости от того, каким был создан приватный ключ (CKA_EXTRACTABLE = true или CKA_EXTRACTABLE = false)
Как правильно было подмечено, код в первом посте — это пол дела. А вообще, конечно, код лучше приводить все-таки одним куском — чтобы не надо было заглядывать в предыдущий пост за деталями. И еще: если это не универсальная обёртка, умеющая добывать значения любых атрибутов, то в данном конкретном месте, зная тип значения данного конкретного атрибута (CK_BBOOL), вполне можно использовать для его хранения переменную соотв. типа., Т.е.:
CK_BBOOL extractable = CK_FALSE;
CK_ATTRIBUTE at_extractable[] = { CKA_EXTRACTABLE, &extractable, sizeof( CK_BBOOL ) };
CK_RV rv;
rv = C_GetAttributeValue( hObject, hSession, &at_extractabe, COUNTOF( extractable ) );
Что касается полученных результатов, то, могу предположить, что там где написано
то itemplate.pValue = 1 в независимости от того, каким был создан приватный ключ (CKA_EXTRACTABLE = true или CKA_EXTRACTABLE = false)
на самом деле подразумевалось
*(itemplate.pValue).
Если так, то вполне возможно, что данное конкретное PKCS#11-устройство не имеет нормальной поддержки атрибута CKA_EXTRACTABLE, и, чтобы не обламывать пользователя ошибками, всегда приводит его значение к CK_TRUE. Так, например, сделано в Mozilla NSS.
Удачи.