add advert parser and verifier

This commit is contained in:
liamcottle 2025-03-03 09:46:03 +13:00
parent f48d55f681
commit b0e9a3d634
3 changed files with 77 additions and 2 deletions

30
package-lock.json generated
View file

@ -7,7 +7,35 @@
"": {
"name": "@liamcottle/meshcore.js",
"version": "1.0.9",
"license": "MIT"
"license": "MIT",
"dependencies": {
"@noble/curves": "^1.8.1"
}
},
"node_modules/@noble/curves": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.1.tgz",
"integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==",
"dependencies": {
"@noble/hashes": "1.7.1"
},
"engines": {
"node": "^14.21.3 || >=16"
},
"funding": {
"url": "https://paulmillr.com/funding/"
}
},
"node_modules/@noble/hashes": {
"version": "1.7.1",
"resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz",
"integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==",
"engines": {
"node": "^14.21.3 || >=16"
},
"funding": {
"url": "https://paulmillr.com/funding/"
}
}
}
}

View file

@ -8,5 +8,8 @@
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Liam Cottle <liam@liamcottle.com>",
"license": "MIT"
"license": "MIT",
"dependencies": {
"@noble/curves": "^1.8.1"
}
}

44
src/advert.js Normal file
View file

@ -0,0 +1,44 @@
import { ed25519 } from "@noble/curves/ed25519";
import BufferReader from "./buffer_reader.js";
import Packet from "./packet.js";
class Advert {
constructor(publicKey, timestamp, signature, appData) {
this.publicKey = publicKey;
this.timestamp = timestamp;
this.signature = signature;
this.appData = appData;
}
getTimestamp() {
return (new BufferReader(this.timestamp)).readUInt32LE();
}
isVerified() {
return ed25519.verify(this.signature, Buffer.concat([
this.publicKey,
this.timestamp,
this.appData,
]), this.publicKey);
}
static fromPacketBytes(bytes) {
// parse packet from bytes
const packet = Packet.fromBytes(bytes);
// read packet payload
const bufferedReader = new BufferReader(packet.payload);
const publicKey = bufferedReader.readBytes(32);
const timestamp = bufferedReader.readBytes(4); // read as bytes for signature
const signature = bufferedReader.readBytes(64);
const appData = bufferedReader.readRemainingBytes();
return new Advert(publicKey, timestamp, signature, appData);
}
}
export default Advert;