|
|
|
@ -4,10 +4,7 @@ import (
|
|
|
|
|
"bytes"
|
|
|
|
|
"github.com/cbeuw/connutil"
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
|
"io"
|
|
|
|
|
"io/ioutil"
|
|
|
|
|
"math/rand"
|
|
|
|
|
"net"
|
|
|
|
|
"strconv"
|
|
|
|
|
"sync"
|
|
|
|
|
"sync/atomic"
|
|
|
|
@ -19,188 +16,73 @@ var seshConfigs = map[string]SessionConfig{
|
|
|
|
|
"ordered": {},
|
|
|
|
|
"unordered": {Unordered: true},
|
|
|
|
|
}
|
|
|
|
|
var encryptionMethods = map[string]byte{
|
|
|
|
|
"plain": EncryptionMethodPlain,
|
|
|
|
|
"aes-256-gcm": EncryptionMethodAES256GCM,
|
|
|
|
|
"aes-128-gcm": EncryptionMethodAES128GCM,
|
|
|
|
|
"chacha20poly1305": EncryptionMethodChaha20Poly1305,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const testPayloadLen = 1024
|
|
|
|
|
const obfsBufLen = testPayloadLen * 2
|
|
|
|
|
|
|
|
|
|
func TestRecvDataFromRemote(t *testing.T) {
|
|
|
|
|
testPayload := make([]byte, testPayloadLen)
|
|
|
|
|
rand.Read(testPayload)
|
|
|
|
|
f := &Frame{
|
|
|
|
|
1,
|
|
|
|
|
0,
|
|
|
|
|
0,
|
|
|
|
|
testPayload,
|
|
|
|
|
}
|
|
|
|
|
obfsBuf := make([]byte, obfsBufLen)
|
|
|
|
|
|
|
|
|
|
var sessionKey [32]byte
|
|
|
|
|
rand.Read(sessionKey[:])
|
|
|
|
|
|
|
|
|
|
MakeObfuscatorUnwrap := func(method byte, sessionKey [32]byte) Obfuscator {
|
|
|
|
|
ret, err := MakeObfuscator(method, sessionKey)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("failed to make an obfuscator: %v", err)
|
|
|
|
|
}
|
|
|
|
|
return ret
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
encryptionMethods := map[string]Obfuscator{
|
|
|
|
|
"plain": MakeObfuscatorUnwrap(EncryptionMethodPlain, sessionKey),
|
|
|
|
|
"aes-gcm": MakeObfuscatorUnwrap(EncryptionMethodAES256GCM, sessionKey),
|
|
|
|
|
"chacha20-poly1305": MakeObfuscatorUnwrap(EncryptionMethodChaha20Poly1305, sessionKey),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for seshType, seshConfig := range seshConfigs {
|
|
|
|
|
seshConfig := seshConfig
|
|
|
|
|
t.Run(seshType, func(t *testing.T) {
|
|
|
|
|
var err error
|
|
|
|
|
seshConfig.Obfuscator, err = MakeObfuscator(EncryptionMethodPlain, sessionKey)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("failed to make obfuscator: %v", err)
|
|
|
|
|
}
|
|
|
|
|
t.Run("initial frame", func(t *testing.T) {
|
|
|
|
|
sesh := MakeSession(0, seshConfig)
|
|
|
|
|
obfsBuf := make([]byte, obfsBufLen)
|
|
|
|
|
f := Frame{
|
|
|
|
|
1,
|
|
|
|
|
0,
|
|
|
|
|
0,
|
|
|
|
|
make([]byte, testPayloadLen),
|
|
|
|
|
}
|
|
|
|
|
rand.Read(f.Payload)
|
|
|
|
|
n, err := sesh.obfuscate(&f, obfsBuf, 0)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
err = sesh.recvDataFromRemote(obfsBuf[:n])
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
stream, err := sesh.Accept()
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
resultPayload := make([]byte, testPayloadLen)
|
|
|
|
|
_, err = stream.Read(resultPayload)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
assert.EqualValues(t, f.Payload, resultPayload)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
t.Run("two frames in order", func(t *testing.T) {
|
|
|
|
|
sesh := MakeSession(0, seshConfig)
|
|
|
|
|
obfsBuf := make([]byte, obfsBufLen)
|
|
|
|
|
f := Frame{
|
|
|
|
|
1,
|
|
|
|
|
0,
|
|
|
|
|
0,
|
|
|
|
|
make([]byte, testPayloadLen),
|
|
|
|
|
}
|
|
|
|
|
rand.Read(f.Payload)
|
|
|
|
|
n, err := sesh.obfuscate(&f, obfsBuf, 0)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
err = sesh.recvDataFromRemote(obfsBuf[:n])
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
stream, err := sesh.Accept()
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
resultPayload := make([]byte, testPayloadLen)
|
|
|
|
|
_, err = io.ReadFull(stream, resultPayload)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
assert.EqualValues(t, f.Payload, resultPayload)
|
|
|
|
|
|
|
|
|
|
f.Seq += 1
|
|
|
|
|
rand.Read(f.Payload)
|
|
|
|
|
n, err = sesh.obfuscate(&f, obfsBuf, 0)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
err = sesh.recvDataFromRemote(obfsBuf[:n])
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
_, err = io.ReadFull(stream, resultPayload)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
assert.EqualValues(t, f.Payload, resultPayload)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
t.Run("two frames in order", func(t *testing.T) {
|
|
|
|
|
sesh := MakeSession(0, seshConfig)
|
|
|
|
|
obfsBuf := make([]byte, obfsBufLen)
|
|
|
|
|
f := Frame{
|
|
|
|
|
1,
|
|
|
|
|
0,
|
|
|
|
|
0,
|
|
|
|
|
make([]byte, testPayloadLen),
|
|
|
|
|
}
|
|
|
|
|
rand.Read(f.Payload)
|
|
|
|
|
n, err := sesh.obfuscate(&f, obfsBuf, 0)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
err = sesh.recvDataFromRemote(obfsBuf[:n])
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
stream, err := sesh.Accept()
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
resultPayload := make([]byte, testPayloadLen)
|
|
|
|
|
_, err = io.ReadFull(stream, resultPayload)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
assert.EqualValues(t, f.Payload, resultPayload)
|
|
|
|
|
|
|
|
|
|
f.Seq += 1
|
|
|
|
|
rand.Read(f.Payload)
|
|
|
|
|
n, err = sesh.obfuscate(&f, obfsBuf, 0)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
err = sesh.recvDataFromRemote(obfsBuf[:n])
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
_, err = io.ReadFull(stream, resultPayload)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
assert.EqualValues(t, f.Payload, resultPayload)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
if seshType == "ordered" {
|
|
|
|
|
t.Run("frames out of order", func(t *testing.T) {
|
|
|
|
|
for method, obfuscator := range encryptionMethods {
|
|
|
|
|
obfuscator := obfuscator
|
|
|
|
|
t.Run(method, func(t *testing.T) {
|
|
|
|
|
seshConfig.Obfuscator = obfuscator
|
|
|
|
|
sesh := MakeSession(0, seshConfig)
|
|
|
|
|
obfsBuf := make([]byte, obfsBufLen)
|
|
|
|
|
f := Frame{
|
|
|
|
|
1,
|
|
|
|
|
0,
|
|
|
|
|
0,
|
|
|
|
|
nil,
|
|
|
|
|
n, err := sesh.Obfs(f, obfsBuf, 0)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Error(err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// First frame
|
|
|
|
|
seq0 := make([]byte, testPayloadLen)
|
|
|
|
|
rand.Read(seq0)
|
|
|
|
|
f.Seq = 0
|
|
|
|
|
f.Payload = seq0
|
|
|
|
|
n, err := sesh.obfuscate(&f, obfsBuf, 0)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
err = sesh.recvDataFromRemote(obfsBuf[:n])
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
// Third frame
|
|
|
|
|
seq2 := make([]byte, testPayloadLen)
|
|
|
|
|
rand.Read(seq2)
|
|
|
|
|
f.Seq = 2
|
|
|
|
|
f.Payload = seq2
|
|
|
|
|
n, err = sesh.obfuscate(&f, obfsBuf, 0)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
err = sesh.recvDataFromRemote(obfsBuf[:n])
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
// Second frame
|
|
|
|
|
seq1 := make([]byte, testPayloadLen)
|
|
|
|
|
rand.Read(seq1)
|
|
|
|
|
f.Seq = 1
|
|
|
|
|
f.Payload = seq1
|
|
|
|
|
n, err = sesh.obfuscate(&f, obfsBuf, 0)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
err = sesh.recvDataFromRemote(obfsBuf[:n])
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
// Expect things to receive in order
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Error(err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
stream, err := sesh.Accept()
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Error(err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
resultPayload := make([]byte, testPayloadLen)
|
|
|
|
|
|
|
|
|
|
// First
|
|
|
|
|
_, err = io.ReadFull(stream, resultPayload)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
assert.EqualValues(t, seq0, resultPayload)
|
|
|
|
|
|
|
|
|
|
// Second
|
|
|
|
|
_, err = io.ReadFull(stream, resultPayload)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
assert.EqualValues(t, seq1, resultPayload)
|
|
|
|
|
|
|
|
|
|
// Third
|
|
|
|
|
_, err = io.ReadFull(stream, resultPayload)
|
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
assert.EqualValues(t, seq2, resultPayload)
|
|
|
|
|
_, err = stream.Read(resultPayload)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Error(err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if !bytes.Equal(testPayload, resultPayload) {
|
|
|
|
|
t.Errorf("Expecting %x, got %x", testPayload, resultPayload)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -212,9 +94,10 @@ func TestRecvDataFromRemote_Closing_InOrder(t *testing.T) {
|
|
|
|
|
|
|
|
|
|
var sessionKey [32]byte
|
|
|
|
|
rand.Read(sessionKey[:])
|
|
|
|
|
obfuscator, _ := MakeObfuscator(EncryptionMethodPlain, sessionKey)
|
|
|
|
|
|
|
|
|
|
seshConfig := seshConfigs["ordered"]
|
|
|
|
|
seshConfig.Obfuscator, _ = MakeObfuscator(EncryptionMethodPlain, sessionKey)
|
|
|
|
|
seshConfig.Obfuscator = obfuscator
|
|
|
|
|
sesh := MakeSession(0, seshConfig)
|
|
|
|
|
|
|
|
|
|
f1 := &Frame{
|
|
|
|
@ -224,7 +107,7 @@ func TestRecvDataFromRemote_Closing_InOrder(t *testing.T) {
|
|
|
|
|
testPayload,
|
|
|
|
|
}
|
|
|
|
|
// create stream 1
|
|
|
|
|
n, _ := sesh.obfuscate(f1, obfsBuf, 0)
|
|
|
|
|
n, _ := sesh.Obfs(f1, obfsBuf, 0)
|
|
|
|
|
err := sesh.recvDataFromRemote(obfsBuf[:n])
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("receiving normal frame for stream 1: %v", err)
|
|
|
|
@ -246,7 +129,7 @@ func TestRecvDataFromRemote_Closing_InOrder(t *testing.T) {
|
|
|
|
|
closingNothing,
|
|
|
|
|
testPayload,
|
|
|
|
|
}
|
|
|
|
|
n, _ = sesh.obfuscate(f2, obfsBuf, 0)
|
|
|
|
|
n, _ = sesh.Obfs(f2, obfsBuf, 0)
|
|
|
|
|
err = sesh.recvDataFromRemote(obfsBuf[:n])
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("receiving normal frame for stream 2: %v", err)
|
|
|
|
@ -268,7 +151,7 @@ func TestRecvDataFromRemote_Closing_InOrder(t *testing.T) {
|
|
|
|
|
closingStream,
|
|
|
|
|
testPayload,
|
|
|
|
|
}
|
|
|
|
|
n, _ = sesh.obfuscate(f1CloseStream, obfsBuf, 0)
|
|
|
|
|
n, _ = sesh.Obfs(f1CloseStream, obfsBuf, 0)
|
|
|
|
|
err = sesh.recvDataFromRemote(obfsBuf[:n])
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("receiving stream closing frame for stream 1: %v", err)
|
|
|
|
@ -297,7 +180,7 @@ func TestRecvDataFromRemote_Closing_InOrder(t *testing.T) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// close stream 1 again
|
|
|
|
|
n, _ = sesh.obfuscate(f1CloseStream, obfsBuf, 0)
|
|
|
|
|
n, _ = sesh.Obfs(f1CloseStream, obfsBuf, 0)
|
|
|
|
|
err = sesh.recvDataFromRemote(obfsBuf[:n])
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("receiving stream closing frame for stream 1 %v", err)
|
|
|
|
@ -320,7 +203,7 @@ func TestRecvDataFromRemote_Closing_InOrder(t *testing.T) {
|
|
|
|
|
Closing: closingSession,
|
|
|
|
|
Payload: testPayload,
|
|
|
|
|
}
|
|
|
|
|
n, _ = sesh.obfuscate(fCloseSession, obfsBuf, 0)
|
|
|
|
|
n, _ = sesh.Obfs(fCloseSession, obfsBuf, 0)
|
|
|
|
|
err = sesh.recvDataFromRemote(obfsBuf[:n])
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("receiving session closing frame: %v", err)
|
|
|
|
@ -350,9 +233,10 @@ func TestRecvDataFromRemote_Closing_OutOfOrder(t *testing.T) {
|
|
|
|
|
|
|
|
|
|
var sessionKey [32]byte
|
|
|
|
|
rand.Read(sessionKey[:])
|
|
|
|
|
obfuscator, _ := MakeObfuscator(EncryptionMethodPlain, sessionKey)
|
|
|
|
|
|
|
|
|
|
seshConfig := seshConfigs["ordered"]
|
|
|
|
|
seshConfig.Obfuscator, _ = MakeObfuscator(EncryptionMethodPlain, sessionKey)
|
|
|
|
|
seshConfig.Obfuscator = obfuscator
|
|
|
|
|
sesh := MakeSession(0, seshConfig)
|
|
|
|
|
|
|
|
|
|
// receive stream 1 closing first
|
|
|
|
@ -362,7 +246,7 @@ func TestRecvDataFromRemote_Closing_OutOfOrder(t *testing.T) {
|
|
|
|
|
closingStream,
|
|
|
|
|
testPayload,
|
|
|
|
|
}
|
|
|
|
|
n, _ := sesh.obfuscate(f1CloseStream, obfsBuf, 0)
|
|
|
|
|
n, _ := sesh.Obfs(f1CloseStream, obfsBuf, 0)
|
|
|
|
|
err := sesh.recvDataFromRemote(obfsBuf[:n])
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("receiving out of order stream closing frame for stream 1: %v", err)
|
|
|
|
@ -384,7 +268,7 @@ func TestRecvDataFromRemote_Closing_OutOfOrder(t *testing.T) {
|
|
|
|
|
closingNothing,
|
|
|
|
|
testPayload,
|
|
|
|
|
}
|
|
|
|
|
n, _ = sesh.obfuscate(f1, obfsBuf, 0)
|
|
|
|
|
n, _ = sesh.Obfs(f1, obfsBuf, 0)
|
|
|
|
|
err = sesh.recvDataFromRemote(obfsBuf[:n])
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("receiving normal frame for stream 1: %v", err)
|
|
|
|
@ -446,7 +330,7 @@ func TestParallelStreams(t *testing.T) {
|
|
|
|
|
wg.Add(1)
|
|
|
|
|
go func(frame *Frame) {
|
|
|
|
|
obfsBuf := make([]byte, obfsBufLen)
|
|
|
|
|
n, _ := sesh.obfuscate(frame, obfsBuf, 0)
|
|
|
|
|
n, _ := sesh.Obfs(frame, obfsBuf, 0)
|
|
|
|
|
obfsBuf = obfsBuf[0:n]
|
|
|
|
|
|
|
|
|
|
err := sesh.recvDataFromRemote(obfsBuf)
|
|
|
|
@ -531,7 +415,7 @@ func TestSession_timeoutAfter(t *testing.T) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func BenchmarkRecvDataFromRemote(b *testing.B) {
|
|
|
|
|
func BenchmarkRecvDataFromRemote_Ordered(b *testing.B) {
|
|
|
|
|
testPayload := make([]byte, testPayloadLen)
|
|
|
|
|
rand.Read(testPayload)
|
|
|
|
|
f := &Frame{
|
|
|
|
@ -544,34 +428,33 @@ func BenchmarkRecvDataFromRemote(b *testing.B) {
|
|
|
|
|
var sessionKey [32]byte
|
|
|
|
|
rand.Read(sessionKey[:])
|
|
|
|
|
|
|
|
|
|
table := map[string]byte{
|
|
|
|
|
"plain": EncryptionMethodPlain,
|
|
|
|
|
"aes-gcm": EncryptionMethodAES256GCM,
|
|
|
|
|
"chacha20poly1305": EncryptionMethodChaha20Poly1305,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const maxIter = 100_000 // run with -benchtime 100000x to avoid index out of bounds panic
|
|
|
|
|
for name, ep := range encryptionMethods {
|
|
|
|
|
for name, ep := range table {
|
|
|
|
|
ep := ep
|
|
|
|
|
b.Run(name, func(b *testing.B) {
|
|
|
|
|
for seshType, seshConfig := range seshConfigs {
|
|
|
|
|
b.Run(seshType, func(b *testing.B) {
|
|
|
|
|
seshConfig.Obfuscator, _ = MakeObfuscator(ep, sessionKey)
|
|
|
|
|
sesh := MakeSession(0, seshConfig)
|
|
|
|
|
seshConfig := seshConfigs["ordered"]
|
|
|
|
|
obfuscator, _ := MakeObfuscator(ep, sessionKey)
|
|
|
|
|
seshConfig.Obfuscator = obfuscator
|
|
|
|
|
sesh := MakeSession(0, seshConfig)
|
|
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
|
stream, _ := sesh.Accept()
|
|
|
|
|
stream.(*Stream).WriteTo(ioutil.Discard)
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
binaryFrames := [maxIter][]byte{}
|
|
|
|
|
for i := 0; i < maxIter; i++ {
|
|
|
|
|
obfsBuf := make([]byte, obfsBufLen)
|
|
|
|
|
n, _ := sesh.obfuscate(f, obfsBuf, 0)
|
|
|
|
|
binaryFrames[i] = obfsBuf[:n]
|
|
|
|
|
f.Seq++
|
|
|
|
|
}
|
|
|
|
|
binaryFrames := [maxIter][]byte{}
|
|
|
|
|
for i := 0; i < maxIter; i++ {
|
|
|
|
|
obfsBuf := make([]byte, obfsBufLen)
|
|
|
|
|
n, _ := sesh.Obfs(f, obfsBuf, 0)
|
|
|
|
|
binaryFrames[i] = obfsBuf[:n]
|
|
|
|
|
f.Seq++
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
b.SetBytes(int64(len(f.Payload)))
|
|
|
|
|
b.ResetTimer()
|
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
|
sesh.recvDataFromRemote(binaryFrames[i])
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
b.SetBytes(int64(len(f.Payload)))
|
|
|
|
|
b.ResetTimer()
|
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
|
sesh.recvDataFromRemote(binaryFrames[i])
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
@ -581,13 +464,21 @@ func BenchmarkMultiStreamWrite(b *testing.B) {
|
|
|
|
|
var sessionKey [32]byte
|
|
|
|
|
rand.Read(sessionKey[:])
|
|
|
|
|
|
|
|
|
|
table := map[string]byte{
|
|
|
|
|
"plain": EncryptionMethodPlain,
|
|
|
|
|
"aes-gcm": EncryptionMethodAES256GCM,
|
|
|
|
|
"chacha20poly1305": EncryptionMethodChaha20Poly1305,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
testPayload := make([]byte, testPayloadLen)
|
|
|
|
|
|
|
|
|
|
for name, ep := range encryptionMethods {
|
|
|
|
|
for name, ep := range table {
|
|
|
|
|
b.Run(name, func(b *testing.B) {
|
|
|
|
|
for seshType, seshConfig := range seshConfigs {
|
|
|
|
|
seshConfig := seshConfig
|
|
|
|
|
b.Run(seshType, func(b *testing.B) {
|
|
|
|
|
seshConfig.Obfuscator, _ = MakeObfuscator(ep, sessionKey)
|
|
|
|
|
obfuscator, _ := MakeObfuscator(ep, sessionKey)
|
|
|
|
|
seshConfig.Obfuscator = obfuscator
|
|
|
|
|
sesh := MakeSession(0, seshConfig)
|
|
|
|
|
sesh.AddConnection(connutil.Discard())
|
|
|
|
|
b.ResetTimer()
|
|
|
|
@ -603,36 +494,3 @@ func BenchmarkMultiStreamWrite(b *testing.B) {
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func BenchmarkLatency(b *testing.B) {
|
|
|
|
|
var sessionKey [32]byte
|
|
|
|
|
rand.Read(sessionKey[:])
|
|
|
|
|
|
|
|
|
|
for name, ep := range encryptionMethods {
|
|
|
|
|
b.Run(name, func(b *testing.B) {
|
|
|
|
|
for seshType, seshConfig := range seshConfigs {
|
|
|
|
|
b.Run(seshType, func(b *testing.B) {
|
|
|
|
|
seshConfig.Obfuscator, _ = MakeObfuscator(ep, sessionKey)
|
|
|
|
|
clientSesh := MakeSession(0, seshConfig)
|
|
|
|
|
serverSesh := MakeSession(0, seshConfig)
|
|
|
|
|
|
|
|
|
|
c, s := net.Pipe()
|
|
|
|
|
clientSesh.AddConnection(c)
|
|
|
|
|
serverSesh.AddConnection(s)
|
|
|
|
|
|
|
|
|
|
buf := make([]byte, 64)
|
|
|
|
|
clientStream, _ := clientSesh.OpenStream()
|
|
|
|
|
clientStream.Write(buf)
|
|
|
|
|
serverStream, _ := serverSesh.Accept()
|
|
|
|
|
io.ReadFull(serverStream, buf)
|
|
|
|
|
|
|
|
|
|
b.ResetTimer()
|
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
|
clientStream.Write(buf)
|
|
|
|
|
io.ReadFull(serverStream, buf)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|