]>
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 | ||
7cd900d6 JH |
17 | var trtp = [4]byte{0x54, 0x52, 0x54, 0x50} |
18 | ||
aebc4d36 JH |
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) | |
7cd900d6 | 38 | func Handshake(rw io.ReadWriter) error { |
d4c152a4 | 39 | handshakeBuf := make([]byte, 12) |
7cd900d6 | 40 | if _, err := io.ReadFull(rw, handshakeBuf); err != nil { |
d4c152a4 JH |
41 | return err |
42 | } | |
43 | ||
aebc4d36 | 44 | var h handshake |
d4c152a4 | 45 | r := bytes.NewReader(handshakeBuf) |
aebc4d36 JH |
46 | if err := binary.Read(r, binary.BigEndian, &h); err != nil { |
47 | return err | |
48 | } | |
49 | ||
7cd900d6 | 50 | if h.Protocol != trtp { |
aebc4d36 JH |
51 | return errors.New("invalid handshake") |
52 | } | |
53 | ||
7cd900d6 | 54 | _, err := rw.Write([]byte{84, 82, 84, 80, 0, 0, 0, 0}) |
aebc4d36 JH |
55 | return err |
56 | } |