diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 718b596..4fea814 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,7 @@ jobs: - name: Get dependencies run: go mod tidy - - name: Enable Debug Log + - name: Enable debug log run: sed -i 's/false/true/g' config/global.go - name: Build diff --git a/gold/head/flags.go b/gold/head/flags.go new file mode 100644 index 0000000..de3cc56 --- /dev/null +++ b/gold/head/flags.go @@ -0,0 +1,34 @@ +package head + +import "encoding/binary" + +type PacketFlags uint16 + +func (pf PacketFlags) IsValid() bool { + return pf&0x8000 == 0 +} + +func (pf PacketFlags) DontFrag() bool { + return pf&0x4000 == 0x4000 +} + +func (pf PacketFlags) NoFrag() bool { + return pf == 0x4000 +} + +func (pf PacketFlags) IsSingle() bool { + return pf == 0 +} + +func (pf PacketFlags) ZeroOffset() bool { + return pf&0x1fff == 0 +} + +func (pf PacketFlags) Offset() uint16 { + return uint16(pf << 3) +} + +// Flags extract flags from raw data +func Flags(data []byte) PacketFlags { + return PacketFlags(binary.LittleEndian.Uint16(data[10:12])) +} diff --git a/gold/head/packet.go b/gold/head/packet.go index e5509f0..ca4975d 100644 --- a/gold/head/packet.go +++ b/gold/head/packet.go @@ -4,7 +4,6 @@ import ( "encoding/binary" "encoding/hex" "errors" - "hash/crc64" "net" blake2b "github.com/fumiama/blake2b-simd" @@ -21,37 +20,6 @@ var ( ErrDataLenLT60 = errors.New("data len < 60") ) -type PacketFlags uint16 - -func (pf PacketFlags) IsValid() bool { - return pf&0x8000 == 0 -} - -func (pf PacketFlags) DontFrag() bool { - return pf&0x4000 == 0x4000 -} - -func (pf PacketFlags) NoFrag() bool { - return pf == 0x4000 -} - -func (pf PacketFlags) IsSingle() bool { - return pf == 0 -} - -func (pf PacketFlags) ZeroOffset() bool { - return pf&0x1fff == 0 -} - -func (pf PacketFlags) Offset() uint16 { - return uint16(pf << 3) -} - -// Flags extract flags from raw data -func Flags(data []byte) PacketFlags { - return PacketFlags(binary.LittleEndian.Uint16(data[10:12])) -} - // Packet 是发送和接收的最小单位 type Packet struct { // idxdatsz len(Data) @@ -77,7 +45,7 @@ type Packet struct { // 生成时 Hash 全 0 // https://github.com/fumiama/blake2b-simd Hash [32]byte - // crc64 包头字段的 checksum 值,可以认为在一定时间内唯一 + // crc64 包头字段的 checksum 值,可以认为在一定时间内唯一 (现已更改算法为 md5 但名字未变) crc64 uint64 // data 承载的数据 data []byte @@ -108,8 +76,8 @@ func (p *Packet) Unmarshal(data []byte) (complete bool, err error) { err = ErrDataLenLT60 return } - p.crc64 = binary.LittleEndian.Uint64(data[52:PacketHeadLen]) - if crc64.Checksum(data[:52], crc64.MakeTable(crc64.ISO)) != p.crc64 { + p.crc64 = CRC64(data) + if CalcCRC64(data) != p.crc64 { err = ErrBadCRCChecksum return } @@ -189,7 +157,7 @@ func (p *Packet) Marshal(src net.IP, teatype uint8, additional uint16, datasz ui w.Write(p.Src.To4()) w.Write(p.Dst.To4()) w.Write(p.Hash[:]) - w.WriteUInt64(crc64.Checksum(w.Bytes(), crc64.MakeTable(crc64.ISO))) + w.WriteUInt64(CalcCRC64(w.Bytes())) w.Write(p.Body()) }) } diff --git a/gold/head/raw.go b/gold/head/raw.go new file mode 100644 index 0000000..646873b --- /dev/null +++ b/gold/head/raw.go @@ -0,0 +1,22 @@ +package head + +import ( + "crypto/md5" + "encoding/binary" +) + +// CRC64 extract packet header checksum +func CRC64(data []byte) uint64 { + return binary.LittleEndian.Uint64(data[52:PacketHeadLen]) +} + +// CalcCRC64 calculate packet header checksum +func CalcCRC64(data []byte) uint64 { + m := md5.Sum(data[:52]) + return binary.LittleEndian.Uint64(m[:8]) +} + +// Hash extract 32 bytes blake2b hash from raw bytes +func Hash(data []byte) []byte { + return data[20:52] +} diff --git a/gold/link/recv.go b/gold/link/recv.go index 2d71fbd..8f46196 100644 --- a/gold/link/recv.go +++ b/gold/link/recv.go @@ -40,7 +40,7 @@ func (m *Me) wait(data []byte) *head.Packet { } return nil } - crc := binary.LittleEndian.Uint64(data[52:head.PacketHeadLen]) + crc := head.CRC64(data) crclog := crc crc ^= (uint64(seq) << 16) if config.ShowDebugLog { @@ -67,7 +67,7 @@ func (m *Me) wait(data []byte) *head.Packet { } crchash := crc64.New(crc64.MakeTable(crc64.ISO)) - _, _ = crchash.Write(data[20:52]) + _, _ = crchash.Write(head.Hash(data)) var buf [4]byte binary.LittleEndian.PutUint32(buf[:], seq) _, _ = crchash.Write(buf[:])