crypto/tlsパッケージに、CNSA 2.0準拠のための鍵交換方式MLKEM1024が追加された
crypto/tls
概要
crypto/tlsパッケージに、耐量子暗号の鍵交換メカニズムとして単体のML-KEM-1024を利用するMLKEM1024(CurveID = 514)が追加された。Config.CurvePreferencesに明示的に追加することで有効化できる。デフォルトでは無効。
導入経緯
Go 1.24以降、crypto/tlsはハイブリッド方式の耐量子鍵交換(X25519MLKEM768、SecP256r1MLKEM768、SecP384r1MLKEM1024)をデフォルトで有効にしている。しかし、米NSAが策定した暗号標準CNSA 2.0では鍵確立アルゴリズムとしてML-KEM-1024単体のみが承認されており、ML-KEM-768ベースのハイブリッド方式は対象外だった。CNSA 2.0準拠が求められる政府機関・防衛関連システムでは、既存のcrypto/tls実装だけでは要件を満たせないという課題があった。
draft-ietf-tls-mlkem-07で定義されるML-KEM-1024単体の鍵交換をTLS 1.3の鍵交換方式として追加する提案であり、仕様は名目上ドラフト段階だが、IANAがdraft-connolly-tls-mlkem-key-agreement-05相当としてコードポイント0x0202(514)を割り当て済みで、Chromeも既に実装していることから仕様変更のリスクはないと判断された。
議論タイムライン
- 2026-04-22: @aclementsがproposalを審査対象の「active」カラムに移動
- 2026-04-29: 週次proposal reviewミーティングで「likely accept」と判断
- 2026-05-06: 1週間のコメント期間中にコンセンサスの変更がなく「accepted」として正式承認
- その後、実装CL go.dev/cl/777221がこのissueに紐付けられた
議論のハイライト
- CNSA 2.0はML-KEM-1024単体のみを鍵確立アルゴリズムとして承認しており、既存のML-KEM-768ベースのハイブリッド方式(
X25519MLKEM768など)は対象外 - 仕様はIETFドラフト段階だが、IANAによるコードポイント割り当て済み・Chrome実装済みであるため、変更リスクは低いと判断された
- CNSA 2.0準拠システムはまだオープンインターネット上で一般的でないため、デフォルトでは無効のまま据え置く方針とされた
- デフォルト無効であり既存動作への影響がないため、
GODEBUGによる制御は不要と結論づけられた - 追加される公開APIは
const MLKEM1024 CurveID = 514のみで、既存のcrypto/mlkemパッケージの実装を活用する最小限の設計となっている
使用例
Before
package main
import "crypto/tls"
func main() {
cfg := &tls.Config{
CurvePreferences: []tls.CurveID{
tls.X25519MLKEM768,
tls.SecP256r1MLKEM768,
},
}
_ = cfg
}
After
package main
import "crypto/tls"
func main() {
cfg := &tls.Config{
CurvePreferences: []tls.CurveID{
tls.MLKEM1024,
},
}
_ = cfg
}
移行時の注意
MLKEM1024はデフォルトで無効のため、既存のアプリケーションの挙動に影響はない。CNSA 2.0準拠が必要なシステムでのみ、Config.CurvePreferencesに明示的に追加して利用する。
実装解説
CurveIDの定数としてMLKEM1024 = 514がcommon.goに追加されている。デフォルト有効/無効の判定を行うdefaultCurveEnabledはMLKEM1024を明示的なcaseに含めていないため、既存のハイブリッド方式とは異なりswitchのdefault節に落ちてfalseを返す(defaults.go)。一方、鍵交換の優先順序を返すcurvePreferenceOrderには他の耐量子方式と並んで含まれており(defaults.go)、Config.CurvePreferencesで明示指定された場合のみ選択対象になる。
実際の鍵交換処理はmlkem1024KeyExchangeとして実装されており(key_schedule.go)、鍵生成・カプセル化・デカプセル化はいずれも既存のcrypto/mlkemパッケージのGenerateKey1024/NewEncapsulationKey1024/Decapsulateをそのまま呼び出すだけの薄いラッパーになっている。また、FIPS 140-3モード(GODEBUG=fips140=on)で許可される鍵交換の一覧にもMLKEM1024が含まれている(defaults_fips140.go)。