从PKCS11令牌中读取对象

时间:2015-03-31 08:07:40

标签: c pkcs#11

我有一个PKCS11令牌,其中包含一个由应用程序创建的对象。我正在尝试编写另一个读取对象的应用程序。我设法使用C_FindObjectsInit()和C_FindObjects()找到对象。然后我调用C_GetObjectSize()以确保对象大小符合预期。它是。接下来,我调用C_GetAttributeValue()来读取对象。返回的模板具有正确的ulValueLen,但pValue为0.我做错了什么?读取对象的代码如下:

CK_ATTRIBUTE dataTemplate[] = {
    {CKA_VALUE, NULL_PTR, 0}
};

ret = C_GetObjectSize(hSession, hObject, &ulSize);  
if(ret != CKR_OK) {
    LOGE("C_GetObjectSize exception! Return value was %x", (int)ret);
    return -1;
}
LOGD("Size of object is %d", ulSize);
ret = C_GetAttributeValue(hSession, hObject, dataTemplate, sizeof(dataTemplate)/sizeof(CK_ATTRIBUTE));
if(ret != CKR_OK)
{
    LOGE("C_GetAttributeValue error! Return value was %d", (int)ret);
    return -1;
}

2 个答案:

答案 0 :(得分:1)

您需要提供一个有效的缓冲区来复制值。即:

CK_BYTE valueBuffer[128];
CK_ATTRIBUTE dataTemplate[] = {
    {CKA_VALUE, valueBuffer, sizeof(valueBuffer)}
};

引用pkcs11:

  

对于模板中的每个(type,pValue,ulValueLen)三元组,   C_GetAttributeValue执行以下算法:如果指定   属性(即类型字段指定的属性)   对象无法显示,因为对象是敏感的或   unxtractable,然后将该三元组中的ulValueLen字段修改为   保持值-1(即,当它被转换为CK_LONG时,它保持-1)。

     

否则,如果对象的指定属性无效(   对象不具有这样的属性),然后是ulValueLen字段   在该三元组中被修改为保持值-1。

     

否则,如果pValue字段的值为NULL_PTR,那么   ulValueLen字段被修改为保持指定的确切长度   对象的属性。

     

否则,如果ulValueLen中指定的长度足够大   保持对象的指定属性的值,然后保持该值   属性被复制到位于pValue的缓冲区中,并且   ulValueLen字段被修改为保持精确的长度   属性。

     

否则,修改ulValueLen字段以保存值-1。

答案 1 :(得分:0)

你不需要调用C_GetObjectSize来获取对象的长度值,如果你之前有对象的句柄,则只能使用C_GetAttributeValue。

我经常使用这段代码在PKCS#11 Token中获取对象的值。希望这有帮助。

CK_ATTRIBUTE dataTemplate[] = {
    {CKA_VALUE, NULL_PTR, 0}
};

//use to get len of value
ret = C_GetAttributeValue(hSession, hObject, dataTemplate, 1);

if(ret != CKR_OK) {
 return;
}

dataTemplate[0].value = new char[dataTemplate[0].ulValueLen];

ret = C_GetAttributeValue(hSession, hObject, dataTemplate, 1);

if(ret != CKR_OK) {
 delete[] dataTemplate[0].pValue;
 return;
}

//Now we have value of object, can show or do something
show_or_do_smth(dataTemplate[0].pValue)