mirror of
https://github.com/fumiama/go-registry.git
synced 2026-06-06 08:20:27 +08:00
95 lines
1.5 KiB
Go
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,
|
|
}
|