ktls.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package tls
  2. import (
  3. "context"
  4. "net"
  5. "github.com/sagernet/sing-box/common/ktls"
  6. E "github.com/sagernet/sing/common/exceptions"
  7. "github.com/sagernet/sing/common/logger"
  8. aTLS "github.com/sagernet/sing/common/tls"
  9. )
  10. type KTLSClientConfig struct {
  11. Config
  12. logger logger.ContextLogger
  13. kernelTx, kernelRx bool
  14. }
  15. func (w *KTLSClientConfig) ClientHandshake(ctx context.Context, conn net.Conn) (aTLS.Conn, error) {
  16. tlsConn, err := aTLS.ClientHandshake(ctx, conn, w.Config)
  17. if err != nil {
  18. return nil, err
  19. }
  20. kConn, err := ktls.NewConn(ctx, w.logger, tlsConn, w.kernelTx, w.kernelRx)
  21. if err != nil {
  22. tlsConn.Close()
  23. return nil, E.Cause(err, "initialize kernel TLS")
  24. }
  25. return kConn, nil
  26. }
  27. func (w *KTLSClientConfig) Clone() Config {
  28. return &KTLSClientConfig{
  29. w.Config.Clone(),
  30. w.logger,
  31. w.kernelTx,
  32. w.kernelRx,
  33. }
  34. }
  35. type KTlSServerConfig struct {
  36. ServerConfig
  37. logger logger.ContextLogger
  38. kernelTx, kernelRx bool
  39. }
  40. func (w *KTlSServerConfig) ServerHandshake(ctx context.Context, conn net.Conn) (aTLS.Conn, error) {
  41. tlsConn, err := aTLS.ServerHandshake(ctx, conn, w.ServerConfig)
  42. if err != nil {
  43. return nil, err
  44. }
  45. kConn, err := ktls.NewConn(ctx, w.logger, tlsConn, w.kernelTx, w.kernelRx)
  46. if err != nil {
  47. tlsConn.Close()
  48. return nil, E.Cause(err, "initialize kernel TLS")
  49. }
  50. return kConn, nil
  51. }
  52. func (w *KTlSServerConfig) Clone() Config {
  53. return &KTlSServerConfig{
  54. w.ServerConfig.Clone().(ServerConfig),
  55. w.logger,
  56. w.kernelTx,
  57. w.kernelRx,
  58. }
  59. }