]> git.r.bdr.sh - rbdr/mobius/blob - hotline/handshake.go
Refactor and cleanup to improve testability
[rbdr/mobius] / hotline / handshake.go
1 package hotline
2
3 import (
4 "bytes"
5 "encoding/binary"
6 "errors"
7 "io"
8 )
9
10 type handshake struct {
11 Protocol [4]byte // Must be 0x54525450 TRTP
12 SubProtocol [4]byte
13 Version [2]byte // Always 1
14 SubVersion [2]byte
15 }
16
17 // Handshake
18 // After establishing TCP connection, both client and server start the handshake process
19 // in order to confirm that each of them comply with requirements of the other.
20 // The information provided in this initial data exchange identifies protocols,
21 // and their versions, used in the communication. In the case where, after inspection,
22 // the capabilities of one of the subjects do not comply with the requirements of the other,
23 // the connection is dropped.
24 //
25 // The following information is sent to the server:
26 // Description Size Data Note
27 // Protocol ID 4 TRTP 0x54525450
28 // Sub-protocol ID 4 HOTL User defined
29 // VERSION 2 1 Currently 1
30 // Sub-version 2 2 User defined
31 //
32 // The server replies with the following:
33 // Description Size Data Note
34 // Protocol ID 4 TRTP
35 // Error code 4 Error code returned by the server (0 = no error)
36 func Handshake(conn io.ReadWriter) error {
37 handshakeBuf := make([]byte, 12)
38 if _, err := io.ReadFull(conn, handshakeBuf); err != nil {
39 return err
40 }
41
42 var h handshake
43 r := bytes.NewReader(handshakeBuf)
44 if err := binary.Read(r, binary.BigEndian, &h); err != nil {
45 return err
46 }
47
48 if h.Protocol != [4]byte{0x54, 0x52, 0x54, 0x50} {
49 return errors.New("invalid handshake")
50 }
51
52 _, err := conn.Write([]byte{84, 82, 84, 80, 0, 0, 0, 0})
53 return err
54 }