]> git.r.bdr.sh - rbdr/mobius/blame - hotline/handshake.go
Prevent account from creating new account with greater permission
[rbdr/mobius] / hotline / handshake.go
CommitLineData
aebc4d36
JH
1package hotline
2
3import (
4 "bytes"
5 "encoding/binary"
6 "errors"
d4c152a4 7 "io"
aebc4d36
JH
8)
9
10type 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
17var 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 38func 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}