2018-04-25 19:25:39 +03:00
|
|
|
package tor
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/base32"
|
|
|
|
"net"
|
|
|
|
"strconv"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
// base32Alphabet is the alphabet used for encoding and decoding v2 and
|
|
|
|
// v3 onion addresses.
|
|
|
|
base32Alphabet = "abcdefghijklmnopqrstuvwxyz234567"
|
|
|
|
|
|
|
|
// OnionSuffix is the ".onion" suffix for v2 and v3 onion addresses.
|
|
|
|
OnionSuffix = ".onion"
|
|
|
|
|
|
|
|
// OnionSuffixLen is the length of the ".onion" suffix.
|
|
|
|
OnionSuffixLen = len(OnionSuffix)
|
|
|
|
|
|
|
|
// V2DecodedLen is the length of a decoded v2 onion service.
|
|
|
|
V2DecodedLen = 10
|
|
|
|
|
|
|
|
// V2Len is the length of a v2 onion service including the ".onion"
|
|
|
|
// suffix.
|
|
|
|
V2Len = 22
|
|
|
|
|
|
|
|
// V3DecodedLen is the length of a decoded v3 onion service.
|
|
|
|
V3DecodedLen = 35
|
|
|
|
|
2021-07-06 12:35:54 +03:00
|
|
|
// V3Len is the length of a v3 onion service including the ".onion"
|
2018-04-25 19:25:39 +03:00
|
|
|
// suffix.
|
|
|
|
V3Len = 62
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
// Base32Encoding represents the Tor's base32-encoding scheme for v2 and
|
|
|
|
// v3 onion addresses.
|
|
|
|
Base32Encoding = base32.NewEncoding(base32Alphabet)
|
|
|
|
)
|
|
|
|
|
|
|
|
// OnionAddr represents a Tor network end point onion address.
|
|
|
|
type OnionAddr struct {
|
|
|
|
// OnionService is the host of the onion address.
|
|
|
|
OnionService string
|
|
|
|
|
|
|
|
// Port is the port of the onion address.
|
|
|
|
Port int
|
|
|
|
}
|
|
|
|
|
|
|
|
// A compile-time check to ensure that OnionAddr implements the net.Addr
|
|
|
|
// interface.
|
|
|
|
var _ net.Addr = (*OnionAddr)(nil)
|
|
|
|
|
|
|
|
// String returns the string representation of an onion address.
|
|
|
|
func (o *OnionAddr) String() string {
|
|
|
|
return net.JoinHostPort(o.OnionService, strconv.Itoa(o.Port))
|
|
|
|
}
|
|
|
|
|
|
|
|
// Network returns the network that this implementation of net.Addr will use.
|
|
|
|
// In this case, because Tor only allows TCP connections, the network is "tcp".
|
|
|
|
func (o *OnionAddr) Network() string {
|
|
|
|
return "tcp"
|
|
|
|
}
|