mirror of
https://github.com/Mezeporta/Erupe.git
synced 2025-12-12 15:04:38 +01:00
91 lines
1.9 KiB
Go
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
|
|
}
|