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 // Create a context for signing and verification
14 ctx, err := secp.NewContext(secp.ContextSign | secp.ContextVerify)
15 if err != nil {
16 log.Fatal(err)
17 }
18 defer ctx.Destroy()
19
20 // Generate a private key (32 random bytes)
21 privKey := make([]byte, 32)
22 if _, err := rand.Read(privKey); err != nil {
23 log.Fatal(err)
24 }
25
26 // Create public key from private key
27 pubKey, err := ctx.CreatePublicKey(privKey)
28 if err != nil {
29 log.Fatal(err)
30 }
31
32 // Serialize public key (compressed)
33 pubKeyBytes, err := ctx.SerializePublicKey(pubKey, true)
34 if err != nil {
35 log.Fatal(err)
36 }
37 fmt.Printf("Public key: %x\n", pubKeyBytes)
38
39 // Sign a message
40 message := []byte("Hello, libsecp256k1!")
41 msgHash := sha256.Sum256(message)
42
43 sig, err := ctx.Sign(msgHash[:], privKey)
44 if err != nil {
45 log.Fatal(err)
46 }
47 fmt.Printf("Signature: %x\n", sig)
48
49 // Verify the signature
50 valid, err := ctx.Verify(msgHash[:], sig, pubKey)
51 if err != nil {
52 log.Fatal(err)
53 }
54 fmt.Printf("Signature valid: %v\n", valid)
55
56 // Test with serialized/parsed public key
57 parsedPubKey, err := ctx.ParsePublicKey(pubKeyBytes)
58 if err != nil {
59 log.Fatal(err)
60 }
61
62 valid2, err := ctx.Verify(msgHash[:], sig, parsedPubKey)
63 if err != nil {
64 log.Fatal(err)
65 }
66 fmt.Printf("Signature valid (parsed key): %v\n", valid2)
67
68 // Test DER encoding
69 derSig, err := ctx.SerializeSignatureDER(sig)
70 if err != nil {
71 log.Fatal(err)
72 }
73 fmt.Printf("DER signature: %x\n", derSig)
74
75 // Parse DER signature
76 parsedSig, err := ctx.ParseSignatureDER(derSig)
77 if err != nil {
78 log.Fatal(err)
79 }
80
81 valid3, err := ctx.Verify(msgHash[:], parsedSig, pubKey)
82 if err != nil {
83 log.Fatal(err)
84 }
85 fmt.Printf("Signature valid (DER): %v\n", valid3)
86 }
87