1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- package tls
- import (
- "context"
- "net"
- "os"
- "github.com/sagernet/sing-box/common/badtls"
- C "github.com/sagernet/sing-box/constant"
- "github.com/sagernet/sing-box/log"
- "github.com/sagernet/sing-box/option"
- aTLS "github.com/sagernet/sing/common/tls"
- )
- type ServerOptions struct {
- Context context.Context
- Logger log.ContextLogger
- Options option.InboundTLSOptions
- KTLSCompatible bool
- }
- func NewServer(ctx context.Context, logger log.ContextLogger, options option.InboundTLSOptions) (ServerConfig, error) {
- return NewServerWithOptions(ServerOptions{
- Context: ctx,
- Logger: logger,
- Options: options,
- })
- }
- func NewServerWithOptions(options ServerOptions) (ServerConfig, error) {
- if !options.Options.Enabled {
- return nil, nil
- }
- if !options.KTLSCompatible {
- if options.Options.KernelTx {
- options.Logger.Warn("enabling kTLS TX in current scenarios will definitely reduce performance, please checkout https://sing-box.sagernet.org/configuration/shared/tls/#kernel_tx")
- }
- }
- if options.Options.KernelRx {
- options.Logger.Warn("enabling kTLS RX will definitely reduce performance, please checkout https://sing-box.sagernet.org/configuration/shared/tls/#kernel_rx")
- }
- if options.Options.Reality != nil && options.Options.Reality.Enabled {
- return NewRealityServer(options.Context, options.Logger, options.Options)
- }
- return NewSTDServer(options.Context, options.Logger, options.Options)
- }
- func ServerHandshake(ctx context.Context, conn net.Conn, config ServerConfig) (Conn, error) {
- ctx, cancel := context.WithTimeout(ctx, C.TCPTimeout)
- defer cancel()
- tlsConn, err := aTLS.ServerHandshake(ctx, conn, config)
- if err != nil {
- return nil, err
- }
- readWaitConn, err := badtls.NewReadWaitConn(tlsConn)
- if err == nil {
- return readWaitConn, nil
- } else if err != os.ErrInvalid {
- return nil, err
- }
- return tlsConn, nil
- }
|