Add NIP-44 encryption and decryption

This commit is contained in:
2025-05-31 09:49:35 -04:00
parent e46f1ba14b
commit e0125ca634
6 changed files with 54 additions and 5 deletions

View File

@@ -1,6 +1,7 @@
import {
nip04,
nip19,
nip44,
generateSecretKey,
getPublicKey,
finalizeEvent,
@@ -57,6 +58,8 @@ browser.runtime.onMessage.addListener((message, _sender, sendResponse) => {
case 'signEvent':
case 'nip04.encrypt':
case 'nip04.decrypt':
case 'nip44.encrypt':
case 'nip44.decrypt':
case 'getRelays':
validations[uuid] = sendResponse;
ask(uuid, message);
@@ -153,6 +156,12 @@ function complete({ payload, origKind, event, remember, host }) {
case 'nip04.decrypt':
nip04Decrypt(event).then(e => sendResponse(e));
break;
case 'nip44.encrypt':
nip44Encrypt(event).then(e => sendResponse(e));
break;
case 'nip44.decrypt':
nip44Decrypt(event).then(e => sendResponse(e));
break;
case 'getRelays':
getRelays().then(e => sendResponse(e));
break;
@@ -237,6 +246,18 @@ async function nip04Decrypt({ pubKey, cipherText }) {
return nip04.decrypt(privKey, pubKey, cipherText);
}
async function nip44Encrypt({ pubKey, plainText }) {
let privKey = await getPrivKey();
let conversationKey = nip44.getConversationKey(privKey, pubKey)
return nip44.encrypt(plainText, conversationKey);
}
async function nip44Decrypt({ pubKey, cipherText }) {
let privKey = await getPrivKey();
let conversationKey = nip44.getConversationKey(privKey, pubKey)
return nip44.decrypt(cipherText, conversationKey);
}
async function getRelays() {
let profile = await currentProfile();
let relays = profile.relays;

View File

@@ -9,6 +9,8 @@ window.addEventListener('message', async message => {
'getRelays',
'nip04.encrypt',
'nip04.decrypt',
'nip44.encrypt',
'nip44.decrypt',
];
let { kind, reqId, payload } = message.data;
if (!validEvents.includes(kind)) return;

View File

@@ -3,7 +3,7 @@
"default_locale": "en",
"name": "__MSG_extension_name__",
"description": "__MSG_extension_description__",
"version": "2.0.0",
"version": "2.0.1",
"icons": {
"48": "images/icon-48.png",
"96": "images/icon-96.png",

View File

@@ -42,6 +42,22 @@ window.nostr = {
});
},
},
nip44: {
async encrypt(pubKey, plainText) {
return await window.nostr.broadcast('nip44.encrypt', {
pubKey,
plainText,
});
},
async decrypt(pubKey, cipherText) {
return await window.nostr.broadcast('nip44.decrypt', {
pubKey,
cipherText,
});
},
},
};
window.addEventListener('message', message => {
@@ -51,6 +67,8 @@ window.addEventListener('message', message => {
'getRelays',
'nip04.encrypt',
'nip04.decrypt',
'nip44.encrypt',
'nip44.decrypt',
].map(e => `return_${e}`);
let { kind, reqId, payload } = message.data;

View File

@@ -71,9 +71,13 @@ Alpine.data('permission', () => ({
case 'getRelays':
return 'Read relay list';
case 'nip04.encrypt':
return 'Encrypt private message';
return 'Encrypt private message (NIP-04)';
case 'nip04.decrypt':
return 'Decrypt private message';
return 'Decrypt private message (NIP-04)';
case 'nip44.encrypt':
return 'Encrypt private message (NIP-44)';
case 'nip44.decrypt':
return 'Decrypt private message (NIP-44)';
default:
break;
}

View File

@@ -350,9 +350,13 @@ export function humanPermission(p) {
case 'getRelays':
return 'Read relay list';
case 'nip04.encrypt':
return 'Encrypt private message';
return 'Encrypt private message (NIP-04)';
case 'nip04.decrypt':
return 'Decrypt private message';
return 'Decrypt private message (NIP-04)';
case 'nip44.encrypt':
return 'Encrypt private message (NIP-44)';
case 'nip44.decrypt':
return 'Decrypt private message (NIP-44)';
default:
return 'Unknown';
}