Skip to content

Commit

Permalink
Slice operations optimisation
Browse files Browse the repository at this point in the history
  • Loading branch information
cbeuw committed Oct 7, 2018
1 parent 22b290b commit 0abbe2f
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 33 deletions.
36 changes: 21 additions & 15 deletions gqclient/TLS/TLS.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,11 @@ import (
func AddRecordLayer(input []byte, typ []byte, ver []byte) []byte {
length := make([]byte, 2)
binary.BigEndian.PutUint16(length, uint16(len(input)))
ret := append(typ, ver...)
ret = append(ret, length...)
ret = append(ret, input...)
ret := make([]byte, 5+len(input))
copy(ret[0:1], typ)
copy(ret[1:3], ver)
copy(ret[3:5], length)
copy(ret[5:], input)
return ret
}

Expand All @@ -29,15 +31,17 @@ type browser interface {

func makeServerName(sta *gqclient.State) []byte {
serverName := sta.ServerName
serverNameListLength := make([]byte, 2)
binary.BigEndian.PutUint16(serverNameListLength, uint16(len(serverName)+3))
serverNameType := []byte{0x00} // host_name
serverNameLength := make([]byte, 2)
binary.BigEndian.PutUint16(serverNameLength, uint16(len(serverName)))
serverNameType := []byte{0x00} // host_name
var ret []byte
ret = append(serverNameType, serverNameLength...)
ret = append(ret, serverName...)
serverNameListLength := make([]byte, 2)
binary.BigEndian.PutUint16(serverNameListLength, uint16(len(ret)))
return append(serverNameListLength, ret...)
ret := make([]byte, 2+1+2+len(serverName))
copy(ret[0:2], serverNameListLength)
copy(ret[2:3], serverNameType)
copy(ret[3:5], serverNameLength)
copy(ret[5:], serverName)
return ret
}

func makeSessionTicket(sta *gqclient.State) []byte {
Expand All @@ -46,9 +50,9 @@ func makeSessionTicket(sta *gqclient.State) []byte {
}

func makeNullBytes(length int) []byte {
var ret []byte
ret := make([]byte, length)
for i := 0; i < length; i++ {
ret = append(ret, 0x00)
ret[i] = 0x00
}
return ret
}
Expand All @@ -57,9 +61,11 @@ func makeNullBytes(length int) []byte {
func addExtRec(typ []byte, data []byte) []byte {
length := make([]byte, 2)
binary.BigEndian.PutUint16(length, uint16(len(data)))
var ret []byte
ret = append(typ, length...)
return append(ret, data...)
ret := make([]byte, 2+2+len(data))
copy(ret[0:2], typ)
copy(ret[2:4], length)
copy(ret[4:], data)
return ret
}

// ComposeInitHandshake composes ClientHello with record layer
Expand Down
7 changes: 5 additions & 2 deletions gqclient/TLS/chrome.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,11 @@ func (c *chrome) composeExtensions(sta *gqclient.State) []byte {

makeSupportedGroups := func() []byte {
suppGroupListLen := []byte{0x00, 0x08}
suppGroup := append(makeGREASE(), []byte{0x00, 0x1d, 0x00, 0x17, 0x00, 0x18}...)
return append(suppGroupListLen, suppGroup...)
ret := make([]byte, 2+8)
copy(ret[0:2], suppGroupListLen)
copy(ret[2:4], makeGREASE())
copy(ret[4:], []byte{0x00, 0x1d, 0x00, 0x17, 0x00, 0x18})
return ret
}

var ext [14][]byte
Expand Down
5 changes: 4 additions & 1 deletion gqclient/auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,8 @@ func MakeRandomField(sta *State) []byte {
goal := h.Sum(nil)[0:16]
iv := CryptoRandBytes(16)
rest := encrypt(iv, sta.AESKey, goal)
return append(iv, rest...)
ret := make([]byte, 32)
copy(ret, iv)
copy(ret[16:], rest)
return ret
}
18 changes: 10 additions & 8 deletions gqclient/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,24 +24,26 @@ func BtoInt(b []byte) int {
}

// CryptoRandBytes generates a byte slice filled with cryptographically secure random bytes
func CryptoRandBytes(length int) (ret []byte) {
func CryptoRandBytes(length int) []byte {
byteMax := big.NewInt(int64(256))
for len(ret) < length {
ret := make([]byte, length)
for i := 0; i < length; i++ {
randInt, _ := rand.Int(rand.Reader, byteMax)
randByte := byte(randInt.Int64())
ret = append(ret, randByte)
ret[i] = randByte
}
return
return ret
}

// PsudoRandBytes returns a byte slice filled with psudorandom bytes generated by the seed
func PsudoRandBytes(length int, seed int64) (ret []byte) {
func PsudoRandBytes(length int, seed int64) []byte {
prand.Seed(seed)
for len(ret) < length {
ret := make([]byte, length)
for i := 0; i < length; i++ {
randByte := byte(prand.Intn(256))
ret = append(ret, randByte)
ret[i] = randByte
}
return
return ret
}

// ReadTillDrain reads TLS data according to its record layer
Expand Down
8 changes: 5 additions & 3 deletions gqserver/TLS.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,11 @@ func parseExtensions(input []byte) (ret map[[2]byte][]byte, err error) {
func AddRecordLayer(input []byte, typ []byte, ver []byte) []byte {
length := make([]byte, 2)
binary.BigEndian.PutUint16(length, uint16(len(input)))
ret := append(typ, ver...)
ret = append(ret, length...)
ret = append(ret, input...)
ret := make([]byte, 5+len(input))
copy(ret[0:1], typ)
copy(ret[1:3], ver)
copy(ret[3:5], length)
copy(ret[5:], input)
return ret
}

Expand Down
9 changes: 5 additions & 4 deletions gqserver/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,14 @@ func BtoInt(b []byte) int {
}

// PsudoRandBytes returns a byte slice filled with psudorandom bytes generated by the seed
func PsudoRandBytes(length int, seed int64) (ret []byte) {
func PsudoRandBytes(length int, seed int64) []byte {
prand.Seed(seed)
for len(ret) < length {
ret := make([]byte, length)
for i := 0; i < length; i++ {
randByte := byte(prand.Intn(256))
ret = append(ret, randByte)
ret[i] = randByte
}
return
return ret
}

// ReadTillDrain reads TLS data according to its record layer
Expand Down

0 comments on commit 0abbe2f

Please sign in to comment.