简体   繁体   English

用openssl / bn.h将C ++转换为python

[英]swig c++ to python with openssl/bn.h

I'm trying to create a *.so file for further use in Python using SWIG. 我正在尝试创建一个* .so文件,以便在使用SWIG的Python中进一步使用。 In particular I'm using some libraries from openssl (such opensll/bn.h). 特别是我正在使用来自openssl的一些库(例如opensll / bn.h)。 But somehow it return error ImportError: [...]/auxchash.so: undefined symbol: BN_bn2hex . 但是,它以某种方式返回错误ImportError: [...]/auxchash.so: undefined symbol: BN_bn2hex

I have the file.cpp, auxchash.cpp: 我有file.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;
}

The file.h, auxchash.h: file.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);

The file.i for the swig module, auxchash.i: swig模块auxchash.i的file.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);

Finally a file setup.py to create all the needed swig files, setup.py: 最后,创建一个文件setup.py来创建所有必需的swig文件setup.py:

from distutils.core import setup, Extension


auxchash_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"],
   )

And all of them are compiled with terminal commands: 它们都是使用终端命令编译的:

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

So far so good, it compile without errors. 到目前为止一切顺利,它可以正确编译。 But then when I run a python main: 但是然后当我运行python main时:

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

It gives my the following error: 它给了我以下错误:

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

I don't know how to figure it out. 我不知道该怎么解决。

You need to link your module against OpenSSL, egsomething like: 您需要将模块链接到OpenSSL,例如:

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

(You might only need crypto in that list, I can't quite remember/tell right now) (您可能只需要该列表中的加密货币,我现在不太记得/告诉我)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM