github.com/dashpay/godash@v0.0.0-20160726055534-e038a21e0e3d/addrmgr/network.go (about)

     1  // Copyright (c) 2013-2014 The btcsuite developers
     2  // Copyright (c) 2016 The Dash developers
     3  // Use of this source code is governed by an ISC
     4  // license that can be found in the LICENSE file.
     5  
     6  package addrmgr
     7  
     8  import (
     9  	"fmt"
    10  	"net"
    11  
    12  	"github.com/dashpay/godash/wire"
    13  )
    14  
    15  var (
    16  	// rfc1918Nets specifies the IPv4 private address blocks as defined by
    17  	// by RFC1918 (10.0.0.0/8, 172.16.0.0/12, and 192.168.0.0/16).
    18  	rfc1918Nets = []net.IPNet{
    19  		ipNet("10.0.0.0", 8, 32),
    20  		ipNet("172.16.0.0", 12, 32),
    21  		ipNet("192.168.0.0", 16, 32),
    22  	}
    23  
    24  	// rfc2544Net specifies the the IPv4 block as defined by RFC2544
    25  	// (198.18.0.0/15)
    26  	rfc2544Net = ipNet("198.18.0.0", 15, 32)
    27  
    28  	// rfc3849Net specifies the IPv6 documentation address block as defined
    29  	// by RFC3849 (2001:DB8::/32).
    30  	rfc3849Net = ipNet("2001:DB8::", 32, 128)
    31  
    32  	// rfc3927Net specifies the IPv4 auto configuration address block as
    33  	// defined by RFC3927 (169.254.0.0/16).
    34  	rfc3927Net = ipNet("169.254.0.0", 16, 32)
    35  
    36  	// rfc3964Net specifies the IPv6 to IPv4 encapsulation address block as
    37  	// defined by RFC3964 (2002::/16).
    38  	rfc3964Net = ipNet("2002::", 16, 128)
    39  
    40  	// rfc4193Net specifies the IPv6 unique local address block as defined
    41  	// by RFC4193 (FC00::/7).
    42  	rfc4193Net = ipNet("FC00::", 7, 128)
    43  
    44  	// rfc4380Net specifies the IPv6 teredo tunneling over UDP address block
    45  	// as defined by RFC4380 (2001::/32).
    46  	rfc4380Net = ipNet("2001::", 32, 128)
    47  
    48  	// rfc4843Net specifies the IPv6 ORCHID address block as defined by
    49  	// RFC4843 (2001:10::/28).
    50  	rfc4843Net = ipNet("2001:10::", 28, 128)
    51  
    52  	// rfc4862Net specifies the IPv6 stateless address autoconfiguration
    53  	// address block as defined by RFC4862 (FE80::/64).
    54  	rfc4862Net = ipNet("FE80::", 64, 128)
    55  
    56  	// rfc5737Net specifies the IPv4 documentation address blocks as defined
    57  	// by RFC5737 (192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24)
    58  	rfc5737Net = []net.IPNet{
    59  		ipNet("192.0.2.0", 24, 32),
    60  		ipNet("198.51.100.0", 24, 32),
    61  		ipNet("203.0.113.0", 24, 32),
    62  	}
    63  
    64  	// rfc6052Net specifies the IPv6 well-known prefix address block as
    65  	// defined by RFC6052 (64:FF9B::/96).
    66  	rfc6052Net = ipNet("64:FF9B::", 96, 128)
    67  
    68  	// rfc6145Net specifies the IPv6 to IPv4 translated address range as
    69  	// defined by RFC6145 (::FFFF:0:0:0/96).
    70  	rfc6145Net = ipNet("::FFFF:0:0:0", 96, 128)
    71  
    72  	// rfc6598Net specifies the IPv4 block as defined by RFC6598 (100.64.0.0/10)
    73  	rfc6598Net = ipNet("100.64.0.0", 10, 32)
    74  
    75  	// onionCatNet defines the IPv6 address block used to support Tor.
    76  	// bitcoind encodes a .onion address as a 16 byte number by decoding the
    77  	// address prior to the .onion (i.e. the key hash) base32 into a ten
    78  	// byte number. It then stores the first 6 bytes of the address as
    79  	// 0xfd, 0x87, 0xd8, 0x7e, 0xeb, 0x43.
    80  	//
    81  	// This is the same range used by OnionCat, which is part part of the
    82  	// RFC4193 unique local IPv6 range.
    83  	//
    84  	// In summary the format is:
    85  	// { magic 6 bytes, 10 bytes base32 decode of key hash }
    86  	onionCatNet = ipNet("fd87:d87e:eb43::", 48, 128)
    87  
    88  	// zero4Net defines the IPv4 address block for address staring with 0
    89  	// (0.0.0.0/8).
    90  	zero4Net = ipNet("0.0.0.0", 8, 32)
    91  
    92  	// heNet defines the Hurricane Electric IPv6 address block.
    93  	heNet = ipNet("2001:470::", 32, 128)
    94  )
    95  
    96  // ipNet returns a net.IPNet struct given the passed IP address string, number
    97  // of one bits to include at the start of the mask, and the total number of bits
    98  // for the mask.
    99  func ipNet(ip string, ones, bits int) net.IPNet {
   100  	return net.IPNet{IP: net.ParseIP(ip), Mask: net.CIDRMask(ones, bits)}
   101  }
   102  
   103  // IsIPv4 returns whether or not the given address is an IPv4 address.
   104  func IsIPv4(na *wire.NetAddress) bool {
   105  	return na.IP.To4() != nil
   106  }
   107  
   108  // IsLocal returns whether or not the given address is a local address.
   109  func IsLocal(na *wire.NetAddress) bool {
   110  	return na.IP.IsLoopback() || zero4Net.Contains(na.IP)
   111  }
   112  
   113  // IsOnionCatTor returns whether or not the passed address is in the IPv6 range
   114  // used by bitcoin to support Tor (fd87:d87e:eb43::/48).  Note that this range
   115  // is the same range used by OnionCat, which is part of the RFC4193 unique local
   116  // IPv6 range.
   117  func IsOnionCatTor(na *wire.NetAddress) bool {
   118  	return onionCatNet.Contains(na.IP)
   119  }
   120  
   121  // IsRFC1918 returns whether or not the passed address is part of the IPv4
   122  // private network address space as defined by RFC1918 (10.0.0.0/8,
   123  // 172.16.0.0/12, or 192.168.0.0/16).
   124  func IsRFC1918(na *wire.NetAddress) bool {
   125  	for _, rfc := range rfc1918Nets {
   126  		if rfc.Contains(na.IP) {
   127  			return true
   128  		}
   129  	}
   130  	return false
   131  }
   132  
   133  // IsRFC2544 returns whether or not the passed address is part of the IPv4
   134  // address space as defined by RFC2544 (198.18.0.0/15)
   135  func IsRFC2544(na *wire.NetAddress) bool {
   136  	return rfc2544Net.Contains(na.IP)
   137  }
   138  
   139  // IsRFC3849 returns whether or not the passed address is part of the IPv6
   140  // documentation range as defined by RFC3849 (2001:DB8::/32).
   141  func IsRFC3849(na *wire.NetAddress) bool {
   142  	return rfc3849Net.Contains(na.IP)
   143  }
   144  
   145  // IsRFC3927 returns whether or not the passed address is part of the IPv4
   146  // autoconfiguration range as defined by RFC3927 (169.254.0.0/16).
   147  func IsRFC3927(na *wire.NetAddress) bool {
   148  	return rfc3927Net.Contains(na.IP)
   149  }
   150  
   151  // IsRFC3964 returns whether or not the passed address is part of the IPv6 to
   152  // IPv4 encapsulation range as defined by RFC3964 (2002::/16).
   153  func IsRFC3964(na *wire.NetAddress) bool {
   154  	return rfc3964Net.Contains(na.IP)
   155  }
   156  
   157  // IsRFC4193 returns whether or not the passed address is part of the IPv6
   158  // unique local range as defined by RFC4193 (FC00::/7).
   159  func IsRFC4193(na *wire.NetAddress) bool {
   160  	return rfc4193Net.Contains(na.IP)
   161  }
   162  
   163  // IsRFC4380 returns whether or not the passed address is part of the IPv6
   164  // teredo tunneling over UDP range as defined by RFC4380 (2001::/32).
   165  func IsRFC4380(na *wire.NetAddress) bool {
   166  	return rfc4380Net.Contains(na.IP)
   167  }
   168  
   169  // IsRFC4843 returns whether or not the passed address is part of the IPv6
   170  // ORCHID range as defined by RFC4843 (2001:10::/28).
   171  func IsRFC4843(na *wire.NetAddress) bool {
   172  	return rfc4843Net.Contains(na.IP)
   173  }
   174  
   175  // IsRFC4862 returns whether or not the passed address is part of the IPv6
   176  // stateless address autoconfiguration range as defined by RFC4862 (FE80::/64).
   177  func IsRFC4862(na *wire.NetAddress) bool {
   178  	return rfc4862Net.Contains(na.IP)
   179  }
   180  
   181  // IsRFC5737 returns whether or not the passed address is part of the IPv4
   182  // documentation address space as defined by RFC5737 (192.0.2.0/24,
   183  // 198.51.100.0/24, 203.0.113.0/24)
   184  func IsRFC5737(na *wire.NetAddress) bool {
   185  	for _, rfc := range rfc5737Net {
   186  		if rfc.Contains(na.IP) {
   187  			return true
   188  		}
   189  	}
   190  
   191  	return false
   192  }
   193  
   194  // IsRFC6052 returns whether or not the passed address is part of the IPv6
   195  // well-known prefix range as defined by RFC6052 (64:FF9B::/96).
   196  func IsRFC6052(na *wire.NetAddress) bool {
   197  	return rfc6052Net.Contains(na.IP)
   198  }
   199  
   200  // IsRFC6145 returns whether or not the passed address is part of the IPv6 to
   201  // IPv4 translated address range as defined by RFC6145 (::FFFF:0:0:0/96).
   202  func IsRFC6145(na *wire.NetAddress) bool {
   203  	return rfc6145Net.Contains(na.IP)
   204  }
   205  
   206  // IsRFC6598 returns whether or not the passed address is part of the IPv4
   207  // shared address space specified by RFC6598 (100.64.0.0/10)
   208  func IsRFC6598(na *wire.NetAddress) bool {
   209  	return rfc6598Net.Contains(na.IP)
   210  }
   211  
   212  // IsValid returns whether or not the passed address is valid.  The address is
   213  // considered invalid under the following circumstances:
   214  // IPv4: It is either a zero or all bits set address.
   215  // IPv6: It is either a zero or RFC3849 documentation address.
   216  func IsValid(na *wire.NetAddress) bool {
   217  	// IsUnspecified returns if address is 0, so only all bits set, and
   218  	// RFC3849 need to be explicitly checked.
   219  	return na.IP != nil && !(na.IP.IsUnspecified() ||
   220  		na.IP.Equal(net.IPv4bcast))
   221  }
   222  
   223  // IsRoutable returns whether or not the passed address is routable over
   224  // the public internet.  This is true as long as the address is valid and is not
   225  // in any reserved ranges.
   226  func IsRoutable(na *wire.NetAddress) bool {
   227  	return IsValid(na) && !(IsRFC1918(na) || IsRFC2544(na) ||
   228  		IsRFC3927(na) || IsRFC4862(na) || IsRFC3849(na) ||
   229  		IsRFC4843(na) || IsRFC5737(na) || IsRFC6598(na) ||
   230  		IsLocal(na) || (IsRFC4193(na) && !IsOnionCatTor(na)))
   231  }
   232  
   233  // GroupKey returns a string representing the network group an address is part
   234  // of.  This is the /16 for IPv4, the /32 (/36 for he.net) for IPv6, the string
   235  // "local" for a local address, the string "tor:key" where key is the /4 of the
   236  // onion address for tor address, and the string "unroutable" for an unroutable
   237  // address.
   238  func GroupKey(na *wire.NetAddress) string {
   239  	if IsLocal(na) {
   240  		return "local"
   241  	}
   242  	if !IsRoutable(na) {
   243  		return "unroutable"
   244  	}
   245  	if IsIPv4(na) {
   246  		return na.IP.Mask(net.CIDRMask(16, 32)).String()
   247  	}
   248  	if IsRFC6145(na) || IsRFC6052(na) {
   249  		// last four bytes are the ip address
   250  		ip := net.IP(na.IP[12:16])
   251  		return ip.Mask(net.CIDRMask(16, 32)).String()
   252  	}
   253  
   254  	if IsRFC3964(na) {
   255  		ip := net.IP(na.IP[2:6])
   256  		return ip.Mask(net.CIDRMask(16, 32)).String()
   257  
   258  	}
   259  	if IsRFC4380(na) {
   260  		// teredo tunnels have the last 4 bytes as the v4 address XOR
   261  		// 0xff.
   262  		ip := net.IP(make([]byte, 4))
   263  		for i, byte := range na.IP[12:16] {
   264  			ip[i] = byte ^ 0xff
   265  		}
   266  		return ip.Mask(net.CIDRMask(16, 32)).String()
   267  	}
   268  	if IsOnionCatTor(na) {
   269  		// group is keyed off the first 4 bits of the actual onion key.
   270  		return fmt.Sprintf("tor:%d", na.IP[6]&((1<<4)-1))
   271  	}
   272  
   273  	// OK, so now we know ourselves to be a IPv6 address.
   274  	// bitcoind uses /32 for everything, except for Hurricane Electric's
   275  	// (he.net) IP range, which it uses /36 for.
   276  	bits := 32
   277  	if heNet.Contains(na.IP) {
   278  		bits = 36
   279  	}
   280  
   281  	return na.IP.Mask(net.CIDRMask(bits, 128)).String()
   282  }