Добрый день!
Мне удалось выполнить свою задачу, при этом возникли некоторые трудности.
Выяснилось, что библиотеку libkncagost.so нужно положить в папку "/home/ai/sdk/linux64dynamic/lib/engines/libkncagost.so", чтобы она была найдена при запуске программы
Код программы:
#include <stdlib.h>
#include <stdio.h>
#include <openssl/engine.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
int main() {
ENGINE_load_builtin_engines();
OpenSSL_add_all_algorithms();
ENGINE_register_all_pkey_asn1_meths();
ENGINE *eng = ENGINE_by_id("kncagost");
int rc = 0;
rc = ENGINE_init(eng);
if (0 == rc) {
printf("ENGINE_init failed\n");
ERR_print_errors_fp(stderr);
abort();
}
return 0;
}
Компиляция:
gcc -o app example.c -I`pwd`/include -L`pwd` -lcrypto -L`pwd`/engines -lkncagost
Запуск:
LD_PRELOAD=`pwd`/libcrypto.so ./app
Вывод:
ENGINE_init failed
139783884961432:error:25066067:lib(37):func(102):reason(103):dso_dlfcn.c:187:filename(/home/ai/sdk/linux64dynamic/lib/engines/libkncagost.so): /home/ai/sdk/linux64dynamic/lib/engines/libkncagost.so: cannot open shared object file: No such file or directory
139783884961432:error:25070067:lib(37):func(112):reason(103):dso_lib.c:244:
139783884961432:error:260B6084:lib(38):func(182):reason(132):eng_dyn.c:450:
139783884961432:error:2606A074:lib(38):func(106):reason(116):eng_list.c:417:id=kncagost
139783884961432:error:26077043:lib(38):func(119):reason(67):eng_init.c:126:
Aborted (core dumped)
Предлагаю следующие варианты решения проблем:
* Добавить переменную окружения KNCA_GOST_ENGINE_PATH, в которую пользователи SDK смогут задать путь к папке криптопровайдера
* Добавить требуемые параметры компиляции ("-fPIC") для статичной бибблиотеки, чтобы обеспечить ее совместную компиляцию с динамичными билиотеками для использования в механизме ruby extensions.
(
www.quora.com/When-exactly-should-I-use-GCCs-fPIC-option)
* Добавить инструкции по подключению движка крипторовайдера к установленному в систему OpenSSL