12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- package supervisor
- import (
- "crypto/tls"
- "fmt"
- "github.com/cloudflare/cloudflared/features"
- )
- const (
- X25519Kyber768Draft00PQKex = tls.CurveID(0x6399) // X25519Kyber768Draft00
- X25519Kyber768Draft00PQKexName = "X25519Kyber768Draft00"
- P256Kyber768Draft00PQKex = tls.CurveID(0xfe32) // P256Kyber768Draft00
- P256Kyber768Draft00PQKexName = "P256Kyber768Draft00"
- X25519MLKEM768PQKex = tls.CurveID(0x11ec) // X25519MLKEM768
- X25519MLKEM768PQKexName = "X25519MLKEM768"
- )
- var (
- nonFipsPostQuantumStrictPKex []tls.CurveID = []tls.CurveID{X25519MLKEM768PQKex, X25519Kyber768Draft00PQKex}
- nonFipsPostQuantumPreferPKex []tls.CurveID = []tls.CurveID{X25519MLKEM768PQKex, X25519Kyber768Draft00PQKex}
- fipsPostQuantumStrictPKex []tls.CurveID = []tls.CurveID{P256Kyber768Draft00PQKex}
- fipsPostQuantumPreferPKex []tls.CurveID = []tls.CurveID{P256Kyber768Draft00PQKex, tls.CurveP256}
- )
- func removeDuplicates(curves []tls.CurveID) []tls.CurveID {
- bucket := make(map[tls.CurveID]bool)
- var result []tls.CurveID
- for _, curve := range curves {
- if _, ok := bucket[curve]; !ok {
- bucket[curve] = true
- result = append(result, curve)
- }
- }
- return result
- }
- func curvePreference(pqMode features.PostQuantumMode, fipsEnabled bool, currentCurve []tls.CurveID) ([]tls.CurveID, error) {
- switch pqMode {
- case features.PostQuantumStrict:
- // If the user passes the -post-quantum flag, we override
- // CurvePreferences to only support hybrid post-quantum key agreements.
- if fipsEnabled {
- return fipsPostQuantumStrictPKex, nil
- }
- return nonFipsPostQuantumStrictPKex, nil
- case features.PostQuantumPrefer:
- if fipsEnabled {
- // Ensure that all curves returned are FIPS compliant.
- // Moreover the first curves are post-quantum and then the
- // non post-quantum.
- return fipsPostQuantumPreferPKex, nil
- }
- curves := append(nonFipsPostQuantumPreferPKex, currentCurve...)
- curves = removeDuplicates(curves)
- return curves, nil
- default:
- return nil, fmt.Errorf("Unexpected post quantum mode")
- }
- }
|