From 156cdccbdc8b718b258740daede162d9976823e1 Mon Sep 17 00:00:00 2001 From: Ardis Lu Date: Thu, 5 Dec 2024 21:17:17 -0800 Subject: [PATCH] Use encodedMessage length in ERC-191 prefix encodedMessage.length !== message.length when fullUrl is a contains grapheme cluster that are UTF-8 encoded in more than 1 byte (e.g., emojis). --- functions/api.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/functions/api.js b/functions/api.js index 6ff41f8..b2bd65c 100644 --- a/functions/api.js +++ b/functions/api.js @@ -72,7 +72,8 @@ export async function onRequestPost({ request, env }) { return new Response('The short URL is too long (maximum length is 80 characters).', { status: 400, headers: { 'Content-Type': 'text/plain; charset=UTF-8' } }); } const message = `Sign this message to confirm you want to create https://alu.bz/${shortUrl} to redirect to ${fullUrl}.`; // Must match frontend exactly - const personalMessage = `\x19Ethereum Signed Message:\n${message.length}${message}`; // ERC-191 + const encodedMessage = new TextEncoder().encode(message); + const personalMessage = `\x19Ethereum Signed Message:\n${encodedMessage.length}${message}`; // ERC-191 const personalMessageHash = keccak256(new TextEncoder().encode(personalMessage)); const signatureObj = Signature.fromCompact(signature.substring(2, 130)).addRecoveryBit(signature.slice(-2) === '1b' ? 0 : 1); const signingPublicKey = signatureObj.recoverPublicKey(personalMessageHash); -- 2.47.3