メインコンテンツへスキップ

Go Proposal Weekly Digest

Go言語のproposal更新を毎週お届け

挙動変更

Config.CurvePreferencesで明示指定したポスト量子ハイブリッド鍵交換は、tlsmlkem/tlssecpmlkem GODEBUGの値によらず有効になる

crypto/tls

この項目の注釈は AI により生成されており、誤りを含む場合があります。
使用例のコンパイル検証: 検証済み

概要

Config.CurvePreferences
にポスト量子ハイブリッド鍵交換(X25519MLKEM768
SecP256r1MLKEM768
SecP384r1MLKEM1024)を明示的に指定した場合、
GODEBUG=tlsmlkem=0GODEBUG=tlssecpmlkem=0 が設定されていてもそれらは有効になる。この2つの
GODEBUG設定は、Config.CurvePreferencesnil(未設定)のときに使われるデフォルトの鍵交換集合
にのみ適用されることが本来の意図であり、その通りに動作する。

使用例

Before

package main

import "crypto/tls"

func main() {
	// GODEBUG=tlsmlkem=0 を設定した環境で実行すると、
	// ポスト量子ハイブリッド鍵交換が無効になってしまうと誤解しやすい書き方。
	cfg := &tls.Config{
		CurvePreferences: []tls.CurveID{tls.X25519MLKEM768, tls.X25519},
	}
	_ = cfg
}

After

package main

import "crypto/tls"

func main() {
	// CurvePreferences を明示的に指定した場合、GODEBUG=tlsmlkem=0 の値に関わらず
	// X25519MLKEM768 は常に候補として使われる。GODEBUG はデフォルト値(CurvePreferences
	// が nil のとき)にのみ影響する。
	cfg := &tls.Config{
		CurvePreferences: []tls.CurveID{tls.X25519MLKEM768, tls.X25519},
	}
	_ = cfg
}

移行時の注意

GODEBUG=tlsmlkem=0GODEBUG=tlssecpmlkem=0 を設定して環境全体でポスト量子ハイブリッド鍵交換
を無効化しているつもりでも、アプリケーション側が Config.CurvePreferences を明示的に設定して
これらの鍵交換を含めている場合、GODEBUGの設定はその指定を上書きしない。ポスト量子ハイブリッド鍵
交換を確実に無効化したい場合は、Config.CurvePreferences を空(nil)のままにして GODEBUG に
委ねるか、CurvePreferences の候補リスト自体から対象の CurveID を除外する必要がある。

実装解説

crypto/tls では、実際に使用可能な鍵交換の判定を Config.supportsCurve が行っている。
c.CurvePreferences が空でない場合はそのリストに含まれるかどうかのみを見て、GODEBUGの値を
参照する defaultCurveEnabled は呼ばれない。GODEBUGの値が参照されるのは c.CurvePreferences
が空(nil)の場合の分岐だけである。

関連リンク