| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 | 
							- package v2raygrpc
 
- import (
 
- 	"context"
 
- 	"net"
 
- 	"os"
 
- 	"github.com/sagernet/sing-box/common/tls"
 
- 	internal_credentials "github.com/sagernet/sing-box/transport/v2raygrpc/credentials"
 
- 	"google.golang.org/grpc/credentials"
 
- )
 
- type TLSTransportCredentials struct {
 
- 	config tls.Config
 
- }
 
- func NewTLSTransportCredentials(config tls.Config) credentials.TransportCredentials {
 
- 	return &TLSTransportCredentials{config}
 
- }
 
- func (c *TLSTransportCredentials) Info() credentials.ProtocolInfo {
 
- 	return credentials.ProtocolInfo{
 
- 		SecurityProtocol: "tls",
 
- 		SecurityVersion:  "1.2",
 
- 		ServerName:       c.config.ServerName(),
 
- 	}
 
- }
 
- func (c *TLSTransportCredentials) ClientHandshake(ctx context.Context, authority string, rawConn net.Conn) (net.Conn, credentials.AuthInfo, error) {
 
- 	cfg := c.config.Clone()
 
- 	if cfg.ServerName() == "" {
 
- 		serverName, _, err := net.SplitHostPort(authority)
 
- 		if err != nil {
 
- 			serverName = authority
 
- 		}
 
- 		cfg.SetServerName(serverName)
 
- 	}
 
- 	conn, err := tls.ClientHandshake(ctx, rawConn, cfg)
 
- 	if err != nil {
 
- 		return nil, nil, err
 
- 	}
 
- 	tlsInfo := credentials.TLSInfo{
 
- 		State: conn.ConnectionState(),
 
- 		CommonAuthInfo: credentials.CommonAuthInfo{
 
- 			SecurityLevel: credentials.PrivacyAndIntegrity,
 
- 		},
 
- 	}
 
- 	id := internal_credentials.SPIFFEIDFromState(conn.ConnectionState())
 
- 	if id != nil {
 
- 		tlsInfo.SPIFFEID = id
 
- 	}
 
- 	return internal_credentials.WrapSyscallConn(rawConn, conn), tlsInfo, nil
 
- }
 
- func (c *TLSTransportCredentials) ServerHandshake(rawConn net.Conn) (net.Conn, credentials.AuthInfo, error) {
 
- 	serverConfig, isServer := c.config.(tls.ServerConfig)
 
- 	if !isServer {
 
- 		return nil, nil, os.ErrInvalid
 
- 	}
 
- 	conn, err := tls.ServerHandshake(context.Background(), rawConn, serverConfig)
 
- 	if err != nil {
 
- 		rawConn.Close()
 
- 		return nil, nil, err
 
- 	}
 
- 	tlsInfo := credentials.TLSInfo{
 
- 		State: conn.ConnectionState(),
 
- 		CommonAuthInfo: credentials.CommonAuthInfo{
 
- 			SecurityLevel: credentials.PrivacyAndIntegrity,
 
- 		},
 
- 	}
 
- 	id := internal_credentials.SPIFFEIDFromState(conn.ConnectionState())
 
- 	if id != nil {
 
- 		tlsInfo.SPIFFEID = id
 
- 	}
 
- 	return internal_credentials.WrapSyscallConn(rawConn, conn), tlsInfo, nil
 
- }
 
- func (c *TLSTransportCredentials) Clone() credentials.TransportCredentials {
 
- 	return NewTLSTransportCredentials(c.config)
 
- }
 
- func (c *TLSTransportCredentials) OverrideServerName(serverNameOverride string) error {
 
- 	c.config.SetServerName(serverNameOverride)
 
- 	return nil
 
- }
 
 
  |