send and verify login challenge
This commit is contained in:
@ -1,8 +1,49 @@
|
||||
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;
|
||||
}
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user