Adding IsValidHostname function

This commit is contained in:
Sarah Jamie Lewis 2018-11-21 14:07:13 -08:00
parent aba5fa4609
commit d54ed0b106
2 changed files with 32 additions and 0 deletions

View File

@ -33,6 +33,8 @@ func expandKey(pri ed25519.PrivateKey) string {
return base64.StdEncoding.EncodeToString(h[:])
}
const V3HostnameLength = 56
// Hidden service version
const version = byte(0x03)
@ -48,6 +50,7 @@ func getCheckdigits(pub ed25519.PublicKey) []byte {
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)
@ -57,3 +60,17 @@ func GetTorV3Hostname(pub ed25519.PublicKey) string {
serviceID := base32.StdEncoding.EncodeToString(combined)
return strings.ToLower(serviceID)
}
// IsValidHostname returns true if the given address is a valid onion v3 address
func IsValidHostname(address string) bool {
if len(address) == V3HostnameLength {
data, err := base32.StdEncoding.DecodeString(strings.ToUpper(address))
if err ==nil {
pubkey := data[0:ed25519.PublicKeySize]
if GetTorV3Hostname(ed25519.PublicKey(pubkey)) == address {
return true
}
}
}
return false
}

View File

@ -1,10 +1,12 @@
package utils
import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/asn1"
"encoding/pem"
"golang.org/x/crypto/ed25519"
"testing"
)
@ -41,3 +43,16 @@ func TestGetTorHostname(t *testing.T) {
t.Errorf("Hostname %s does not equal %s", hostname, "kwke2hntvyfqm7dr")
}
}
func TestV3(t *testing.T) {
pub,_,_ := ed25519.GenerateKey(rand.Reader)
hostname := GetTorV3Hostname(pub)
if !IsValidHostname(hostname) {
t.Errorf("Generated V3 Hostname was invalid")
}
if IsValidHostname(hostname[0:34]) {
t.Errorf("Invalid V3 Hostname was marked valid")
}
}