keys.go raw
1 package nostr
2
3 import (
4 "crypto/rand"
5 "encoding/hex"
6 "fmt"
7 "io"
8 "math/big"
9
10 "github.com/btcsuite/btcd/btcec/v2"
11 "github.com/btcsuite/btcd/btcec/v2/schnorr"
12 )
13
14 func GeneratePrivateKey() string {
15 params := btcec.S256().Params()
16 one := new(big.Int).SetInt64(1)
17
18 b := make([]byte, params.BitSize/8+8)
19 if _, err := io.ReadFull(rand.Reader, b); err != nil {
20 return ""
21 }
22
23 k := new(big.Int).SetBytes(b)
24 n := new(big.Int).Sub(params.N, one)
25 k.Mod(k, n)
26 k.Add(k, one)
27
28 return fmt.Sprintf("%064x", k.Bytes())
29 }
30
31 func GetPublicKey(sk string) (string, error) {
32 b, err := hex.DecodeString(sk)
33 if err != nil {
34 return "", err
35 }
36
37 _, pk := btcec.PrivKeyFromBytes(b)
38 return hex.EncodeToString(schnorr.SerializePubKey(pk)), nil
39 }
40
41 func IsValidPublicKey(pk string) bool {
42 if !isLowerHex(pk) {
43 return false
44 }
45
46 v, _ := hex.DecodeString(pk)
47 _, err := schnorr.ParsePubKey(v)
48 return err == nil
49 }
50