53 lines
1.6 KiB
Go
53 lines
1.6 KiB
Go
package vpnruntime
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"testing"
|
|
)
|
|
|
|
func TestNormalizeIPv4PacketChecksumsRepairsTCP(t *testing.T) {
|
|
packet := []byte{
|
|
0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06, 0x12, 0x34, 192, 168, 200, 61, 10, 77, 0, 2,
|
|
0x46, 0xa0, 0xdd, 0x78, 0, 0, 0, 1, 0, 0, 0, 0, 0x50, 0x12, 0x72, 0x10, 0xab, 0xcd, 0, 0,
|
|
}
|
|
if !normalizeIPv4PacketChecksums(packet) {
|
|
t.Fatal("normalize returned false")
|
|
}
|
|
if got := checksum(packet[:20]); got != 0 {
|
|
t.Fatalf("ip checksum verification = %#x, want 0", got)
|
|
}
|
|
tcp := packet[20:]
|
|
pseudo := make([]byte, 12+len(tcp))
|
|
copy(pseudo[0:4], packet[12:16])
|
|
copy(pseudo[4:8], packet[16:20])
|
|
pseudo[9] = 6
|
|
binary.BigEndian.PutUint16(pseudo[10:12], uint16(len(tcp)))
|
|
copy(pseudo[12:], tcp)
|
|
if got := checksum(pseudo); got != 0 {
|
|
t.Fatalf("tcp checksum verification = %#x, want 0", got)
|
|
}
|
|
}
|
|
|
|
func TestNormalizeIPv4PacketChecksumsRepairsUDP(t *testing.T) {
|
|
packet := []byte{
|
|
0x45, 0x00, 0x00, 0x20, 0, 0, 0x40, 0, 0x40, 0x11, 0x12, 0x34, 10, 77, 0, 2, 192, 168, 200, 210,
|
|
0x30, 0x39, 0x00, 0x35, 0x00, 0x0c, 0xab, 0xcd, 0xde, 0xad, 0xbe, 0xef,
|
|
}
|
|
if !normalizeIPv4PacketChecksums(packet) {
|
|
t.Fatal("normalize returned false")
|
|
}
|
|
if got := checksum(packet[:20]); got != 0 {
|
|
t.Fatalf("ip checksum verification = %#x, want 0", got)
|
|
}
|
|
udp := packet[20:]
|
|
pseudo := make([]byte, 12+len(udp))
|
|
copy(pseudo[0:4], packet[12:16])
|
|
copy(pseudo[4:8], packet[16:20])
|
|
pseudo[9] = 17
|
|
binary.BigEndian.PutUint16(pseudo[10:12], uint16(len(udp)))
|
|
copy(pseudo[12:], udp)
|
|
if got := checksum(pseudo); got != 0 {
|
|
t.Fatalf("udp checksum verification = %#x, want 0", got)
|
|
}
|
|
}
|