1
0
mirror of https://github.com/fumiama/go-registry.git synced 2026-06-06 08:20:27 +08:00
Files
go-registry/cmd.go
fumiama 3a0fede329 init
2021-12-13 15:42:37 +08:00

95 lines
1.5 KiB
Go

package registry
import (
"crypto/md5"
"unsafe"
tea "github.com/fumiama/gofastTEA"
)
const (
CMDGET uint8 = iota
CMDCAT
CMDMD5
CMDACK
CMDEND
CMDSET
CMDDEL
CMDDAT
)
type CmdPacket struct {
cmd uint8
md5 [16]byte
t tea.TEA
data []byte
}
func NewCmdPacket(cmd uint8, data []byte, t *tea.TEA) *CmdPacket {
return &CmdPacket{
cmd: cmd,
md5: md5.Sum(data),
t: *t,
data: data,
}
}
func ParseCmdPacket(data []byte, t *tea.TEA) *CmdPacket {
if len(data) < 1+1+16 {
return nil
}
if len(data)-1-1-16 < int(data[1]) {
return nil
}
var md5 [16]byte
copy(md5[:], data[2:18])
return &CmdPacket{
cmd: data[0],
md5: md5,
t: *t,
data: data[18 : data[1]+18],
}
}
func (c *CmdPacket) Encrypt(seq uint8) (raw []byte) {
setseq(&c.t, seq)
d := c.t.EncryptLittleEndian(c.data, sumtable)
raw = append(raw, c.cmd, uint8(len(d)))
raw = append(raw, c.md5[:]...)
raw = append(raw, d...)
return
}
func (c *CmdPacket) Decrypt(seq uint8) []byte {
setseq(&c.t, seq)
d := c.t.DecryptLittleEndian(c.data, sumtable)
if d != nil && c.md5 == md5.Sum(d) {
return d
}
return nil
}
func setseq(t *tea.TEA, seq uint8) {
*(*uint8)(unsafe.Pointer(uintptr(unsafe.Pointer(t)) + uintptr(15))) = seq
}
// TEA encoding sumtable
var sumtable = [0x10]uint32{
0x9e3579b9,
0x3c6ef172,
0xd2a66d2b,
0x78dd36e4,
0x17e5609d,
0xb54fda56,
0x5384560f,
0xf1bb77c8,
0x8ff24781,
0x2e4ac13a,
0xcc653af3,
0x6a9964ac,
0x08d12965,
0xa708081e,
0x451221d7,
0xe37793d0,
}