From a235128d24e074a854f23946d3efc788b689470e Mon Sep 17 00:00:00 2001 From: forcer Date: Tue, 21 Oct 2025 19:43:16 +0200 Subject: [PATCH] bugfix: signing is made off radio --- index.mjs | 13 ++- supercop/index.mjs | 229 +++++++++++++++++++++++++++++++++++++++++ supercop/supercop.wasm | Bin 0 -> 57010 bytes 3 files changed, 237 insertions(+), 5 deletions(-) create mode 100644 supercop/index.mjs create mode 100644 supercop/supercop.wasm diff --git a/index.mjs b/index.mjs index 17a9724..15d6e56 100644 --- a/index.mjs +++ b/index.mjs @@ -4,6 +4,7 @@ import { Advert } from '@liamcottle/meshcore.js'; +import { KeyPair } from './supercop/index.mjs'; import crypto from 'crypto'; const device = process.argv[2] ?? '/dev/ttyACM0'; @@ -11,13 +12,13 @@ const apiURL = 'https://map.meshcore.dev/api/v1/uploader/node'; const seenAdverts = {}; let clientInfo = {}; -const signData = async (connection, data) => { +const signData = async (kp, data) => { const json = JSON.stringify(data); const dataHash = new Uint8Array( await crypto.subtle.digest('SHA-256', new TextEncoder().encode(json)) ); - return { data: json, signature: BufferUtils.bytesToHex(await connection.sign(dataHash)) } + return { data: json, signature: BufferUtils.bytesToHex(await kp.sign(dataHash)) } } const processPacket = async (connection, rawPacket) => { @@ -26,7 +27,7 @@ const processPacket = async (connection, rawPacket) => { if(packet.payload_type_string !== 'ADVERT') return; const advert = Advert.fromBytes(packet.payload); - // console.log(advert); + // console.debug('DEBUG: got advert', advert); if(advert.parsed.type === 'CHAT') return; const pubKey = BufferUtils.bytesToHex(advert.publicKey); @@ -59,7 +60,7 @@ const processPacket = async (connection, rawPacket) => { links: [`meshcore://${BufferUtils.bytesToHex(rawPacket)}`] }; - const requestData = await signData(connection, data); + const requestData = await signData(clientInfo.kp, data); requestData.publicKey = BufferUtils.bytesToHex(clientInfo.publicKey); const req = await fetch(apiURL, { @@ -67,6 +68,8 @@ const processPacket = async (connection, rawPacket) => { body: JSON.stringify(requestData) }); + // console.debug('DEBUG: sent request', req); + console.log('sending', requestData) console.log(await req.json()); @@ -89,7 +92,7 @@ connection.on('connected', async () => { connection.setManualAddContacts(); clientInfo = await connection.getSelfInfo(); - // console.log('info', clientInfo); + clientInfo.kp = KeyPair.from({ publicKey: clientInfo.publicKey, secretKey: (await connection.exportPrivateKey()).privateKey }); console.log('Map uploader waiting for adverts...'); }); diff --git a/supercop/index.mjs b/supercop/index.mjs new file mode 100644 index 0000000..2d1e928 --- /dev/null +++ b/supercop/index.mjs @@ -0,0 +1,229 @@ +import fs from 'node:fs'; + +const Module = (async () => { + const memory = new WebAssembly.Memory({ initial: 4 }); + const imports = { env: { memory } }; + const program = await WebAssembly.instantiate(fs.readFileSync('./supercop/supercop.wasm'), imports); + + return { + memory: memory, + instance: program.instance, + exports: program.instance.exports, + }; +})(); + +function toBuffer(data) { + return data instanceof Buffer ? data : Buffer.from(data); +} + +function randomBytes(length) { + return Buffer.from(new Array(length).fill(0).map(() => Math.floor(Math.random() * 256))); +} + +export function createSeed() { + return randomBytes(32); +} + +export function isSeed(data) { + return data.length === 32; +} + +export function isPublicKey(data) { + return data.length === 32; +} + +export function isSignature(data) { + return data.length === 64; +} + +export function isSecretKey(data) { + return data.length === 64; +} + +export class KeyPair { + publicKey; + secretKey; + constructor() { + // Intentionally empty + } + // Passes signing on to the exported stand-alone method + // Async, so the error = promise rejection + async sign(message) { + if (!isSecretKey(this.secretKey)) + throw new Error('No secret key on this keypair, only verification is possible'); + if (!isPublicKey(this.publicKey)) + throw new Error('Invalid public key'); + return sign(message, this.publicKey, this.secretKey); + } + // Passes verification on to the exported stand-alone method + verify(signature, message) { + if (!isPublicKey(this.publicKey)) + throw new Error('Invalid public key'); + return verify(signature, message, this.publicKey); + } + keyExchange(theirPublicKey) { + if (!isSecretKey(this.secretKey)) + throw new Error('Invalid secret key'); + return keyExchange(theirPublicKey, this.secretKey); + } + toJSON() { + return { + publicKey: this.publicKey ? [...this.publicKey] : undefined, + secretKey: this.secretKey ? [...this.secretKey] : undefined, + }; + } + static create(seed) { + return createKeyPair(seed); + } + static from(data) { + return keyPairFrom(data); + } +} + +export function keyPairFrom(data) { + if (typeof data !== 'object') + throw new Error('Invalid input data'); + // Sanitization and sanity checking + data = { + publicKey: toBuffer(data.publicKey), + secretKey: toBuffer(data.secretKey) + }; + + if (!isPublicKey(data.publicKey)) + throw new Error('Invalid public key'); + // Not checking the secretKey, allowed to be missing + const keypair = new KeyPair(); + Object.assign(keypair, data); + + return keypair; +} + +export async function createKeyPair(seed) { + // Pre-fetch module components + const fn = (await Module).exports; + const mem = (await Module).memory; + // Ensure we have a valid seed + if (Array.isArray(seed)) + seed = Buffer.from(seed); + if (!isSeed(seed)) + throw new Error('Invalid seed'); + // Reserve wasm-side memory + const seedPtr = fn._malloc(32); + const publicKeyPtr = fn._malloc(32); + const secretKeyPtr = fn._malloc(64); + const seedBuf = new Uint8Array(mem.buffer, seedPtr, 32); + const publicKey = new Uint8Array(mem.buffer, publicKeyPtr, 32); + const secretKey = new Uint8Array(mem.buffer, secretKeyPtr, 64); + seedBuf.set(seed); + fn.create_keypair(publicKeyPtr, secretKeyPtr, seedPtr); + fn._free(seedPtr); + fn._free(publicKeyPtr); + fn._free(secretKeyPtr); + + return keyPairFrom({ + publicKey: Buffer.from(publicKey), + secretKey: Buffer.from(secretKey), + }); +} + +export async function sign(message, publicKey, secretKey) { + // Pre-fetch module components + const fn = (await Module).exports; + const mem = (await Module).memory; + + // Sanitization and sanity checking + if (Array.isArray(publicKey)) + publicKey = Buffer.from(publicKey); + if (Array.isArray(secretKey)) + secretKey = Buffer.from(secretKey); + if (!isPublicKey(publicKey)) + throw new Error('Invalid public key'); + if (!isSecretKey(secretKey)) + throw new Error('Invalid secret key'); + if ('string' === typeof message) + message = Buffer.from(message); + // Allocate memory on the wasm side to transfer variables + const messageLen = message.length; + const messageArrPtr = fn._malloc(messageLen); + const messageArr = new Uint8Array(mem.buffer, messageArrPtr, messageLen); + const publicKeyArrPtr = fn._malloc(32); + const publicKeyArr = new Uint8Array(mem.buffer, publicKeyArrPtr, 32); + const secretKeyArrPtr = fn._malloc(64); + const secretKeyArr = new Uint8Array(mem.buffer, secretKeyArrPtr, 64); + const sigPtr = fn._malloc(64); + const sig = new Uint8Array(mem.buffer, sigPtr, 64); + messageArr.set(message); + publicKeyArr.set(publicKey); + secretKeyArr.set(secretKey); + await fn.sign(sigPtr, messageArrPtr, messageLen, publicKeyArrPtr, secretKeyArrPtr); + // Free used memory on wasm side + fn._free(messageArrPtr); + fn._free(publicKeyArrPtr); + fn._free(secretKeyArrPtr); + fn._free(sigPtr); + + return Buffer.from(sig); +} +export async function verify(signature, message, publicKey) { + const fn = (await Module).exports; + const mem = (await Module).memory; + + // Sanitization and sanity checking + if (Array.isArray(signature)) + signature = Buffer.from(signature); + if (Array.isArray(publicKey)) + publicKey = Buffer.from(publicKey); + if (!isPublicKey(publicKey)) + throw new Error('Invalid public key'); + if (!isSignature(signature)) + throw new Error('Invalid signature'); + if ('string' === typeof message) + message = Buffer.from(message); + // Allocate memory on the wasm side to transfer variables + const messageLen = message.length; + const messageArrPtr = fn._malloc(messageLen); + const messageArr = new Uint8Array(mem.buffer, messageArrPtr, messageLen); + const signatureArrPtr = fn._malloc(64); + const signatureArr = new Uint8Array(mem.buffer, signatureArrPtr, 64); + const publicKeyArrPtr = fn._malloc(32); + const publicKeyArr = new Uint8Array(mem.buffer, publicKeyArrPtr, 32); + messageArr.set(message); + signatureArr.set(signature); + publicKeyArr.set(publicKey); + const res = fn.verify(signatureArrPtr, messageArrPtr, messageLen, publicKeyArrPtr) === 1; + // Free used memory on wasm side + fn._free(messageArrPtr); + fn._free(signatureArrPtr); + fn._free(publicKeyArrPtr); + + return res; +} +export async function keyExchange(theirPublicKey, ourSecretKey) { + const fn = (await Module).exports; + const mem = (await Module).memory; + + // Sanitization and sanity checking + if (Array.isArray(theirPublicKey)) + theirPublicKey = Buffer.from(theirPublicKey); + if (Array.isArray(ourSecretKey)) + ourSecretKey = Buffer.from(ourSecretKey); + if (!isPublicKey(theirPublicKey)) + throw new Error('Invalid public key'); + if (!isSecretKey(ourSecretKey)) + throw new Error('Invalid secret key'); + // Allocate memory on the wasm side to transfer variables + const sharedSecretArrPtr = fn._malloc(32); + const sharedSecretArr = new Uint8Array(mem.buffer, sharedSecretArrPtr, 32); + const publicKeyArrPtr = fn._malloc(32); + const publicKeyArr = new Uint8Array(mem.buffer, publicKeyArrPtr, 32); + const secretKeyArrPtr = fn._malloc(64); + const secretKeyArr = new Uint8Array(mem.buffer, secretKeyArrPtr, 64); + publicKeyArr.set(theirPublicKey); + secretKeyArr.set(ourSecretKey); + fn.key_exchange(sharedSecretArrPtr, publicKeyArrPtr, secretKeyArrPtr); + // Free used memory on wasm side + fn._free(sharedSecretArrPtr); + fn._free(publicKeyArrPtr); + fn._free(secretKeyArrPtr); + return Buffer.from(sharedSecretArr); +} diff --git a/supercop/supercop.wasm b/supercop/supercop.wasm new file mode 100644 index 0000000000000000000000000000000000000000..42de268bbe70fc0e80cc8b9a5f6739c9f1aedc1e GIT binary patch literal 57010 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