diff --git a/internal/server/TLS.go b/internal/server/TLS.go index 80d5576..017b928 100644 --- a/internal/server/TLS.go +++ b/internal/server/TLS.go @@ -24,6 +24,9 @@ type ClientHello struct { extensions map[[2]byte][]byte } +var u16 = binary.BigEndian.Uint16 +var u32 = binary.BigEndian.Uint32 + func parseExtensions(input []byte) (ret map[[2]byte][]byte, err error) { defer func() { if r := recover(); r != nil { @@ -37,7 +40,7 @@ func parseExtensions(input []byte) (ret map[[2]byte][]byte, err error) { var typ [2]byte copy(typ[:], input[pointer:pointer+2]) pointer += 2 - length := util.BtoInt(input[pointer : pointer+2]) + length := int(u16(input[pointer : pointer+2])) pointer += 2 data := input[pointer : pointer+length] pointer += length @@ -81,7 +84,7 @@ func ParseClientHello(data []byte) (ret *ClientHello, err error) { } pointer += 1 // Length - length := util.BtoInt(data[pointer : pointer+3]) + length := int(u32(append([]byte{0x00}, data[pointer:pointer+3]...))) pointer += 3 if length != len(data[pointer:]) { return ret, errors.New("Hello length doesn't match") @@ -98,7 +101,7 @@ func ParseClientHello(data []byte) (ret *ClientHello, err error) { sessionId := data[pointer : pointer+sessionIdLen] pointer += sessionIdLen // Cipher Suites - cipherSuitesLen := util.BtoInt(data[pointer : pointer+2]) + cipherSuitesLen := int(u16(data[pointer : pointer+2])) pointer += 2 cipherSuites := data[pointer : pointer+cipherSuitesLen] pointer += cipherSuitesLen @@ -108,7 +111,7 @@ func ParseClientHello(data []byte) (ret *ClientHello, err error) { compressionMethods := data[pointer : pointer+compressionMethodsLen] pointer += compressionMethodsLen // Extensions - extensionsLen := util.BtoInt(data[pointer : pointer+2]) + extensionsLen := int(u16(data[pointer : pointer+2])) pointer += 2 extensions, err := parseExtensions(data[pointer:]) ret = &ClientHello{ diff --git a/internal/util/util.go b/internal/util/util.go index cc8e6d0..1b7047d 100644 --- a/internal/util/util.go +++ b/internal/util/util.go @@ -28,19 +28,6 @@ func AESDecrypt(iv []byte, key []byte, ciphertext []byte) []byte { return ret } -// BtoInt converts a byte slice into int in Big Endian order -// Uint methods from binary package can be used, but they are messy -func BtoInt(b []byte) int { - var mult uint = 1 - var sum uint - length := uint(len(b)) - var i uint - for i = 0; i < length; i++ { - sum += uint(b[i]) * (mult << ((length - i - 1) * 8)) - } - return int(sum) -} - // PsudoRandBytes returns a byte slice filled with psudorandom bytes generated by the seed func PsudoRandBytes(length int, seed int64) []byte { r := prand.New(prand.NewSource(seed)) @@ -60,7 +47,7 @@ func ReadTLS(conn net.Conn, buffer []byte) (n int, err error) { return } - dataLength := BtoInt(buffer[3:5]) + dataLength := int(binary.BigEndian.Uint16(buffer[3:5])) if dataLength > len(buffer) { err = errors.New("Reading TLS message: message size greater than buffer. message size: " + strconv.Itoa(dataLength)) return