c++ - 从 PKCS11 读取 C++ 结构有什么问题?

标签 c++ struct pkcs#11

我正在尝试使用 PKCS11 库。我在 Windows10 x64 上从 C_GetInfo 函数得到了错误的结构数据。

我的代码

CK_C_GetInfo f_C_GetInfo = (CK_C_GetInfo)dlsym(__pkcs11->dlHandle, "C_GetInfo");
CK_C_Finalize f_C_Finalize = (CK_C_Finalize)dlsym(__pkcs11->dlHandle, "C_Finalize");

CK_INFO _info;
rv = f_C_GetInfo(&_info);

C++ 声明

/* an unsigned value, at least 32 bits long */
// typedef unsigned long int CK_ULONG;
typedef unsigned long int CK_ULONG;

/* at least 32 bits; each bit is a Boolean flag */
typedef CK_ULONG          CK_FLAGS;

typedef struct CK_VERSION {
    CK_BYTE       major;  /* integer portion of version number */
    CK_BYTE       minor;  /* 1/100ths portion of version number */
} CK_VERSION;

typedef CK_VERSION CK_PTR CK_VERSION_PTR;

typedef struct CK_INFO {
    CK_VERSION    cryptokiVersion;     /* Cryptoki interface ver */
    CK_UTF8CHAR   manufacturerID[32];  /* blank padded */
    CK_FLAGS      flags;               /* must be zero */

    CK_UTF8CHAR   libraryDescription[32];  /* blank padded */
    CK_VERSION    libraryVersion;          /* version of library */
} CK_INFO;

typedef CK_INFO CK_PTR    CK_INFO_PTR;

// Function C_GetInfo
CK_RV C_GetInfo ( CK_INFO_PTR pInfo );

来自调试器的信息

enter image description here enter image description here

错误的结构数据从参数flags开始,它必须是0(十六进制:00 00 00 00)。但它有十六进制值 00 00 52 75

如果我将参数 flags 的类型更改为 char[4],我可以修复此错误

怎么了?为什么这个结构的 PKCS11 接口(interface)错误?

最佳答案

前两个元素cryptokiVersionmanufacturerID占用34字节。

manufacturerID 提到它的空白填充,如果你看字节,有一系列 0x20 这是 UTF-8

后跟 4 0x00

紧随其后的是 52 75 74 ....

manufacturerIDflags 之间的数据中没有填充,但是您的结构定义包含 2 个字节的填充以对齐 unsigned long与下一个边界,这将是 36 字节。

尝试从结构中删除填充。

#pragma pack(push, p1, 1)

typedef struct CK_INFO {
    CK_VERSION    cryptokiVersion;     /* Cryptoki interface ver */
    CK_UTF8CHAR   manufacturerID[32];  /* blank padded */
    CK_FLAGS      flags;               /* must be zero */

    CK_UTF8CHAR   libraryDescription[32];  /* blank padded */
    CK_VERSION    libraryVersion;          /* version of library */
} CK_INFO;

#pragma pack(pop, p1)

关于c++ - 从 PKCS11 读取 C++ 结构有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38381503/

相关文章:

c - 如何在 C 中初始化双指针? (指针数组)

windows-phone-8 - 如何以编程方式更改证书签名请求的主题属性?

java - PKCS#11 实例化问题

c++ - Linux C++ LibUSB 在 USB HUB 中写入寄存器

c++ - 在屏幕空间中拖动后,OpenGL对象会变形

c - 向双向链表添加元素

arrays - 如何使用嵌套数组解码 JSON 响应数组

c - 无法将 pkcs#11 模块添加到 secmod 数据库

c++ - 在处理结构模板中的整数时如何修复 'X is not a class template'?

c++ - 递增 streampos 对象