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