Goに追加された「FIPS 140-3 mode」を試してみた!
この記事は、Finatext Advent Calendar 2025 の 13 日目の記事です。
はじめに
Go 1.24 から FIPS 140-3 mode という機能が追加されました。
この記事では、FIPS 140-3 についてざっくり要点を確認した後に、Go でどのようなことができるようになったのか見ていきます。
FIPS 140-3とは
米国国立標準技術研究所(NIST: National Institute of Standards and Technology)によって定義された暗号モジュールのセキュリティ要件です。
FIPS 140-3の暗号モジュールとしてどうやって認証されるのか
以下の資料を参考に概要を確認していきます。
FIPS認証の暗号モジュールとなるには、NISTとカナダのサイバーセキュリティセンターが共同で運営しているプログラム(CMVP: Cryptographic Module Validation Program)で認証される必要があります。
CMVPの審査・認証は、第三者機関(CSTLs: Cryptographic and Security Testing Laboratories)によって行われます。
また、CMVPに申請する暗号モジュールは、以下のアルゴリズムのいずれかに該当するものを使用しなければいけません。
a. specified in a Federal Information Processing Standard (FIPS),
v
b. adopted in a FIPS and specified either in an appendix to the FIPS or in a document
referenced by the FIPS,
c. specified in NIST SP 800-140C as an Approved security function, or
d. specified in NIST SP 800-140D as an Approved sensitive security parameter establishment
method.概訳:
a. 連邦情報処理標準(FIPS)で規定されているもの
b. FIPSで採用され、FIPSの付録またはFIPSが参照する文書で規定されているもの
c. NIST SP 800-140Cで承認済みセキュリティ機能として規定されているもの
d. NIST SP 800-140Dで承認済みの機密セキュリティパラメータ確立方法として規定されているもの
この要件を満たす方法として、アルゴリズム認証プログラム(CAVP: Cryptographic Algorithm Validation Program)が存在します。
こちらも、NISTとカナダのサイバーセキュリティセンターが共同で運営しています。
CAVP認証されたアルゴリズムは、CMVPするための前提条件を満たします。
上記踏まえると、次のように整理できます。
-
CAVP
- 暗号アルゴリズム(AES, SHA, RSAなど)自体の正しさや性能を審査・認証する。
-
CMVP
- CAVPで認証されたアルゴリズムを含む暗号モジュール(ハードウェアやソフトウェア製品)全体のセキュリティ要件を審査・認証する。
- 認証されると、
FIPS 140-3準拠製品となる
FIPS 140-3に準拠するとうれしいこと
-
FIPS 140-3認証済み暗号モジュールは、アメリカおよびカナダの政府機関の調達条件で公式に認められ、重要な情報資産の保護に利用される。 -
FIPS 140-3認証済みのモジュールは、CMVP公式サイトの一覧に掲載されるため、海外・国内企業・官公庁の調達担当者が容易に検索・選定できる。 -
第三者機関による厳正なテストと審査を受けているため、製品の安全性・信頼性が対外的にも証明され、顧客へのアピールポイントとなる。
-
FIPS 140-3認証済みと明記できることで、政府案件以外でも金融・医療・製造などの分野で採用候補になりうる。
Goにおける現時点(2025/12)のFIPS 140-3対応状況
Goが提供する暗号モジュールは、FIPS 140-3準拠を目指して以下のプロセスを進めています。
CAVP認証済み
暗号モジュールについては、NISTによって認証済み。

CAVP認証されたバージョンはv1.0.0
CMVPは審査中
2025/05にCMVP審査リストへの掲載が開始しました。
この申請に必要な暗号アルゴリズムは、上記のCAVP(v1.0.0)を使用しています。

CMVP審査リストより
Go のFIPS 140-3 modeについて
Go1.24 にて、上記の FIPS 140-3 で認証された暗号アルゴリズムのみを扱えるように制限する機能を簡単に利用できるオプションが追加されました。
GODEBUG=fips140=on
Go の暗号モジュールは起動時に自己チェックや整合性検証を行い、利用できるアルゴリズムやプロトコルも厳しく制限されます。
また、乱数生成や TLS 通信などもFIPS 140-3の基準に沿った安全な方式で動作するようになります。
GODEBUG=fips140=only
fips140=on に加えて、FIPS 140-3準拠でない暗号アルゴリズムはエラーを返すかパニックになります。
GOFIPS140=v1.0.0
このオプションを使うと、GoプログラムはCMVPへ認証申請時に提出した暗号アルゴリズムのパッケージに対してビルドします。
GOFIPS140を使用すると、GODEBUG=fips140=onはデフォルトで有効になります。
FIPS 140-3 modeで制限されたメソッド一覧
以下のコミットで対応されたメソッドを確認できますのでご参考まで。
試してみた
制限されたメソッドの中から、MD5 を例として試してみます。
Go1.24 では、FIPS 140-3 modeの場合(GODEBUG=fips140=only)、 checkSum内で panic が発生するようになっています。
以下のようなテスト関数を用意して FIPS 140-3 mode で検証してみます。
go version
go version go1.25.0 darwin/arm64
non FIPS 140-3 modeの場合はエラー・パニックなし
go test -v -run=TestMd5Sum
=== RUN TestMd5Sum
--- PASS: TestMd5Sum (0.00s)
PASS
ok github.com/uh-zz/advent-calendar-2025 0.401s
FIPS 140-3 mode の場合にパニックが発生
GODEBUG=fips140=only go test -v -run=TestMd5Sum
=== RUN TestMd5Sum
goroutine 5 [running]:
runtime/debug.Stack()
/usr/local/go/src/runtime/debug/stack.go:26 +0x64
runtime/debug.PrintStack()
/usr/local/go/src/runtime/debug/stack.go:18 +0x1c
github.com/uh-zz/advent-calendar-2025.TestMd5Sum.func1()
/path/to/go/src/github.com/uh-zz/advent-calendar-2025/fips140_test.go:17 +0x3c
panic({0x1010ccd40?, 0x1010fe260?})
/usr/local/go/src/runtime/panic.go:783 +0x120
crypto/md5.(*digest).checkSum(0x14000104f18?)
/usr/local/go/src/crypto/md5/md5.go:177 +0x11c
crypto/md5.Sum({0x14000104f1c?, 0x100fdce90?, 0x24?})
/usr/local/go/src/crypto/md5/md5.go:209 +0x84
github.com/uh-zz/advent-calendar-2025.md5sum(...)
/path/to/go/src/github.com/uh-zz/advent-calendar-2025/fips140_test.go:11
github.com/uh-zz/advent-calendar-2025.TestMd5Sum(0x14000005880)
/path/to/go/src/github.com/uh-zz/advent-calendar-2025/fips140_test.go:24 +0x64
testing.tRunner(0x14000005880, 0x1010fce40)
/usr/local/go/src/testing/testing.go:1934 +0xc8
created by testing.(*T).Run in goroutine 1
/usr/local/go/src/testing/testing.go:1997 +0x364
fips140_test.go:18: md5sum panicked: crypto/md5: use of MD5 is not allowed in FIPS 140-only mode
--- PASS: TestMd5Sum (0.00s)
PASS
ok github.com/uh-zz/advent-calendar-2025 0.246s
Go 1.26 のアップデートで FIPS 140-3 mode が有効でも FIPS 140 非準拠メソッドを使えるように
以下の issue で議論されたものです。
FIPS 140-3 mode が有効な環境でも、FIPS 140 非準拠なメソッドが使えるようにする API が提案されました。
上記メソッドは、Go 1.26 リリースノートのドラフトにも記載されています。
試してみた
この機能を検証するために、リリース前の Go バージョンをインストールできる gotip を利用します。
go install golang.org/dl/gotip@latest
gotip download
Updating the go development tree...
From https://go.googlesource.com/go
* branch master -> FETCH_HEAD
HEAD is now at 0d0d5c9 test/codegen: test negation with add/sub on riscv64
Building Go cmd/dist using /usr/local/go. (go1.25.0 darwin/arm64)
Building Go toolchain1 using /usr/local/go.
Building Go bootstrap cmd/go (go_bootstrap) using Go toolchain1.
Building Go toolchain2 using go_bootstrap and Go toolchain1.
Building Go toolchain3 using go_bootstrap and Go toolchain2.
Building packages and commands for darwin/arm64.
---
Installed Go for darwin/arm64 in /path/to/sdk/gotip
Installed commands in /path/to/sdk/gotip/bin
Success. You may now run 'gotip'!
検証するコードは、Go 本体のテストコードと同様のものです。
暗号アルゴリズムも、FIPS 140-3 modeチェックが入っていることを確認できます。
GODEBUG=fips140=only gotip test -v
=== RUN TestDisabled
--- PASS: TestDisabled (0.00s)
PASS
ok github.com/uh-zz/advent-calendar-2025 0.241s
おわりに
Go 1.24 で追加されたFIPS 140-3 modeの概要と検証コードから動作イメージを体感できました。
注意書きはあるものの、導入ハードルも低いため、簡単な確認に魅力的な機能ではないでしょうか。
引き続き、リリースノートからアップデート情報を追っていけたらと思います。
記事内で使ったテストコードは以下のリポジトリにあるのでぜひ参考にしてください。
Discussion