Files
Erupe/network/crypt_packet.go
2022-07-29 03:25:23 +10:00

91 lines
1.9 KiB
Go

package network
import (
"bytes"
"encoding/binary"
)
const (
// CryptPacketHeaderLength represents the byte-length of
// an encrypted packet header.
CryptPacketHeaderLength = 14
)
// CryptPacketHeader represents the parsed information of an encrypted packet header.
type CryptPacketHeader struct {
Pf0 byte
KeyRotDelta byte
PacketNum uint16
DataSize uint16
PrevPacketCombinedCheck uint16
Check0 uint16
Check1 uint16
Check2 uint16
}
// NewCryptPacketHeader parses raw bytes into a CryptPacketHeader
func NewCryptPacketHeader(data []byte) (*CryptPacketHeader, error) {
var c = CryptPacketHeader{}
r := bytes.NewReader(data)
var err error
err = binary.Read(r, binary.BigEndian, &c.Pf0)
if err != nil {
return nil, err
}
err = binary.Read(r, binary.BigEndian, &c.KeyRotDelta)
if err != nil {
return nil, err
}
err = binary.Read(r, binary.BigEndian, &c.PacketNum)
if err != nil {
return nil, err
}
err = binary.Read(r, binary.BigEndian, &c.DataSize)
if err != nil {
return nil, err
}
err = binary.Read(r, binary.BigEndian, &c.PrevPacketCombinedCheck)
if err != nil {
return nil, err
}
err = binary.Read(r, binary.BigEndian, &c.Check0)
if err != nil {
return nil, err
}
err = binary.Read(r, binary.BigEndian, &c.Check1)
if err != nil {
return nil, err
}
err = binary.Read(r, binary.BigEndian, &c.Check2)
if err != nil {
return nil, err
}
return &c, nil
}
// Encode encodes the CryptPacketHeader into raw bytes.
func (c *CryptPacketHeader) Encode() ([]byte, error) {
buf := bytes.NewBuffer([]byte{})
var data = []interface{}{
c.Pf0,
c.KeyRotDelta,
c.PacketNum,
c.DataSize,
c.PrevPacketCombinedCheck,
c.Check0,
c.Check1,
c.Check2,
}
for _, v := range data {
err := binary.Write(buf, binary.BigEndian, v)
if err != nil {
return nil, err
}
}
return buf.Bytes(), nil
}