diff options
| author | Jeff Halter <868228+jhalter@users.noreply.github.com> | 2022-05-28 11:35:50 -0700 |
|---|---|---|
| committer | Jeff Halter <868228+jhalter@users.noreply.github.com> | 2022-05-28 11:35:50 -0700 |
| commit | aebc4d3647b9823ae8cbb57b21b1af83bfd011fb (patch) | |
| tree | 6fa8871ec45654b68e6b018d6d06969d21b7278f /hotline/handshake.go | |
| parent | decc2fbf5db4a05aec93462ad35d890930bddd04 (diff) | |
Misc cleanup
* Removed some unnecessary user of pointers
* Removed dead cruft
* Reorganized code
Diffstat (limited to 'hotline/handshake.go')
| -rw-r--r-- | hotline/handshake.go | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/hotline/handshake.go b/hotline/handshake.go new file mode 100644 index 0000000..66bf643 --- /dev/null +++ b/hotline/handshake.go @@ -0,0 +1,49 @@ +package hotline + +import ( + "bytes" + "encoding/binary" + "errors" + "net" +) + +type handshake struct { + Protocol [4]byte // Must be 0x54525450 TRTP + SubProtocol [4]byte + Version [2]byte // Always 1 + SubVersion [2]byte +} + +// Handshake +// After establishing TCP connection, both client and server start the handshake process +// in order to confirm that each of them comply with requirements of the other. +// The information provided in this initial data exchange identifies protocols, +// and their versions, used in the communication. In the case where, after inspection, +// the capabilities of one of the subjects do not comply with the requirements of the other, +// the connection is dropped. +// +// The following information is sent to the server: +// Description Size Data Note +// Protocol ID 4 TRTP 0x54525450 +// Sub-protocol ID 4 HOTL User defined +// VERSION 2 1 Currently 1 +// Sub-version 2 2 User defined +// +// The server replies with the following: +// Description Size Data Note +// Protocol ID 4 TRTP +// Error code 4 Error code returned by the server (0 = no error) +func Handshake(conn net.Conn, buf []byte) error { + var h handshake + r := bytes.NewReader(buf) + if err := binary.Read(r, binary.BigEndian, &h); err != nil { + return err + } + + if h.Protocol != [4]byte{0x54, 0x52, 0x54, 0x50} { + return errors.New("invalid handshake") + } + + _, err := conn.Write([]byte{84, 82, 84, 80, 0, 0, 0, 0}) + return err +} |