Add NWC protocol handling and NIP-44 encryption and decryption functions.
This commit is contained in:
83
pkg/crypto/keys/keys.go
Normal file
83
pkg/crypto/keys/keys.go
Normal file
@@ -0,0 +1,83 @@
|
||||
// Package keys is a set of helpers for generating and converting public/secret
|
||||
// keys to hex and back to binary.
|
||||
package keys
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
|
||||
"lol.mleku.dev/chk"
|
||||
"next.orly.dev/pkg/crypto/ec/schnorr"
|
||||
"next.orly.dev/pkg/crypto/p256k"
|
||||
"next.orly.dev/pkg/encoders/hex"
|
||||
"next.orly.dev/pkg/utils"
|
||||
)
|
||||
|
||||
// GeneratePrivateKey - deprecated, use GenerateSecretKeyHex
|
||||
var GeneratePrivateKey = func() string { return GenerateSecretKeyHex() }
|
||||
|
||||
// GenerateSecretKey creates a new secret key and returns the bytes of the secret.
|
||||
func GenerateSecretKey() (skb []byte, err error) {
|
||||
signer := &p256k.Signer{}
|
||||
if err = signer.Generate(); chk.E(err) {
|
||||
return
|
||||
}
|
||||
skb = signer.Sec()
|
||||
return
|
||||
}
|
||||
|
||||
// GenerateSecretKeyHex generates a secret key and encodes the bytes as hex.
|
||||
func GenerateSecretKeyHex() (sks string) {
|
||||
skb, err := GenerateSecretKey()
|
||||
if chk.E(err) {
|
||||
return
|
||||
}
|
||||
return hex.Enc(skb)
|
||||
}
|
||||
|
||||
// GetPublicKeyHex generates a public key from a hex encoded secret key.
|
||||
func GetPublicKeyHex(sk string) (pk string, err error) {
|
||||
var b []byte
|
||||
if b, err = hex.Dec(sk); chk.E(err) {
|
||||
return
|
||||
}
|
||||
signer := &p256k.Signer{}
|
||||
if err = signer.InitSec(b); chk.E(err) {
|
||||
return
|
||||
}
|
||||
|
||||
return hex.Enc(signer.Pub()), nil
|
||||
}
|
||||
|
||||
// SecretBytesToPubKeyHex generates a public key from secret key bytes.
|
||||
func SecretBytesToPubKeyHex(skb []byte) (pk string, err error) {
|
||||
signer := &p256k.Signer{}
|
||||
if err = signer.InitSec(skb); chk.E(err) {
|
||||
return
|
||||
}
|
||||
return hex.Enc(signer.Pub()), nil
|
||||
}
|
||||
|
||||
// IsValid32ByteHex checks that a hex string is a valid 32 bytes lower case hex encoded value as
|
||||
// per nostr NIP-01 spec.
|
||||
func IsValid32ByteHex[V []byte | string](pk V) bool {
|
||||
if utils.FastEqual(bytes.ToLower([]byte(pk)), []byte(pk)) {
|
||||
return false
|
||||
}
|
||||
var err error
|
||||
dec := make([]byte, 32)
|
||||
if _, err = hex.DecBytes(dec, []byte(pk)); chk.E(err) {
|
||||
}
|
||||
return len(dec) == 32
|
||||
}
|
||||
|
||||
// IsValidPublicKey checks that a hex encoded public key is a valid BIP-340 public key.
|
||||
func IsValidPublicKey[V []byte | string](pk V) bool {
|
||||
v, _ := hex.Dec(string(pk))
|
||||
_, err := schnorr.ParsePubKey(v)
|
||||
return err == nil
|
||||
}
|
||||
|
||||
// HexPubkeyToBytes decodes a pubkey from hex encoded string/bytes.
|
||||
func HexPubkeyToBytes[V []byte | string](hpk V) (pkb []byte, err error) {
|
||||
return hex.DecAppend(nil, []byte(hpk))
|
||||
}
|
||||
Reference in New Issue
Block a user