私は openssl を初めて使用し、openssl から openssl-fips-2.0.1 コードをダウンロードしましたが、ドキュメントとセキュリティ ポリシーに記載されている FIPS_mode_set() の定義をたどることができませんでした。ただし、fips.c で fips_set_mode() を見つけましたが、同じものを参照していません。よろしいですか?
定義はどこにありますか?教えてください。
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/gcc
LD
まず、コンパイルしますfips_premin.c
。次に、real を呼び出して、作成ld
したすべてのオブジェクト ファイルと最終的なリンクを実行しますfips_premain.o
。最後にincore
、FIPS オブジェクト モジュールで swap を呼び出し、関連するtext
and 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
次に、標準化config
とmake
. 場合によっては、 を実行してからconfig
調整CC
しFIPSLD_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.1e
openssl-1.0.1f
ctags
また、何かを見つけてジャンプするのに役立つソース コード ブラウザーのようなものを検討することもできます。Sourceforge のExuberant Ctagsを参照してください。
リンケージは(静的リンケージおよびランタイム リンケージの場合)FIPS_mode_set()
から利用できる必要があります。libcrypto
*.a
*.so
libcrypto.a/.so
ディストリビューションの開発者パッケージに付属してopenssl
いるか、自分自身を構築した結果として 付属していますopenssl-x.y.z
。
のソースは、ファイルFIPS_mode_set()
の のソースにあります。openssl-x.y.z
crypto/o_fips.c
ヘッダファイルを参照してくださいcrypto.h
。次のように、566行目にその定義を見つけることができます。
int FIPS_mode_set(int r);
ドキュメントには、ヘッダー ファイルにあることが明確に記載されています<openssl/crypto.h>
。
そのため、コードに includeopenssl/crypto.h
して、この関数の定義を含めます。他の問題に直面した場合は、役立つ可能性のある OpenSSL の質問を閲覧できます。