mirror of https://github.com/keeweb/keeweb.git
64 lines
2.3 KiB
JavaScript
64 lines
2.3 KiB
JavaScript
const Logger = require('./logger');
|
|
const publicKey = require('raw-loader!../../resources/public-key.pem');
|
|
const kdbxweb = require('kdbxweb');
|
|
|
|
const SignatureVerifier = {
|
|
logger: new Logger('signature-verifier'),
|
|
|
|
publicKey: null,
|
|
|
|
verify(data, signature, pk) {
|
|
return new Promise((resolve, reject) => {
|
|
const algo = { name: 'RSASSA-PKCS1-v1_5', hash: { name: 'SHA-256' } };
|
|
try {
|
|
if (!pk) {
|
|
pk = this.getPublicKey();
|
|
}
|
|
signature = kdbxweb.ByteUtils.base64ToBytes(signature);
|
|
const subtle = window.crypto.subtle;
|
|
const keyFormat = 'spki';
|
|
pk = kdbxweb.ByteUtils.base64ToBytes(pk);
|
|
subtle
|
|
.importKey(keyFormat, pk, algo, false, ['verify'])
|
|
.then(cryptoKey => {
|
|
try {
|
|
subtle
|
|
.verify(
|
|
algo,
|
|
cryptoKey,
|
|
kdbxweb.ByteUtils.arrayToBuffer(signature),
|
|
kdbxweb.ByteUtils.arrayToBuffer(data)
|
|
)
|
|
.then(isValid => {
|
|
resolve(isValid);
|
|
})
|
|
.catch(e => {
|
|
this.logger.error('Verify error', e);
|
|
reject();
|
|
});
|
|
} catch (e) {
|
|
this.logger.error('Signature verification error', e);
|
|
reject();
|
|
}
|
|
})
|
|
.catch(e => {
|
|
this.logger.error('ImportKey error', e);
|
|
reject();
|
|
});
|
|
} catch (e) {
|
|
this.logger.error('Signature key verification error', e);
|
|
reject();
|
|
}
|
|
});
|
|
},
|
|
|
|
getPublicKey() {
|
|
if (!this.publicKey) {
|
|
this.publicKey = publicKey.match(/-+BEGIN PUBLIC KEY-+([\s\S]+?)-+END PUBLIC KEY-+/)[1].replace(/\s+/g, '');
|
|
}
|
|
return this.publicKey;
|
|
}
|
|
};
|
|
|
|
module.exports = SignatureVerifier;
|