FIPS 140-3 準拠

Go 1.24 以降、Go バイナリは FIPS 140-3 準拠を容易にするモードでネイティブに動作できます。さらに、ツールチェーンは Go Cryptographic Module を構成する暗号パッケージのフリーズされたバージョンに対してビルドできます。

FIPS 140-3

NIST FIPS 140-3 は、米国政府の暗号アプリケーションに対する準拠制度であり、とりわけ承認されたアルゴリズムのセットの使用と、対象の動作環境でテストされた CMVP 検証済み暗号モジュールの使用を要求します。

このページで説明されているメカニズムは、Go アプリケーションの準拠を容易にします。

FIPS 140-3 準拠を必要としないアプリケーションは、それらを安全に無視でき、FIPS 140-3 モードを有効にすべきではありません。

注: FIPS 140-3 準拠および検証済みの暗号モジュールを使用するだけで、関連するすべての規制要件を満たせない場合があります。Go チームは、提供される FIPS 140-3 モードの使用が個々のユーザーの特定の規制要件をどのように満たすか、あるいは満たさないかについて、いかなる保証やサポートも提供できません。このモジュールの使用がお客様の特定の要件を満たすかどうかを判断する際には、注意が必要です。

Go Cryptographic Module

Go Cryptographic Module は、FIPS 140-3 承認アルゴリズムを実装する crypto/internal/fips140/... 配下の標準ライブラリ Go パッケージの集合です。

crypto/ecdsacrypto/rand のような公開 API パッケージは、Go Cryptographic Module を透過的に使用して FIPS 140-3 アルゴリズムを実装します。

FIPS 140-3 モード

ランタイムの fips140 GODEBUG オプションは、Go Cryptographic Module が FIPS 140-3 モードで動作するかどうかを制御します。デフォルトは off です。プログラムが開始された後は変更できません。

FIPS 140-3 モードで動作している場合(fips140 GODEBUG 設定が on の場合)

  • Go Cryptographic Module は、init 時に自動的に整合性自己チェックを実行し、ビルド時に計算されたモジュールのオブジェクトファイルのチェックサムとメモリにロードされたシンボルを比較します。

  • すべてのアルゴリズムは、関連する FIPS 140-3 実装ガイダンスに従って、init 時または初回使用時に既知応答自己テストを実行します。

  • 生成された暗号鍵に対してペアワイズ一貫性テストが実行されます。これにより、特定の鍵タイプで最大 2 倍の速度低下が発生する可能性があり、これは特に一時的な鍵にとって重要です。

  • crypto/rand.Reader は NIST SP 800-90A DRBG をベースに実装されています。GODEBUG=fips140=off と同じレベルのセキュリティを保証するため、ランダムバイトはすべての Read でプラットフォームの CSPRNG からも取得され、評価されていない追加データとして出力に混入されます。

  • crypto/tls パッケージは、FIPS 140-3 で承認されていないプロトコルバージョン、暗号スイート、署名アルゴリズム、または鍵交換メカニズムを無視し、交渉しません。

  • crypto/rsa.SignPSSPSSSaltLengthAuto とともに使用すると、ソルトの長さはハッシュの長さに制限されます。

GODEBUG=fips140=only が使用される場合、上記に加えて、FIPS 140-3 に準拠していない暗号アルゴリズムはエラーを返すか、パニックを引き起こします。このモードは最大限の努力であり、すべての FIPS 140-3 要件への準拠を保証するものではないことに注意してください。

OpenBSD、Wasm、AIX、および 32 ビット Windows プラットフォームでは、GODEBUG=fips140=on および only はサポートされていません。

crypto/fips140 パッケージ

crypto/fips140.Enabled 関数は、FIPS 140-3 モードがアクティブかどうかを報告します。

GOFIPS140 環境変数

GOFIPS140 環境変数は、go buildgo install、および go test とともに使用され、実行可能プログラムにリンクされる Go Cryptographic Module のバージョンを選択できます。

  • off がデフォルトであり、使用中の標準ライブラリツリーにある crypto/internal/fips140/... パッケージを使用します。

  • latestoff と同様ですが、FIPS 140-3 モードをデフォルトで有効にします。

  • v1.0.0 は、2025 年初頭にフリーズされ、Go 1.24 で初めて出荷された Go Cryptographic Module バージョン v1.0.0 を使用します。FIPS 140-3 モードをデフォルトで有効にします。

モジュールの検証

Google は現在、Go Cryptographic Module の少なくとも年次 Geomys CMVP 検証を促進するための契約関係にあります。検証時に Go Cryptographic Module をフリーズし、提出用の新しいモジュールバージョンを作成します。

これらの検証は、多くの一般的なオペレーティングシステムとハードウェアプラットフォームの組み合わせをサポートする、包括的なオペレーティング環境セットでテストされます。

モジュールでセキュリティ上の問題が発見された場合、非定期的な検証が実行されることがあります。

検証済みモジュールバージョン

CMVP 検証を完了したモジュールバージョンのリスト

現在、検証を完了したモジュールバージョンはありません。

処理中のモジュールバージョン

CMVP Modules In Process List に現在掲載されているモジュールバージョンのリスト

テスト中の実装モジュールバージョン

CMVP Implementation Under Test List に現在掲載されているモジュールバージョンのリスト

現在、テスト中のモジュールバージョンはありません。

Go+BoringCrypto

以前の、特定の FIPS 140-3 承認アルゴリズムに BoringCrypto モジュールを使用するサポートされていないメカニズムは現在も利用可能ですが、将来のリリースでこのページで説明されているメカニズムに削除され、置き換えられる予定です。

Go+BoringCrypto は、ネイティブの FIPS 140-3 モードとは互換性がありません。