main.go raw

   1  package main
   2  
   3  import (
   4  	"crypto/rand"
   5  	"crypto/sha256"
   6  	"fmt"
   7  	"log"
   8  
   9  	secp "p8k.mleku.dev"
  10  )
  11  
  12  func main() {
  13  	ctx, err := secp.NewContext(secp.ContextSign | secp.ContextVerify)
  14  	if err != nil {
  15  		log.Fatal(err)
  16  	}
  17  	defer ctx.Destroy()
  18  
  19  	// Generate private key
  20  	privKey := make([]byte, 32)
  21  	if _, err := rand.Read(privKey); err != nil {
  22  		log.Fatal(err)
  23  	}
  24  
  25  	// Create keypair for Schnorr
  26  	keypair, err := ctx.CreateKeypair(privKey)
  27  	if err != nil {
  28  		log.Fatal(err)
  29  	}
  30  
  31  	// Extract x-only public key
  32  	xonly, pkParity, err := ctx.KeypairXOnlyPub(keypair)
  33  	if err != nil {
  34  		log.Fatal(err)
  35  	}
  36  	fmt.Printf("X-only public key: %x\n", xonly)
  37  	fmt.Printf("Public key parity: %d\n", pkParity)
  38  
  39  	// Sign with Schnorr
  40  	message := []byte("Hello, Schnorr!")
  41  	msgHash := sha256.Sum256(message)
  42  
  43  	auxRand := make([]byte, 32)
  44  	if _, err := rand.Read(auxRand); err != nil {
  45  		log.Fatal(err)
  46  	}
  47  
  48  	sig, err := ctx.SchnorrSign(msgHash[:], keypair, auxRand)
  49  	if err != nil {
  50  		log.Fatal(err)
  51  	}
  52  	fmt.Printf("Schnorr signature: %x\n", sig)
  53  
  54  	// Verify Schnorr signature
  55  	valid, err := ctx.SchnorrVerify(sig, msgHash[:], xonly[:])
  56  	if err != nil {
  57  		log.Fatal(err)
  58  	}
  59  	fmt.Printf("Schnorr signature valid: %v\n", valid)
  60  
  61  	// Test with wrong message
  62  	wrongMsg := []byte("Wrong message!")
  63  	wrongHash := sha256.Sum256(wrongMsg)
  64  	valid2, err := ctx.SchnorrVerify(sig, wrongHash[:], xonly[:])
  65  	if err != nil {
  66  		log.Fatal(err)
  67  	}
  68  	fmt.Printf("Schnorr signature valid (wrong msg): %v\n", valid2)
  69  }
  70