質問

以前の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の個人情報を使用せずにこの機能を実行する方法はありますか?

役に立ちましたか?

解決

さらに読んだ後、なぜ問題が発生したのか、どうやって回避するのかを見つけました。この問題は、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行のすぐ下。

他のヒント

次のようなtypedefを作成する独自のヘッダーを作成できますか

typedef t_stack_SSL_CIPHER STACK_OF(SSL_CIPHER)

その後、.iファイルでdo

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top