update README.md

This commit is contained in:
wenyifan 2022-09-08 00:12:01 +08:00
parent a983817b8d
commit c2ab6cbe5f
4 changed files with 29 additions and 25 deletions

View File

@ -11,8 +11,8 @@ import (
func TestName(t *testing.T) { func TestName(t *testing.T) {
dial, err := tls.DialWithDialer(&net.Dialer{ dial, err := tls.DialWithDialer(&net.Dialer{
Timeout: time.Second * 5, Timeout: time.Second * 5,
}, "tcp", "www.baidu.com:443", &tls.Config{ }, "tcp", "evan.run:443", &tls.Config{
ServerName: "www.baidu.com", ServerName: "evan.run",
}) })
err = dial.Handshake() err = dial.Handshake()

View File

@ -24,7 +24,9 @@ func (m PackAppData) Read(p []byte) (n int, err error) {
headRead, err := io.ReadAtLeast(m.Conn, buf[0:HeaderLength+2], HeaderLength+2) headRead, err := io.ReadAtLeast(m.Conn, buf[0:HeaderLength+2], HeaderLength+2)
if err != nil { if err != nil {
fmt.Printf("Read header error: %v\n", err) if err != io.EOF {
fmt.Printf("Read header error: %v\n", err)
}
return 0, err return 0, err
} }
if headRead < HeaderLength+2 { if headRead < HeaderLength+2 {

View File

@ -51,14 +51,15 @@ func handler(conn net.Conn, targetAddress string, fakeAddress string) {
} }
waitCh := make(chan int, 1) waitCh := make(chan int, 1)
go processHandshake(conn, fakeConn, waitCh) go processHandshake(conn, fakeConn, waitCh, "client")
go processHandshake(fakeConn, conn, waitCh) go processHandshake(fakeConn, conn, waitCh, "server")
<-waitCh <-waitCh
//Clean up previous buffered data //Clean up previous buffered data
conn.SetDeadline(time.Now()) conn.SetDeadline(time.Now())
conn.SetDeadline(time.Time{}) conn.SetDeadline(time.Time{})
fakeConn.Close()
realConnection, err := net.Dial("tcp", targetAddress) realConnection, err := net.Dial("tcp", targetAddress)
if err != nil { if err != nil {
@ -132,26 +133,22 @@ func handler(conn net.Conn, targetAddress string, fakeAddress string) {
//}() //}()
} }
func processHandshake(src net.Conn, dst net.Conn, waitCh chan int) { func processHandshake(src net.Conn, dst net.Conn, waitCh chan int, srcType string) {
buf := make([]byte, 32*1024) buf := make([]byte, 32*1024)
for { for {
nr, er := src.Read(buf) nr, er := src.Read(buf)
if nr > 0 { if nr > 0 {
header := ParseAndVerifyTLSHeader(buf[0:nr])
nw, ew := dst.Write(buf[0:nr]) nw, ew := dst.Write(buf[0:nr])
if header != nil && header.Type == ChangeCipherSpec { if srcType == "client" {
//fmt.Println(header.toString()) header := ParseAndVerifyTLSHeader(buf[0:nr])
fmt.Println("[Server] handshake complete") if header != nil {
if header.ChangeCipherSpecNext == AppData { if header.Type == ChangeCipherSpec {
dst.Close() fmt.Println("[Server] handshake complete")
waitCh <- 1 waitCh <- 1
} else { break
src.Close() }
waitCh <- 1 //fmt.Println(header.toString())
return
} }
break
} }
if nw < 0 || nr < nw { if nw < 0 || nr < nw {
nw = 0 nw = 0
@ -175,5 +172,4 @@ func processHandshake(src net.Conn, dst net.Conn, waitCh chan int) {
break break
} }
} }
waitCh <- 1
} }

View File

@ -17,8 +17,12 @@ const (
VersionTLS12 = 0x0303 VersionTLS12 = 0x0303
VersionTLS13 = 0x0304 VersionTLS13 = 0x0304
ServerHello = 2 ServerHello = 2
ClientHello = 1 ClientHello = 1
Certificate = 11
ServerKeyExchange = 12
ServerHelloDone = 14
EncryptedHandshake = 99
) )
type TLSHeader struct { type TLSHeader struct {
@ -88,12 +92,14 @@ func ParseAndVerifyTLSHeader(data []byte) *TLSHeader {
if header.Type == Handshake { if header.Type == Handshake {
header.HandshakeType = data[5] header.HandshakeType = data[5]
//Check Handshake type //Check Handshake type
if header.HandshakeType != ServerHello && header.HandshakeType != ClientHello { if header.HandshakeType != ServerHello && header.HandshakeType != ClientHello && header.HandshakeType != Certificate && header.HandshakeType != ServerKeyExchange && header.HandshakeType != ServerHelloDone {
return nil header.HandshakeType = EncryptedHandshake
} }
} }
if header.Type == ChangeCipherSpec { if header.Type == ChangeCipherSpec {
header.ChangeCipherSpecNext = data[6] if len(data) > 6 {
header.ChangeCipherSpecNext = data[6]
}
} }
return header return header
} }