mirror of
https://github.com/shadow1ng/fscan.git
synced 2026-02-09 10:19:19 +08:00
- 移除 screen.go 中错误的认证结果覆盖逻辑 - 启用 NLA 协议的 ErrorCode 字段检测 - 添加 PubKeyAuth 验证确保认证真正成功 - 修复 io.go 中错误被静默忽略的问题 - 修复 socket.go/io.go 中可能导致 panic 的代码 - 修复 screen.go 中文件句柄泄漏和 log.Panic
82 lines
1.6 KiB
Go
82 lines
1.6 KiB
Go
package core
|
|
|
|
import (
|
|
"crypto/rsa"
|
|
"math/big"
|
|
|
|
"github.com/huin/asn1ber"
|
|
|
|
//"crypto/tls"
|
|
"errors"
|
|
"github.com/icodeface/tls"
|
|
"net"
|
|
)
|
|
|
|
type SocketLayer struct {
|
|
conn net.Conn
|
|
tlsConn *tls.Conn
|
|
}
|
|
|
|
func NewSocketLayer(conn net.Conn) *SocketLayer {
|
|
l := &SocketLayer{
|
|
conn: conn,
|
|
tlsConn: nil,
|
|
}
|
|
return l
|
|
}
|
|
|
|
func (s *SocketLayer) Read(b []byte) (n int, err error) {
|
|
if s.tlsConn != nil {
|
|
return s.tlsConn.Read(b)
|
|
}
|
|
return s.conn.Read(b)
|
|
}
|
|
|
|
func (s *SocketLayer) Write(b []byte) (n int, err error) {
|
|
if s.tlsConn != nil {
|
|
return s.tlsConn.Write(b)
|
|
}
|
|
return s.conn.Write(b)
|
|
}
|
|
|
|
func (s *SocketLayer) Close() error {
|
|
if s.tlsConn != nil {
|
|
err := s.tlsConn.Close()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return s.conn.Close()
|
|
}
|
|
|
|
func (s *SocketLayer) StartTLS() error {
|
|
config := &tls.Config{
|
|
InsecureSkipVerify: true,
|
|
MinVersion: tls.VersionTLS10,
|
|
MaxVersion: tls.VersionTLS13,
|
|
PreferServerCipherSuites: true,
|
|
}
|
|
s.tlsConn = tls.Client(s.conn, config)
|
|
return s.tlsConn.Handshake()
|
|
}
|
|
|
|
type PublicKey struct {
|
|
N *big.Int `asn1:"explicit,tag:0"` // modulus
|
|
E int `asn1:"explicit,tag:1"` // public exponent
|
|
}
|
|
|
|
func (s *SocketLayer) TlsPubKey() ([]byte, error) {
|
|
if s.tlsConn == nil {
|
|
return nil, errors.New("TLS conn does not exist")
|
|
}
|
|
certs := s.tlsConn.ConnectionState().PeerCertificates
|
|
if len(certs) == 0 {
|
|
return nil, errors.New("no peer certificates")
|
|
}
|
|
pub, ok := certs[0].PublicKey.(*rsa.PublicKey)
|
|
if !ok {
|
|
return nil, errors.New("invalid public key type")
|
|
}
|
|
return asn1ber.Marshal(*pub)
|
|
}
|