🔐

Goに追加された「FIPS 140-3 mode」を試してみた!

に公開

この記事は、Finatext Advent Calendar 2025 の 13 日目の記事です。


はじめに

Go 1.24 から FIPS 140-3 mode という機能が追加されました。

https://go.dev/doc/go1.24#fips140

この記事では、FIPS 140-3 についてざっくり要点を確認した後に、Go でどのようなことができるようになったのか見ていきます。

FIPS 140-3とは

米国国立標準技術研究所(NIST: National Institute of Standards and Technology)によって定義された暗号モジュールのセキュリティ要件です。

https://csrc.nist.gov/pubs/fips/140-3/final

FIPS 140-3の暗号モジュールとしてどうやって認証されるのか

以下の資料を参考に概要を確認していきます。
https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.140-3.pdf

FIPS認証の暗号モジュールとなるには、NISTとカナダのサイバーセキュリティセンターが共同で運営しているプログラム(CMVP: Cryptographic Module Validation Program)で認証される必要があります。
CMVPの審査・認証は、第三者機関(CSTLs: Cryptographic and Security Testing Laboratories)によって行われます。

https://csrc.nist.gov/projects/cryptographic-module-validation-program

また、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するための前提条件を満たします。

https://csrc.nist.gov/projects/cryptographic-algorithm-validation-program

上記踏まえると、次のように整理できます。

  • 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準拠を目指して以下のプロセスを進めています。

https://go.dev/blog/fips140

CAVP認証済み

暗号モジュールについては、NISTによって認証済み。

https://csrc.nist.gov/projects/cryptographic-algorithm-validation-program/details?validation=39260


CAVP認証されたバージョンはv1.0.0

CMVPは審査中

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

https://csrc.nist.gov/Projects/cryptographic-module-validation-program/modules-in-process/modules-in-process-list


CMVP審査リストより

Go のFIPS 140-3 modeについて

Go1.24 にて、上記の FIPS 140-3 で認証された暗号アルゴリズムのみを扱えるように制限する機能を簡単に利用できるオプションが追加されました。

https://tip.golang.org/doc/security/fips140

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で制限されたメソッド一覧

以下のコミットで対応されたメソッドを確認できますのでご参考まで。

https://github.com/golang/go/commit/b299e9a44f298e72815ca0513bcc6ccca075f3fc

試してみた

制限されたメソッドの中から、MD5 を例として試してみます。

Go1.24 では、FIPS 140-3 modeの場合(GODEBUG=fips140=only)、 checkSum内で panic が発生するようになっています。

https://github.com/golang/go/blob/go1.24.0/src/crypto/md5/md5.go#L153-L163

以下のようなテスト関数を用意して FIPS 140-3 mode で検証してみます。

https://github.com/uh-zz/advent-calendar-2025/blob/main/fips140_test.go#L10-L28

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 が提案されました。

https://github.com/golang/go/issues/74630

上記メソッドは、Go 1.26 リリースノートのドラフトにも記載されています。

https://go.dev/doc/go1.26#cryptofips140pkgcryptofips140

試してみた

この機能を検証するために、リリース前の Go バージョンをインストールできる gotip を利用します。

https://zenn.dev/uji/articles/d51e81535e0d723af56e

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 本体のテストコードと同様のものです。

https://github.com/uh-zz/advent-calendar-2025/blob/main/fips140_go1.26_test.go#L10-L30

暗号アルゴリズムも、FIPS 140-3 modeチェックが入っていることを確認できます。

https://github.com/golang/go/blob/master/src/crypto/des/cipher.go#L31-L34

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の概要と検証コードから動作イメージを体感できました。
注意書きはあるものの、導入ハードルも低いため、簡単な確認に魅力的な機能ではないでしょうか。
引き続き、リリースノートからアップデート情報を追っていけたらと思います。

記事内で使ったテストコードは以下のリポジトリにあるのでぜひ参考にしてください。

https://github.com/uh-zz/advent-calendar-2025

Finatext Tech Blog

Discussion