Salamander finalmask: Support packetSize (Gecko in Hysteria v2.9.2) (#6198)

And some other refinements

https://github.com/XTLS/Xray-core/pull/6198#issuecomment-4567438813

Example: https://github.com/XTLS/Xray-core/pull/6198#issue-4522226670
This commit is contained in:
LjhAUMEM
2026-05-29 16:36:45 +08:00
committed by RPRX
parent 36303694d1
commit 66a8100737
17 changed files with 587 additions and 361 deletions
@@ -1,70 +0,0 @@
package aes128gcm_test
import (
"crypto/rand"
"crypto/sha256"
"testing"
"github.com/stretchr/testify/assert"
"github.com/xtls/xray-core/common/crypto"
)
func TestAes128GcmSealInPlace(t *testing.T) {
hashedPsk := sha256.Sum256([]byte("psk"))
aead := crypto.NewAesGcm(hashedPsk[:16])
text := []byte("0123456789012")
buf := make([]byte, 8192)
nonceSize := aead.NonceSize()
nonce := buf[:nonceSize]
rand.Read(nonce)
copy(buf[nonceSize:], text)
plaintext := buf[nonceSize : nonceSize+len(text)]
sealed := aead.Seal(nil, nonce, plaintext, nil)
_ = aead.Seal(plaintext[:0], nonce, plaintext, nil)
assert.Equal(t, sealed, buf[nonceSize:nonceSize+aead.Overhead()+len(text)])
}
func encrypted(plain []byte) ([]byte, []byte) {
hashedPsk := sha256.Sum256([]byte("psk"))
aead := crypto.NewAesGcm(hashedPsk[:16])
nonce := make([]byte, 12)
rand.Read(nonce)
return nonce, aead.Seal(nil, nonce, plain, nil)
}
func TestAes128GcmOpenInPlace(t *testing.T) {
a, b := encrypted([]byte("0123456789012"))
buf := make([]byte, 8192)
copy(buf, a)
copy(buf[len(a):], b)
hashedPsk := sha256.Sum256([]byte("psk"))
aead := crypto.NewAesGcm(hashedPsk[:16])
nonceSize := aead.NonceSize()
nonce := buf[:nonceSize]
ciphertext := buf[nonceSize : nonceSize+len(b)]
opened, _ := aead.Open(nil, nonce, ciphertext, nil)
_, _ = aead.Open(ciphertext[:0], nonce, ciphertext, nil)
assert.Equal(t, opened, ciphertext[:len(ciphertext)-aead.Overhead()])
}
func TestAes128GcmBounce(t *testing.T) {
hashedPsk := sha256.Sum256([]byte("psk"))
aead := crypto.NewAesGcm(hashedPsk[:16])
buf := make([]byte, aead.NonceSize()+aead.Overhead())
for i := 0; i < 1000; i++ {
_, _ = rand.Read(buf)
_, err := aead.Open(buf[aead.NonceSize():aead.NonceSize()], buf[:aead.NonceSize()], buf[aead.NonceSize():], nil)
assert.NotEqual(t, err, nil)
}
}
@@ -4,8 +4,9 @@ import (
"net"
)
func (c *Config) UDP() {
}
func (c *Config) UDP() {}
func (c *Config) HeaderConn() {}
func (c *Config) WrapPacketConnClient(raw net.PacketConn, level int, levelCount int) (net.PacketConn, error) {
return NewConnClient(c, raw)
@@ -14,6 +15,3 @@ func (c *Config) WrapPacketConnClient(raw net.PacketConn, level int, levelCount
func (c *Config) WrapPacketConnServer(raw net.PacketConn, level int, levelCount int) (net.PacketConn, error) {
return NewConnServer(c, raw)
}
func (c *Config) HeaderConn() {
}
@@ -8,8 +8,6 @@ import (
"github.com/xtls/xray-core/common"
"github.com/xtls/xray-core/common/crypto"
"github.com/xtls/xray-core/common/errors"
"github.com/xtls/xray-core/transport/internet/finalmask"
)
type aes128gcmConn struct {
@@ -19,13 +17,10 @@ type aes128gcmConn struct {
func NewConnClient(c *Config, raw net.PacketConn) (net.PacketConn, error) {
hashedPsk := sha256.Sum256([]byte(c.Password))
conn := &aes128gcmConn{
return &aes128gcmConn{
PacketConn: raw,
aead: crypto.NewAesGcm(hashedPsk[:16]),
}
return conn, nil
}, nil
}
func NewConnServer(c *Config, raw net.PacketConn) (net.PacketConn, error) {
@@ -37,31 +32,19 @@ func (c *aes128gcmConn) Size() int {
}
func (c *aes128gcmConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) {
if len(p) < c.aead.NonceSize()+c.aead.Overhead() {
return 0, addr, errors.New("aead short lenth")
}
nonceSize := c.aead.NonceSize()
nonce := p[:nonceSize]
ciphertext := p[nonceSize:]
_, err = c.aead.Open(ciphertext[:0], nonce, ciphertext, nil)
overhead := c.aead.Overhead()
_, err = c.aead.Open(p[nonceSize:nonceSize], p[:nonceSize], p[nonceSize:], nil)
if err != nil {
return 0, addr, errors.New("aead open").Base(err)
return 0, nil, err
}
return len(p) - c.aead.NonceSize() - c.aead.Overhead(), addr, nil
return len(p) - nonceSize - overhead, nil, nil
}
func (c *aes128gcmConn) WriteTo(p []byte, addr net.Addr) (n int, err error) {
if c.aead.Overhead()+len(p) > finalmask.UDPSize {
return 0, errors.New("aead short write")
}
nonceSize := c.aead.NonceSize()
nonce := p[:nonceSize]
common.Must2(rand.Read(nonce))
plaintext := p[nonceSize:]
_ = c.aead.Seal(plaintext[:0], nonce, plaintext, nil)
return len(p) + c.aead.Overhead(), nil
overhead := c.aead.Overhead()
common.Must2(rand.Read(p[:nonceSize]))
_ = c.aead.Seal(p[nonceSize:nonceSize], p[:nonceSize], p[nonceSize:], nil)
return len(p) + overhead, nil
}
@@ -4,8 +4,9 @@ import (
"net"
)
func (c *Config) UDP() {
}
func (c *Config) UDP() {}
func (c *Config) HeaderConn() {}
func (c *Config) WrapPacketConnClient(raw net.PacketConn, level int, levelCount int) (net.PacketConn, error) {
return NewConnClient(c, raw)
@@ -14,6 +15,3 @@ func (c *Config) WrapPacketConnClient(raw net.PacketConn, level int, levelCount
func (c *Config) WrapPacketConnServer(raw net.PacketConn, level int, levelCount int) (net.PacketConn, error) {
return NewConnServer(c, raw)
}
func (c *Config) HeaderConn() {
}
@@ -77,12 +77,10 @@ type simpleConn struct {
}
func NewConnClient(c *Config, raw net.PacketConn) (net.PacketConn, error) {
conn := &simpleConn{
return &simpleConn{
PacketConn: raw,
aead: &simple{},
}
return conn, nil
}, nil
}
func NewConnServer(c *Config, raw net.PacketConn) (net.PacketConn, error) {
@@ -96,14 +94,12 @@ func (c *simpleConn) Size() int {
func (c *simpleConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) {
_, err = c.aead.Open(p[:0], nil, p, nil)
if err != nil {
return 0, addr, errors.New("aead open").Base(err)
return 0, nil, err
}
return len(p) - c.aead.Overhead(), addr, nil
return len(p) - c.aead.Overhead(), nil, nil
}
func (c *simpleConn) WriteTo(p []byte, addr net.Addr) (n int, err error) {
_ = c.aead.Seal(p[:0], nil, p[c.aead.Overhead():], nil)
return len(p), nil
}
@@ -1,35 +0,0 @@
package original_test
import (
"crypto/rand"
"testing"
"github.com/stretchr/testify/assert"
"github.com/xtls/xray-core/transport/internet/finalmask/mkcp/original"
)
func TestSimpleSealInPlace(t *testing.T) {
aead := original.NewSimple()
text := []byte("0123456789012")
buf := make([]byte, 8192)
copy(buf[aead.Overhead():], text)
plaintext := buf[aead.Overhead() : aead.Overhead()+len(text)]
sealed := aead.Seal(nil, nil, plaintext, nil)
_ = aead.Seal(buf[:0], nil, plaintext, nil)
assert.Equal(t, sealed, buf[:aead.Overhead()+len(text)])
}
func TestOriginalBounce(t *testing.T) {
aead := original.NewSimple()
buf := make([]byte, aead.NonceSize()+aead.Overhead())
for i := 0; i < 1000; i++ {
_, _ = rand.Read(buf)
_, err := aead.Open(buf[:0], nil, buf, nil)
assert.NotEqual(t, err, nil)
}
}