feat: packet remove write+read funcs && add encryption fields
This commit is contained in:
108
hsp/packet.go
108
hsp/packet.go
@ -2,10 +2,7 @@ package hsp
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/binary"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
|
||||||
"net"
|
"net"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -23,8 +20,10 @@ type RawPacket struct {
|
|||||||
Flags uint8
|
Flags uint8
|
||||||
HeaderSize uint16
|
HeaderSize uint16
|
||||||
PayloadSize uint32
|
PayloadSize uint32
|
||||||
|
Nonce []byte
|
||||||
Header []byte
|
Header []byte
|
||||||
Payload []byte
|
Payload []byte
|
||||||
|
Mac []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
type Packet struct {
|
type Packet struct {
|
||||||
@ -82,106 +81,3 @@ func SerializeHeaders(headers *map[string]string) []byte {
|
|||||||
fmt.Fprintf(buf, "\n")
|
fmt.Fprintf(buf, "\n")
|
||||||
return buf.Bytes()
|
return buf.Bytes()
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewPacketDuplex(conn net.Conn) *PacketDuplex {
|
|
||||||
return &PacketDuplex{
|
|
||||||
conn,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *PacketDuplex) ReadPacket() (*Packet, error) {
|
|
||||||
rpkt := &RawPacket{}
|
|
||||||
|
|
||||||
err := binary.Read(r.conn, binary.BigEndian, &rpkt.Magic)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if rpkt.Magic != Magic {
|
|
||||||
return nil, errors.New("Magic bytes are invalid")
|
|
||||||
}
|
|
||||||
|
|
||||||
err = binary.Read(r.conn, binary.BigEndian, &rpkt.Version)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = binary.Read(r.conn, binary.BigEndian, &rpkt.Flags)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = binary.Read(r.conn, binary.BigEndian, &rpkt.HeaderSize)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = binary.Read(r.conn, binary.BigEndian, &rpkt.PayloadSize)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
rpkt.Header = make([]byte, rpkt.HeaderSize)
|
|
||||||
if _, err := io.ReadFull(r.conn, rpkt.Header); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
rpkt.Payload = make([]byte, rpkt.PayloadSize)
|
|
||||||
if _, err := io.ReadFull(r.conn, rpkt.Payload); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
pkt := &Packet{
|
|
||||||
Version: int(rpkt.Version),
|
|
||||||
Flags: int(rpkt.Flags),
|
|
||||||
Headers: make(map[string]string),
|
|
||||||
Payload: rpkt.Payload,
|
|
||||||
}
|
|
||||||
|
|
||||||
ParseHeaders(rpkt.Header, &pkt.Headers)
|
|
||||||
|
|
||||||
return pkt, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *PacketDuplex) WritePacket(packet *Packet) (int, error) {
|
|
||||||
buf := new(bytes.Buffer)
|
|
||||||
|
|
||||||
if err := binary.Write(buf, binary.BigEndian, Magic); err != nil {
|
|
||||||
return 0, errors.New(fmt.Sprintf("Failed to write magic into packet: %s", err.Error()))
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := binary.Write(buf, binary.BigEndian, uint8(packet.Version)); err != nil {
|
|
||||||
return 0, errors.New(fmt.Sprintf("Failed to write version into packet: %s", err.Error()))
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := binary.Write(buf, binary.BigEndian, uint8(packet.Flags)); err != nil {
|
|
||||||
return 0, errors.New(fmt.Sprintf("Failed to write flags into packet: %s", err.Error()))
|
|
||||||
}
|
|
||||||
|
|
||||||
rawHeaders := SerializeHeaders(&packet.Headers)
|
|
||||||
headerSize := len(rawHeaders)
|
|
||||||
payloadSize := len(packet.Payload)
|
|
||||||
|
|
||||||
if err := binary.Write(buf, binary.BigEndian, uint16(headerSize)); err != nil {
|
|
||||||
return 0, errors.New(fmt.Sprintf("Failed to write header size into packet: %s", err.Error()))
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := binary.Write(buf, binary.BigEndian, uint32(payloadSize)); err != nil {
|
|
||||||
return 0, errors.New(fmt.Sprintf("Failed to write payload size into packet: %s", err.Error()))
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := buf.Write(rawHeaders[:headerSize]); err != nil {
|
|
||||||
return 0, errors.New(fmt.Sprintf("Failed to write raw headers: %s", err.Error()))
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := buf.Write(packet.Payload[:payloadSize]); err != nil {
|
|
||||||
return 0, errors.New(fmt.Sprintf("Failed to write payload: %s", err.Error()))
|
|
||||||
}
|
|
||||||
|
|
||||||
n, err := r.conn.Write(buf.Bytes())
|
|
||||||
if err != nil {
|
|
||||||
return 0, errors.New(fmt.Sprintf("Failed to send packet over connection: %s", err.Error()))
|
|
||||||
}
|
|
||||||
|
|
||||||
return n, nil
|
|
||||||
}
|
|
||||||
|
Reference in New Issue
Block a user