37 lines
1.1 KiB
Go
37 lines
1.1 KiB
Go
package main
|
|
|
|
// Fuzz target for the tunnel's one allowed address. host_tunnel_ip arrives in
|
|
// the pairing response and becomes the WireGuard peer's AllowedIPs; whatever
|
|
// the string, the answer is either a refusal or exactly one address.
|
|
|
|
import (
|
|
"net/netip"
|
|
"testing"
|
|
)
|
|
|
|
func FuzzATunnelAddressIsOneHostOrRefused(f *testing.F) {
|
|
for _, s := range []string{"2001:db8::e:3", "10.0.0.1", "2001:db8::e:3/64", "::/0", "0.0.0.0/0",
|
|
"", "::", "2001:db8::e:3%eth0", "::ffff:10.0.0.1", "ff02::1", " 2001:db8::1"} {
|
|
f.Add(s)
|
|
}
|
|
f.Fuzz(func(t *testing.T, s string) {
|
|
got, err := hostTunnelAllowedIP(s)
|
|
if err != nil {
|
|
return
|
|
}
|
|
p, perr := netip.ParsePrefix(got)
|
|
if perr != nil {
|
|
t.Fatalf("%q -> %q, which is not a prefix: %v", s, got, perr)
|
|
}
|
|
if p.Bits() != p.Addr().BitLen() {
|
|
t.Fatalf("%q -> %q covers more than one address", s, got)
|
|
}
|
|
if a, _ := netip.ParseAddr(s); a != p.Addr() {
|
|
t.Fatalf("%q -> %q is not the address it was given", s, got)
|
|
}
|
|
if p.Addr().IsUnspecified() || p.Addr().IsMulticast() {
|
|
t.Fatalf("%q -> %q is not one host", s, got)
|
|
}
|
|
})
|
|
}
|