我有一个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;
}
答案 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)