37 lines
1.1 KiB
JavaScript
37 lines
1.1 KiB
JavaScript
|
|
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,
|
||
|
|
};
|