diff --git a/src/app/screens/Nostr/ConfirmSignSchnorr.tsx b/src/app/screens/Nostr/ConfirmSignSchnorr.tsx index 00e3d467e0..b5a039bcbb 100644 --- a/src/app/screens/Nostr/ConfirmSignSchnorr.tsx +++ b/src/app/screens/Nostr/ConfirmSignSchnorr.tsx @@ -23,7 +23,8 @@ function ConfirmSignSchnorr() { const { t: tPermissions } = useTranslation("permissions"); const navigate = useNavigate(); - const sigHash = navState.args?.sigHash as string; + const sigHash = navState.args?.sigHash as string | undefined; + const plaintext = navState.args?.message as string | undefined; const origin = navState.origin as OriginData; const [loading, setLoading] = useState(false); const [successMessage, setSuccessMessage] = useState(""); @@ -98,7 +99,7 @@ function ConfirmSignSchnorr() { publisher: origin.host, action: tPermissions("nostr.signschnorr.title"), })} - content={sigHash} + content={plaintext || sigHash || ""} />
diff --git a/src/extension/background-script/actions/nostr/signSchnorrOrPrompt.ts b/src/extension/background-script/actions/nostr/signSchnorrOrPrompt.ts index c1954fa0af..859d1141a2 100644 --- a/src/extension/background-script/actions/nostr/signSchnorrOrPrompt.ts +++ b/src/extension/background-script/actions/nostr/signSchnorrOrPrompt.ts @@ -23,21 +23,24 @@ const signSchnorrOrPrompt = async ( const nostr = await state.getState().getNostr(); const sigHash = message.args.sigHash; + const plaintext = message.args.message; + + const isMessageMode = message.args.message !== undefined; try { - if (!sigHash || typeof sigHash !== "string") { + if (isMessageMode) { + if (typeof plaintext !== "string") { + throw new Error("message is missing or not correct"); + } + } else if (!sigHash || typeof sigHash !== "string") { throw new Error("sigHash is missing or not correct"); } - const hasPermission = await hasPermissionFor( - PermissionMethodNostr["NOSTR_SIGNSCHNORR"], - host - ); + const permissionMethod = PermissionMethodNostr["NOSTR_SIGNSCHNORR"]; + + const hasPermission = await hasPermissionFor(permissionMethod, host); - const isBlocked = await isPermissionBlocked( - PermissionMethodNostr["NOSTR_SIGNSCHNORR"], - host - ); + const isBlocked = await isPermissionBlocked(permissionMethod, host); if (isBlocked) { return { denied: true }; @@ -55,10 +58,9 @@ const signSchnorrOrPrompt = async ( action: "public/nostr/confirmSignSchnorr", }); - // add permission to db only if user decided to always allow this request if (promptResponse.data.permissionOption == DONT_ASK_CURRENT) { await addPermissionFor( - PermissionMethodNostr["NOSTR_SIGNSCHNORR"], + permissionMethod, host, promptResponse.data.blocked ); @@ -84,7 +86,13 @@ const signSchnorrOrPrompt = async ( } async function signSchnorr() { - const signedSchnorr = await nostr.signSchnorr(sigHash); + let signedSchnorr: string; + + if (isMessageMode) { + signedSchnorr = await nostr.hashAndSignSchnorr(plaintext as string); + } else { + signedSchnorr = await nostr.signSchnorr(sigHash as string); + } return { data: signedSchnorr }; } diff --git a/src/extension/background-script/nostr/index.ts b/src/extension/background-script/nostr/index.ts index 566794f336..493bd96f54 100644 --- a/src/extension/background-script/nostr/index.ts +++ b/src/extension/background-script/nostr/index.ts @@ -53,6 +53,19 @@ class Nostr { return signedHex; } + async hashAndSignSchnorr(message: string): Promise { + const encoder = new TextEncoder(); + const data = encoder.encode(message); + const hashBuffer = await crypto.subtle.digest("SHA-256", data); + const hashArray = new Uint8Array(hashBuffer); + + const signature = await schnorr.sign( + hashArray, + secp256k1.etc.hexToBytes(this.privateKey) + ); + return secp256k1.etc.bytesToHex(signature); + } + nip04Encrypt(pubkey: string, text: string) { const key = secp256k1.getSharedSecret(this.privateKey, "02" + pubkey); const normalizedKey = Buffer.from(key.slice(1, 33)); diff --git a/src/extension/providers/nostr/index.ts b/src/extension/providers/nostr/index.ts index d06cff2b53..65c1b9203f 100644 --- a/src/extension/providers/nostr/index.ts +++ b/src/extension/providers/nostr/index.ts @@ -26,6 +26,11 @@ export default class NostrProvider extends ProviderBase { return this.execute("signEventOrPrompt", { event }); } + async hashAndSignSchnorr(message: string) { + await this.enable(); + return this.execute("signSchnorrOrPrompt", { message }); + } + async signSchnorr(sigHash: string) { await this.enable(); return this.execute("signSchnorrOrPrompt", { sigHash }); diff --git a/src/types.ts b/src/types.ts index dbce3d3c67..8d2988ed0c 100644 --- a/src/types.ts +++ b/src/types.ts @@ -561,7 +561,8 @@ export interface MessageSignEvent extends MessageDefault { export interface MessageSignSchnorr extends MessageDefault { args: { - sigHash: string; + sigHash?: string; + message?: string; }; action: "signSchnorr"; }