keeweb/build/util/sign.js

62 lines
1.7 KiB
JavaScript
Raw Normal View History

2019-01-07 18:33:21 +01:00
const fs = require('fs');
2020-03-19 20:53:30 +01:00
const signer = require('pkcs11-smartcard-sign');
2020-04-04 19:26:27 +02:00
const crypto = require('crypto');
2019-01-07 18:33:21 +01:00
const verifyKey = fs.readFileSync('app/resources/public-key.pem');
2020-03-19 20:53:30 +01:00
const signerOptions = JSON.parse(fs.readFileSync('keys/keeweb-sign.json', 'utf8'));
2019-01-07 18:33:21 +01:00
function getPin() {
if (getPin.pin) {
return Promise.resolve(getPin.pin);
}
2020-04-04 19:26:27 +02:00
return require('keytar')
.getPassword('keeweb.pin', 'keeweb')
2020-06-01 16:53:51 +02:00
.then((pass) => {
2020-04-04 19:26:27 +02:00
if (pass) {
getPin.pin = pass;
return pass;
} else {
throw 'Cannot find PIN';
}
});
}
function getPrivateKey(path) {
if (!getPrivateKey[path]) {
getPrivateKey[path] = fs.readFileSync(path);
}
return getPrivateKey[path];
2019-01-07 18:33:21 +01:00
}
module.exports = function sign(grunt, data) {
2020-04-04 19:26:27 +02:00
if (signerOptions.privateKey) {
2020-04-04 19:43:12 +02:00
return Promise.resolve().then(() => {
const algo = signerOptions.algo || 'sha256';
2020-04-04 19:26:27 +02:00
2020-04-04 19:43:12 +02:00
const sign = crypto.createSign(algo);
sign.update(data);
const signature = sign.sign(getPrivateKey(signerOptions.privateKey));
2020-04-04 19:26:27 +02:00
2020-04-04 19:43:12 +02:00
const verify = crypto.createVerify(algo);
verify.write(data);
verify.end();
2020-04-04 19:26:27 +02:00
2020-04-04 19:43:12 +02:00
if (verify.verify(verifyKey, signature)) {
return signature;
} else {
throw 'Validation error';
}
});
2020-04-04 19:26:27 +02:00
}
2019-01-07 18:33:21 +01:00
return getPin()
2020-06-01 16:53:51 +02:00
.then((pin) => signer.sign({ data, verifyKey, pin, ...signerOptions }))
.catch((err) => {
2019-01-07 18:33:21 +01:00
if (grunt) {
grunt.warn(`Error signing data: ${err}`);
}
throw err;
});
};
module.exports.getPin = getPin;