私の理解によると、FIPS準拠は、ハードウェアおよびソフトウェアレベルでのコンプライアンスです。
FIPS 140-2は、ハードウェアを中心とする大きなドキュメントです。要件を書いている人は、ハードウェアを組み込んだ電気技術者でした。たとえば、Dr. Randy Easterは暗号モジュール検証プログラム(CMVP)を実行します。彼の簡単なCV:http://www.nist.gov/itl/csd/easter-randy.cfmがここにあります。彼は確かに倍精度浮動小数点型です。)
NISTとCMVPがソフトウェアに要件を戻したとき、丸い穴に四角いペグを打ちました。あなたはソフトウェアの文脈で全く意味を成さない多くのものを見つけるでしょう。たとえば、OpenSSL(および他のFIPS検証済みライブラリ)は、ソフトウェア自体のソフトウェアの完全性を検証するためにHMAC(対称)キーを格納します。 (キーがROMに焼かれたとき、ヒューズが切れたとき、耐タンパー性のPCBに、そして耐タンパー性のあるエンクロージャーでは、その多くの違いがあります)。
完全性については、Implementation Guidance for FIPS PUB 140-2 and the Cryptographic Module Validation Programの承認テスト方法をご覧ください。彼らは本当にCMACとHMACを含んでいます。
... Androidアプリは、FIPS準拠します...検証および検証されていない:最初の
まず物事:)
暗号モジュール検証プログラム(CMVP)によると、2つの暗号化の種類があります。 「準拠」とは何も意味しません(「適合」、「承認」、「同等」など)。
あなたのアプリは検証された暗号を使用するか、検証された暗号を使用しません。アプリが「準拠」暗号を使用していると述べた場合、有効な暗号を使用しているのはではなく、です。典型的なマーケティングミスはhttp://webdrive.com/support/webdrive/v11/fips_compliance.htmです。
私は、スイッチメーカーのマーケティング部門が「FIPS Validated」ではなく「FIPS Compliant」と呼んでいるため、DHSがFederalからスイッチを束ねていることを知っています。
1)私が作りたい場合、私は私のプロジェクトで使用される唯一の暗号化モジュールはFIPS準拠 を持っている場合は、私のAndroidアプリは、FIPS準拠、それは十分でしょうか?
いいえこの番号には2つの部分があります。最初は手順であり、モジュールのセキュリティポリシーに記載されています。たとえば、OpenSSLにはソースからビルドする手順があり、手順から逸脱することはできません。
2番目は使用法(より良い用語がないため)であり、FIPS 140-2の運用要件に準拠する必要があります。たとえば、AESで暗号化されたメッセージを送信する場合は、キーとivを再利用することはできません。
何かに該当するもの:FIPS_mode_set
を呼び出す必要があり、ゼロ以外の値を返す必要があります。 FIPS_mode_set
に電話をかけられないとエラーが発生し、検証された暗号化を使用していないことを意味します。 FIPS_mode_set
からのエラーは操作上のエラーで、有効な暗号化を使用していないことを意味します。
OpenSSLを使用している場合は、データシートに「vendor affirmed」も含めて、1747証明書を引用する必要があります。私はそれがセキュリティポリシーの要件であると考えており、それを提供できないと、あなたの暗号はではなく、が有効であることを意味します! AndroidのSDKが提供する
暗号モジュールははBouncyCastle ライブラリであり、FIPS準拠ではありません。
私はバウンシーキャッスルを使用しないため、そのステータスはわかりません。ライブラリが検証されている場合は、CMVPによって発行された証明書が存在します。あなたはValidated FIPS 140-1 and FIPS 140-2 Cryptographic Modulesでそれらを見ることができます。
私はstackoverflowのリンクごとに私のプロジェクト にOpenSSLライブラリFIPS準拠を使用しています
また、OpenSSLののウィキ試してみてください:FIPS Library and Androidを。
完全性のために、OpenSSL用のAndroidのビルドシステムを使用することはできません。その後、FIPSで検証済みの暗号化を請求することはできません。セキュリティポリシーで公開されている手順との相違点であり、検証を無効にします。 AndroidのドキュメントのためのFIPSのOpenSSLモジュールによれば
、 モジュールはのARMv7アーキテクチャ の異なるAndroidデバイス上でテストされています。
これは解くのに難しい領域です。スティーブ・マーカスはOpenSSL FIPS 2.0 Object Module platform questionsでそれに答えようとしました。
これは私の理解ではないかもしれません。プラットフォームが検証されると、CMVP(Cryptographic Module Validation Program)によってマイナーな変更が容認されます。私は「プラットフォーム」が何であるかを避けていますが、マザーボード、プロセッサ、命令セット、その他の運用上の影響を含みます。一般に、ランタイムライブラリのような環境への影響は含まれません。
たとえば、アップル社は、A6プロセッサ搭載のiPadのマザーボードを少し変更することができます(フォームファクタを変更したり、改良された内蔵カメラを提供している可能性があります)。それは、A6プロセッサ自体にわずかな変更を加えることさえできます(恐らくキャッシュサイズを増やす)。彼らは彼らが望むもの(IpAd 3、iPad 4、またはFan Boiをくすぐるもの)を呼び出すことができます。しかし、同じマザーボードに搭載されているA7プロセッサは、大きな改訂版があるため、別の検証が必要になります。同じことが命令セットにも当てはまります:armv7とarmv7sは別々のバリデーションが必要です。
別の例として、ARMv7プロセッサを考えてみましょう。 ARMv7を使用するSnapdragonプロセッサは、ARM Holdings社のClassic ARM7EJ-Sとは異なるプラットフォームです。両方とも個別のバリデーションが必要でした。 NEONはARMv7であり、別の検証があります(ARMv7の上にいくつかのマルチメディア命令が追加されたと思います)。
CMVPは、いつでも気を変えてマイナーなプラットフォームの変更を許さないようにすることができます。
ウィルAndroidのハードウェアがある限り(ハードウェアを含む)プラットフォームが以前に検証されたよう ここで問題
いいえ、FIPS準拠されていません。プラットフォームは以前に検証されなかった場合は、その問題;)
3)AESアルゴリズムは、FIPS準拠の下にあります。この は、JavaコードでAESアルゴリズムを使用すると、 というFIPS準拠のOpenSSLライブラリを使用していて、その FIPSに準拠していないことを意味しますか?
正しい。 JavaコードはFIPS検証済みではないため、アプリはFIPS検証済み暗号化を使用できません。
完全性のために、暗号アルゴリズム検証プログラム(CAVP)もあります。 CAVPは、証明書を発行してAES実装を承認します。たとえば、OpenSSLののAESの実装では、(CAVPなど)他のNISTの部門はあなたのモジュールの検査を終了した後、その後、CMVPは、サインオフをし、最終的には証明書1884、2116、2234、2342、2394と2484.
を発行されていますモジュール全体(全体として)に証明書を発行します。たとえば、NISTはOpenSSLの証明書1747を発行しました。
AESは、FIPS準拠の下にある場合は、何それはAESの JavaやC#実装としなければなりません。彼らは両方とも をCMVPに渡す必要がありますか? AndroidとJavaの下で
- 、JNIを使用して、共有オブジェクトを呼び出す:
あなたはOpenSSLを検証済みFIPSを使用しているので、あなたがする必要があります。共有オブジェクトは、OpenSSLのFIPSで検証された暗号化を提供する必要があります。
C#では、P/InvokeまたはIneropを使用して、ダイナミックリンクライブラリを呼び出します。ダイナミックリンクライブラリは、OpenSSLのFIPSで検証された暗号化を提供する必要があります。
私はすなわちlibssl.aのOpenSSL ライブラリを使用して、私のプロジェクトライブラリを構築しているとlibcrypto.aは、FIPSモジュールを使用して構成され
。
fipsld
とincore
を静的ライブラリで実行することはできません。何か問題があるように聞こえます。実行可能ファイルと共有オブジェクトでのみ実行できます。 fipsld
とincore
が連携し、FIPS関連のコードとデータの署名を実行可能な共有ライブラリまたはアプリに埋め込みます。 FIPS関連のコードとデータは、(1)fipscanister.o
と(2)fips_premain.c
に由来します。
fipsld
はfips_premain.c
をコンパイルし、実行可能な共有オブジェクトまたはアプリにfipscanister.o
をリンクします。 incore
は、実行ファイル、共有オブジェクト、またはアプリに署名を書き込みます。 FIPS_mode_set
に電話すると、HMACを介してFIPS関連コードとデータの整合性が検証され、FIPS関連の自己テストが実行されます。すべて成功した場合、FIPS_mode_set
はゼロ以外の値を返し、FIPSで検証された暗号化を使用しています。
参考として、OpenSSLはwikiページを提供しています:FIPS Library and Android。プロジェクトmake
を実行したときにCC
とFIPSCC_LD
を設定する方法については、fipsld
とincore
が「ちょうどよい」と説明しています。
同等のiOSページはありません。しかし、あなたはOpenSSL FIPS User Guide 2.0の付録E.
で見つけることができます。GoogleがAndroid Open Sourceプロジェクトでfipsバージョンのlibcryptoを使用しない(または独自のものを使用しない)理由についての洞察はありますか? – Blaze
ブレイズ - いいえ、分かりません。彼らは参照ハードウェア(以前はSamsung Nexus 4、現在はLG Nexus 5)の検証をスポンサーすることができますが、各プラットフォームは独自の検証が必要です。それはOEMの責任です。 – jww
それぞれのプラットフォームで独自の検証が必要なのはなぜですか?あなたが言うように - 「プラットフォームが検証されると、CMVP(Cryptographic Module Validation Program)によってプラットフォームへのマイナーチェンジが許容されます。」 OpenSlの人々がarmv7アンドロイドプラットフォームのためにいいと言っているのは、この論理です。 – Blaze