Migrate the AmneziaWG graft from the old sagernet base (506b763) onto v0.0.3, the base sing-box 1.14 uses. Strategy: start from v0.0.3, copy the net-new obfuscation files verbatim from the proven graft (27290b6), take the 6 modified device/ files wholesale from the graft, keep all tun/* and conn/* from v0.0.3. Net-new (copied from27290b6): device/magic-header.go + device/obf*.go (9). Modified (from27290b6): device/{send,receive,uapi,device,noise-protocol,cookie}.go. - receive.go: reverted two Go-1.22 'range int' loops to the v0.0.3 form (go 1.20). - cookie.go: keeps the 4-arg CreateReply(msgType) the grafted send.go calls. - noise-protocol.go: MessageEncapsulatingTransportSize=0 (AWG composes without the sagernet Bind.Send headroom prepend). §010 android UDP_GRO guard (fb8d8d8) intentionally DROPPED: v0.0.3 fixes the receive split-brain at source — bind_std.go now gates all 5 RX/offload paths on linux||android, and gso_linux.go splits coalesced packets on android. Re-inserting the guard would disable a now-working android RX-offload path. Requires on-device re-verification before release. go.mod: go 1.20, golang.org/x/sys v0.21.0 (v0.0.3 baseline). No amnezia-vpn import paths remain. Builds clean for linux/android/windows/darwin (library packages).
47 lines
774 B
Go
47 lines
774 B
Go
package device
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/hex"
|
|
"errors"
|
|
"strings"
|
|
)
|
|
|
|
func newBytesObf(val string) (obf, error) {
|
|
val = strings.TrimPrefix(val, "0x")
|
|
|
|
if len(val) == 0 {
|
|
return nil, errors.New("empty argument")
|
|
}
|
|
|
|
if len(val)%2 != 0 {
|
|
return nil, errors.New("odd amount of symbols")
|
|
}
|
|
|
|
bytes, err := hex.DecodeString(val)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &bytesObf{data: bytes}, nil
|
|
}
|
|
|
|
type bytesObf struct {
|
|
data []byte
|
|
}
|
|
|
|
func (o *bytesObf) Obfuscate(dst, src []byte) {
|
|
copy(dst, o.data)
|
|
}
|
|
|
|
func (o *bytesObf) Deobfuscate(dst, src []byte) bool {
|
|
return bytes.Equal(o.data, src[:o.ObfuscatedLen(0)])
|
|
}
|
|
|
|
func (o *bytesObf) ObfuscatedLen(srcLen int) int {
|
|
return len(o.data)
|
|
}
|
|
|
|
func (o *bytesObf) DeobfuscatedLen(srcLen int) int {
|
|
return 0
|
|
}
|