package nostr import ( "crypto/rand" "encoding/hex" "fmt" "io" "math/big" "strings" "github.com/btcsuite/btcd/btcec/v2" "github.com/btcsuite/btcd/btcec/v2/schnorr" ) func GeneratePrivateKey() string { params := btcec.S256().Params() one := new(big.Int).SetInt64(1) b := make([]byte, params.BitSize/8+8) if _, err := io.ReadFull(rand.Reader, b); err != nil { return "" } k := new(big.Int).SetBytes(b) n := new(big.Int).Sub(params.N, one) k.Mod(k, n) k.Add(k, one) return fmt.Sprintf("%064x", k.Bytes()) } func GetPublicKey(sk string) (string, error) { b, err := hex.DecodeString(sk) if err != nil { return "", err } _, pk := btcec.PrivKeyFromBytes(b) return hex.EncodeToString(schnorr.SerializePubKey(pk)), nil } // Deprecated: use IsValid32ByteHex instead -- functionality unchanged. func IsValidPublicKeyHex(pk string) bool { if strings.ToLower(pk) != pk { return false } dec, _ := hex.DecodeString(pk) return len(dec) == 32 } func IsValidPublicKey(pk string) bool { v, _ := hex.DecodeString(pk) _, err := schnorr.ParsePubKey(v) return err == nil }