Swig C ++ для Python с openssl / bn.h

Я пытаюсь создать файл * .so для дальнейшего использования в Python, используя SWIG. В частности, я использую некоторые библиотеки из openssl (такие как opensll / bn.h). Но как-то это возвращает ошибку ImportError: [...]/auxchash.so: undefined symbol: BN_bn2hex,

У меня есть файл .cpp, auxchash.cpp:

#include auxchash.h

int keygen(int bits, char *p, char *q, char *g, char *hk, char *tk){
BN_CTX *ctx = BN_CTX_new();
BIGNUM *bn_p = BN_new();
BIGNUM *bn_q = BN_new();
BIGNUM *bn_g = BN_new();
BIGNUM *bn_hk = BN_new();
BIGNUM *bn_tk = BN_new();
BIGNUM *bn_two = BN_new();

BN_CTX_init(ctx);

BN_dec2bn(&bn_two, "2"); //initialize a BIGNUM with value 2

//on non-unix platform needs to initialize the PRNG with randomness
//or BN_generate_prime_ex may fail

//computing the safe prime p and q = (p-1)/2
BN_generate_prime_ex(bn_p, bits, 1, NULL, NULL, NULL);
BN_sub(bn_q, bn_p, BN_value_one());
BN_div(bn_q, NULL, bn_q, bn_two, ctx);

//finding the generator g (for the group QR_p)
BN_rand_range(bn_g, bn_p);
BN_mod_exp(bn_g, bn_g, bn_two, bn_p, ctx);

//choosing the keys hk and tk
BN_rand_range(bn_tk, bn_q);
BN_mod_exp(bn_hk, bn_g, bn_tk, bn_p, ctx);

//converting from BIGNUM to hex
p = BN_bn2hex(bn_p);
q = BN_bn2hex(bn_q);
g = BN_bn2hex(bn_g);
hk = BN_bn2hex(bn_hk);
tk = BN_bn2hex(bn_tk);

//freeing the resources
BN_CTX_free(ctx);
BN_free(bn_two);
BN_free(bn_p);
BN_free(bn_q);
BN_free(bn_g);
BN_free(bn_hk);
BN_clear_free(bn_tk);

return 0;
}

Файл .h, auxchash.h:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<openssl/bn.h>
#include<openssl/sha.h>
#include<openssl/rand.h>

int keygen(int bits, char *p, char *q, char *g, char *hk, char *tk);

Файл .i для модуля swig, auxchash.i:

%module auxchash
%{
#define SWIG_FILE_WITH_INIT
#include "auxchash.h"#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<openssl/bn.h>
#include<openssl/sha.h>
#include<openssl/rand.h>
%}

%include "typemaps.i"%include "cstring.i"
%cstring_bounded_output(char *p, 1024);
%cstring_bounded_output(char *q, 1024);
%cstring_bounded_output(char *g, 1024);
%cstring_bounded_output(char *hk, 1024);
%cstring_bounded_output(char *tk, 1024);
extern int keygen(int bits, char *p, char *q, char *g, char *hk, char *tk);

Наконец, файл setup.py для создания всех необходимых файлов swig, setup.py:

from distutils.core import setup, Extensionauxchash_module = Extension('_auxchash',
sources=['auxchash_wrap.cxx', 'auxchash.cpp'],
)

setup (name = 'auxchash',
version = '0.1',
author      = "SWIG Docs",
description = """Simple swig example from docs""",
ext_modules = [auxchash_module],
py_modules = ["auxchash"],
)

И все они скомпилированы с терминальными командами:

swig -c++ -python auxchash.i
python setup.py build_ext --inplace

Пока все хорошо, он компилируется без ошибок. Но потом, когда я запускаю Python Main:

import auxchash
res,p,q,g,hk,tk = auxchash.keygen(10)

Это дает мне следующую ошибку:

File: "[...]/auxchash.py" import auxchash
File: "[...]/auxchash.py" auxchash=swig_import_helper()
File: "[...]/auxchash.py" return=importlib.import_module('_auxchash')
File: "[...]/__init.py__" __import__(name)`
ImportError: [...]/auxchash.so: undefined symbol: BN_bn2hex

Я не знаю, как это понять.

1

Решение

Вам нужно связать свой модуль с OpenSSL, например, что-то вроде:

auxchash_module = Extension('_auxchash',
sources=['auxchash_wrap.cxx', 'auxchash.cpp'],
libraries=['crypto', 'ssl'],
)

(Вам может понадобиться только крипто в этом списке, я не могу вспомнить / рассказать прямо сейчас)

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector