dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

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 }