From 39ccf24ae5f215c2575b63a7aaf2864e0f77f9cb Mon Sep 17 00:00:00 2001 From: Zhen Yu Yong Date: Thu, 25 Jun 2020 20:07:38 +0800 Subject: [PATCH 1/7] concat ciphertexts in browser.js for encryption/decryption --- browser.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/browser.js b/browser.js index 11cb609..b5bae33 100644 --- a/browser.js +++ b/browser.js @@ -78,13 +78,15 @@ function getAes(op) { } else { if (op === 'encrypt') { var cipher = nodeCrypto.createCipheriv('aes-256-cbc', key, iv); - cipher.update(data); - resolve(cipher.final()); + var firstChunk = cipher.update(data); + var secondChunk = cipher.final(); + resolve(Buffer.concat([firstChunk, secondChunk])); } else if (op === 'decrypt') { var decipher = nodeCrypto.createDecipheriv('aes-256-cbc', key, iv); - decipher.update(data); - resolve(decipher.final()); + var firstChunk = decipher.update(data); + var secondChunk = decipher.final(); + resolve(Buffer.concat([firstChunk, secondChunk])); } } }); From 51d97b91a1c1fe6e93d2c3c8e31b739004eb53d3 Mon Sep 17 00:00:00 2001 From: Zhen Yu Yong Date: Thu, 25 Jun 2020 20:15:09 +0800 Subject: [PATCH 2/7] wrote test --- test.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test.js b/test.js index cd40f31..4e4e63c 100644 --- a/test.js +++ b/test.js @@ -217,6 +217,22 @@ describe("ECIES", function() { }); }); + it("should encrypt and decrypt", function() { + return eccrypto.encrypt(publicKeyA, Buffer.from("to a")).then(function(enc) { + return eccrypto.decrypt(privateKeyA, enc); + }).then(function(msg) { + expect(msg.toString()).to.equal("to a"); + }); + }); + + it("should encrypt and decrypt with message size > 15", function() { + return eccrypto.encrypt(publicKeyA, Buffer.from("message size that is greater than 15 for sure =)")).then(function(enc) { + return eccrypto.decrypt(privateKeyA, enc); + }).then(function(msg) { + expect(msg.toString()).to.equal("to a"); + }); + }); + it("should encrypt with compressed public key", function() { return eccrypto.encrypt(publicKeyBCompressed, Buffer.from("test"), encOpts) .then(function(enc) { From b5a245b23429304f8d4bfad32427f0eddb02c0f3 Mon Sep 17 00:00:00 2001 From: Zhen Yu Yong Date: Thu, 25 Jun 2020 20:19:13 +0800 Subject: [PATCH 3/7] fixed test --- test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test.js b/test.js index 4e4e63c..0da9882 100644 --- a/test.js +++ b/test.js @@ -229,7 +229,7 @@ describe("ECIES", function() { return eccrypto.encrypt(publicKeyA, Buffer.from("message size that is greater than 15 for sure =)")).then(function(enc) { return eccrypto.decrypt(privateKeyA, enc); }).then(function(msg) { - expect(msg.toString()).to.equal("to a"); + expect(msg.toString()).to.equal("message size that is greater than 15 for sure =)"); }); }); From 3f4504e4841f98b98e4cdcac5783ab4e66fb3d77 Mon Sep 17 00:00:00 2001 From: Zhen Yu Yong Date: Thu, 25 Jun 2020 22:11:26 +0800 Subject: [PATCH 4/7] fixed double declerations --- browser.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/browser.js b/browser.js index b5bae33..c9847df 100644 --- a/browser.js +++ b/browser.js @@ -78,14 +78,14 @@ function getAes(op) { } else { if (op === 'encrypt') { var cipher = nodeCrypto.createCipheriv('aes-256-cbc', key, iv); - var firstChunk = cipher.update(data); - var secondChunk = cipher.final(); + let firstChunk = cipher.update(data); + let secondChunk = cipher.final(); resolve(Buffer.concat([firstChunk, secondChunk])); } else if (op === 'decrypt') { var decipher = nodeCrypto.createDecipheriv('aes-256-cbc', key, iv); - var firstChunk = decipher.update(data); - var secondChunk = decipher.final(); + let firstChunk = decipher.update(data); + let secondChunk = decipher.final(); resolve(Buffer.concat([firstChunk, secondChunk])); } } From 20819b51f7f1607e02d1fb891e5bb38c4eead3fa Mon Sep 17 00:00:00 2001 From: Zhen Yu Yong Date: Thu, 2 Jul 2020 16:47:07 +0800 Subject: [PATCH 5/7] edited package.json for publishing --- README.md | 117 ++-------------------------------------------- package-lock.json | 2 +- package.json | 6 +-- 3 files changed, 7 insertions(+), 118 deletions(-) diff --git a/README.md b/README.md index 2b5477c..289126c 100644 --- a/README.md +++ b/README.md @@ -1,116 +1,5 @@ -# eccrypto [![Build Status](https://travis-ci.org/bitchan/eccrypto.svg?branch=master)](https://travis-ci.org/bitchan/eccrypto) +# eccrypto-torus -[![NPM](https://nodei.co/npm/eccrypto.png)](https://www.npmjs.com/package/eccrypto) +Fork of [![NPM](https://nodei.co/npm/eccrypto.png)](https://www.npmjs.com/package/eccrypto) -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 and uses the fastest implementation 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. - -## Implementation details - -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. - -* Use Node.js crypto module/library bindings where possible -* Use WebCryptoAPI where possible -* Promise-driven API -* Only secp256k1 curve, only SHA-512 (KDF), HMAC-SHA-256 (HMAC) and AES-256-CBC for ECIES -* Compressed key support - -### Native crypto API limitations - -#### crypto - -ECDH only works in Node 0.11+ (see https://github.com/joyent/node/pull/5854), ECDSA only supports keys in PEM format (see https://github.com/joyent/node/issues/6904) and ECIES is not supported at all. - -#### WebCryptoAPI - -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); see also [feature matrix](https://docs.google.com/spreadsheet/ccc?key=0AiAcidBZRLxndE9LWEs2R1oxZ0xidUVoU3FQbFFobkE#gid=1)) 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 meaning that secp256k1 (K-256) curve 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 ECDH and implement ECIES manually with the help of native crypto API. - -## Possible future goals - -* Support other curves/KDF/MAC/symmetric encryption schemes - -## Usage - -### ECDSA - -```js -var crypto = require("crypto"); -var eccrypto = require("eccrypto"); - -// A new random 32-byte private key. -var privateKey = eccrypto.generatePrivate(); -// Corresponding uncompressed (65-byte) public key. -var publicKey = eccrypto.getPublic(privateKey); - -var str = "message to sign"; -// Always hash you message to sign! -var msg = crypto.createHash("sha256").update(str).digest(); - -eccrypto.sign(privateKey, msg).then(function(sig) { - console.log("Signature in DER format:", sig); - eccrypto.verify(publicKey, msg, sig).then(function() { - console.log("Signature is OK"); - }).catch(function() { - console.log("Signature is BAD"); - }); -}); -``` - -### ECDH - -```js -var eccrypto = require("eccrypto"); - -var privateKeyA = eccrypto.generatePrivate(); -var publicKeyA = eccrypto.getPublic(privateKeyA); -var privateKeyB = eccrypto.generatePrivate(); -var publicKeyB = eccrypto.getPublic(privateKeyB); - -eccrypto.derive(privateKeyA, publicKeyB).then(function(sharedKey1) { - eccrypto.derive(privateKeyB, publicKeyA).then(function(sharedKey2) { - console.log("Both shared keys are equal:", sharedKey1, sharedKey2); - }); -}); -``` - -### ECIES - -```js -var eccrypto = require("eccrypto"); - -var privateKeyA = eccrypto.generatePrivate(); -var publicKeyA = eccrypto.getPublic(privateKeyA); -var privateKeyB = eccrypto.generatePrivate(); -var publicKeyB = eccrypto.getPublic(privateKeyB); - -// Encrypting the message for B. -eccrypto.encrypt(publicKeyB, Buffer.from("msg to b")).then(function(encrypted) { - // B decrypting the message. - eccrypto.decrypt(privateKeyB, encrypted).then(function(plaintext) { - console.log("Message to part B:", plaintext.toString()); - }); -}); - -// Encrypting the message for A. -eccrypto.encrypt(publicKeyA, Buffer.from("msg to a")).then(function(encrypted) { - // A decrypting the message. - eccrypto.decrypt(privateKeyA, encrypted).then(function(plaintext) { - console.log("Message to part A:", plaintext.toString()); - }); -}); -``` - -## License - -eccrypto - JavaScript Elliptic curve cryptography library - -Written in 2014-2015 by Kagami Hiiragi - -To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. This software is distributed without any warranty. - -You should have received a copy of the CC0 Public Domain Dedication along with this software. If not, see . +Fixes https://github.com/bitchan/eccrypto/pull/64 \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 5369c1c..bc3daef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "eccrypto", - "version": "1.1.2", + "version": "1.1.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 03ab790..035dd21 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "eccrypto", + "name": "eccrypto-torus", "version": "1.1.3", - "description": "JavaScript Elliptic curve cryptography library", + "description": "JavaScript Elliptic curve cryptography library, includes fix to browser.js so that encrypt/decrypt works", "main": "index.js", "browser": "browser.js", "scripts": { @@ -29,7 +29,7 @@ "elliptic", "curve" ], - "author": "Kagami Hiiragi", + "author": "Zhen Yu Yong", "license": "CC0-1.0", "bugs": { "url": "https://github.com/bitchan/eccrypto/issues" From edaffcc26c192cbd38e98c3cee318efcd7a76df1 Mon Sep 17 00:00:00 2001 From: Zhen Yu Yong Date: Tue, 28 Jul 2020 19:40:19 +0800 Subject: [PATCH 6/7] Revert "edited package.json for publishing" This reverts commit 20819b51f7f1607e02d1fb891e5bb38c4eead3fa. --- README.md | 117 ++++++++++++++++++++++++++++++++++++++++++++-- package-lock.json | 2 +- package.json | 6 +-- 3 files changed, 118 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 289126c..2b5477c 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,116 @@ -# eccrypto-torus +# eccrypto [![Build Status](https://travis-ci.org/bitchan/eccrypto.svg?branch=master)](https://travis-ci.org/bitchan/eccrypto) -Fork of [![NPM](https://nodei.co/npm/eccrypto.png)](https://www.npmjs.com/package/eccrypto) +[![NPM](https://nodei.co/npm/eccrypto.png)](https://www.npmjs.com/package/eccrypto) -Fixes https://github.com/bitchan/eccrypto/pull/64 \ No newline at end of file +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 and uses the fastest implementation 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. + +## Implementation details + +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. + +* Use Node.js crypto module/library bindings where possible +* Use WebCryptoAPI where possible +* Promise-driven API +* Only secp256k1 curve, only SHA-512 (KDF), HMAC-SHA-256 (HMAC) and AES-256-CBC for ECIES +* Compressed key support + +### Native crypto API limitations + +#### crypto + +ECDH only works in Node 0.11+ (see https://github.com/joyent/node/pull/5854), ECDSA only supports keys in PEM format (see https://github.com/joyent/node/issues/6904) and ECIES is not supported at all. + +#### WebCryptoAPI + +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); see also [feature matrix](https://docs.google.com/spreadsheet/ccc?key=0AiAcidBZRLxndE9LWEs2R1oxZ0xidUVoU3FQbFFobkE#gid=1)) 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 meaning that secp256k1 (K-256) curve 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 ECDH and implement ECIES manually with the help of native crypto API. + +## Possible future goals + +* Support other curves/KDF/MAC/symmetric encryption schemes + +## Usage + +### ECDSA + +```js +var crypto = require("crypto"); +var eccrypto = require("eccrypto"); + +// A new random 32-byte private key. +var privateKey = eccrypto.generatePrivate(); +// Corresponding uncompressed (65-byte) public key. +var publicKey = eccrypto.getPublic(privateKey); + +var str = "message to sign"; +// Always hash you message to sign! +var msg = crypto.createHash("sha256").update(str).digest(); + +eccrypto.sign(privateKey, msg).then(function(sig) { + console.log("Signature in DER format:", sig); + eccrypto.verify(publicKey, msg, sig).then(function() { + console.log("Signature is OK"); + }).catch(function() { + console.log("Signature is BAD"); + }); +}); +``` + +### ECDH + +```js +var eccrypto = require("eccrypto"); + +var privateKeyA = eccrypto.generatePrivate(); +var publicKeyA = eccrypto.getPublic(privateKeyA); +var privateKeyB = eccrypto.generatePrivate(); +var publicKeyB = eccrypto.getPublic(privateKeyB); + +eccrypto.derive(privateKeyA, publicKeyB).then(function(sharedKey1) { + eccrypto.derive(privateKeyB, publicKeyA).then(function(sharedKey2) { + console.log("Both shared keys are equal:", sharedKey1, sharedKey2); + }); +}); +``` + +### ECIES + +```js +var eccrypto = require("eccrypto"); + +var privateKeyA = eccrypto.generatePrivate(); +var publicKeyA = eccrypto.getPublic(privateKeyA); +var privateKeyB = eccrypto.generatePrivate(); +var publicKeyB = eccrypto.getPublic(privateKeyB); + +// Encrypting the message for B. +eccrypto.encrypt(publicKeyB, Buffer.from("msg to b")).then(function(encrypted) { + // B decrypting the message. + eccrypto.decrypt(privateKeyB, encrypted).then(function(plaintext) { + console.log("Message to part B:", plaintext.toString()); + }); +}); + +// Encrypting the message for A. +eccrypto.encrypt(publicKeyA, Buffer.from("msg to a")).then(function(encrypted) { + // A decrypting the message. + eccrypto.decrypt(privateKeyA, encrypted).then(function(plaintext) { + console.log("Message to part A:", plaintext.toString()); + }); +}); +``` + +## License + +eccrypto - JavaScript Elliptic curve cryptography library + +Written in 2014-2015 by Kagami Hiiragi + +To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. This software is distributed without any warranty. + +You should have received a copy of the CC0 Public Domain Dedication along with this software. If not, see . diff --git a/package-lock.json b/package-lock.json index bc3daef..5369c1c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "eccrypto", - "version": "1.1.3", + "version": "1.1.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 035dd21..03ab790 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "eccrypto-torus", + "name": "eccrypto", "version": "1.1.3", - "description": "JavaScript Elliptic curve cryptography library, includes fix to browser.js so that encrypt/decrypt works", + "description": "JavaScript Elliptic curve cryptography library", "main": "index.js", "browser": "browser.js", "scripts": { @@ -29,7 +29,7 @@ "elliptic", "curve" ], - "author": "Zhen Yu Yong", + "author": "Kagami Hiiragi", "license": "CC0-1.0", "bugs": { "url": "https://github.com/bitchan/eccrypto/issues" From affd2fd3e2327dda9ffde26691ce9cfd25136105 Mon Sep 17 00:00:00 2001 From: Zhen Yu Yong Date: Tue, 28 Jul 2020 19:42:50 +0800 Subject: [PATCH 7/7] removed duplicate test --- test.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/test.js b/test.js index 0da9882..4da5607 100644 --- a/test.js +++ b/test.js @@ -217,14 +217,6 @@ describe("ECIES", function() { }); }); - it("should encrypt and decrypt", function() { - return eccrypto.encrypt(publicKeyA, Buffer.from("to a")).then(function(enc) { - return eccrypto.decrypt(privateKeyA, enc); - }).then(function(msg) { - expect(msg.toString()).to.equal("to a"); - }); - }); - it("should encrypt and decrypt with message size > 15", function() { return eccrypto.encrypt(publicKeyA, Buffer.from("message size that is greater than 15 for sure =)")).then(function(enc) { return eccrypto.decrypt(privateKeyA, enc);