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 マクロでも同じ問題に遭遇しました。残念ながら、それは stdio.h なども含まれている lhash.h に含まれていますが、これは望ましくありません (そして、私のビルドは実際には、セットアップされた方法でそれらを見つけることができません)。私のビルドでは、swig に -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);
}

...そして、コンパイル時にヘッダーを適切な場所に #include しますか?

于 2009-07-31T05:57:05.253 に答える