2

使用之前的 OpenSSL 版本,可以在 SWIG .i 文件中执行此操作:

STACK *ssl_get_ciphers(SSL *ssl) {
    return (STACK *)SSL_get_ciphers(ssl);
}

对于 OpenSSL 1.0.0beta3,这会失败,因为似乎不再定义 STACK。新的 OpenSSL 试图在类型检查方面做得更好,所以应该使用 STACK_OF 宏,它的定义如下:

#define STACK_OF(type) struct stack_st_##type

如果我将上面的代码更改为使用 STACK_OF:

STACK_OF(SSL_CIPHER) *ssl_get_ciphers(SSL *ssl) {
    return SSL_get_ciphers(ssl);
}

然后 SWIG 不喜欢这样:

Error: Syntax error in input(1).

我可以通过将其更改为:

struct stack_st_SSL_CIPHER *ssl_get_ciphers(SSL *ssl) {
    return SSL_get_ciphers(ssl);
}

但这显然不好,因为 OpenSSL 可能会在不同版本之间更改宏。有 _STACK 结构,但同样是 OpenSSL 私有细节,可能会随着版本的不同而变化。堆栈也可以作为参数传入,如下所示:

int sk_x509_num(STACK_OF(X509) *stack) {
    return sk_num(stack);
}

SWIG 也不喜欢哪个。

有没有办法在不使用 OpenSSL 私有详细信息的情况下完成这项工作?

4

2 回答 2

1

经过更多阅读后,我发现了为什么会出现问题,以及如何解决它。问题的发生是因为 SWIG 的预处理器不知道 STACK_OF 宏,所以这就是 SWIG 失败的原因。我可以通过在我的 .i 文件中添加它来解决这个问题:

%include <openssl/safestack.h>

现在我也遇到了与 LHASH_OF 宏相同的问题。不幸的是,它包含在 lhash.h 中,其中还包含我不想要的 stdio.h 等(而且我的构建实际上找不到它们的设置方式)。我的构建恰好需要 -includeall 命令行选项来痛饮。所以不幸的是,使用 LHASH_OF 我最终从 OpenSSL 复制了定义:(

#define LHASH_OF(type) struct lhash_st_##type

就在我上面提到的 %include 行的正下方。

于 2009-08-01T06:54:40.983 回答
0

您可以创建自己的标头,使 typedef 像这样:

typedef t_stack_SSL_CIPHER STACK_OF(SSL_CIPHER)

然后在 .i 文件中执行

t_stack_SSL_CIPHER *ssl_get_ciphers(SSL *ssl) {
    return SSL_get_ciphers(ssl);
}

...并在编译时将您的标头#included 放在正确的位置?

于 2009-07-31T05:57:05.253 回答