eccrypto/index.js

65 lines
1.6 KiB
JavaScript
Raw Normal View History

/**
* Node.js eccrypto implementation.
* @module eccrypto
*/
"use strict";
require("es6-promise").polyfill();
2014-12-23 20:28:40 +00:00
var secp256k1 = require("secp256k1");
/**
* Compute the public key for a given private key.
* @param {Buffer} publicKey A 32-byte private key
* @return {Buffer} A 65-byte public key
*/
2014-12-26 17:48:39 +00:00
function getPublic(privateKey) {
return secp256k1.createPublicKey(privateKey);
2014-12-26 18:02:01 +00:00
}
2014-12-26 17:48:39 +00:00
exports.getPublic = getPublic;
/**
* Create an ECDSA signature.
* @param {Buffer} privateKey A 32-byte private key
* @param {Buffer} msg The message being signed
* @return {Promise.<Buffer,undefined>} A promise that resolves with the
* signature or rejects on bad private key/message.
*/
// FIXME(Kagami): What to do in case of invalid nonce?
exports.sign = function(privateKey, msg) {
return new Promise(function(resolve, reject) {
try {
secp256k1.sign(privateKey, msg, function(code, sig) {
if (code === 1) {
resolve(sig);
} else {
reject();
}
});
} catch(e) {
reject();
}
});
};
/**
* Verify an ECDSA signature.
2014-12-26 17:48:39 +00:00
* @param {Buffer} key Private or public key
* @param {Buffer} msg The message being verified
* @param {Buffer} sig The signature
* @return {Promise} A promise that resolves on correct signature and
* rejects on bad signature/public key.
*/
2014-12-26 17:48:39 +00:00
exports.verify = function(key, msg, sig) {
var publicKey = key.length === 32 ? getPublic(key) : key;
return new Promise(function(resolve, reject) {
secp256k1.verify(publicKey, msg, sig, function(code) {
if (code === 1) {
resolve();
} else {
reject();
}
});
});
};