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