38 lines
1.1 KiB
Go
38 lines
1.1 KiB
Go
|
package connectivity
|
||
|
|
||
|
import (
|
||
|
"encoding/base32"
|
||
|
"strings"
|
||
|
"golang.org/x/crypto/ed25519"
|
||
|
"golang.org/x/crypto/sha3"
|
||
|
)
|
||
|
|
||
|
// V3HostnameLength is the length of a Tor V3 Onion Address (without the .onion suffix)
|
||
|
const V3HostnameLength = 56
|
||
|
|
||
|
// Hidden service version
|
||
|
const version = byte(0x03)
|
||
|
|
||
|
// Salt used to create checkdigits
|
||
|
const salt = ".onion checksum"
|
||
|
|
||
|
func getCheckdigits(pub ed25519.PublicKey) []byte {
|
||
|
// Calculate checksum sha3(".onion checksum" || publicKey || version)
|
||
|
checkstr := []byte(salt)
|
||
|
checkstr = append(checkstr, pub...)
|
||
|
checkstr = append(checkstr, version)
|
||
|
checksum := sha3.Sum256(checkstr)
|
||
|
return checksum[:2]
|
||
|
}
|
||
|
|
||
|
// GetTorV3Hostname converts an ed25519 public key to a valid tor onion hostname
|
||
|
func GetTorV3Hostname(pub ed25519.PublicKey) string {
|
||
|
// Construct onion address base32(publicKey || checkdigits || version)
|
||
|
checkdigits := getCheckdigits(pub)
|
||
|
combined := pub[:]
|
||
|
combined = append(combined, checkdigits...)
|
||
|
combined = append(combined, version)
|
||
|
serviceID := base32.StdEncoding.EncodeToString(combined)
|
||
|
return strings.ToLower(serviceID)
|
||
|
}
|