Что не так в чтении структуры C ++ из PKCS11?

Я пытаюсь использовать 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);

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

Информация от отладчика

введите описание изображения здесь
введите описание изображения здесь

Неправильная структура данных начинается с параметра flags, это ДОЛЖНО быть 0 (Hex: 00 00 00 00). Но это имеет шестнадцатеричное значение 00 00 52 75,

Я могу исправить эту ошибку, если я изменю тип параметра flags в char[4]

Что случилось? Почему интерфейс PKCS11 не подходит для этой структуры?

1

Решение

Первые два элемента 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)
2

Другие решения

Чрезвычайно важно помнить, что согласно PKCS # 11 все структуры упакованы до минимального размера, поддерживаемого платформой, и не выровнены по 4 или 8 байтов. В противном случае драйверы PKCS # 11 будут несовместимы с приложениями. Стандарт PKCS # 11 является строгим в этом отношении.

1

По вопросам рекламы [email protected]