尝试Base64编码带有LuaJIT FFI绑定到OpenSSL的BIO_f_base64()的字符串时出现意外的“未找到符号”错误

时间:2016-11-16 15:07:17

标签: c lua openssl ffi luajit

我正在尝试将此示例(找到here)从openssl文档转换为与LuaJIT的FFI一起使用。向下滚动以查看完整的Lua代码。

BIO *bio, *b64;
char message[] = "Hello World \n";

b64 = BIO_new(BIO_f_base64());
bio = BIO_new_fp(stdout, BIO_NOCLOSE);
BIO_push(b64, bio);
BIO_write(b64, message, strlen(message));
BIO_flush(b64);

BIO_free_all(b64);

但是当我在代码ssl.BIO_flush(b64)中找到这一行时,我收到以下错误(从LuaJIT解释器而不是文件运行) stdin:1: Symbol not found: BIO_flush stack traceback: [C]: in function '__index' stdin:1: in main chunk [C]: at 0x0ac2cdd2f176

我知道还有很多其他方法可以进行base64编码,此时我已经切换到纯Lua解决方案。我仍然想了解为什么我收到此错误,因为部分我正在研究这个项目以了解有关LuaJIT FFI接口的更多信息,而openssl已经是我已经使用的libcurl的依赖项(使用OAth访问各种API)我希望尽可能地保持我的依赖性。

我已经成功使用了openssl的HMAC()身份验证功能(从LuaJIT的FFI找到了here),所以通过阅读文档和试错,我对LuaJIT的FFI界面非常熟悉。下面是Lua代码。我必须浏览 MANY openssl头文件才能到达ffi.cdef[[]],但似乎我可能仍然遗漏了一些东西。任何帮助都会受到赞赏。

编辑:只是为了测试BIO_flush()是否在某种程度上是可选的,我也排除了那条线并且完全没有错误地通过我的代码然后我检查了输出文件,它是空白的。

ffi = require "ffi"

ffi.cdef[[
typedef struct bio_method_st BIO_METHOD;
typedef struct bio_st BIO;

typedef void bio_info_cb(BIO *, int, const char *, int, long, long);
struct crypto_ex_data_st { struct stack_st_void *sk; };
typedef struct crypto_ex_data_st CRYPTO_EX_DATA;
typedef void CRYPTO_RWLOCK;

typedef long (*BIO_callback_fn)(BIO *b, int oper, const char *argp, int argi,long argl, long ret);
typedef long (*BIO_callback_fn_ex)(BIO *b, int oper, const char *argp,size_t len, int argi,long argl, int ret, size_t *processed);

struct bio_st { const BIO_METHOD *method; BIO_callback_fn callback; BIO_callback_fn_ex callback_ex; char *cb_arg;int init; int shutdown; int flags;int retry_reason; int num; void *ptr; struct bio_st *next_bio;struct bio_st *prev_bio;int references; uint64_t num_read; uint64_t num_write; CRYPTO_EX_DATA ex_data; CRYPTO_RWLOCK *lock; };
struct bio_method_st { int type; const char *name; int (*bwrite) (BIO *, const char *, size_t, size_t *); int (*bwrite_old) (BIO *, const char *, int); int (*bread) (BIO *, char *, size_t, size_t *); int (*bread_old) (BIO *, char *, int); int (*bputs) (BIO *, const char *); int (*bgets) (BIO *, char *, int); long (*ctrl) (BIO *, int, long, void *); int (*create) (BIO *); int (*destroy) (BIO *); long (*callback_ctrl) (BIO *, int, bio_info_cb *); };

typedef struct { char *fpos; void *base; unsigned short handle; short flags; short unget; unsigned long alloc; unsigned short buffincrement; } FILE;

BIO *BIO_new(BIO_METHOD *type);
BIO *BIO_new_fp(FILE *stream, int close_flag);
BIO *BIO_push(BIO *b, BIO *append);
int BIO_write(BIO *b, const void *data, int dlen);
int BIO_read(BIO *b, void *buf, int len);
int BIO_flush(BIO *b);
void BIO_free_all(BIO *a);

BIO_METHOD *BIO_f_base64(void);

FILE *fopen(const char *filename, const char *mode);
int fprintf(FILE *stream, const char *format, ...);
int fclose(FILE *stream);
]]

BIO_NOCLOSE = 0 --# define BIO_NOCLOSE 0x00
BIO_CLOSE = 1 --# define BIO_CLOSE 0x01

ssl = ffi.load('/usr/lib/libssl.so')
f = ffi.C.fopen("/tmp/test", "a+")
bio = ffi.new('BIO')
b64 = ffi.new('BIO')
str = "Hello World"
b64 = ssl.BIO_new(ssl.BIO_f_base64())
bio = ssl.BIO_new_fp(f, BIO_NOCLOSE)
ssl.BIO_push(b64, bio)
=ssl.BIO_write(b64, str, #str) --This yields 11 in the Lua interpreter. This function returns an int with the number of bytes successfully written so apparently the string was written to the file.
ssl.BIO_flush(b64)
ssl.BIO_free_all(b64)

ffi.C.fclose(f)

0 个答案:

没有答案