diff --git a/README.md b/README.md index d2a664e..8eb8ef9 100644 --- a/README.md +++ b/README.md @@ -4,18 +4,19 @@ JavaScript Elliptic curve cryptography library for both browserify and node. ## Motivation -There is currently no any isomorphic ECC library which provides ECDSA, ECDH and ECIES for both Node.JS and Browser. So `eccrypto` is an attempt to create one. Current goals: +There is currently no any isomorphic ECC library which provides ECDSA, ECDH and ECIES for both Node.js and Browser and uses the fastest implementations available (e.g. [secp256k1-node](https://github.com/wanderer/secp256k1-node) is much faster than other libraries but can be used only on Node.js). So `eccrypto` is an attempt to create one. Current goals: -* Implement ECDSA -* Implement ECDH -* Implement ECIES -* Support secp256k1 curve, HMAC-SHA256 for ECDH and AES-256-CBC for ECIES +- [x] Convert private key to public +- [x] ECDSA +- [ ] ECDH +- [ ] ECIES Implementation details: -* Use Node.JS crypto module/library bindings where possible +* Use Node.js crypto module/library bindings where possible * Use WebCryptoAPI where possible * Promise-driven API +* Only secp256k1 curve, HMAC-SHA256 for ECDH and AES-256-CBC for ECIES Possible future goals: @@ -31,14 +32,28 @@ ECDH only works in Node 0.11+ (see https://github.com/joyent/node/pull/5854), EC ECDSA and ECDH are supported in Chrome [only on Windows](https://sites.google.com/a/chromium.org/dev/blink/webcrypto#TOC-Supported-algorithms-as-of-Chrome-41-) (see also [bug 338883](https://code.google.com/p/chromium/issues/detail?id=338883)), aren't supported by Firefox (fixed only in 36.0+, see [bug 1034854](https://bugzilla.mozilla.org/show_bug.cgi?id=1034854)) and ECIES is not defined at all in WebCryptoAPI draft. Also WebCryptoAPI [currently defines](http://www.w3.org/TR/WebCryptoAPI/#EcKeyGenParams-dictionary) only curves recommended by NIST which means that secp256k1 is not supported (see also: [[1]](http://lists.w3.org/Archives/Public/public-webcrypto-comments/2013Dec/0001.html), [[2]](https://bugzilla.mozilla.org/show_bug.cgi?id=1051509)). -So we use [seck256k1](https://www.npmjs.com/package/secp256k1) library in Node for ECDSA, [elliptic](https://www.npmjs.com/package/elliptic) in Browser for ECDSA and implement ECDH and ECIES manually with the help of native crypto API. +So we use [seck256k1](https://www.npmjs.com/package/secp256k1) library in Node for ECDSA, [elliptic](https://www.npmjs.com/package/elliptic) in Browser for ECDSA and ECDH and implement ECIES manually with the help of native crypto API. ## Usage With the help of browserify `eccrypto` provides different implementations for Browser and Node.js with the same API. Because WebCryptoAPI defines asynchronous promise-driven API, implementation for Node needs to use promises too. ```js +var crypto = require("crypto"); var eccrypto = require("eccrypto"); +var privateKey = crypto.randomBytes(32); +var publicKey = eccrypto.getPublic(privateKey); +var str = "test msg"; +// Always hash you msg to sign! +var msg = crypto.createHash("sha256").update(str).digest(); +eccrypto.sign(privateKey, msg).then(function(sig) { + console.log("signed:", sig); + // Public key is sufficient for verifying but private key also could be + // passed for convinience. + eccrypto.verify(publicKey, msg, sig).then(function() { + console.log("verified"); + }); +}); ``` ## License diff --git a/test.js b/test.js index e6199b0..524d8b0 100644 --- a/test.js +++ b/test.js @@ -37,6 +37,7 @@ describe("ECDSA", function() { return eccrypto.verify(privateKey, msg, sig); }); }); + it("shouldn't verify incorrect signature", function(done) { eccrypto.sign(privateKey, msg) .then(function(sig) {