QBot/services/signature.js

37 lines
1.1 KiB
JavaScript
Raw Permalink Normal View History

const nacl = require('tweetnacl');
const { Buffer } = require('buffer');
const { BOT_SECRET } = require('../config');
function getKeyPairFromSecret(secret) {
let seed = secret;
while (seed.length < 32) seed += secret;
seed = seed.slice(0, 32);
const seedUint8 = Buffer.from(seed, 'utf-8');
return nacl.sign.keyPair.fromSeed(seedUint8);
}
function generateCallbackSignature(event_ts, plain_token) {
const keyPair = getKeyPairFromSecret(BOT_SECRET);
const privateKey = keyPair.secretKey;
const msgToSign = Buffer.concat([
Buffer.from(String(event_ts), 'utf-8'),
Buffer.from(plain_token, 'utf-8')
]);
return Buffer.from(nacl.sign.detached(msgToSign, privateKey)).toString('hex');
}
function verifySignature(timestamp, rawBody, signature) {
const keyPair = getKeyPairFromSecret(BOT_SECRET);
const publicKey = keyPair.publicKey;
const msg = Buffer.from(timestamp + rawBody.toString('utf-8'));
return nacl.sign.detached.verify(
msg,
Buffer.from(signature, 'hex'),
publicKey
);
}
module.exports = {
generateCallbackSignature,
verifySignature,
};