diff --git a/internal/multiplex/obfs.go b/internal/multiplex/obfs.go index 099ab08..733bb97 100644 --- a/internal/multiplex/obfs.go +++ b/internal/multiplex/obfs.go @@ -35,10 +35,10 @@ func MakeObfs(salsaKey [32]byte, payloadCipher cipher.AEAD) Obfser { if len(buf) < usefulLen { return 0, errors.New("buffer is too small") } - used := buf[:usefulLen] - recordLayer := used[0:5] - header := used[5 : 5+HEADER_LEN] - encryptedPayload := used[5+HEADER_LEN:] + useful := buf[:usefulLen] // tls header + payload + potential overhead + recordLayer := useful[0:5] + header := useful[5 : 5+HEADER_LEN] + encryptedPayload := useful[5+HEADER_LEN:] // header: [StreamID 4 bytes][Seq 4 bytes][Closing 1 byte][extraLen 1 bytes][random 2 bytes] putU32(header[0:4], f.StreamID) diff --git a/internal/multiplex/session_test.go b/internal/multiplex/session_test.go index 3a0216f..b7b947a 100644 --- a/internal/multiplex/session_test.go +++ b/internal/multiplex/session_test.go @@ -25,14 +25,10 @@ func BenchmarkRecvDataFromRemote(b *testing.B) { sesh := MakeSession(0, UNLIMITED_VALVE, obfuscator, util.ReadTLS) n, _ := sesh.Obfs(f, obfsBuf) - originalHeader := make([]byte, 12) - copy(originalHeader, obfsBuf[5:17]) - b.ResetTimer() for i := 0; i < b.N; i++ { sesh.recvDataFromRemote(obfsBuf[:n]) b.SetBytes(int64(n)) - copy(obfsBuf[5:17], originalHeader) } }) @@ -41,15 +37,10 @@ func BenchmarkRecvDataFromRemote(b *testing.B) { sesh := MakeSession(0, UNLIMITED_VALVE, obfuscator, util.ReadTLS) n, _ := sesh.Obfs(f, obfsBuf) - // because deobfs decrypts the header in-place, which alters the input - originalHeader := make([]byte, 12) - copy(originalHeader, obfsBuf[5:17]) - b.ResetTimer() for i := 0; i < b.N; i++ { sesh.recvDataFromRemote(obfsBuf[:n]) b.SetBytes(int64(n)) - copy(obfsBuf[5:17], originalHeader) } }) @@ -58,14 +49,10 @@ func BenchmarkRecvDataFromRemote(b *testing.B) { sesh := MakeSession(0, UNLIMITED_VALVE, obfuscator, util.ReadTLS) n, _ := sesh.Obfs(f, obfsBuf) - originalHeader := make([]byte, 12) - copy(originalHeader, obfsBuf[5:17]) - b.ResetTimer() for i := 0; i < b.N; i++ { sesh.recvDataFromRemote(obfsBuf[:n]) b.SetBytes(int64(n)) - copy(obfsBuf[5:17], originalHeader) } })