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 {
if err != io.EOF {
fmt.Printf("Read header error: %v\n", err) 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,27 +133,23 @@ 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])
if header != nil {
if header.Type == ChangeCipherSpec {
fmt.Println("[Server] handshake complete") fmt.Println("[Server] handshake complete")
if header.ChangeCipherSpecNext == AppData {
dst.Close()
waitCh <- 1 waitCh <- 1
} else {
src.Close()
waitCh <- 1
return
}
break break
} }
//fmt.Println(header.toString())
}
}
if nw < 0 || nr < nw { if nw < 0 || nr < nw {
nw = 0 nw = 0
if ew == nil { if ew == nil {
@ -175,5 +172,4 @@ func processHandshake(src net.Conn, dst net.Conn, waitCh chan int) {
break break
} }
} }
waitCh <- 1
} }

View File

@ -19,6 +19,10 @@ const (
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 {
if len(data) > 6 {
header.ChangeCipherSpecNext = data[6] header.ChangeCipherSpecNext = data[6]
} }
}
return header return header
} }