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
@Varius
C_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;