diff --git a/package.json b/package.json index ada18b7..c4feee2 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "node-webcrypto-ossl": false, "./src/crypto/webcrypto.js": "./src/crypto/webcrypto-browser.js", "./src/crypto/hmac.js": "./src/crypto/hmac-browser.js", - "./src/crypto/aes.js": "./src/crypto/aes-browser.js" + "./src/crypto/ciphers.js": "./src/crypto/ciphers-browser.js" }, "scripts": { "lint": "aegir-lint", @@ -32,6 +32,7 @@ "dependencies": { "asn1.js": "^4.8.1", "async": "^2.1.2", + "browserify-aes": "^1.0.6", "multihashing-async": "^0.2.0", "node-webcrypto-ossl": "^1.0.7", "nodeify": "^1.0.0", @@ -66,4 +67,4 @@ "greenkeeperio-bot ", "nikuda " ] -} \ No newline at end of file +} diff --git a/src/crypto/aes-browser.js b/src/crypto/aes-browser.js deleted file mode 100644 index 22de0cd..0000000 --- a/src/crypto/aes-browser.js +++ /dev/null @@ -1,52 +0,0 @@ -'use strict' - -const nodeify = require('nodeify') - -const crypto = require('./webcrypto')() - -exports.create = function (key, iv, callback) { - nodeify(crypto.subtle.importKey( - 'raw', - key, - { - name: 'AES-CTR' - }, - false, - ['encrypt', 'decrypt'] - ).then((key) => { - const counter = copy(iv) - - return { - encrypt (data, cb) { - nodeify(crypto.subtle.encrypt( - { - name: 'AES-CTR', - counter: counter, - length: 128 - }, - key, - data - ).then((raw) => Buffer.from(raw)), cb) - }, - - decrypt (data, cb) { - nodeify(crypto.subtle.decrypt( - { - name: 'AES-CTR', - counter: counter, - length: 128 - }, - key, - data - ).then((raw) => Buffer.from(raw)), cb) - } - } - }), callback) -} - -function copy (buf) { - const fresh = new Buffer(buf.length) - buf.copy(fresh) - - return fresh -} diff --git a/src/crypto/aes.js b/src/crypto/aes.js index 7326acf..54005ff 100644 --- a/src/crypto/aes.js +++ b/src/crypto/aes.js @@ -1,20 +1,20 @@ 'use strict' -const crypto = require('crypto') +const ciphers = require('./ciphers') -const ciphers = { +const CIPHER_MODES = { 16: 'aes-128-ctr', 32: 'aes-256-ctr' } exports.create = function (key, iv, callback) { - const name = ciphers[key.length] - if (!name) { + const mode = CIPHER_MODES[key.length] + if (!mode) { return callback(new Error('Invalid key length')) } - const cipher = crypto.createCipheriv(name, key, iv) - const decipher = crypto.createDecipheriv(name, key, iv) + const cipher = ciphers.createCipheriv(mode, key, iv) + const decipher = ciphers.createDecipheriv(mode, key, iv) const res = { encrypt (data, cb) { diff --git a/src/crypto/ciphers-browser.js b/src/crypto/ciphers-browser.js new file mode 100644 index 0000000..5aee05a --- /dev/null +++ b/src/crypto/ciphers-browser.js @@ -0,0 +1,8 @@ +'use strict' + +const crypto = require('browserify-aes') + +module.exports = { + createCipheriv: crypto.createCipheriv, + createDecipheriv: crypto.createDecipheriv +} diff --git a/src/crypto/ciphers.js b/src/crypto/ciphers.js new file mode 100644 index 0000000..efcd70f --- /dev/null +++ b/src/crypto/ciphers.js @@ -0,0 +1,8 @@ +'use strict' + +const crypto = require('crypto') + +module.exports = { + createCipheriv: crypto.createCipheriv, + createDecipheriv: crypto.createDecipheriv +} diff --git a/test/aes.spec.js b/test/aes.spec.js index 3579a68..6adc119 100644 --- a/test/aes.spec.js +++ b/test/aes.spec.js @@ -14,7 +14,7 @@ const bytes = { 32: 'AES-256' } -describe.only('AES-CTR', () => { +describe('AES-CTR', () => { Object.keys(bytes).forEach((byte) => { it(`${bytes[byte]} - encrypt and decrypt`, (done) => { const key = new Buffer(parseInt(byte, 10))