2015-03-31 53 views
0

我有一個PKCS11令牌和一個由應用程序創建的對象。我試圖編寫另一個讀取對象的應用程序。我設法使用C_FindObjectsInit()和C_FindObjects()來查找對象。然後我調用C_GetObjectSize()來確保對象的大小與預期的一樣。它是。接下來,我調用C_GetAttributeValue()來讀取對象。返回的模板具有正確的ulValueLen,但pValue爲0.我做錯了什麼?讀取對象的代碼如下:從PKCS11令牌讀取對象

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; 
} 

回答

1

您需要提供一個有效的緩衝區,其中的值將被複制。即:

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

援引PKCS11:

對於每個(類型,p值,ulValueLen)在模板三重, C_GetAttributeValue執行以下算法:如果即指定指定 屬性(屬性由類型字段)爲 對象無法顯示,因爲該對象是敏感的或 不可提取,那麼該三元組中的ulValueLen字段被修改爲 保存值-1(即,當它被轉換爲CK_LONG時,它保存-1)。否則,如果該對象的指定屬性無效( 對象不具有這樣的屬性),則修改該三元組中的ulValueLen字段 以保存值-1。否則,如果pValue字段的值爲NULL_PTR,則修改ulValueLen字段以保留該對象的指定 屬性的確切長度。

否則,如果在ulValueLen指定的長度足夠大以 保持該對象的指定的屬性的值,則該 屬性被複制到位於p值的緩衝液,和 ulValueLen字段被修改爲容納 屬性的確切長度。

否則,ulValueLen字段被修改爲保存值-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)