Еще раз спасибо за предоставленную библиотеку rtpkcs11ecp для ОС raspbian.
Однако у меня возникла проблема. Дело в том, что я пытаюсь загрузить библиотеку с помощью с++ кода (как продемонстрировано в документации на сайте).
В этом скрипте я подключил заголовочный файл rtpkcs11.h, предоставленный мне вместе с библиотекой.
Я подключил его следующим образом:
#include "rtpkcs11/rtpkcs11.h"
И, скомпилировав свою программу следующим образом gcc sign.cpp -lstdc++
получил следующие ошибки:
pi@raspberrypi ~/Desktop/au-gateway/POC $ gcc sign.cpp -lstdc++
sign.cpp: In function ‘int main()’:
sign.cpp:31:2: error: ‘HMODULE’ was not declared in this scope
sign.cpp:31:10: error: expected ‘;’ before ‘hModule’
sign.cpp:41:6: error: ‘hModule’ was not declared in this scope
sign.cpp:41:47: error: ‘LoadLibrary’ was not declared in this scope
sign.cpp:51:91: error: ‘GetProcAddress’ was not declared in this scope
sign.cpp:72:6: error: ‘hModule’ was not declared in this scope
sign.cpp:75:29: error: ‘FreeLibrary’ was not declared in this scope
Проверил все предоставленные мне заголовочные файлы и не обнаружил определений для типов данных hModule и методов LoadLibrary() и GetProcAddress().
И потому у меня возникает вопрос, где можно их взять, чтобы устранить вышеуказанную проблему?
Это исходник примера, взятого из документации, который я пытаюсь скомпилировать:
#include <iostream>
#include <stdio.h>
#include "rtpkcs11/rtpkcs11.h"
#ifdef __unix__
/* Библиотека для Рутокен Lite, Рутокен ЭЦП, Рутокен PINPad, поддерживает алгоритмы ГОСТ и RSA */
#define PKCS11_LIBRARY_NAME "/usr/lib/pkcs11-arm/rtpkcs11ecp/librtpkcs11ecp.so"
#define PKCS11ECP_LIBRARY_NAME "/usr/lib/pkcs11-arm/rtpkcs11ecp/librtpkcs11ecp.so"
#endif
int main()
{
HMODULE hModule = NULL_PTR; // Хэндл загруженной библиотеки PKCS#11
CK_FUNCTION_LIST_PTR pFunctionList = NULL_PTR; // Указатель на список функций PKCS#11, хранящийся в структуре CK_FUNCTION_LIST
CK_C_GetFunctionList pfGetFunctionList = NULL_PTR; // Указатель на функцию C_GetFunctionList
CK_RV rv = CKR_OK; // Вспомогательная переменная для хранения кода возврата
while (TRUE)
{
// Загрузить библиотеку
printf("Loading library %s", PKCS11_LIBRARY_NAME);
hModule = LoadLibrary(PKCS11_LIBRARY_NAME);
if (hModule == NULL_PTR)
{
printf(" -> Failed to load rtPKCS11ECP library\n");
break;
}
// Получить адрес функции запроса структуры с указателями на функции
printf(" -> Getting GetFunctionList function");
pfGetFunctionList = (CK_C_GetFunctionList)GetProcAddress(hModule, "C_GetFunctionList");
if (pfGetFunctionList == NULL_PTR)
{
printf(" -> Failed to get function list\n");
break;
}
// Получить структуру с указателями на функции
printf("Getting function list");
rv = pfGetFunctionList(&pFunctionList);
if (rv != CKR_OK)
{
printf(" -> Failed\n");
break;
}
break;
}
// Выгрузить библиотеку из памяти
if (hModule)
{
printf("Unloading library");
if (FreeLibrary(hModule) != TRUE)
printf(" -> Failed to unload library\n");
hModule = NULL_PTR;
}
}