main.go (1319B)
1 package main 2 3 import ( 4 "crypto/ed25519" 5 "encoding/base32" 6 "encoding/base64" 7 "flag" 8 "fmt" 9 "os" 10 "strings" 11 ) 12 13 func main() { 14 var onionAddr, certFile string 15 flag.StringVar(&onionAddr, "onion-address", "", "the_public_onion_address.onion") 16 flag.StringVar(&onionAddr, "a", "", "the_public_onion_address.onion") 17 flag.StringVar(&certFile, "cert", "", "certificate file to validate") 18 flag.StringVar(&certFile, "c", "", "certificate file to validate") 19 flag.Parse() 20 21 certBytes, err := os.ReadFile(certFile) 22 if err != nil { 23 panic(err) 24 } 25 cert := string(certBytes) 26 cert = strings.TrimSpace(cert) 27 cert = strings.TrimPrefix(cert, "-----BEGIN SIGNED MESSAGE-----\n") 28 cert = strings.TrimSuffix(cert, "\n-----END SIGNATURE-----") 29 parts := strings.Split(cert, "\n-----BEGIN SIGNATURE-----\n") 30 msg := []byte(parts[0]) 31 sig, _ := base64.StdEncoding.DecodeString(strings.ReplaceAll(parts[1], "\n", "")) 32 pub := identityKeyFromAddress(onionAddr) 33 if ed25519.Verify(pub, msg, sig) { 34 fmt.Println("valid signature") 35 } else { 36 fmt.Println("invalid signature") 37 } 38 } 39 40 func identityKeyFromAddress(onionAddr string) ed25519.PublicKey { 41 trimmedAddr := strings.TrimSuffix(onionAddr, ".onion") 42 upperAddr := strings.ToUpper(trimmedAddr) 43 decodedAddr, _ := base32.StdEncoding.DecodeString(upperAddr) 44 return decodedAddr[:32] 45 }