openssl-migration

Tips to upgrade/migrate OpenSSL lib versions.


Project maintained by KazKobara Hosted on GitHub Pages — Theme by mattgraham

コンパイル時に鍵構造体要素の参照に対して以下のような “incomplete type” エラーが出る場合

例えば、以下など。

error: dereferencing pointer to incomplete type ‘RSA’ {aka ‘struct rsa_st’}
error: dereferencing pointer to incomplete type ‘DSA’ {aka ‘struct dsa_st’}
error: dereferencing pointer to incomplete type ‘DH’ {aka ‘struct dh_st’}
error: dereferencing pointer to incomplete type ‘BN_MONT_CTX’ {aka ‘struct bn_mont_ctx_st’}

対処方法

Ver. 1.1 からは、鍵要素の取り出しは *_get*() 関数 (RSA_get0_key() など) 書込み/書換えは *_set*() 関数(RSA_set0_key() など)を使う。

以下は説明のための疑似コード。実験用のコード: RSA_()用](/openssl-migration/src/set_and_get_rsa.c), [DH_()用

xxx = key->n から *_get*(key, ) への変更例

    /* 宣言 */
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
    /* *_get*() で受ける BIGNUM は const にし、ポインタ定数として宣言する。 */
    const BIGNUM *cbn_to_get_p = NULL;
#endif

    /* RSA鍵の要素 n のアドレスを取り出す場合 */
#if OPENSSL_VERSION_NUMBER < 0x10100000L
    /*** compile error が出る箇所 ***/
    xxx = key->n;  /* ここで key は RSA, DSA, DHなどの鍵構造体 */
#else
    RSA_get0_key(key, &cbn_to_get_p, NULL, NULL);
    xxx = cbn_to_get_p;
#endif

    /* メモリ解放 */
    /* _get*() で受けた const BIGNUM ポインタ定数は BN_free() しないこと。*/
    /* ({RSA,DSA,DH}_free() などで解放されるため) */
    // BN_free(cbn_to_get_p)

*_get*()の補足

key->n = yyy から *_set*(key, ) への変更例

    /* 宣言 */
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
    /* *_set*() で渡す BIGNUM には const は付けず、ポインタ変数として宣言し、NULL を入れておく。 */
    BIGNUM *bn_to_set_p = NULL;  /* *_set*()用 */
#endif
    BIGNUM *bn_p = NULL;         /* *_set*()以外用のBIGNUMポインタ変数 */

    /* RSA鍵の要素 n を更新する場合 */
#if OPENSSL_VERSION_NUMBER < 0x10100000L
    /*** compile error が出る箇所 ***/
    key->n = yyy;  /* ここで key は RSA, DSA, DHなどの鍵構造体 */
#else
    bn_to_set_p = yyy;
    if (!RSA_set0_key(key, bn_to_set_p, NULL, NULL)){
        /* エラー処理 */
    }
    /* _set*() で渡した BIGNUM ポインタ変数は ({RSA,DSA,DH}_free() などで解放されるため)、使用後のポインタに NULL を入れておくこと(もし、入れないのであれば以降で BN_free()しないこと)。*/
    bn_to_set_p = NULL;
#endif

    /* メモリ解放 */
    /* memory leak を防止するため、宣言された(constでない) BIGNUM ポインタ変数はいずれも BN_free() されいる(かNULLとなっている)こと。 */
    BN_free(bn_p);
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
    BN_free(bn_to_set_p);  /* 使用後 NULL を入れておく(or BN_free()しない)こと。 */
#endif

*_set*()の補足