]>
Commit | Line | Data |
---|---|---|
aebc4d36 JH |
1 | package hotline |
2 | ||
3 | import ( | |
4 | "bytes" | |
5 | "encoding/binary" | |
6 | "errors" | |
d4c152a4 | 7 | "io" |
aebc4d36 JH |
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) | |
d4c152a4 JH |
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 | ||
aebc4d36 | 42 | var h handshake |
d4c152a4 | 43 | r := bytes.NewReader(handshakeBuf) |
aebc4d36 JH |
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 | } |