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