51 lines
1.6 KiB
JavaScript
51 lines
1.6 KiB
JavaScript
const { subtle } = require('node:crypto').webcrypto;
|
|
|
|
const sharedSecret = process.env.SHARED_SECRET;
|
|
|
|
const authentication = {
|
|
checkSharedSecret: (providedSecret) => {
|
|
return sharedSecret === providedSecret;
|
|
},
|
|
verifySignature : async (msg, sig, publicKeys) => {
|
|
try {
|
|
for (const pemPubKey of publicKeys) {
|
|
try {
|
|
const pubKey = await authentication.pemToKey(pemPubKey);
|
|
const verified = await subtle.verify(
|
|
'Ed25519',
|
|
pubKey,
|
|
sig,
|
|
msg
|
|
);
|
|
if (verified) {
|
|
console.log('Signature verified successfully with public key:', pemPubKey);
|
|
return pemPubKey;
|
|
}
|
|
} catch (err) {
|
|
console.log('Failed to verify signature with public key:', pemPubKey, err);
|
|
}
|
|
}
|
|
return null;
|
|
} catch (err) {
|
|
console.error('Error verifying signature:', err);
|
|
}
|
|
},
|
|
pemToKey: async (pemKey) => {
|
|
const base64 = pemKey.replace(`-----BEGIN PUBLIC KEY-----`, '').replace(`-----END PUBLIC KEY-----`, '').trim();
|
|
const buffer = Buffer.from(base64, 'base64');
|
|
const uint8Array = new Uint8Array(buffer);
|
|
const publicKey = await subtle.importKey(
|
|
"spki",
|
|
uint8Array,
|
|
{
|
|
name: "Ed25519",
|
|
},
|
|
true,
|
|
["verify"],
|
|
);
|
|
return publicKey;
|
|
}
|
|
};
|
|
|
|
module.exports = authentication;
|