C++ 使用pkcs#11从智能卡读取文本文件
我有一张空白智能卡C++ 使用pkcs#11从智能卡读取文本文件,c++,security,smartcard,pkcs#11,C++,Security,Smartcard,Pkcs#11,我有一张空白智能卡(SLE66CX322P,Cardos 4.3b)和一个读卡器/写卡器(Gemalto CT 40)。使用软件,我可以初始化卡,生成密钥、证书等。我还可以创建一个简单的ASCII文件,其中包含一些将存储在智能卡上的文本。我的问题是,如何使用pkcs#11api在C/C++中读取此ASCII文件的内容 下面是我迄今为止尝试过的(也使用Qt): ----------读卡器.h------------ 结果是该块 qWarning() << (const
(SLE66CX322P,Cardos 4.3b)
和一个读卡器/写卡器(Gemalto CT 40)
。使用软件,我可以初始化卡,生成密钥、证书等。我还可以创建一个简单的ASCII
文件,其中包含一些将存储在智能卡上的文本。我的问题是,如何使用pkcs#11api
在C/C++
中读取此ASCII文件的内容
下面是我迄今为止尝试过的(也使用Qt):
----------读卡器.h------------
结果是该块
qWarning() << (const char *) dataTemp[0].pValue;
qWarning() << (const char *) dataTemp[1].pValue;
qWarning() << (const char *) dataTemp[2].pValue;
qWarning() << (const char *) dataTemp[3].pValue;
qWarning()最可能的原因:
- 您的
ulCount
变量被C\u FindObjects()
覆盖到1
- 在调用
C_GetAttributeValue
之前,需要再次将其重新分配到4
- 这样,代码只读取模板中的第一个属性
一些附加(随机)注释:
- 由于不调用
C_Login()
,因此只能查看/访问公共对象(设置为CKA_PRIVATE的对象对您是隐藏的)
C\u FindObjectsInit()
的零ulCount
参数会导致代码枚举所有令牌对象——您可能希望CKA\u类
和CKA\u标签
过滤器有效
- 我建议不要对
C\u FindObjectsInit()
和C\u GetAttributeValue()使用相同的模板
- 您的
dataValue
缓冲区非常小--您确定该值合适吗
祝你好运 谢谢,你的建议解决了这个问题。我已将4
重新分配给ulCount
,将C\u FindObjectsInit()
的最后一个参数更改为1,并增加了dataValue
和label
的缓冲区。但是,我不确定C\u FindObjectsInit()
中的CK\u ULONG
值的作用。当我输入2
时,我没有得到任何结果。使用1
我获得芯片卡的内容<代码>0
为我提供了更多带有不可读字符的结果。我认为CK_ULONG
值告诉我文本文件有多少属性必须适合模板,以及两个属性。do fit:dataValue
和label
@VariusC_ULONG ulCount
的C_FindObjectsInit()
参数定义搜索模板中匹配的属性数量(及其值)。在您的案例中,0=“所有对象”,1=“具有CKA\U类==CKO\U数据的对象”和2=“具有CKA\U类==CKO\U数据和CKA\U值==MyData的对象”。由于您的数据对象可能不包含“MyData”,因此您的搜索不会为ulCount=2
提供任何结果。这有意义吗?此外,您不应该将属性值(pValue
)视为以零结尾的字符串。您应该使用valueLen
字段来确定输出长度并仅转储有效字节。在调用C_GetAttributeValue()
之前,您应该重置模板中的所有字段valueLen
。是的,谢谢。现在这是有道理的。事实上,我的卡片上没有任何包含MyData
的文件。因此,ulCount=1
为我提供了类型为CKO_数据
的所有文件,与它们的CKA_值
无关。而ulCount=2
会给我所有类型为CKO_DATA
的文件和一个值“MyData”(如果我卡上有这样的文件…)。现在明白了。谢谢
#include "cardreader.h"
CardReader::CardReader(QObject *parent) : QObject(parent)
{
readCard();
}
/***********************************************************************/
void CardReader::readCard()
{
rv = C_Initialize(NULL_PTR);
slotCount = 10;
rv = C_GetSlotList(CK_TRUE, slotIds, &slotCount);
qWarning() << "Found" << slotCount << "slots";
if (rv != CKR_OK || slotCount < 1)
{
qWarning() << "No slots found -> exit";
return;
}
slotId = slotIds[0];
rv = C_OpenSession(slotId, CKF_SERIAL_SESSION|CKF_RW_SESSION, NULL_PTR, NULL_PTR, &session);
if (rv != CKR_OK)
{
qWarning() << "Sessions could not be opened -> exit";
qWarning() << "RV (as hex value) = " << QString("%1").arg(rv, 0, 16);
return;
}
/*********************************************************************/
CK_OBJECT_CLASS dataClass = CKO_DATA;
CK_OBJECT_HANDLE handleObject;
CK_UTF8CHAR label[] = {"MyLabel"};
CK_ULONG ulCount = 4ul;
CK_CHAR application[] = {"TestApplication"};
CK_BYTE dataValue[] = {"MyData"};
CK_BBOOL valid = CK_TRUE;
CK_ATTRIBUTE dataTemp[] =
{
{CKA_CLASS, &dataClass, sizeof(dataClass)},
{CKA_VALUE, dataValue, sizeof(dataValue)},
{CKA_LABEL, label, sizeof(label)-1},
//{CKA_APPLICATION, application, sizeof(application)}
{CKA_TOKEN, &valid, sizeof(true)}
};
rv = C_FindObjectsInit(session, dataTemp, 0);
if (rv != CKR_OK)
{
qWarning() << "C_FindObjectsInit Error -> exit";
qWarning() << "C_FindObjectsInit Error" << QString("%1").arg(rv, 0, 16);
return;
}
while (1)
{
rv = C_FindObjects(session, &handleObject, 1, &ulCount);
qWarning() << "C_FindObjects Result =" << QString("%1").arg(rv, 0, 16) << ", count =" << ulCount;
if (rv != CKR_OK || ulCount == 0)
break;
rv = C_GetAttributeValue(session, handleObject, dataTemp, ulCount);
if (rv != CKR_OK)
{
qWarning() << "C_GetAttributeValue error -> exit";
qWarning() << "RV (as hex value) = " << QString("%1").arg(rv, 0, 16) << ", count = " << ulCount;
return;
}
qWarning() << (const char *) dataTemp[0].pValue;
qWarning() << (const char *) dataTemp[1].pValue;
qWarning() << (const char *) dataTemp[2].pValue;
qWarning() << (const char *) dataTemp[3].pValue;
}
}
#include "cardreader.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
CardReader c;
return a.exec();
}
qWarning() << (const char *) dataTemp[0].pValue;
qWarning() << (const char *) dataTemp[1].pValue;
qWarning() << (const char *) dataTemp[2].pValue;
qWarning() << (const char *) dataTemp[3].pValue;