aboutsummaryrefslogtreecommitdiff
path: root/hotline/handshake.go
diff options
context:
space:
mode:
authorJeff Halter <868228+jhalter@users.noreply.github.com>2022-05-28 11:35:50 -0700
committerJeff Halter <868228+jhalter@users.noreply.github.com>2022-05-28 11:35:50 -0700
commitaebc4d3647b9823ae8cbb57b21b1af83bfd011fb (patch)
tree6fa8871ec45654b68e6b018d6d06969d21b7278f /hotline/handshake.go
parentdecc2fbf5db4a05aec93462ad35d890930bddd04 (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.go49
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
+}