startKey: decode bech32 nsec to hex before constructing NDKPrivateKeySigner
Some checks failed
Docker image / build-and-push-image (push) Has been cancelled
Some checks failed
Docker image / build-and-push-image (push) Has been cancelled
NDK 2.8.1's NDKPrivateKeySigner constructor forwards its arg straight to nostr-tools getPublicKey() which requires 32-byte hex/bytes/bigint and throws on bech32 input. Every key loaded through startKey (i.e. every key created via create_new_key, plus boot-time reloads of any plain-nsec entries in the config) was failing silently with the nostr-tools type error. The try/catch caught the throw and returned without loading the key, so the bunker would happily report create_new_key as successful, the key would persist encrypted on disk, but the runtime keystore would not have a signer for it. NIP-46 connect / sign_event against any admin-provisioned target therefore silently timed out from the client side — blocking essentially every signing flow. Sister bug to #5 (getKeys iterator) in a different code path. The fix matches the existing pattern in create_new_key.ts:16: hexpk = nip19.decode(nsec).data as string; Verified against the local spike harness: create_new_key now loads the target into runtime; get_keys returns the new entry (assuming #5 is patched separately for the iterator path). Fixes #8. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
42dbbd7536
commit
e39eaa632d
1 changed files with 8 additions and 2 deletions
|
|
@ -230,8 +230,14 @@ class Daemon {
|
|||
|
||||
if (nsec.startsWith('nsec1')) {
|
||||
try {
|
||||
const key = new NDKPrivateKeySigner(nsec);
|
||||
hexpk = key.privateKey!;
|
||||
// NDK 2.8.1's NDKPrivateKeySigner constructor passes its
|
||||
// arg straight to nostr-tools getPublicKey() which requires
|
||||
// 32-byte hex / bytes / bigint, not bech32. Without this
|
||||
// decode, every key created via create_new_key fails to
|
||||
// load with the nostr-tools getPublicKey type error, so
|
||||
// the bunker can never sign for any target it provisions.
|
||||
// See aiolabs/nsecbunkerd#8.
|
||||
hexpk = nip19.decode(nsec).data as string;
|
||||
} catch(e) {
|
||||
console.error(`Error loading key ${name}:`, e);
|
||||
return
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue