update README.md
This commit is contained in:
parent
a983817b8d
commit
c2ab6cbe5f
@ -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()
|
||||||
|
@ -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 {
|
||||||
|
@ -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
|
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user