]>
Commit | Line | Data |
---|---|---|
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 | var trtp = [4]byte{0x54, 0x52, 0x54, 0x50} | |
18 | ||
19 | // Handshake | |
20 | // After establishing TCP connection, both client and server start the handshake process | |
21 | // in order to confirm that each of them comply with requirements of the other. | |
22 | // The information provided in this initial data exchange identifies protocols, | |
23 | // and their versions, used in the communication. In the case where, after inspection, | |
24 | // the capabilities of one of the subjects do not comply with the requirements of the other, | |
25 | // the connection is dropped. | |
26 | // | |
27 | // The following information is sent to the server: | |
28 | // Description Size Data Note | |
29 | // Protocol ID 4 TRTP 0x54525450 | |
30 | // Sub-protocol ID 4 HOTL User defined | |
31 | // VERSION 2 1 Currently 1 | |
32 | // Sub-version 2 2 User defined | |
33 | // | |
34 | // The server replies with the following: | |
35 | // Description Size Data Note | |
36 | // Protocol ID 4 TRTP | |
37 | // Error code 4 Error code returned by the server (0 = no error) | |
38 | func Handshake(rw io.ReadWriter) error { | |
39 | handshakeBuf := make([]byte, 12) | |
40 | if _, err := io.ReadFull(rw, handshakeBuf); err != nil { | |
41 | return err | |
42 | } | |
43 | ||
44 | var h handshake | |
45 | r := bytes.NewReader(handshakeBuf) | |
46 | if err := binary.Read(r, binary.BigEndian, &h); err != nil { | |
47 | return err | |
48 | } | |
49 | ||
50 | if h.Protocol != trtp { | |
51 | return errors.New("invalid handshake") | |
52 | } | |
53 | ||
54 | _, err := rw.Write([]byte{84, 82, 84, 80, 0, 0, 0, 0}) | |
55 | return err | |
56 | } |