Приветствую. Занимаемся работами поддержки алгоритмов GOST 2015 которые скоро вступят в силу. Разрабатываем свою статическую библиотеку написанную на С с использованием статических библиотек криптографии от НУЦ. С версией под Windows проблем нет, но вот с версией под Linux есть проблемы, не удается собрать даже простой проект чтобы ключи GOST 2015 читались и с ними можно было работать.
Уточню еще то, что сейчас есть рабочая статическая библиотека под Windows и Linux со старыми библиотеками которая исправно работает. Поэтому разработка не с нуля, а в виде перехода и адаптации под новую библиотеку.
Есть несколько вопросов:
- Как правильно подключать/инициализировать криптографию с поддержкой алгоритмов GOST 2015? Интересует Linux, можно также и уточнить про Windows если есть отличия.
На Windows методом перебора стало понятно, что они подключаются после вызоваENGINE_load_builtin_engines();
На Linux данного вызова недостаточно, при попытке загрузки ключа GOST 2015 из SDK получаем ошибку"error:0609E09C:digital envelope routines:pkey_set_type:unsupported algorithm". RSA ключи при этом читаются.
После переписки с knca@pki.gov.kz получили информацию что нужно также вызывать engine_load_gost(). Проблема в том, что его использовать не выходит из-за ошибки “implicit declaration of function ‘engine_load_gost’”.
В единственной папке с .h файлами (которая лежит в папке с динамическими библиотеками) в engines.h данный метод отсутствует. - В SDK от 2 августа отсутствуют .h файлы для статических библиотек openssl. В папке для Windows они есть только в папке dynamic, а для Linux и вовсе отсутствуют. Можно для статических библиотек везде использовать ту папку с .h файлами которая расположена в SDK по пути
"SDK 2.0\C\Windows\KalkanCrypt-OpenSSL\dynamic\openssl\"или для статических библиотек должны быть свои заголовочные файлы? - Простой пример под Linux с попыткой использования engine_load_gost();
#include <openssl/engine.h>
#include <openssl/ssl.h>
int main()
{
printf("Hello World!\n");
ENGINE_load_openssl();
engine_load_gost();
printf("is end\n");
}
Пытаюсь собрать gcc -Llibs testc.c -lssl -lcrypto -lpthread -lz -ldl -lpcsclite -fPIC -o crypto_tool
Директория где собираю выглядит так:
-Libs
testc.c
При сборке выдает следующие ошибки:
testc.c: In function ‘main’:
testc.c:12:3: warning: implicit declaration of function ‘engine_load_gost’ [-Wimplicit-function-declaration]
12 | engine_load_gost();
| ^~~~~~~~~~~~~~~~
/usr/bin/ld: libs/libcrypto.a(KNCA_PKCS11.o): in function `main':
KNCA_PKCS11.c:(.text.startup+0x0): multiple definition of `main'; /tmp/ccCbgik3.o:testc.c:(.text+0x0): first defined here
collect2: error: ld returned 1 exit status
Про отсутствие объявления функции вопрос уже задал выше. Интересует момент по этой ошибке
"/usr/bin/ld: libs/libcrypto.a(KNCA_PKCS11.o): in function `main':
KNCA_PKCS11.c:(.text.startup+0x0): multiple definition of `main'; /tmp/ccCbgik3.o:testc.c:(.text+0x0): first defined here
collect2: error: ld returned 1 exit status"
С чем это связано может быть? Если взять .h файлы из динамической библиотеки и модифицировать engines.h, добавить объявление функции engine_load_gost(), то ошибка связанная с engine_load_gost() уходит, но вторая, связанная с KNCA_PKCS11, остается все равно, как ее решить?
Если этот же пример попробовать собрать в eclipse, то получаем целый список ошибок (engine_load_gost() был вручную объявлен в engines.h, поэтому по нему тут ошибки нет)
Ошибки в консоли
gcc -L"/home/user/eclipse-workspace/testc1/libs" -pthread -o "testc1" ./testc.o -lpcsclite -lssl -lcrypto -ldl
/usr/bin/ld: /home/user/eclipse-workspace/testc1/libs/libcrypto.a(KNCA_PKCS11.o): in function `main':
KNCA_PKCS11.c:(.text.startup+0x0): multiple definition of `main'; ./testc.o:/home/user/eclipse-workspace/testc1/Debug/../testc.c:8: first defined here
/usr/bin/ld: /home/user/eclipse-workspace/testc1/libs/libcrypto.a(KNCA_PKCS11.o): in function `C_Finalize':
KNCA_PKCS11.c:(.text+0x92f): undefined reference to `SCardReleaseContext'
/usr/bin/ld: /home/user/eclipse-workspace/testc1/libs/libcrypto.a(KNCA_PKCS11_Sessions.o): in function `KNCA_OpenSession':
KNCA_PKCS11_Sessions.c:(.text+0xb1): undefined reference to `SCardConnect'
/usr/bin/ld: KNCA_PKCS11_Sessions.c:(.text+0xd6): undefined reference to `g_rgSCardT1Pci'
/usr/bin/ld: KNCA_PKCS11_Sessions.c:(.text+0x26b): undefined reference to `g_rgSCardT0Pci'
/usr/bin/ld: /home/user/eclipse-workspace/testc1/libs/libcrypto.a(KNCA_PKCS11_Sessions.o): in function `KNCA_CloseSession':
KNCA_PKCS11_Sessions.c:(.text+0x6ba): undefined reference to `SCardDisconnect'
/usr/bin/ld: KNCA_PKCS11_Sessions.c:(.text+0x74b): undefined reference to `SCardDisconnect'
/usr/bin/ld: /home/user/eclipse-workspace/testc1/libs/libcrypto.a(KNCA_PKCS11_SlotsTokens.o): in function `KNCA_UpdateSlotsStates':
KNCA_PKCS11_SlotsTokens.c:(.text+0x1c6): undefined reference to `SCardListReaders'
/usr/bin/ld: KNCA_PKCS11_SlotsTokens.c:(.text+0x228): undefined reference to `SCardListReaders'
/usr/bin/ld: KNCA_PKCS11_SlotsTokens.c:(.text+0x343): undefined reference to `SCardGetStatusChange'
/usr/bin/ld: KNCA_PKCS11_SlotsTokens.c:(.text+0xb38): undefined reference to `SCardGetStatusChange'
/usr/bin/ld: /home/user/eclipse-workspace/testc1/libs/libcrypto.a(KNCA_PKCS11_SlotsTokens.o): in function `KNCA_GetSlotList':
KNCA_PKCS11_SlotsTokens.c:(.text+0xc17): undefined reference to `SCardEstablishContext'
/usr/bin/ld: KNCA_PKCS11_SlotsTokens.c:(.text+0xd01): undefined reference to `SCardReleaseContext'
/usr/bin/ld: /home/user/eclipse-workspace/testc1/libs/libcrypto.a(KNCA_PKCS11_SlotsTokens.o): in function `KNCA_WaitForSlotEvent':
KNCA_PKCS11_SlotsTokens.c:(.text+0x134f): undefined reference to `SCardGetStatusChange'
/usr/bin/ld: /home/user/eclipse-workspace/testc1/libs/libcrypto.a(KNCA_PKCS11_SCardComm.o): in function `KNCASCSendCmd':
KNCA_PKCS11_SCardComm.c:(.text+0x3d): undefined reference to `SCardTransmit'
collect2: error: ld returned 1 exit status
make: *** [makefile:44: testc1] Error 1
"make all" terminated with exit code 2. Build might be incomplete.