rtengine и ENGINE_load_private_key
Здравствуйте.
Использую Рутокен ЭЦП, Linux, OpenSSL 1.1.0.
Подпись на Рутокен работает:
$ openssl dgst -engine rtengine -sign 'pkcs11:id=3135' -keyform engine file > sig
Я хочу получить аналогичный результат в коде на C. Примеры, которые поставляются с rtengine мне не подходят, так как они используют pkcs11 интерфейс и требуют линковки с вашей библиотекой pkcs11.
Мне требуется код, который взаимодействует через интерфейс OpenSSL.
Пытаюсь запустить тест по аналогии с
https://stackoverflow.com/questions/406 … ng-openssl
#include <stdio.h>
#include <openssl/engine.h>
typedef struct pw_cb_data {
const void *password;
const char *prompt_info;
}PW_CB_DATA;
int main()
{
int r;
ENGINE *e;
EVP_PKEY * key;
PW_CB_DATA cb;
cb.password = "12345678";
cb.prompt_info = "pkcs11:id=3135";
ENGINE_load_builtin_engines();
ENGINE_load_dynamic();
e = ENGINE_by_id("rtengine");
if (!e){
printf("Can't find engine: %s\n", ERR_reason_error_string(ERR_get_error()));
return -1;
}
if (!ENGINE_init(e)){
printf("Engine initialization failed!\n");
ENGINE_free(e);
return -1;
}
if (ENGINE_set_default(e, ENGINE_METHOD_ALL)) {
printf("Engine %s(%s): Activated.\n", ENGINE_get_name(e), ENGINE_get_id(e));
} else {
printf("Engine %s(%s): Initialized but not usable.\n",
ENGINE_get_name(e), ENGINE_get_id(e));
return -1;
}
OpenSSL_add_all_algorithms();
key = ENGINE_load_private_key(e, "pkcs11:id=3135", UI_OpenSSL(), &cb);
printf("key = %x\n", key);
return 0;
}
$ ./test
Engine Rutoken engine(rtengine): Activated.
Segmentation fault
$
Код падает на ENGINE_load_private_key()
ltrace:
ENGINE_load_builtin_engines(1, 0x7ffc0d5d1578, 0x7ffc0d5d1588, 0) = 1
OPENSSL_init_crypto(1024, 0, 0x7ffc0d5d13f4, 0) = 1
ENGINE_by_id(0x56398512bd60, 0xffffffff, 0x7ffc0d5d13f4, 0) = 0x563986e58560
ENGINE_init(0x563986e58560, 0, 0x563986e46050, 0) = 1
ENGINE_set_default(0x563986e58560, 0xffff, 0x563986e46050, 0) = 1
ENGINE_get_id(0x563986e58560, 0, 0x563986e46050, 0) = 0x7f05af205d93
ENGINE_get_name(0x563986e58560, 0, 0x563986e46050, 0) = 0x7f05af205d9c
printf("Engine %s(%s): Activated.\n", "Rutoken engine", "rtengine") = 44
OPENSSL_init_crypto(12, 0, 0x7f05afbd4760, 0x7fffffe1) = 1
UI_OpenSSL(0x7f05b0069314, 129, 0x7fffffff, 0x7f05af426760) = 0x7f05b0065f80
ENGINE_load_private_key(0x563986e58560, 0x56398512bd51, 0x7f05b0065f80, 0x7ffc0d5d1460 <no return ...>
--- SIGSEGV (Segmentation fault) ---
+++ killed by SIGSEGV +++