mirror of
https://github.com/XTLS/Xray-core.git
synced 2026-07-08 20:58:44 +00:00
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:
@@ -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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user