mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2026-10-10 04:03:11 +08:00
175 lines
4.9 KiB
Go
175 lines
4.9 KiB
Go
package openvpn
|
|
|
|
import (
|
|
"bytes"
|
|
"testing"
|
|
)
|
|
|
|
func TestControlPacketEncodeDecodeWithTLSCrypt(t *testing.T) {
|
|
cryptClient, err := NewTLSCrypt(testStaticKey(), true)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
cryptServer, err := NewTLSCrypt(testStaticKey(), false)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
var local SessionID
|
|
copy(local[:], []byte("client01"))
|
|
var remote SessionID
|
|
copy(remote[:], []byte("server01"))
|
|
|
|
packet := ControlPacket{
|
|
Opcode: PControlV1,
|
|
KeyID: 0,
|
|
LocalSession: local,
|
|
AckIDs: []uint32{3, 4},
|
|
AckRemoteSession: remote,
|
|
MessageID: 9,
|
|
Payload: []byte("tls ciphertext"),
|
|
}
|
|
encoded, err := packet.Encode(cryptClient, 77, 1714567890)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
decoded, packetID, unixTime, err := DecodeControlPacket(cryptServer, encoded)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if packetID != 77 || unixTime != 1714567890 {
|
|
t.Fatalf("unexpected tls-crypt packet id/time: %d/%d", packetID, unixTime)
|
|
}
|
|
if decoded.Opcode != packet.Opcode || decoded.KeyID != packet.KeyID {
|
|
t.Fatalf("unexpected opcode/key-id: %s/%d", decoded.Opcode, decoded.KeyID)
|
|
}
|
|
if decoded.LocalSession != local {
|
|
t.Fatalf("unexpected local session: %x", decoded.LocalSession)
|
|
}
|
|
if !bytes.Equal(decoded.Payload, packet.Payload) {
|
|
t.Fatalf("unexpected payload: %q", decoded.Payload)
|
|
}
|
|
if len(decoded.AckIDs) != 2 || decoded.AckIDs[0] != 3 || decoded.AckIDs[1] != 4 {
|
|
t.Fatalf("unexpected ack ids: %#v", decoded.AckIDs)
|
|
}
|
|
if decoded.AckRemoteSession != remote {
|
|
t.Fatalf("unexpected ack remote session: %x", decoded.AckRemoteSession)
|
|
}
|
|
}
|
|
|
|
func TestControlPacketEncodeDecodeWithTLSAuth(t *testing.T) {
|
|
cryptClient, err := NewTLSAuth(testStaticKey(), "1")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
cryptServer, err := NewTLSAuth(testStaticKey(), "0")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
var local SessionID
|
|
copy(local[:], []byte("client01"))
|
|
var remote SessionID
|
|
copy(remote[:], []byte("server01"))
|
|
|
|
packet := ControlPacket{
|
|
Opcode: PControlV1,
|
|
KeyID: 0,
|
|
LocalSession: local,
|
|
AckIDs: []uint32{3, 4},
|
|
AckRemoteSession: remote,
|
|
MessageID: 9,
|
|
Payload: []byte("tls auth"),
|
|
}
|
|
encoded, err := packet.Encode(cryptClient, 77, 1714567890)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
decoded, packetID, unixTime, err := DecodeControlPacket(cryptServer, encoded)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if packetID != 77 || unixTime != 1714567890 {
|
|
t.Fatalf("unexpected tls-auth packet id/time: %d/%d", packetID, unixTime)
|
|
}
|
|
if decoded.Opcode != packet.Opcode || decoded.KeyID != packet.KeyID {
|
|
t.Fatalf("unexpected opcode/key-id: %s/%d", decoded.Opcode, decoded.KeyID)
|
|
}
|
|
if decoded.LocalSession != local {
|
|
t.Fatalf("unexpected local session: %x", decoded.LocalSession)
|
|
}
|
|
if !bytes.Equal(decoded.Payload, packet.Payload) {
|
|
t.Fatalf("unexpected payload: %q", decoded.Payload)
|
|
}
|
|
}
|
|
|
|
func TestControlPacketEncodeDecodePlain(t *testing.T) {
|
|
var local SessionID
|
|
copy(local[:], []byte("client01"))
|
|
var remote SessionID
|
|
copy(remote[:], []byte("server01"))
|
|
|
|
packet := ControlPacket{
|
|
Opcode: PControlV1,
|
|
KeyID: 1,
|
|
LocalSession: local,
|
|
AckIDs: []uint32{11},
|
|
AckRemoteSession: remote,
|
|
MessageID: 12,
|
|
Payload: []byte("plain control"),
|
|
}
|
|
encoded, err := packet.Encode(nil, 0, 0)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
decoded, packetID, unixTime, err := DecodeControlPacket(nil, encoded)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if packetID != 0 || unixTime != 0 {
|
|
t.Fatalf("unexpected plain packet id/time: %d/%d", packetID, unixTime)
|
|
}
|
|
if decoded.Opcode != packet.Opcode || decoded.KeyID != packet.KeyID {
|
|
t.Fatalf("unexpected opcode/key-id: %s/%d", decoded.Opcode, decoded.KeyID)
|
|
}
|
|
if decoded.LocalSession != local {
|
|
t.Fatalf("unexpected local session: %x", decoded.LocalSession)
|
|
}
|
|
if decoded.MessageID != packet.MessageID {
|
|
t.Fatalf("unexpected message id: %d", decoded.MessageID)
|
|
}
|
|
if !bytes.Equal(decoded.Payload, packet.Payload) {
|
|
t.Fatalf("unexpected payload: %q", decoded.Payload)
|
|
}
|
|
if len(decoded.AckIDs) != 1 || decoded.AckIDs[0] != 11 {
|
|
t.Fatalf("unexpected ack ids: %#v", decoded.AckIDs)
|
|
}
|
|
if decoded.AckRemoteSession != remote {
|
|
t.Fatalf("unexpected ack remote session: %x", decoded.AckRemoteSession)
|
|
}
|
|
}
|
|
|
|
func TestAckPacketRejectsTrailingPayload(t *testing.T) {
|
|
_, _, _, _, err := DecodeControlPlain(PAckV1, []byte{0, 1})
|
|
if err == nil {
|
|
t.Fatal("expected trailing payload error")
|
|
}
|
|
}
|
|
|
|
func TestControlPacketRejectsOversizedACKArray(t *testing.T) {
|
|
packet := ControlPacket{
|
|
Opcode: PAckV1,
|
|
AckIDs: make([]uint32, reliableAckSize+1),
|
|
}
|
|
if _, err := packet.EncodePlain(); err == nil {
|
|
t.Fatal("oversized ACK array encoded")
|
|
}
|
|
plain := make([]byte, 1+(reliableAckSize+1)*4+SessionIDSize)
|
|
plain[0] = reliableAckSize + 1
|
|
if _, _, _, _, err := DecodeControlPlain(PAckV1, plain); err == nil {
|
|
t.Fatal("oversized ACK array decoded")
|
|
}
|
|
}
|