eccrypto/browser.js

48 lines
1.2 KiB
JavaScript
Raw Normal View History

/**
* Browser eccrypto implementation.
*/
2015-01-07 18:47:41 +00:00
// NOTE(Kagami): We don't use promise shim in Browser implementation
// because it's supported natively in new browsers (see
// <http://caniuse.com/#feat=promises>) and we can use only new browsers
// because of the WebCryptoAPI (see
// <http://caniuse.com/#feat=cryptography>).
"use strict";
var EC = require("elliptic").ec;
var ec = new EC("secp256k1");
exports.getPublic = function(privateKey) {
2015-01-05 23:49:32 +00:00
// `elliptic` doesn't have such checkings so we do it by ourself. We
2014-12-27 12:47:25 +00:00
// should always ensure that library user doesn't try to do something
// dumb.
2015-01-05 23:49:32 +00:00
if (privateKey.length !== 32) {
throw new Error("Bad private key");
}
// XXX(Kagami): `elliptic.utils.encode` returns array for every
// encoding except `hex`.
return new Buffer(ec.keyPair(privateKey).getPublic("arr"));
};
exports.sign = function(privateKey, msg) {
var key = ec.keyPair(privateKey);
var sig;
try {
sig = new Buffer(key.sign(msg).toDER());
return Promise.resolve(sig);
} catch(e) {
return Promise.reject();
}
};
2014-12-26 17:48:39 +00:00
exports.verify = function(key, msg, sig) {
key = ec.keyPair(key);
if (key.verify(msg, sig)) {
return Promise.resolve();
} else {
return Promise.reject();
}
};