Tink を使用して FIPS 140-2 セキュリティ要件を満たす

Tink 自体は FIPS 140-2 検証を受けていません。ただし、いくつかの FIPS 140-2 承認済みアルゴリズムをサポートしており、基盤となる実装では BoringSSLs BoringCrypto などの検証済み暗号モジュールを利用できます。Tink には、FIPS モードで BoringSSL を構築するための WORKSPACE が含まれています。

なお、Workspace は、BoringSSL の使用が FIPS を遵守することを保証するものではありません。BoringCrypto の公式セキュリティ ポリシーを読むことを強くおすすめします。

サポートされているアルゴリズム

Tink の次のアルゴリズムは、FIPS 140-2 に基づいて承認されています(詳細については、FIPS 140-2 Annex A をご覧ください)。

  • 認証付き暗号化
    • AES-GCM
    • AES-CTR-HMAC-SHA256
  • MAC
    • HMAC-SHA256
    • AES-CMAC
  • デジタル署名
    • ECDSA
    • RSA-SSA-PKCS1
    • RSA-SSA-PSS

C++ の FIPS 専用モード

FIPS 140-2 承認済みアルゴリズムと検証済みの実装を使用する必要がある場合は、FIPS 専用モードで Tink をビルドできます。これにより、使用が承認済みのアルゴリズムに制限され、Tink が検証済みの暗号モジュールを使用しているかどうかがチェックされます。

これにより、Tink の動作が次のように変わります。

  • Register() 関数は、FIPS 検証済みの実装を含むアルゴリズムのみを登録します。つまり、検証済みの暗号モジュールを使用するアルゴリズムの鍵セットをのみ使用できます。
  • Tink は、BoringSSL が BoringCrypto モジュールでビルドされているかどうかを確認します。モジュールが利用できない場合、プリミティブを呼び出すと INTERNAL エラーが返されます。
  • subtle/ でのプリミティブの使用は、検証済みの暗号モジュールを利用するアルゴリズムに限定されます。

BoringCrypto

Tink は、C++ で BoringCrypto を使用して、検証済みの暗号モジュールへのアクセスを提供します。FIPS のみのモードでは、現在の検証ステータスにより、使用可能なアルゴリズムに次の制約が追加されます。

  • AES-CMAC は検証されていないため、使用できません
  • RSA-SSA-PKCS1 は 3,072 ビットのモジュラスに制限されます
  • RSA-SSA-PSS は 3,072 ビットのモジュラスに制限される

Bazel で BoringCrypto モジュールを使用するには、C++ WorkSPACEboringssllocal_repository 定義のコメント化を解除します。

コンパイル時に有効にする

FIPS 専用モードで Tink をビルドするには、コンパイル時にフラグを設定します。

bazel build ... --//third_party/tink/cc/config:use_only_fips=True

Tink が FIPS 専用モードでビルドされているかどうかを実行時に確認するには、定数 kUseOnlyFips を提供するヘッダー internal/fips_utils.h を含めます。

FIPS 専用モードで Tink をビルドしていない場合でも、一部のアルゴリズムでは検証済み実装を利用できますが、他のアルゴリズムの使用は制限されません。

実行時に有効にする

FIPS 専用モードで Tink をビルドする代わりに、config/tink_fips.h から crypto::tink::RestrictToFips() を呼び出すこともできます。これは、実行時にフラグを設定して FIPS プリミティブに対する制限を有効にします。

警告: ランタイム オプションを使用する場合は、鍵マテリアルの処理、鍵マネージャーの登録、その他の Tink 機能の前に crypto::tink::RestrictToFips() を呼び出す必要があります。また、BoringSSL が BoringCrypto モジュールでビルドされていることを確認する必要があります。そうしないと、Tink でデータを処理できません。