pqtunnels.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package supervisor
  2. import (
  3. "crypto/tls"
  4. "fmt"
  5. "github.com/cloudflare/cloudflared/features"
  6. )
  7. const (
  8. X25519Kyber768Draft00PQKex = tls.CurveID(0x6399) // X25519Kyber768Draft00
  9. X25519Kyber768Draft00PQKexName = "X25519Kyber768Draft00"
  10. P256Kyber768Draft00PQKex = tls.CurveID(0xfe32) // P256Kyber768Draft00
  11. P256Kyber768Draft00PQKexName = "P256Kyber768Draft00"
  12. X25519MLKEM768PQKex = tls.CurveID(0x11ec) // X25519MLKEM768
  13. X25519MLKEM768PQKexName = "X25519MLKEM768"
  14. )
  15. var (
  16. nonFipsPostQuantumStrictPKex []tls.CurveID = []tls.CurveID{X25519MLKEM768PQKex, X25519Kyber768Draft00PQKex}
  17. nonFipsPostQuantumPreferPKex []tls.CurveID = []tls.CurveID{X25519MLKEM768PQKex, X25519Kyber768Draft00PQKex}
  18. fipsPostQuantumStrictPKex []tls.CurveID = []tls.CurveID{P256Kyber768Draft00PQKex}
  19. fipsPostQuantumPreferPKex []tls.CurveID = []tls.CurveID{P256Kyber768Draft00PQKex, tls.CurveP256}
  20. )
  21. func removeDuplicates(curves []tls.CurveID) []tls.CurveID {
  22. bucket := make(map[tls.CurveID]bool)
  23. var result []tls.CurveID
  24. for _, curve := range curves {
  25. if _, ok := bucket[curve]; !ok {
  26. bucket[curve] = true
  27. result = append(result, curve)
  28. }
  29. }
  30. return result
  31. }
  32. func curvePreference(pqMode features.PostQuantumMode, fipsEnabled bool, currentCurve []tls.CurveID) ([]tls.CurveID, error) {
  33. switch pqMode {
  34. case features.PostQuantumStrict:
  35. // If the user passes the -post-quantum flag, we override
  36. // CurvePreferences to only support hybrid post-quantum key agreements.
  37. if fipsEnabled {
  38. return fipsPostQuantumStrictPKex, nil
  39. }
  40. return nonFipsPostQuantumStrictPKex, nil
  41. case features.PostQuantumPrefer:
  42. if fipsEnabled {
  43. // Ensure that all curves returned are FIPS compliant.
  44. // Moreover the first curves are post-quantum and then the
  45. // non post-quantum.
  46. return fipsPostQuantumPreferPKex, nil
  47. }
  48. curves := append(nonFipsPostQuantumPreferPKex, currentCurve...)
  49. curves = removeDuplicates(curves)
  50. return curves, nil
  51. default:
  52. return nil, fmt.Errorf("Unexpected post quantum mode")
  53. }
  54. }