Я пытаюсь использовать PKCS11 lib. У меня неправильная структура данных в 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);
/* 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 );
Неправильная структура данных начинается с параметра flags
, это ДОЛЖНО быть 0 (Hex: 00 00 00 00
). Но это имеет шестнадцатеричное значение 00 00 52 75
,
Я могу исправить эту ошибку, если я изменю тип параметра flags
в char[4]
Что случилось? Почему интерфейс PKCS11 не подходит для этой структуры?
Первые два элемента cryptokiVersion
а также manufacturerID
занимают 34 байта.
manufacturerID
упоминает, что его пустым дополнением, если вы посмотрите на байты, есть серия 0x20
который UTF-8
за ,
Вслед за 4 0x00
С последующим 52 75 74 ....
Там нет заполнения в данных между manufacturerID
а также flags
, но определение вашей структуры содержит 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)
Чрезвычайно важно помнить, что согласно PKCS # 11 все структуры упакованы до минимального размера, поддерживаемого платформой, и не выровнены по 4 или 8 байтов. В противном случае драйверы PKCS # 11 будут несовместимы с приложениями. Стандарт PKCS # 11 является строгим в этом отношении.