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

我的密码

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

来自调试器的信息

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

错误的结构数据从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/

10-11 23:18
查看更多