Config.CurvePreferencesで明示指定したポスト量子ハイブリッド鍵交換は、tlsmlkem/tlssecpmlkem GODEBUGの値によらず有効になる
crypto/tls
概要
Config.CurvePreferences
にポスト量子ハイブリッド鍵交換(X25519MLKEM768、
SecP256r1MLKEM768、
SecP384r1MLKEM1024)を明示的に指定した場合、
GODEBUG=tlsmlkem=0 や GODEBUG=tlssecpmlkem=0 が設定されていてもそれらは有効になる。この2つの
GODEBUG設定は、Config.CurvePreferences が nil(未設定)のときに使われるデフォルトの鍵交換集合
にのみ適用されることが本来の意図であり、その通りに動作する。
使用例
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=0 や GODEBUG=tlssecpmlkem=0 を設定して環境全体でポスト量子ハイブリッド鍵交換
を無効化しているつもりでも、アプリケーション側が Config.CurvePreferences を明示的に設定して
これらの鍵交換を含めている場合、GODEBUGの設定はその指定を上書きしない。ポスト量子ハイブリッド鍵
交換を確実に無効化したい場合は、Config.CurvePreferences を空(nil)のままにして GODEBUG に
委ねるか、CurvePreferences の候補リスト自体から対象の CurveID を除外する必要がある。
実装解説
crypto/tls では、実際に使用可能な鍵交換の判定を Config.supportsCurve が行っている。
c.CurvePreferences が空でない場合はそのリストに含まれるかどうかのみを見て、GODEBUGの値を
参照する defaultCurveEnabled は呼ばれない。GODEBUGの値が参照されるのは c.CurvePreferences
が空(nil)の場合の分岐だけである。
defaultCurveEnabled
(tlsmlkem/tlssecpmlkemGODEBUGを参照するのはここのみ)Config.supportsCurve
(CurvePreferencesが空でなければGODEBUGを参照する分岐に入らない)