1
1
package hinting
2
2
3
3
import (
4
- "github.com/stretchr/testify/assert"
4
+ "crypto/rand"
5
+ "net"
5
6
"net/netip"
6
7
"testing"
8
+
9
+ "github.com/stretchr/testify/assert"
7
10
)
8
11
9
12
func TestReverseLookupDomains (t * testing.T ) {
@@ -32,6 +35,8 @@ func TestReverseLookupDomains(t *testing.T) {
32
35
domain string
33
36
}{
34
37
{ip : netip .MustParseAddr ("66.180.178.131" ), domain : "princeton.edu" },
38
+ //{ip: randIPFromCIDR("128.112.0.0/16"), domain: "princeton.edu"},
39
+ {ip : randIPFromCIDR ("128.112.66.0/23" ), domain : "princeton.edu" },
35
40
},
36
41
},
37
42
{
@@ -42,6 +47,7 @@ func TestReverseLookupDomains(t *testing.T) {
42
47
}{
43
48
{ip : netip .MustParseAddr ("128.143.33.137" ), domain : "virginia.edu" },
44
49
{ip : netip .MustParseAddr ("128.143.33.144" ), domain : "virginia.edu" },
50
+ {ip : randIPFromCIDR ("128.143.0.128/25" ), domain : "virginia.edu" },
45
51
},
46
52
},
47
53
{
@@ -51,6 +57,7 @@ func TestReverseLookupDomains(t *testing.T) {
51
57
domain string
52
58
}{
53
59
{ip : netip .MustParseAddr ("130.59.31.80" ), domain : "switch.ch" },
60
+ {ip : randIPFromCIDR ("130.59.2.128/25" ), domain : "switch.ch" },
54
61
},
55
62
},
56
63
{
@@ -59,6 +66,7 @@ func TestReverseLookupDomains(t *testing.T) {
59
66
ip netip.Addr
60
67
domain string
61
68
}{
69
+ //{ip: netip.MustParseAddr("203.250.215.48"), domain: "kreonet.net"},
62
70
{ip : netip .MustParseAddr ("134.75.254.11" ), domain : "kreonet.net" },
63
71
{ip : netip .MustParseAddr ("134.75.254.12" ), domain : "kreonet.net" },
64
72
},
@@ -70,6 +78,7 @@ func TestReverseLookupDomains(t *testing.T) {
70
78
domain string
71
79
}{
72
80
{ip : netip .MustParseAddr ("163.152.6.10" ), domain : "korea.ac.kr" },
81
+ {ip : randIPFromCIDR ("163.152.6.16/29" ), domain : "korea.ac.kr" },
73
82
},
74
83
},
75
84
}
@@ -124,3 +133,41 @@ func TestDomainsFromHostnamesDerivation(t *testing.T) {
124
133
}
125
134
}
126
135
}
136
+
137
+ // randIPFromCIDR returns a random host IP in the subnet specified by the CIDR
138
+ func randIPFromCIDR (cidr string ) (ip netip.Addr ) {
139
+ _ , ipNet , err := net .ParseCIDR (cidr )
140
+ if err != nil {
141
+ return
142
+ }
143
+ ip , ok := netip .AddrFromSlice (ipNet .IP )
144
+ if ! ok {
145
+ return
146
+ }
147
+ var randBytes []byte
148
+ randBytes = make ([]byte , net .IPv6len )
149
+ _ , err = rand .Read (randBytes )
150
+ if err != nil {
151
+ return
152
+ }
153
+ if ip .Is4 () {
154
+ randBytes = randBytes [:net .IPv4len ]
155
+ }
156
+ randomIP := net .IP (randBytes )
157
+ maskedIP := randomIP .Mask (invertMask (ipNet .Mask ))
158
+ if len (ipNet .IP ) != len (maskedIP ) {
159
+ return
160
+ }
161
+ for i := range ipNet .IP {
162
+ randomIP [i ] = ipNet .IP [i ] | maskedIP [i ]
163
+ }
164
+ return netip .MustParseAddr (randomIP .String ())
165
+ }
166
+
167
+ func invertMask (mask net.IPMask ) (invertedMask net.IPMask ) {
168
+ invertedMask = make (net.IPMask , len (mask ))
169
+ for i , b := range mask {
170
+ invertedMask [i ] = 0xff ^ b
171
+ }
172
+ return
173
+ }
0 commit comments