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 +++
