1
0
mirror of https://github.com/fumiama/WireGold.git synced 2026-06-20 10:20:25 +08:00

feat(crypto): use new xor version

This commit is contained in:
源文雨
2025-02-01 15:46:45 +08:00
parent d679f45931
commit f0776751dd
2 changed files with 26 additions and 41 deletions

View File

@@ -125,61 +125,43 @@ func (m *Me) xorenc(data []byte, seq uint32) []byte {
batchsz := len(data) / 8 batchsz := len(data) / 8
remain := len(data) % 8 remain := len(data) % 8
sum := m.mask sum := m.mask
newdat := helper.MakeBytes(len(data) + 8) newdat := helper.MakeBytes(8 + batchsz*8 + 8) // seqrand dat tail
binary.LittleEndian.PutUint32(newdat[:4], seq) binary.LittleEndian.PutUint32(newdat[:4], seq)
_, _ = rand.Read(newdat[4:8]) _, _ = rand.Read(newdat[4:8]) // seqrand
if remain > 0 { sum ^= binary.LittleEndian.Uint64(newdat[:8]) // init from seqrand
var buf [8]byte binary.LittleEndian.PutUint64(newdat[:8], sum)
p := batchsz * 8 for i := 0; i < batchsz; i++ { // range on batch data
copy(buf[:], data[p:])
sum ^= binary.LittleEndian.Uint64(buf[:])
binary.LittleEndian.PutUint64(buf[:], sum)
copy(newdat[8+p:], buf[:])
}
for i := batchsz - 1; i >= 0; i-- {
a := i * 8 a := i * 8
b := (i + 1) * 8 b := (i + 1) * 8
sum ^= binary.LittleEndian.Uint64(data[a:b]) sum ^= binary.LittleEndian.Uint64(data[a:b])
binary.LittleEndian.PutUint64(newdat[a+8:b+8], sum) binary.LittleEndian.PutUint64(newdat[a+8:b+8], sum)
} }
sum ^= binary.LittleEndian.Uint64(newdat[:8]) p := batchsz * 8
binary.LittleEndian.PutUint64(newdat[:8], sum) copy(newdat[8+p:], data[p:])
newdat[len(newdat)-1] = byte(remain)
sum ^= binary.LittleEndian.Uint64(newdat[8+p:])
binary.LittleEndian.PutUint64(newdat[8+p:], sum)
return newdat return newdat
} }
// xordec 按 8 字节, 以初始 m.mask 循环异或解码 data // xordec 按 8 字节, 以初始 m.mask 循环异或解码 data
func (m *Me) xordec(data []byte) (uint32, []byte) { func (m *Me) xordec(data []byte) (uint32, []byte) {
if len(data) <= 8 { if len(data) < 16 || len(data)%8 != 0 {
return 0, nil return 0, nil
} }
batchsz := len(data) / 8 batchsz := len(data) / 8
remain := len(data) % 8 sum := m.mask
this := uint64(0) for i := 0; i < batchsz; i++ {
next := uint64(0)
if len(data) >= 8 {
next = binary.LittleEndian.Uint64(data[:8])
}
for i := 0; i < batchsz-1; i++ {
a := i * 8 a := i * 8
b := (i + 1) * 8 b := (i + 1) * 8
this = next x := binary.LittleEndian.Uint64(data[a:b])
next = binary.LittleEndian.Uint64(data[a+8 : b+8]) sum ^= x
binary.LittleEndian.PutUint64(data[a:b], this^next) binary.LittleEndian.PutUint64(data[a:b], sum)
sum = x
} }
if remain > 0 { remain := data[len(data)-1]
var buf [8]byte if remain >= 8 {
a := (batchsz - 1) * 8 return 0, nil
b := batchsz * 8
copy(buf[:], data[b:])
this = next
next = binary.LittleEndian.Uint64(buf[:]) | (m.mask & (uint64(0xffffffff_ffffffff) << (uint64(remain) * 8)))
if batchsz > 0 {
binary.LittleEndian.PutUint64(data[a:b], this^next)
}
binary.LittleEndian.PutUint64(buf[:], next^m.mask)
copy(data[b:], buf[:])
} else {
binary.LittleEndian.PutUint64(data[len(data)-8:], next^m.mask)
} }
return binary.LittleEndian.Uint32(data[:4]), data[8:] return binary.LittleEndian.Uint32(data[:4]), data[8 : len(data)-8+int(remain)]
} }

View File

@@ -17,7 +17,7 @@ func TestXOR(t *testing.T) {
} }
buf := make([]byte, 4096) buf := make([]byte, 4096)
buf2 := make([]byte, 4096) buf2 := make([]byte, 4096)
for i := 1; i < 4096; i++ { for i := 0; i < 4096; i++ {
data := buf[:i] data := buf[:i]
orgdata := buf2[:i] orgdata := buf2[:i]
r1 := bytes.NewBuffer(data[:0]) r1 := bytes.NewBuffer(data[:0])
@@ -28,7 +28,10 @@ func TestXOR(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
seq, dec := m.xordec(m.xorenc(r1.Bytes(), uint32(i))) seq, dec := m.xordec(m.xorenc(r1.Bytes(), uint32(i)))
if !bytes.Equal(dec, r2.Bytes()) || seq != uint32(i) { if !bytes.Equal(dec, r2.Bytes()) {
t.Fatal("unexpected xor at", i, "except", hex.EncodeToString(r2.Bytes()), "got", hex.EncodeToString(dec))
}
if seq != uint32(i) {
t.Fatal("unexpected xor at", i, "seq", seq) t.Fatal("unexpected xor at", i, "seq", seq)
} }
} }