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