main.go raw

   1  package main
   2  
   3  import (
   4  	"bytes"
   5  	"crypto/rand"
   6  	"fmt"
   7  	"log"
   8  
   9  	secp "p8k.mleku.dev"
  10  )
  11  
  12  func main() {
  13  	ctx, err := secp.NewContext(secp.ContextSign)
  14  	if err != nil {
  15  		log.Fatal(err)
  16  	}
  17  	defer ctx.Destroy()
  18  
  19  	// Alice's keys
  20  	alicePriv := make([]byte, 32)
  21  	if _, err := rand.Read(alicePriv); err != nil {
  22  		log.Fatal(err)
  23  	}
  24  	alicePub, err := ctx.CreatePublicKey(alicePriv)
  25  	if err != nil {
  26  		log.Fatal(err)
  27  	}
  28  
  29  	// Bob's keys
  30  	bobPriv := make([]byte, 32)
  31  	if _, err := rand.Read(bobPriv); err != nil {
  32  		log.Fatal(err)
  33  	}
  34  	bobPub, err := ctx.CreatePublicKey(bobPriv)
  35  	if err != nil {
  36  		log.Fatal(err)
  37  	}
  38  
  39  	// Alice computes shared secret with Bob's public key
  40  	aliceShared, err := ctx.ECDH(bobPub, alicePriv)
  41  	if err != nil {
  42  		log.Fatal(err)
  43  	}
  44  
  45  	// Bob computes shared secret with Alice's public key
  46  	bobShared, err := ctx.ECDH(alicePub, bobPriv)
  47  	if err != nil {
  48  		log.Fatal(err)
  49  	}
  50  
  51  	fmt.Printf("Alice's shared secret: %x\n", aliceShared)
  52  	fmt.Printf("Bob's shared secret:   %x\n", bobShared)
  53  	fmt.Printf("Secrets match: %v\n", bytes.Equal(aliceShared, bobShared))
  54  }
  55