Files
sing-box-extended-mirror/common/tls/client.go
T

101 lines
2.7 KiB
Go
Raw Normal View History

2022-09-09 18:45:10 +08:00
package tls
import (
"context"
"net"
"os"
"github.com/sagernet/sing-box/adapter"
2023-12-20 20:00:00 +08:00
"github.com/sagernet/sing-box/common/badtls"
2022-09-09 18:45:10 +08:00
C "github.com/sagernet/sing-box/constant"
"github.com/sagernet/sing-box/option"
M "github.com/sagernet/sing/common/metadata"
N "github.com/sagernet/sing/common/network"
2023-02-28 11:30:46 +08:00
aTLS "github.com/sagernet/sing/common/tls"
2022-09-09 18:45:10 +08:00
)
2023-08-29 13:43:42 +08:00
func NewDialerFromOptions(ctx context.Context, router adapter.Router, dialer N.Dialer, serverAddress string, options option.OutboundTLSOptions) (N.Dialer, error) {
2022-11-13 11:24:37 +08:00
if !options.Enabled {
return dialer, nil
}
2023-08-29 13:43:42 +08:00
config, err := NewClient(ctx, serverAddress, options)
2022-09-09 18:45:10 +08:00
if err != nil {
return nil, err
}
return NewDialer(dialer, config), nil
}
2023-08-29 13:43:42 +08:00
func NewClient(ctx context.Context, serverAddress string, options option.OutboundTLSOptions) (Config, error) {
2022-11-13 11:24:37 +08:00
if !options.Enabled {
return nil, nil
}
2025-02-22 08:00:59 +08:00
if options.Reality != nil && options.Reality.Enabled {
2023-08-29 13:43:42 +08:00
return NewRealityClient(ctx, serverAddress, options)
2022-09-10 10:27:00 +08:00
} else if options.UTLS != nil && options.UTLS.Enabled {
2023-08-29 13:43:42 +08:00
return NewUTLSClient(ctx, serverAddress, options)
2022-09-09 18:19:50 +08:00
}
2025-02-22 08:00:59 +08:00
return NewSTDClient(ctx, serverAddress, options)
2022-09-09 18:45:10 +08:00
}
func ClientHandshake(ctx context.Context, conn net.Conn, config Config) (Conn, error) {
2022-09-09 18:45:10 +08:00
ctx, cancel := context.WithTimeout(ctx, C.TCPTimeout)
defer cancel()
2023-12-20 20:00:00 +08:00
tlsConn, err := aTLS.ClientHandshake(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
2022-09-09 18:45:10 +08:00
}
2025-10-07 13:41:25 +08:00
type Dialer interface {
N.Dialer
DialTLSContext(ctx context.Context, destination M.Socksaddr) (Conn, error)
}
type defaultDialer struct {
2022-09-09 18:45:10 +08:00
dialer N.Dialer
config Config
}
2025-10-07 13:41:25 +08:00
func NewDialer(dialer N.Dialer, config Config) Dialer {
return &defaultDialer{dialer, config}
2022-09-09 18:45:10 +08:00
}
2025-10-07 13:41:25 +08:00
func (d *defaultDialer) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) {
if N.NetworkName(network) != N.NetworkTCP {
2022-09-09 18:45:10 +08:00
return nil, os.ErrInvalid
}
2025-10-07 13:41:25 +08:00
return d.DialTLSContext(ctx, destination)
}
func (d *defaultDialer) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) {
return nil, os.ErrInvalid
}
func (d *defaultDialer) DialTLSContext(ctx context.Context, destination M.Socksaddr) (Conn, error) {
return d.dialContext(ctx, destination)
}
func (d *defaultDialer) dialContext(ctx context.Context, destination M.Socksaddr) (Conn, error) {
conn, err := d.dialer.DialContext(ctx, N.NetworkTCP, destination)
if err != nil {
return nil, err
}
tlsConn, err := aTLS.ClientHandshake(ctx, conn, d.config)
2022-09-09 18:45:10 +08:00
if err != nil {
2025-10-07 13:41:25 +08:00
conn.Close()
2022-09-09 18:45:10 +08:00
return nil, err
}
2025-10-07 13:41:25 +08:00
return tlsConn, nil
2022-09-09 18:45:10 +08:00
}
2025-10-07 13:41:25 +08:00
func (d *defaultDialer) Upstream() any {
return d.dialer
2022-09-09 18:45:10 +08:00
}