2

私は openssl を初めて使用し、openssl から openssl-fips-2.0.1 コードをダウンロードしましたが、ドキュメントとセキュリティ ポリシーに記載されている FIPS_mode_set() の定義をたどることができませんでした。ただし、fips.c で fips_set_mode() を見つけましたが、同じものを参照していません。よろしいですか?

定義はどこにありますか?教えてください。

4

3 に答える 3

3

FIPS_mode_set() コードが openssl パッケージに見つかりません

あなたは尋ね方を知っている必要があります...

openssl-1.0.1f$ grep -R FIPS_mode_set *
apps/openssl.c:     if (!FIPS_mode_set(1)) {
CHANGES:  *) Functions FIPS_mode_set() and FIPS_mode() which call the underlying
crypto/cpt_err.c:{ERR_FUNC(CRYPTO_F_FIPS_MODE_SET), "FIPS_mode_set"},
crypto/evp/evp_cnf.c:   if (!FIPS_mode() && !FIPS_mode_set(1))
crypto/crypto.h:int FIPS_mode_set(int r);
crypto/o_fips.c:int FIPS_mode_set(int r)
Binary file fips_premain_dso matches
ssl/ssltest.c:      if(!FIPS_mode_set(1))
util/libeay.num:FIPS_mode_set    3253    EXIST::FUNCTION:
openssl-1.0.1f$ 

宣言は にcrypto/crypto.hあり、定義は にありcrypto/o_fips.cます。ここからo_fips.cです:

int FIPS_mode_set(int r)
    {
    OPENSSL_init();
#ifdef OPENSSL_FIPS
#ifndef FIPS_AUTH_USER_PASS
#define FIPS_AUTH_USER_PASS "Default FIPS Crypto User Password"
#endif
    if (!FIPS_module_mode_set(r, FIPS_AUTH_USER_PASS))
        return 0;
    if (r)
        RAND_set_rand_method(FIPS_rand_get_method());
    else
        RAND_set_rand_method(NULL);
    return 1;
#else
    if (r == 0)
        return 1;
    CRYPTOerr(CRYPTO_F_FIPS_MODE_SET, CRYPTO_R_FIPS_MODE_NOT_SUPPORTED);
    return 0;
#endif
    }

FIPS_mode_set特別な設定で「FIPS モード」に入るか、いくつかのアルゴリズムを切り替えることを探していた場合、このステップではそれは起こりません。

リンクすると早くなります。ボンネットの下で何が起こるかfipsldというと、コンパイラであり、の呼び出しを探しますLD。が呼び出されない場合LDは、通常のコンパイラ (おそらく) を呼び出すだけです。の呼び出しを検出すると、次の3 つのことを行います。fipsld/usr/bin/gccLD

まず、コンパイルしますfips_premin.c。次に、real を呼び出して、作成ldしたすべてのオブジェクト ファイルと最終的なリンクを実行しますfips_premain.o。最後にincore、FIPS オブジェクト モジュールで swap を呼び出し、関連するtextand data(関連とは FIPS コードとデータを意味します) の署名を計算し、署名を実行可能ファイルに埋め込みます。

署名は HMAC で生成され、キーは実行可能ファイルに埋め込まれます。それについて特別なことは何もなく、世界中のすべての実行可能ファイルで一定です。使用されるキーは次のとおりetaonrishdlcupfmです。


実行可能ファイルをビルドするときに特別な手順を実行していない場合は、おそらくいくつかの手順が不足しています。fipsldとを使用する手順は次のincoreとおりです。

$ export CC=`find /usr/local -name fipsld`
$ echo $CC 
/usr/local/ssl/fips-2.0/bin/fipsld
$ export FIPSLD_CC=`find /usr/bin -name gcc`
$ echo $FIPSLD_CC 
/usr/bin/gcc

次に、標準化configmake. 場合によっては、 を実行してからconfig調整CCFIPSLD_CC、 を実行する必要がmakeありconfigます。場合によっては、Makefileアフターを開いて にconfig変更CCする必要があります/usr/local/ssl/fips-2.0/bin/fipsld。特定のパッケージングを回避するために、これを行う方法はたくさんあります。


openssl から openssl-fips-2.0.1 コードをダウンロードしましたが、FIPS_mode_set() の定義までトレースできませんでした。

openssl-fips-NNNセキュリティ ポリシーに従って FIPS オブジェクト モジュールを構築すると FIPS で検証された暗号化が提供されます。OpenSSL FIPS 1402- セキュリティ ポリシーは、こちら にあります。

ダウンロードしてビルドしただけのopenssl-fips-NNN場合は、FIPS で検証された暗号化を使用していない可能性があります。従うべき手順があり、それにはソース コードの「信頼できる」コピーを取得することが含まれます。署名をダウンロードして検証することはできますが、FIPS で検証された署名チェッカーが必要です。ソースからビルドできないため、ニワトリが先か卵が先かの問題が発生します。したがって、実際的な解決策は、OpenSSL Foundation から CD を注文することです。その奇妙ですが、それは真実です。たとえば、OpenSSL FIPS User GuideまたはOpenSSL FIPS Security Policyの Appendix B, Controlled Distribution File Fingerprint を参照してください。

FIPS オブジェクト モジュールをビルドしてインストールしたら、ライブラリの FIPS 対応バージョンをビルドできます。FIPS 対応 OpenSSL は、利用可能な場合、FIPS オブジェクト モジュールを使用します。「プラグ可能な」アーキテクチャと考えてください。

ライブラリの FIPS 対応バージョンは、 や などの単純なopenssl-NNNです。それはあなたが知っていて愛しているものです。openssl-1.0.1eopenssl-1.0.1f


ctagsまた、何かを見つけてジャンプするのに役立つソース コード ブラウザーのようなものを検討することもできます。Sourceforge のExuberant Ctagsを参照してください。

于 2014-01-31T21:43:23.673 に答える
2

リンケージは(静的リンケージおよびランタイム リンケージの場合)FIPS_mode_set()から利用できる必要があります。libcrypto*.a*.so

libcrypto.a/.soディストリビューションの開発者パッケージに付属してopensslいるか、自分自身を構築した結果として 付属していますopenssl-x.y.z

のソースは、ファイルFIPS_mode_set()の のソースにあります。openssl-x.y.zcrypto/o_fips.c

于 2013-12-22T12:22:55.630 に答える
2

ヘッダファイルを参照してくださいcrypto.h。次のように、566行目にその定義を見つけることができます。

int FIPS_mode_set(int r);

ドキュメントには、ヘッダー ファイルにあることが明確に記載されています<openssl/crypto.h>

そのため、コードに includeopenssl/crypto.hして、この関数の定義を含めます。他の問題に直面した場合は、役立つ可能性のある OpenSSL の質問を閲覧できます。

于 2013-12-22T09:33:15.863 に答える