From 56791711a04c783105e32d550f7b37b3403b348c Mon Sep 17 00:00:00 2001 From: rzcoder Date: Thu, 27 Nov 2014 22:07:17 +0500 Subject: [PATCH 001/146] initial export/import formats --- src/NodeRSA.js | 90 ++++++++++++++++++++---------------------- src/formats/formats.js | 20 ++++++++++ src/formats/pkcs1.js | 65 ++++++++++++++++++++++++++++++ src/formats/pkcs8.js | 44 +++++++++++++++++++++ 4 files changed, 171 insertions(+), 48 deletions(-) create mode 100644 src/formats/formats.js create mode 100644 src/formats/pkcs1.js create mode 100644 src/formats/pkcs8.js diff --git a/src/NodeRSA.js b/src/NodeRSA.js index 97528e2..013faac 100644 --- a/src/NodeRSA.js +++ b/src/NodeRSA.js @@ -13,6 +13,7 @@ var ber = require('asn1').Ber; var _ = require('lodash'); var utils = require('./utils'); var schemes = require('./schemes/schemes.js'); +var formats = require('./formats/formats.js'); var PUBLIC_RSA_OID = '1.2.840.113549.1.1.1'; @@ -25,6 +26,9 @@ module.exports = (function () { var DEFAULT_ENCRYPTION_SCHEME = 'pkcs1_oaep'; var DEFAULT_SIGNING_SCHEME = 'pkcs1'; + var DEFAULT_EXPORT_PRIVATE_FORMAT = 'pkcs1'; + var DEFAULT_EXPORT_PUBLIC_FORMAT = 'pkcs8'; + /** * @param key {string|buffer|object} Key in PEM format, or data for generate key {b: bits, e: exponent} * @constructor @@ -142,7 +146,7 @@ module.exports = (function () { } this.keyPair.generate(bits, exp.toString(16)); - this.$recalculateCache(); + this.$cache = {}; return this; }; @@ -162,7 +166,7 @@ module.exports = (function () { } else throw Error('Invalid PEM format'); - this.$recalculateCache(); + this.$cache = {}; }; /** @@ -251,7 +255,7 @@ module.exports = (function () { */ NodeRSA.prototype.encrypt = function (buffer, encoding, source_encoding) { try { - var res = this.keyPair.encrypt(this.$getDataForEcrypt(buffer, source_encoding)); + var res = this.keyPair.encrypt(this.$getDataForEncrypt(buffer, source_encoding)); if (encoding == 'buffer' || !encoding) { return res; @@ -295,7 +299,7 @@ module.exports = (function () { if (!this.isPrivate()) { throw Error("It is not private key"); } - var res = this.keyPair.sign(this.$getDataForEcrypt(buffer, source_encoding)); + var res = this.keyPair.sign(this.$getDataForEncrypt(buffer, source_encoding)); if (encoding && encoding != 'buffer') { res = res.toString(encoding); @@ -317,21 +321,45 @@ module.exports = (function () { throw Error("It is not public key"); } signature_encoding = (!signature_encoding || signature_encoding == 'buffer' ? null : signature_encoding); - return this.keyPair.verify(this.$getDataForEcrypt(buffer, source_encoding), signature, signature_encoding); + return this.keyPair.verify(this.$getDataForEncrypt(buffer, source_encoding), signature, signature_encoding); }; - NodeRSA.prototype.exportPrivate = function () { + NodeRSA.prototype.exportPrivate = function (format) { if (!this.isPrivate()) { throw Error("It is not private key"); } - return this.$cache.privatePEM; + + format = format || DEFAULT_EXPORT_PRIVATE_FORMAT; + if (this.$cache.privateKey && this.$cache.privateKey[format]) { + return this.$cache.privateKey[format]; + } else { + var fmt = format.split('-'); + if (!formats.isPrivateExport(fmt[0])) { + throw Error('Unsupported private key export format'); + } + + this.$cache.privateKey = this.$cache.privateKey || {}; + return this.$cache.privateKey[format] = formats[fmt[0]].privateExport(this.keyPair, fmt[1]); + } }; - NodeRSA.prototype.exportPublic = function () { + NodeRSA.prototype.exportPublic = function (format) { if (!this.isPublic()) { throw Error("It is not public key"); } - return this.$cache.publicPEM; + + format = format || DEFAULT_EXPORT_PUBLIC_FORMAT; + if (this.$cache.publicKey && this.$cache.publicKey[format]) { + return this.$cache.publicKey[format]; + } else { + var fmt = format.split('-'); + if (!formats.isPublicExport(fmt[0])) { + throw Error('Unsupported public key export format'); + } + + this.$cache.publicKey = this.$cache.publicKey || {}; + return this.$cache.publicKey[format] = formats[fmt[0]].publicExport(this.keyPair, fmt[1]); + } }; NodeRSA.prototype.getKeySize = function () { @@ -349,7 +377,7 @@ module.exports = (function () { * @param encoding {string} - optional. Encoding for given string. Default utf8. * @returns {Buffer} */ - NodeRSA.prototype.$getDataForEcrypt = function (buffer, encoding) { + NodeRSA.prototype.$getDataForEncrypt = function (buffer, encoding) { if (_.isString(buffer) || _.isNumber(buffer)) { return new Buffer('' + buffer, encoding || 'utf8'); } else if (Buffer.isBuffer(buffer)) { @@ -383,16 +411,15 @@ module.exports = (function () { * private * Recalculating properties */ - NodeRSA.prototype.$recalculateCache = function () { + /*NodeRSA.prototype.$recalculateCache = function () { this.$cache.privatePEM = this.$makePrivatePEM(); - this.$cache.publicPEM = this.$makePublicPEM(); - }; + };*/ /** * private * @returns {string} private PEM string */ - NodeRSA.prototype.$makePrivatePEM = function () { + /*NodeRSA.prototype.$makePrivatePEM = function () { if (!this.isPrivate()) { return null; } @@ -424,40 +451,7 @@ module.exports = (function () { utils.linebrk(writer.buffer.toString('base64'), 64) + '\n-----END RSA PRIVATE KEY-----'; }; - - /** - * private - * @returns {string} public PEM string - */ - NodeRSA.prototype.$makePublicPEM = function () { - if (!this.isPublic()) { - return null; - } - - var n = this.keyPair.n.toBuffer(); - var length = n.length + 512; // magic - - var bodyWriter = new ber.Writer({size: length}); - bodyWriter.writeByte(0); - bodyWriter.startSequence(); - bodyWriter.writeBuffer(n, 2); - bodyWriter.writeInt(this.keyPair.e); - bodyWriter.endSequence(); - var body = bodyWriter.buffer; - - var writer = new ber.Writer({size: length}); - writer.startSequence(); - writer.startSequence(); - writer.writeOID(PUBLIC_RSA_OID); - writer.writeNull(); - writer.endSequence(); - writer.writeBuffer(body, 3); - writer.endSequence(); - - return '-----BEGIN PUBLIC KEY-----\n' + - utils.linebrk(writer.buffer.toString('base64'), 64) + - '\n-----END PUBLIC KEY-----'; - }; +*/ return NodeRSA; })(); diff --git a/src/formats/formats.js b/src/formats/formats.js new file mode 100644 index 0000000..da2205b --- /dev/null +++ b/src/formats/formats.js @@ -0,0 +1,20 @@ +module.exports = { + pkcs1: require('./pkcs1'), + pkcs8: require('./pkcs8'), + + isPrivateExport: function(format) { + return module.exports[format] && typeof module.exports[format].privateExport === 'function'; + }, + + isPrivateImport: function(format) { + return module.exports[format] && typeof module.exports[format].privateImport === 'function'; + }, + + isPublicExport: function(format) { + return module.exports[format] && typeof module.exports[format].publicExport === 'function'; + }, + + isPublicImport: function(format) { + return module.exports[format] && typeof module.exports[format].publicImport === 'function'; + } +}; \ No newline at end of file diff --git a/src/formats/pkcs1.js b/src/formats/pkcs1.js new file mode 100644 index 0000000..d437834 --- /dev/null +++ b/src/formats/pkcs1.js @@ -0,0 +1,65 @@ +var ber = require('asn1').Ber; +var utils = require('../utils'); + +module.exports = { + privateExport: function(key, options) { + options = options || {}; + + var der = module.exports.privateDerEncode(key); + if (options.binary) { + return der; + } else { + return '-----BEGIN RSA PRIVATE KEY-----\n' + utils.linebrk(der.toString('base64'), 64) + '\n-----END RSA PRIVATE KEY-----'; + } + }, + + publicExport: function(key, options) { + options = options || {}; + + var der = module.exports.publicDerEncode(key); + if (options.binary) { + return der; + } else { + return '-----BEGIN RSA PUBLIC KEY-----\n' + utils.linebrk(der.toString('base64'), 64) + '\n-----END RSA PUBLIC KEY-----'; + } + }, + + privateDerEncode: function(key) { + var n = key.n.toBuffer(); + var d = key.d.toBuffer(); + var p = key.p.toBuffer(); + var q = key.q.toBuffer(); + var dmp1 = key.dmp1.toBuffer(); + var dmq1 = key.dmq1.toBuffer(); + var coeff = key.coeff.toBuffer(); + + var length = n.length + d.length + p.length + q.length + dmp1.length + dmq1.length + coeff.length + 512; // magic + var writer = new ber.Writer({size: length}); + + writer.startSequence(); + writer.writeInt(0); + writer.writeBuffer(n, 2); + writer.writeInt(key.e); + writer.writeBuffer(d, 2); + writer.writeBuffer(p, 2); + writer.writeBuffer(q, 2); + writer.writeBuffer(dmp1, 2); + writer.writeBuffer(dmq1, 2); + writer.writeBuffer(coeff, 2); + writer.endSequence(); + + return writer.buffer; + }, + + publicDerEncode: function (key) { + var n = key.n.toBuffer(); + var length = n.length + 512; // magic + + var bodyWriter = new ber.Writer({size: length}); + bodyWriter.startSequence(); + bodyWriter.writeBuffer(n, 2); + bodyWriter.writeInt(key.e); + bodyWriter.endSequence(); + return bodyWriter.buffer; + } +}; \ No newline at end of file diff --git a/src/formats/pkcs8.js b/src/formats/pkcs8.js new file mode 100644 index 0000000..6d9d11b --- /dev/null +++ b/src/formats/pkcs8.js @@ -0,0 +1,44 @@ +var ber = require('asn1').Ber; +var PUBLIC_RSA_OID = '1.2.840.113549.1.1.1'; +var utils = require('../utils'); + +module.exports = { + publicExport: function(key, options) { + options = options || {}; + + var der = module.exports.publicDerEncode(key); + if (options.binary) { + return der; + } else { + return '-----BEGIN PUBLIC KEY-----\n' + utils.linebrk(der.toString('base64'), 64) + '\n-----END PUBLIC KEY-----'; + } + }, + + publicImport: function(key) { + + }, + + publicDerEncode: function (key) { + var n = key.n.toBuffer(); + var length = n.length + 512; // magic + + var bodyWriter = new ber.Writer({size: length}); + bodyWriter.writeByte(0); + bodyWriter.startSequence(); + bodyWriter.writeBuffer(n, 2); + bodyWriter.writeInt(key.e); + bodyWriter.endSequence(); + var body = bodyWriter.buffer; + + var writer = new ber.Writer({size: length}); + writer.startSequence(); + writer.startSequence(); + writer.writeOID(PUBLIC_RSA_OID); + writer.writeNull(); + writer.endSequence(); + writer.writeBuffer(body, 3); + writer.endSequence(); + + return writer.buffer; + } +}; \ No newline at end of file From 080df0a9b20a198ecf2259a3abb258e430c983bc Mon Sep 17 00:00:00 2001 From: rzcoder Date: Fri, 28 Nov 2014 04:15:03 +0500 Subject: [PATCH 002/146] auto detect key type for import --- src/NodeRSA.js | 46 ++++++++++++++-------- src/formats/formats.js | 34 ++++++++++++++-- src/formats/pkcs1.js | 88 ++++++++++++++++++++++++++++++------------ src/formats/pkcs8.js | 71 +++++++++++++++++++++++++++------- test/tests.js | 10 +---- 5 files changed, 180 insertions(+), 69 deletions(-) diff --git a/src/NodeRSA.js b/src/NodeRSA.js index 013faac..8cf6c2d 100644 --- a/src/NodeRSA.js +++ b/src/NodeRSA.js @@ -151,21 +151,13 @@ module.exports = (function () { }; /** - * Load key from PEM string - * @param pem {string} + * Importing key + * @param keyData {string|buffer} */ - NodeRSA.prototype.importKey = function (pem) { - if (Buffer.isBuffer(pem)) { - pem = pem.toString('utf8'); + NodeRSA.prototype.importKey = function (keyData, format) { + if(format === undefined && !formats.detectAndImport(this.keyPair, keyData, format)) { + throw Error("Key format must be specified"); } - - if (/^\s*-----BEGIN RSA PRIVATE KEY-----\s*([A-Za-z0-9+/=]+\s*)+-----END RSA PRIVATE KEY-----\s*$/g.test(pem)) { - this.$loadFromPrivatePEM(pem, 'base64'); - } else if (/^\s*-----BEGIN PUBLIC KEY-----\s*([A-Za-z0-9+/=]+\s*)+-----END PUBLIC KEY-----\s*$/g.test(pem)) { - this.$loadFromPublicPEM(pem, 'base64'); - } else - throw Error('Invalid PEM format'); - this.$cache = {}; }; @@ -174,7 +166,7 @@ module.exports = (function () { * * @param privatePEM {string} */ - NodeRSA.prototype.$loadFromPrivatePEM = function (privatePEM, encoding) { + /*NodeRSA.prototype.$loadFromPrivatePEM = function (privatePEM, encoding) { var pem = privatePEM .replace('-----BEGIN RSA PRIVATE KEY-----', '') .replace('-----END RSA PRIVATE KEY-----', '') @@ -194,14 +186,14 @@ module.exports = (function () { reader.readString(2, true) // coefficient -- (inverse of q) mod p ); - }; + };*/ /** * Make key form public PEM string * * @param publicPEM {string} */ - NodeRSA.prototype.$loadFromPublicPEM = function (publicPEM, encoding) { + /*NodeRSA.prototype.$loadFromPublicPEM = function (publicPEM, encoding) { var pem = publicPEM .replace('-----BEGIN PUBLIC KEY-----', '') .replace('-----END PUBLIC KEY-----', '') @@ -221,7 +213,7 @@ module.exports = (function () { body.readString(0x02, true), // modulus body.readString(0x02, true) // publicExponent ); - }; + };*/ /** * Check if key pair contains private key @@ -324,6 +316,12 @@ module.exports = (function () { return this.keyPair.verify(this.$getDataForEncrypt(buffer, source_encoding), signature, signature_encoding); }; + /** + * Exporting private key + * + * @param format + * @returns {*} + */ NodeRSA.prototype.exportPrivate = function (format) { if (!this.isPrivate()) { throw Error("It is not private key"); @@ -343,6 +341,12 @@ module.exports = (function () { } }; + /** + * Exporting public key + * + * @param format + * @returns {*} + */ NodeRSA.prototype.exportPublic = function (format) { if (!this.isPublic()) { throw Error("It is not public key"); @@ -362,10 +366,18 @@ module.exports = (function () { } }; + /** + * Returns key size in bits + * @returns {int} + */ NodeRSA.prototype.getKeySize = function () { return this.keyPair.keySize; }; + /** + * Returns max message length in bytes (for 1 chunk) depending on current encryption scheme + * @returns {int} + */ NodeRSA.prototype.getMaxMessageSize = function () { return this.keyPair.maxMessageLength; }; diff --git a/src/formats/formats.js b/src/formats/formats.js index da2205b..6d2b85f 100644 --- a/src/formats/formats.js +++ b/src/formats/formats.js @@ -1,20 +1,46 @@ +var _ = require('lodash'); module.exports = { pkcs1: require('./pkcs1'), pkcs8: require('./pkcs8'), - isPrivateExport: function(format) { + isPrivateExport: function (format) { return module.exports[format] && typeof module.exports[format].privateExport === 'function'; }, - isPrivateImport: function(format) { + isPrivateImport: function (format) { return module.exports[format] && typeof module.exports[format].privateImport === 'function'; }, - isPublicExport: function(format) { + isPublicExport: function (format) { return module.exports[format] && typeof module.exports[format].publicExport === 'function'; }, - isPublicImport: function(format) { + isPublicImport: function (format) { return module.exports[format] && typeof module.exports[format].publicImport === 'function'; + }, + + detectAndImport: function (key, data, format) { + if (format === undefined && _.isString(data)) { + for (var format in module.exports) { + if (typeof module.exports[format].autoImport === 'function' && module.exports[format].autoImport(key, data)) { + return true; + } + } + } else if (format) { + var fmt = format.split('-'); + var keyType = fmt[1] === 'private' || fmt[1] === 'public' ? fmt[1] : 'private'; + var keyOpt = fmt[2] === 'der' ? {binary: true} : null; + if (module.exports[fmt[0]]) { + if (keyType === 'private') { + module.exports[fmt[0]].privateImport(key, data, keyOpt); + } else { + module.exports[fmt[0]].publicImport(key, data, keyOpt); + } + } else { + throw Error('Unsupported key format'); + } + } + + return false; } }; \ No newline at end of file diff --git a/src/formats/pkcs1.js b/src/formats/pkcs1.js index d437834..2ffb19f 100644 --- a/src/formats/pkcs1.js +++ b/src/formats/pkcs1.js @@ -1,30 +1,11 @@ var ber = require('asn1').Ber; +var _ = require('lodash'); var utils = require('../utils'); module.exports = { - privateExport: function(key, options) { + privateExport: function (key, options) { options = options || {}; - var der = module.exports.privateDerEncode(key); - if (options.binary) { - return der; - } else { - return '-----BEGIN RSA PRIVATE KEY-----\n' + utils.linebrk(der.toString('base64'), 64) + '\n-----END RSA PRIVATE KEY-----'; - } - }, - - publicExport: function(key, options) { - options = options || {}; - - var der = module.exports.publicDerEncode(key); - if (options.binary) { - return der; - } else { - return '-----BEGIN RSA PUBLIC KEY-----\n' + utils.linebrk(der.toString('base64'), 64) + '\n-----END RSA PUBLIC KEY-----'; - } - }, - - privateDerEncode: function(key) { var n = key.n.toBuffer(); var d = key.d.toBuffer(); var p = key.p.toBuffer(); @@ -48,10 +29,45 @@ module.exports = { writer.writeBuffer(coeff, 2); writer.endSequence(); - return writer.buffer; + if (options.binary) { + return writer.buffer; + } else { + return '-----BEGIN RSA PRIVATE KEY-----\n' + utils.linebrk(writer.buffer.toString('base64'), 64) + '\n-----END RSA PRIVATE KEY-----'; + } }, - publicDerEncode: function (key) { + privateImport: function (key, data) { + var buffer; + + if (_.isString(data)) { + var pem = data.replace('-----BEGIN RSA PRIVATE KEY-----', '') + .replace('-----END RSA PRIVATE KEY-----', '') + .replace(/\s+|\n\r|\n|\r$/gm, ''); + buffer = new Buffer(pem, 'base64'); + } else if (Buffer.isBuffer(data)) { + buffer = data; + } else { + throw Error('Unsupported key format'); + } + + var reader = new ber.Reader(buffer); + reader.readSequence(); + reader.readString(2, true); // just zero + key.setPrivate( + reader.readString(2, true), // modulus + reader.readString(2, true), // publicExponent + reader.readString(2, true), // privateExponent + reader.readString(2, true), // prime1 + reader.readString(2, true), // prime2 + reader.readString(2, true), // exponent1 -- d mod (p1) + reader.readString(2, true), // exponent2 -- d mod (q-1) + reader.readString(2, true) // coefficient -- (inverse of q) mod p + ); + }, + + publicExport: function (key, options) { + options = options || {}; + var n = key.n.toBuffer(); var length = n.length + 512; // magic @@ -60,6 +76,30 @@ module.exports = { bodyWriter.writeBuffer(n, 2); bodyWriter.writeInt(key.e); bodyWriter.endSequence(); - return bodyWriter.buffer; + + if (options.binary) { + return bodyWriter.buffer; + } else { + return '-----BEGIN RSA PUBLIC KEY-----\n' + utils.linebrk(bodyWriter.buffer.toString('base64'), 64) + '\n-----END RSA PUBLIC KEY-----'; + } + }, + + /** + * Trying autodetect and import key + * @param key + * @param data + */ + autoImport: function (key, data) { + if (/^\s*-----BEGIN RSA PRIVATE KEY-----\s*([A-Za-z0-9+/=]+\s*)+-----END RSA PRIVATE KEY-----\s*$/g.test(data)) { + module.exports.privateImport(key, data); + return true; + } + + if (/^\s*-----BEGIN RSA PUBLIC KEY-----\s*([A-Za-z0-9+/=]+\s*)+-----END RSA PUBLIC KEY-----\s*$/g.test(data)) { + module.exports.publicImport(key, data); + return true; + } + + return false; } }; \ No newline at end of file diff --git a/src/formats/pkcs8.js b/src/formats/pkcs8.js index 6d9d11b..86e1fb4 100644 --- a/src/formats/pkcs8.js +++ b/src/formats/pkcs8.js @@ -1,4 +1,5 @@ var ber = require('asn1').Ber; +var _ = require('lodash'); var PUBLIC_RSA_OID = '1.2.840.113549.1.1.1'; var utils = require('../utils'); @@ -6,19 +7,6 @@ module.exports = { publicExport: function(key, options) { options = options || {}; - var der = module.exports.publicDerEncode(key); - if (options.binary) { - return der; - } else { - return '-----BEGIN PUBLIC KEY-----\n' + utils.linebrk(der.toString('base64'), 64) + '\n-----END PUBLIC KEY-----'; - } - }, - - publicImport: function(key) { - - }, - - publicDerEncode: function (key) { var n = key.n.toBuffer(); var length = n.length + 512; // magic @@ -39,6 +27,59 @@ module.exports = { writer.writeBuffer(body, 3); writer.endSequence(); - return writer.buffer; + if (options.binary) { + return writer.buffer; + } else { + return '-----BEGIN PUBLIC KEY-----\n' + utils.linebrk(writer.buffer.toString('base64'), 64) + '\n-----END PUBLIC KEY-----'; + } + }, + + publicImport: function(key, data) { + var buffer; + + if (_.isString(data)) { + var pem = data.replace('-----BEGIN PUBLIC KEY-----', '') + .replace('-----END PUBLIC KEY-----', '') + .replace(/\s+|\n\r|\n|\r$/gm, ''); + buffer = new Buffer(pem, 'base64'); + } else if (Buffer.isBuffer(data)) { + buffer = data; + } else { + throw Error('Unsupported key format'); + } + + var reader = new ber.Reader(buffer); + reader.readSequence(); + var header = new ber.Reader(reader.readString(0x30, true)); + if (header.readOID(0x06, true) !== PUBLIC_RSA_OID) { + throw Error('Invalid Public key format'); + } + + var body = new ber.Reader(reader.readString(0x03, true)); + body.readByte(); + body.readSequence(); + key.setPublic( + body.readString(0x02, true), // modulus + body.readString(0x02, true) // publicExponent + ); + }, + + /** + * Trying autodetect and import key + * @param key + * @param data + */ + autoImport: function (key, data) { + if (/^\s*-----BEGIN PRIVATE KEY-----\s*([A-Za-z0-9+/=]+\s*)+-----END PRIVATE KEY-----\s*$/g.test(data)) { + module.exports.privateImport(key, data); + return true; + } + + if (/^\s*-----BEGIN PUBLIC KEY-----\s*([A-Za-z0-9+/=]+\s*)+-----END PUBLIC KEY-----\s*$/g.test(data)) { + module.exports.publicImport(key, data); + return true; + } + + return false; } -}; \ No newline at end of file +}; diff --git a/test/tests.js b/test/tests.js index 90c1d76..c3b7e83 100644 --- a/test/tests.js +++ b/test/tests.js @@ -254,21 +254,13 @@ describe("NodeRSA", function(){ assert.equal(privateNodeRSA.exportPublic(), publicKeyPEM); }); - it("should create key from buffer/fs.readFileSync output", function(){ + it("should create and load key from buffer/fs.readFileSync output", function(){ var key = new NodeRSA(fs.readFileSync(fileKey)); assert.equal(key.exportPrivate(), fileKeyPEM); key = new NodeRSA(); key.importKey(fs.readFileSync(fileKey)); assert.equal(key.exportPrivate(), fileKeyPEM); }); - - it("should load PEM from buffer/fs.readFileSync output", function(){ - var key = new NodeRSA(); - assert.equal(key.isEmpty(), true); - key.importKey(fs.readFileSync(fileKey)); - assert.equal(key.isEmpty(), false); - assert.equal(key.exportPrivate(), fileKeyPEM); - }); }); describe("Bad cases", function () { From ef7ed7b374fa14cf6266e5e79427da8d55fe8a10 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sat, 29 Nov 2014 02:53:51 +0500 Subject: [PATCH 003/146] new exporting key api --- src/NodeRSA.js | 183 +++---------------- src/formats/formats.js | 69 ++++++- src/formats/pkcs1.js | 23 ++- src/formats/pkcs8.js | 21 ++- src/libs/rsa.js | 15 ++ src/schemes/pkcs1.js | 4 +- test/keys/private_pkcs1.der | Bin 0 -> 608 bytes test/{private.key => keys/private_pkcs1.pem} | 0 test/keys/private_pkcs8.der | Bin 0 -> 634 bytes test/keys/private_pkcs8.pem | 16 ++ test/keys/public_pkcs1.der | Bin 0 -> 140 bytes test/keys/public_pkcs1.pem | 5 + test/keys/public_pkcs8.der | Bin 0 -> 162 bytes test/keys/public_pkcs8.pem | 6 + test/tests.js | 153 ++++++++++------ 15 files changed, 269 insertions(+), 226 deletions(-) create mode 100644 test/keys/private_pkcs1.der rename test/{private.key => keys/private_pkcs1.pem} (100%) create mode 100644 test/keys/private_pkcs8.der create mode 100644 test/keys/private_pkcs8.pem create mode 100644 test/keys/public_pkcs1.der create mode 100644 test/keys/public_pkcs1.pem create mode 100644 test/keys/public_pkcs8.der create mode 100644 test/keys/public_pkcs8.pem diff --git a/src/NodeRSA.js b/src/NodeRSA.js index 8cf6c2d..7c342ac 100644 --- a/src/NodeRSA.js +++ b/src/NodeRSA.js @@ -26,18 +26,26 @@ module.exports = (function () { var DEFAULT_ENCRYPTION_SCHEME = 'pkcs1_oaep'; var DEFAULT_SIGNING_SCHEME = 'pkcs1'; - var DEFAULT_EXPORT_PRIVATE_FORMAT = 'pkcs1'; - var DEFAULT_EXPORT_PUBLIC_FORMAT = 'pkcs8'; + var DEFAULT_EXPORT_FORMAT = 'private'; + var EXPORT_FORMAT_ALIASES = { + 'private': 'pkcs1-private-pem', + 'public': 'pkcs8-public-pem' + }; /** * @param key {string|buffer|object} Key in PEM format, or data for generate key {b: bits, e: exponent} * @constructor */ - function NodeRSA(key, options) { + function NodeRSA(key, format, options) { if (!this instanceof NodeRSA) { return new NodeRSA(key, options); } + if (_.isObject(format)) { + options = format; + format = undefined; + } + this.$options = { signingScheme: DEFAULT_SIGNING_SCHEME, signingSchemeOptions: { @@ -53,14 +61,14 @@ module.exports = (function () { rsaUtils: this }; this.keyPair = new rsa.Key(); - this.setOptions(options); this.$cache = {}; if (Buffer.isBuffer(key) || _.isString(key)) { - this.importKey(key); + this.importKey(key, format); } else if (_.isObject(key)) { this.generateKeyPair(key.b, key.e); } + this.setOptions(options); } /** @@ -153,73 +161,38 @@ module.exports = (function () { /** * Importing key * @param keyData {string|buffer} + * @param format {string} */ NodeRSA.prototype.importKey = function (keyData, format) { - if(format === undefined && !formats.detectAndImport(this.keyPair, keyData, format)) { + if (!keyData) { + throw Error("Empty key given"); + } + + if(!formats.detectAndImport(this.keyPair, keyData, format) && format === undefined) { throw Error("Key format must be specified"); } this.$cache = {}; }; /** - * Make key form private PEM string - * - * @param privatePEM {string} + * Exporting key + * @param format {string} */ - /*NodeRSA.prototype.$loadFromPrivatePEM = function (privatePEM, encoding) { - var pem = privatePEM - .replace('-----BEGIN RSA PRIVATE KEY-----', '') - .replace('-----END RSA PRIVATE KEY-----', '') - .replace(/\s+|\n\r|\n|\r$/gm, ''); - var reader = new ber.Reader(new Buffer(pem, 'base64')); - - reader.readSequence(); - reader.readString(2, true); // just zero - this.keyPair.setPrivate( - reader.readString(2, true), // modulus - reader.readString(2, true), // publicExponent - reader.readString(2, true), // privateExponent - reader.readString(2, true), // prime1 - reader.readString(2, true), // prime2 - reader.readString(2, true), // exponent1 -- d mod (p1) - reader.readString(2, true), // exponent2 -- d mod (q-1) - reader.readString(2, true) // coefficient -- (inverse of q) mod p - ); - - };*/ + NodeRSA.prototype.exportKey = function (format) { + format = format || DEFAULT_EXPORT_FORMAT; + format = EXPORT_FORMAT_ALIASES[format] || format; - /** - * Make key form public PEM string - * - * @param publicPEM {string} - */ - /*NodeRSA.prototype.$loadFromPublicPEM = function (publicPEM, encoding) { - var pem = publicPEM - .replace('-----BEGIN PUBLIC KEY-----', '') - .replace('-----END PUBLIC KEY-----', '') - .replace(/\s+|\n\r|\n|\r$/gm, ''); - var reader = new ber.Reader(new Buffer(pem, 'base64')); - - reader.readSequence(); - var header = new ber.Reader(reader.readString(0x30, true)); - if (header.readOID(0x06, true) !== PUBLIC_RSA_OID) { - throw Error('Invalid Public key PEM format'); + if (!this.$cache[format]) { + this.$cache[format] = formats.detectAndExport(this.keyPair, format); } - - var body = new ber.Reader(reader.readString(0x03, true)); - body.readByte(); - body.readSequence(); - this.keyPair.setPublic( - body.readString(0x02, true), // modulus - body.readString(0x02, true) // publicExponent - ); - };*/ + return this.$cache[format]; + }; /** * Check if key pair contains private key */ NodeRSA.prototype.isPrivate = function () { - return this.keyPair.n && this.keyPair.e && this.keyPair.d || false; + return this.keyPair.isPrivate(); }; /** @@ -227,7 +200,7 @@ module.exports = (function () { * @param strict {boolean} - public key only, return false if have private exponent */ NodeRSA.prototype.isPublic = function (strict) { - return this.keyPair.n && this.keyPair.e && !(strict && this.keyPair.d) || false; + return this.keyPair.isPublic(strict); }; /** @@ -316,56 +289,6 @@ module.exports = (function () { return this.keyPair.verify(this.$getDataForEncrypt(buffer, source_encoding), signature, signature_encoding); }; - /** - * Exporting private key - * - * @param format - * @returns {*} - */ - NodeRSA.prototype.exportPrivate = function (format) { - if (!this.isPrivate()) { - throw Error("It is not private key"); - } - - format = format || DEFAULT_EXPORT_PRIVATE_FORMAT; - if (this.$cache.privateKey && this.$cache.privateKey[format]) { - return this.$cache.privateKey[format]; - } else { - var fmt = format.split('-'); - if (!formats.isPrivateExport(fmt[0])) { - throw Error('Unsupported private key export format'); - } - - this.$cache.privateKey = this.$cache.privateKey || {}; - return this.$cache.privateKey[format] = formats[fmt[0]].privateExport(this.keyPair, fmt[1]); - } - }; - - /** - * Exporting public key - * - * @param format - * @returns {*} - */ - NodeRSA.prototype.exportPublic = function (format) { - if (!this.isPublic()) { - throw Error("It is not public key"); - } - - format = format || DEFAULT_EXPORT_PUBLIC_FORMAT; - if (this.$cache.publicKey && this.$cache.publicKey[format]) { - return this.$cache.publicKey[format]; - } else { - var fmt = format.split('-'); - if (!formats.isPublicExport(fmt[0])) { - throw Error('Unsupported public key export format'); - } - - this.$cache.publicKey = this.$cache.publicKey || {}; - return this.$cache.publicKey[format] = formats[fmt[0]].publicExport(this.keyPair, fmt[1]); - } - }; - /** * Returns key size in bits * @returns {int} @@ -419,51 +342,5 @@ module.exports = (function () { } }; - /** - * private - * Recalculating properties - */ - /*NodeRSA.prototype.$recalculateCache = function () { - this.$cache.privatePEM = this.$makePrivatePEM(); - };*/ - - /** - * private - * @returns {string} private PEM string - */ - /*NodeRSA.prototype.$makePrivatePEM = function () { - if (!this.isPrivate()) { - return null; - } - - var n = this.keyPair.n.toBuffer(); - var d = this.keyPair.d.toBuffer(); - var p = this.keyPair.p.toBuffer(); - var q = this.keyPair.q.toBuffer(); - var dmp1 = this.keyPair.dmp1.toBuffer(); - var dmq1 = this.keyPair.dmq1.toBuffer(); - var coeff = this.keyPair.coeff.toBuffer(); - - var length = n.length + d.length + p.length + q.length + dmp1.length + dmq1.length + coeff.length + 512; // magic - var writer = new ber.Writer({size: length}); - - writer.startSequence(); - writer.writeInt(0); - writer.writeBuffer(n, 2); - writer.writeInt(this.keyPair.e); - writer.writeBuffer(d, 2); - writer.writeBuffer(p, 2); - writer.writeBuffer(q, 2); - writer.writeBuffer(dmp1, 2); - writer.writeBuffer(dmq1, 2); - writer.writeBuffer(coeff, 2); - writer.endSequence(); - - return '-----BEGIN RSA PRIVATE KEY-----\n' + - utils.linebrk(writer.buffer.toString('base64'), 64) + - '\n-----END RSA PRIVATE KEY-----'; - }; -*/ - return NodeRSA; })(); diff --git a/src/formats/formats.js b/src/formats/formats.js index 6d2b85f..f38c648 100644 --- a/src/formats/formats.js +++ b/src/formats/formats.js @@ -20,7 +20,7 @@ module.exports = { }, detectAndImport: function (key, data, format) { - if (format === undefined && _.isString(data)) { + if (format === undefined) { for (var format in module.exports) { if (typeof module.exports[format].autoImport === 'function' && module.exports[format].autoImport(key, data)) { return true; @@ -28,8 +28,28 @@ module.exports = { } } else if (format) { var fmt = format.split('-'); - var keyType = fmt[1] === 'private' || fmt[1] === 'public' ? fmt[1] : 'private'; - var keyOpt = fmt[2] === 'der' ? {binary: true} : null; + var keyType = 'private'; + var keyOpt = {type: 'default'}; + + for(var i = 1; i < fmt.length; i++) { + if (fmt[i]) { + switch (fmt[i]) { + case 'public': + keyType = fmt[i]; + break; + case 'private': + keyType = fmt[i]; + break; + case 'pem': + keyOpt.type = fmt[i]; + break; + case 'der': + keyOpt.type = fmt[i]; + break; + } + } + } + if (module.exports[fmt[0]]) { if (keyType === 'private') { module.exports[fmt[0]].privateImport(key, data, keyOpt); @@ -42,5 +62,48 @@ module.exports = { } return false; + }, + + detectAndExport: function(key, format) { + if (format) { + var fmt = format.split('-'); + var keyType = 'private'; + var keyOpt = {type: 'default'}; + + for(var i = 1; i < fmt.length; i++) { + if (fmt[i]) { + switch (fmt[i]) { + case 'public': + keyType = fmt[i]; + break; + case 'private': + keyType = fmt[i]; + break; + case 'pem': + keyOpt.type = fmt[i]; + break; + case 'der': + keyOpt.type = fmt[i]; + break; + } + } + } + + if (module.exports[fmt[0]]) { + if (keyType === 'private') { + if (!key.isPrivate()) { + throw Error("It is not private key"); + } + return module.exports[fmt[0]].privateExport(key, keyOpt); + } else { + if (!key.isPublic()) { + throw Error("It is not public key"); + } + return module.exports[fmt[0]].publicExport(key, keyOpt); + } + } else { + throw Error('Unsupported key format'); + } + } } }; \ No newline at end of file diff --git a/src/formats/pkcs1.js b/src/formats/pkcs1.js index 2ffb19f..264e07c 100644 --- a/src/formats/pkcs1.js +++ b/src/formats/pkcs1.js @@ -29,21 +29,30 @@ module.exports = { writer.writeBuffer(coeff, 2); writer.endSequence(); - if (options.binary) { + if (options.type === 'der') { return writer.buffer; } else { return '-----BEGIN RSA PRIVATE KEY-----\n' + utils.linebrk(writer.buffer.toString('base64'), 64) + '\n-----END RSA PRIVATE KEY-----'; } }, - privateImport: function (key, data) { + privateImport: function (key, data, options) { + options = options || {}; var buffer; - if (_.isString(data)) { - var pem = data.replace('-----BEGIN RSA PRIVATE KEY-----', '') - .replace('-----END RSA PRIVATE KEY-----', '') - .replace(/\s+|\n\r|\n|\r$/gm, ''); - buffer = new Buffer(pem, 'base64'); + if (options.type !== 'der') { + if (Buffer.isBuffer(data)) { + data = data.toString('utf8'); + } + + if (_.isString(data)) { + var pem = data.replace('-----BEGIN RSA PRIVATE KEY-----', '') + .replace('-----END RSA PRIVATE KEY-----', '') + .replace(/\s+|\n\r|\n|\r$/gm, ''); + buffer = new Buffer(pem, 'base64'); + } else { + throw Error('Unsupported key format'); + } } else if (Buffer.isBuffer(data)) { buffer = data; } else { diff --git a/src/formats/pkcs8.js b/src/formats/pkcs8.js index 86e1fb4..5d0c715 100644 --- a/src/formats/pkcs8.js +++ b/src/formats/pkcs8.js @@ -27,21 +27,28 @@ module.exports = { writer.writeBuffer(body, 3); writer.endSequence(); - if (options.binary) { + if (options.type === 'der') { return writer.buffer; } else { return '-----BEGIN PUBLIC KEY-----\n' + utils.linebrk(writer.buffer.toString('base64'), 64) + '\n-----END PUBLIC KEY-----'; } }, - publicImport: function(key, data) { + publicImport: function(key, data, options) { + options = options || {}; var buffer; - if (_.isString(data)) { - var pem = data.replace('-----BEGIN PUBLIC KEY-----', '') - .replace('-----END PUBLIC KEY-----', '') - .replace(/\s+|\n\r|\n|\r$/gm, ''); - buffer = new Buffer(pem, 'base64'); + if (options.type !== 'der') { + if (Buffer.isBuffer(data)) { + data = data.toString('utf8'); + } + + if (_.isString(data)) { + var pem = data.replace('-----BEGIN PUBLIC KEY-----', '') + .replace('-----END PUBLIC KEY-----', '') + .replace(/\s+|\n\r|\n|\r$/gm, ''); + buffer = new Buffer(pem, 'base64'); + } } else if (Buffer.isBuffer(data)) { buffer = data; } else { diff --git a/src/libs/rsa.js b/src/libs/rsa.js index 245bb29..fe1dccd 100644 --- a/src/libs/rsa.js +++ b/src/libs/rsa.js @@ -278,6 +278,21 @@ module.exports.Key = (function() { return this.signingScheme.verify.apply(this.signingScheme, arguments); }; + /** + * Check if key pair contains private key + */ + RSAKey.prototype.isPrivate = function () { + return this.n && this.e && this.d || false; + }; + + /** + * Check if key pair contains public key + * @param strict {boolean} - public key only, return false if have private exponent + */ + RSAKey.prototype.isPublic = function (strict) { + return this.n && this.e && !(strict && this.d) || false; + }; + Object.defineProperty(RSAKey.prototype, 'keySize', { get: function() { return this.cache.keyBitLength; } }); diff --git a/src/schemes/pkcs1.js b/src/schemes/pkcs1.js index d46e297..d6907c6 100644 --- a/src/schemes/pkcs1.js +++ b/src/schemes/pkcs1.js @@ -115,7 +115,7 @@ module.exports.makeScheme = function (key, options) { } else { var signer = crypt.createSign('RSA-' + hashAlgorithm.toUpperCase()); signer.update(buffer); - return signer.sign(this.options.rsaUtils.exportPrivate()); + return signer.sign(this.options.rsaUtils.exportKey('private')); } }; @@ -137,7 +137,7 @@ module.exports.makeScheme = function (key, options) { } else { var verifier = crypt.createVerify('RSA-' + hashAlgorithm.toUpperCase()); verifier.update(buffer); - return verifier.verify(this.options.rsaUtils.exportPublic(), signature, signature_encoding); + return verifier.verify(this.options.rsaUtils.exportKey('public'), signature, signature_encoding); } }; diff --git a/test/keys/private_pkcs1.der b/test/keys/private_pkcs1.der new file mode 100644 index 0000000000000000000000000000000000000000..3afd0ad53eb1157a95532f334794b33654b3e4dc GIT binary patch literal 608 zcmV-m0-yabf&yFu0RRGlfdGPakA$Q!zr6Oh-}P}*!MM9 z{<)7CwB!osikyOgrsIY&a!zP04IkVTe$#F3Js+Sh5wjBEsOGIhDDV-C#0eM8a-w)g_P@G@GglZopM(kTC)S0RRC4fq)T& zccAy{6VvO>1lcz!_|D*k2w;SvvbBd-XQPdi)ec;{c6hWNUyHwM7tyRVS~PO-aLCql z6VDS~Eh%=nL|dtyJ_H4KaD~RRpeo-$8k4OfT=P`s^-!}1S>kblr5(L z!xXPd)$YAk<_ay%9g zX1YSAe6tsfCRk$sgR;L9B46UJA*yjG29OcQpl7w7V$^4W2LeF=tA-p0#QhAi7*Xbu z_>@+_v!0DkzpaO0#1a}BeWuX2Y5zXuEY9F>LHPn-yFBKjkOyZC$w3Yrv8aj1JB4ot z0zm+sxs1^%fY@q4s5wT)C>LZyVaR9sW7?nY%y7KMWcN5sTIS5D42Z7AJi+5Oi3vq~ zEA60TR0F|`K{D(c<2*qEKvRk0w+aI>9>8adL_?c{(IDz{>PW)OZ=J6%Rehs0eo#8c zxHzSqd$NZE*ZN9?4qt?;b#!u}+v(3MBZT738v;NBNXi-s-+Q2h+}j9=Cy>L+whPNS uKoOn1n*F&SMeIw7%$Ut{&AO&TW5QWLd2EE=90|r;Vlj_liyU`i$_J`&>mj26 literal 0 HcmV?d00001 diff --git a/test/private.key b/test/keys/private_pkcs1.pem similarity index 100% rename from test/private.key rename to test/keys/private_pkcs1.pem diff --git a/test/keys/private_pkcs8.der b/test/keys/private_pkcs8.der new file mode 100644 index 0000000000000000000000000000000000000000..633b0c000ec533cbd80b93d29fa735294744a43b GIT binary patch literal 634 zcmV-=0)_oBf&z8|0RS)!1_>&LNQUpU@(FLTmk_A0)c@5f_0CCq%gm{ z_P5`ed*@VvGsk%?{xjhQSK+rl4y4%kHCX<+j~TS&3g?QPf`F#uhB0zZXe&*n&H!1ke;DrcagrTyvhgWB# zjg!?5T)TF7v>soJziSuKtTb9Qa`14-)^rok6J9MTcDY1bshvIq1$S_T#y2F`7_I0PndgZ4S#(&j;0zm-6 zwfk%z-|4NmE<=HKl;x~1KYD5`e~xlI77%8-LZ*DP7mOxYV*i7(zY`)~;;td8aVQ3m z5yzlswVq(|U90$bx46+ze=92i7R=~5KjZVL>J}eK>|QiiQ=~k12G=J zXNyEbn}g9H>U8Qz!pv`-uP;@7qcna{I>)#;rJZ}ShXdF8N`wwygsXLQa-rMl&nqK@ z;>{ZZKm$n18VTQfpoHAp2#F_w&2!DVrbA=GSwMMg Ugx?$q##~}Ck70`(cVfy1s$%aZjsO4v literal 0 HcmV?d00001 diff --git a/test/keys/private_pkcs8.pem b/test/keys/private_pkcs8.pem new file mode 100644 index 0000000..af76cbe --- /dev/null +++ b/test/keys/private_pkcs8.pem @@ -0,0 +1,16 @@ +-----BEGIN PRIVATE KEY----- +MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIJ1j4SkML+89rff +mXvnVIEzx3kt/jPhBlfhtz4OpNj3NVj+uY8ZtOQK54qcgoCm44Yxck5oLA0f3BR+ +023tPR+gTCOXXq4gLybiHBKOM0vlMqoxV7JLK/TigG6J2/vq7nI2IsLgnzmVuZbd +YDJiRMJub9UlkBc0m6oKbsBVaZAxAgMBAAECgYARhHeg9+sT0+vNBNk3KfjO4IUI +YIShsrWHV2ejjZPVDly7dni0Hl+Lv2sX0aw0WjRy8HDI1nQTzxNeLSl2uURbqZ0+ +BAV3cIXGs6Aq30Aak60jXPNU5vVR13LCr+ZYE/IRPAQrOruULacBwxSvSuUWusOZ +RPZ1p8d65acUxn/VgQJBAMK1+2wf3+mtuC5DgXaU5awvP3pqLH+OcjwWEGa6QqZ8 +sxeMJlhi/4OyvxMiX+KuIapxKAaQEcegZ7WeYtRngQcCQQCrhhwHxP0MshhR5pL4 +lFbAs56NTr+th2DEEhoafabQt2n/PuUszuBvQfkCX7s85qOQB2cNyUEOHLGoicc7 +hW8HAkEAnbmM0SmA2GpAqDlGxigXZENhyGf5Y9qf7sxwvMZk9zhMWubMqQyIrsY8 +weM2iQlFfCvtoGNUA8GMQTLsG+M8QQJAU4nitwoDMR7AZ4tEQ5uD0SDqdOpIwsxv +na8vVX2jNH5QOse4OKWde7KHA9f6SoQOX4SrdXRyodvpzysjhOLNGwJAA0jKGgnf +e6CE3NsIiSeQw8q2C8s5QBGdvJr9uR9F7EuJzJjNc826pkNjwllAeWyE3xwJxlxi +MY9hixx3YsoHqg== +-----END PRIVATE KEY----- \ No newline at end of file diff --git a/test/keys/public_pkcs1.der b/test/keys/public_pkcs1.der new file mode 100644 index 0000000000000000000000000000000000000000..58891a8dfa4668043e2d190dc12858c503b162e3 GIT binary patch literal 140 zcmV;70CWE^fr$cvfdGPakA$Q!zr6Oh-}P}*!MM9{<)7C zwB!osikyOgrsIY&a!zP04IkVTe$#F3Js+Sh5wjBEsOGIhDDV-C#0eM8a-w)g_P@G@GglZopM(kTC)S0RRCRi$W0q literal 0 HcmV?d00001 diff --git a/test/keys/public_pkcs1.pem b/test/keys/public_pkcs1.pem new file mode 100644 index 0000000..8b6b542 --- /dev/null +++ b/test/keys/public_pkcs1.pem @@ -0,0 +1,5 @@ +-----BEGIN RSA PUBLIC KEY----- +MIGJAoGBAIJ1j4SkML+89rffmXvnVIEzx3kt/jPhBlfhtz4OpNj3NVj+uY8ZtOQK +54qcgoCm44Yxck5oLA0f3BR+023tPR+gTCOXXq4gLybiHBKOM0vlMqoxV7JLK/Ti +gG6J2/vq7nI2IsLgnzmVuZbdYDJiRMJub9UlkBc0m6oKbsBVaZAxAgMBAAE= +-----END RSA PUBLIC KEY----- \ No newline at end of file diff --git a/test/keys/public_pkcs8.der b/test/keys/public_pkcs8.der new file mode 100644 index 0000000000000000000000000000000000000000..5d2c1c3334816a5b0ef53666b7d1ed23b031f691 GIT binary patch literal 162 zcmV;T0A2qufuAr91_>&LNQU 1 ? " in " + env + " environment" : ""), function () { it("incorrect data for verifying", function () { - var key = new NodeRSA(generatedKeys[0].exportPrivate(), { + var key = new NodeRSA(generatedKeys[0].exportKey(), { signingScheme: scheme + '-sha256', environment: env }); @@ -393,7 +438,7 @@ describe("NodeRSA", function(){ }); it("incorrect key for signing", function () { - var key = new NodeRSA(generatedKeys[0].exportPublic(), { + var key = new NodeRSA(generatedKeys[0].exportKey('pkcs8-public'), { signingScheme: scheme + '-sha256', environment: env }); @@ -403,11 +448,11 @@ describe("NodeRSA", function(){ }); it("incorrect key for verifying", function () { - var key1 = new NodeRSA(generatedKeys[0].exportPrivate(), { + var key1 = new NodeRSA(generatedKeys[0].exportKey(), { signingScheme: scheme + '-sha256', environment: env }); - var key2 = new NodeRSA(generatedKeys[1].exportPublic(), { + var key2 = new NodeRSA(generatedKeys[1].exportKey('pkcs8-public'), { signingScheme: scheme + '-sha256', environment: env }); @@ -424,11 +469,11 @@ describe("NodeRSA", function(){ }); it("different algorithms", function () { - var singKey = new NodeRSA(generatedKeys[0].exportPrivate(), { + var singKey = new NodeRSA(generatedKeys[0].exportKey(), { signingScheme: scheme + '-md5', environment: env }); - var verifyKey = new NodeRSA(generatedKeys[0].exportPrivate(), { + var verifyKey = new NodeRSA(generatedKeys[0].exportKey(), { signingScheme: scheme + '-sha1', environment: env }); @@ -447,11 +492,11 @@ describe("NodeRSA", function(){ for (var alg in signHashAlgorithms['browser']) { (function (alg) { it("signing with custom algorithm (" + alg + ") (equal test)", function () { - var nodeKey = new NodeRSA(generatedKeys[5].exportPrivate(), { + var nodeKey = new NodeRSA(generatedKeys[5].exportKey(), { signingScheme: scheme + '-' + alg, environment: 'node' }); - var browserKey = new NodeRSA(generatedKeys[5].exportPrivate(), { + var browserKey = new NodeRSA(generatedKeys[5].exportKey(), { signingScheme: scheme + '-' + alg, environment: 'browser' }); @@ -460,11 +505,11 @@ describe("NodeRSA", function(){ }); it("sign in node & verify in browser (" + alg + ")", function () { - var nodeKey = new NodeRSA(generatedKeys[5].exportPrivate(), { + var nodeKey = new NodeRSA(generatedKeys[5].exportKey(), { signingScheme: scheme + '-' + alg, environment: 'node' }); - var browserKey = new NodeRSA(generatedKeys[5].exportPrivate(), { + var browserKey = new NodeRSA(generatedKeys[5].exportKey(), { signingScheme: scheme + '-' + alg, environment: 'browser' }); @@ -473,11 +518,11 @@ describe("NodeRSA", function(){ }); it("sign in browser & verify in node (" + alg + ")", function () { - var nodeKey = new NodeRSA(generatedKeys[5].exportPrivate(), { + var nodeKey = new NodeRSA(generatedKeys[5].exportKey(), { signingScheme: scheme + '-' + alg, environment: 'node' }); - var browserKey = new NodeRSA(generatedKeys[5].exportPrivate(), { + var browserKey = new NodeRSA(generatedKeys[5].exportKey(), { signingScheme: scheme + '-' + alg, environment: 'browser' }); From 4cc4e099d9f7b850ad3f17425aae6f87a38e8a34 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sat, 29 Nov 2014 03:22:32 +0500 Subject: [PATCH 004/146] pkcs8 private export/import --- src/formats/pkcs1.js | 31 ++++++++++++++- src/formats/pkcs8.js | 92 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 120 insertions(+), 3 deletions(-) diff --git a/src/formats/pkcs1.js b/src/formats/pkcs1.js index 264e07c..91ffe8d 100644 --- a/src/formats/pkcs1.js +++ b/src/formats/pkcs1.js @@ -86,13 +86,42 @@ module.exports = { bodyWriter.writeInt(key.e); bodyWriter.endSequence(); - if (options.binary) { + if (options.type === 'der') { return bodyWriter.buffer; } else { return '-----BEGIN RSA PUBLIC KEY-----\n' + utils.linebrk(bodyWriter.buffer.toString('base64'), 64) + '\n-----END RSA PUBLIC KEY-----'; } }, + publicImport: function(key, data, options) { + options = options || {}; + var buffer; + + if (options.type !== 'der') { + if (Buffer.isBuffer(data)) { + data = data.toString('utf8'); + } + + if (_.isString(data)) { + var pem = data.replace('-----BEGIN RSA PUBLIC KEY-----', '') + .replace('-----END RSA PUBLIC KEY-----', '') + .replace(/\s+|\n\r|\n|\r$/gm, ''); + buffer = new Buffer(pem, 'base64'); + } + } else if (Buffer.isBuffer(data)) { + buffer = data; + } else { + throw Error('Unsupported key format'); + } + + var body = new ber.Reader(buffer); + body.readSequence(); + key.setPublic( + body.readString(0x02, true), // modulus + body.readString(0x02, true) // publicExponent + ); + }, + /** * Trying autodetect and import key * @param key diff --git a/src/formats/pkcs8.js b/src/formats/pkcs8.js index 5d0c715..0c4fe37 100644 --- a/src/formats/pkcs8.js +++ b/src/formats/pkcs8.js @@ -4,6 +4,95 @@ var PUBLIC_RSA_OID = '1.2.840.113549.1.1.1'; var utils = require('../utils'); module.exports = { + privateExport: function (key, options) { + options = options || {}; + + var n = key.n.toBuffer(); + var d = key.d.toBuffer(); + var p = key.p.toBuffer(); + var q = key.q.toBuffer(); + var dmp1 = key.dmp1.toBuffer(); + var dmq1 = key.dmq1.toBuffer(); + var coeff = key.coeff.toBuffer(); + + var length = n.length + d.length + p.length + q.length + dmp1.length + dmq1.length + coeff.length + 512; // magic + var bodyWriter = new ber.Writer({size: length}); + + bodyWriter.startSequence(); + bodyWriter.writeInt(0); + bodyWriter.writeBuffer(n, 2); + bodyWriter.writeInt(key.e); + bodyWriter.writeBuffer(d, 2); + bodyWriter.writeBuffer(p, 2); + bodyWriter.writeBuffer(q, 2); + bodyWriter.writeBuffer(dmp1, 2); + bodyWriter.writeBuffer(dmq1, 2); + bodyWriter.writeBuffer(coeff, 2); + bodyWriter.endSequence(); + + var writer = new ber.Writer({size: length}); + writer.startSequence(); + writer.writeInt(0); + writer.startSequence(); + writer.writeOID(PUBLIC_RSA_OID); + writer.writeNull(); + writer.endSequence(); + writer.writeBuffer(bodyWriter.buffer, 4); + writer.endSequence(); + + if (options.type === 'der') { + return writer.buffer; + } else { + return '-----BEGIN PRIVATE KEY-----\n' + utils.linebrk(writer.buffer.toString('base64'), 64) + '\n-----END PRIVATE KEY-----'; + } + }, + + privateImport: function (key, data, options) { + options = options || {}; + var buffer; + + if (options.type !== 'der') { + if (Buffer.isBuffer(data)) { + data = data.toString('utf8'); + } + + if (_.isString(data)) { + var pem = data.replace('-----BEGIN PRIVATE KEY-----', '') + .replace('-----END PRIVATE KEY-----', '') + .replace(/\s+|\n\r|\n|\r$/gm, ''); + buffer = new Buffer(pem, 'base64'); + } else { + throw Error('Unsupported key format'); + } + } else if (Buffer.isBuffer(data)) { + buffer = data; + } else { + throw Error('Unsupported key format'); + } + + var reader = new ber.Reader(buffer); + reader.readSequence(); + reader.readInt(0); + var header = new ber.Reader(reader.readString(0x30, true)); + if (header.readOID(0x06, true) !== PUBLIC_RSA_OID) { + throw Error('Invalid Public key format'); + } + + var body = new ber.Reader(reader.readString(0x04, true)); + body.readSequence(); + body.readString(2, true); // just zero + key.setPrivate( + body.readString(2, true), // modulus + body.readString(2, true), // publicExponent + body.readString(2, true), // privateExponent + body.readString(2, true), // prime1 + body.readString(2, true), // prime2 + body.readString(2, true), // exponent1 -- d mod (p1) + body.readString(2, true), // exponent2 -- d mod (q-1) + body.readString(2, true) // coefficient -- (inverse of q) mod p + ); + }, + publicExport: function(key, options) { options = options || {}; @@ -16,7 +105,6 @@ module.exports = { bodyWriter.writeBuffer(n, 2); bodyWriter.writeInt(key.e); bodyWriter.endSequence(); - var body = bodyWriter.buffer; var writer = new ber.Writer({size: length}); writer.startSequence(); @@ -24,7 +112,7 @@ module.exports = { writer.writeOID(PUBLIC_RSA_OID); writer.writeNull(); writer.endSequence(); - writer.writeBuffer(body, 3); + writer.writeBuffer(bodyWriter.buffer, 3); writer.endSequence(); if (options.type === 'der') { From 20373fcc7d9ac80eb9194bf4612e2f75fb21ff8a Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sat, 29 Nov 2014 03:26:20 +0500 Subject: [PATCH 005/146] formats aliases --- src/NodeRSA.js | 4 ++++ test/tests.js | 7 +++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/NodeRSA.js b/src/NodeRSA.js index 7c342ac..e509254 100644 --- a/src/NodeRSA.js +++ b/src/NodeRSA.js @@ -168,6 +168,10 @@ module.exports = (function () { throw Error("Empty key given"); } + if (format) { + format = EXPORT_FORMAT_ALIASES[format] || format; + } + if(!formats.detectAndImport(this.keyPair, keyData, format) && format === undefined) { throw Error("Key format must be specified"); } diff --git a/test/tests.js b/test/tests.js index e5eb8cf..8cc9589 100644 --- a/test/tests.js +++ b/test/tests.js @@ -232,7 +232,10 @@ describe("NodeRSA", function(){ 'pkcs1-public-der': {public: true, der: true, file: 'public_pkcs1.der'}, 'pkcs1-public-pem': {public: true, der: false, file: 'public_pkcs1.pem'}, 'pkcs8-public-der': {public: true, der: true, file: 'public_pkcs8.der'}, - 'pkcs8-public-pem': {public: true, der: false, file: 'public_pkcs8.pem'} + 'pkcs8-public-pem': {public: true, der: false, file: 'public_pkcs8.pem'}, + + 'private': {public: false, der: false, file: 'private_pkcs1.pem'}, + 'public': {public: true, der: false, file: 'public_pkcs8.pem'} }; describe("Good cases", function () { @@ -291,7 +294,7 @@ describe("NodeRSA", function(){ } }); - it("should export to " + format + " format", function () { + it("should export to \"" + format + "\" format", function () { var keyData = fs.readFileSync(keysFolder + options.file); var exported = sampleKey.exportKey(format); From 4d1aae232dd244dd559ece7dfb936d43bb932a13 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sat, 29 Nov 2014 03:28:43 +0500 Subject: [PATCH 006/146] code style fix --- src/NodeRSA.js | 12 +++++++++--- src/formats/formats.js | 6 +++--- src/formats/pkcs1.js | 2 +- src/formats/pkcs8.js | 6 ++++-- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/NodeRSA.js b/src/NodeRSA.js index e509254..27c201a 100644 --- a/src/NodeRSA.js +++ b/src/NodeRSA.js @@ -15,8 +15,6 @@ var utils = require('./utils'); var schemes = require('./schemes/schemes.js'); var formats = require('./formats/formats.js'); -var PUBLIC_RSA_OID = '1.2.840.113549.1.1.1'; - module.exports = (function () { var SUPPORTED_HASH_ALGORITHMS = { node: ['md4', 'md5', 'ripemd160', 'sha', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'], @@ -68,6 +66,7 @@ module.exports = (function () { } else if (_.isObject(key)) { this.generateKeyPair(key.b, key.e); } + this.setOptions(options); } @@ -110,6 +109,7 @@ module.exports = (function () { if (!schemes.isSignature(this.$options.signingScheme)) { throw Error('Unsupported signing scheme'); } + if (this.$options.signingSchemeOptions.hash && _.indexOf(SUPPORTED_HASH_ALGORITHMS[this.$options.environment], this.$options.signingSchemeOptions.hash) == -1) { throw Error('Unsupported hashing algorithm for ' + this.$options.environment + ' environment'); @@ -172,9 +172,10 @@ module.exports = (function () { format = EXPORT_FORMAT_ALIASES[format] || format; } - if(!formats.detectAndImport(this.keyPair, keyData, format) && format === undefined) { + if (!formats.detectAndImport(this.keyPair, keyData, format) && format === undefined) { throw Error("Key format must be specified"); } + this.$cache = {}; }; @@ -189,6 +190,7 @@ module.exports = (function () { if (!this.$cache[format]) { this.$cache[format] = formats.detectAndExport(this.keyPair, format); } + return this.$cache[format]; }; @@ -247,9 +249,11 @@ module.exports = (function () { try { buffer = _.isString(buffer) ? new Buffer(buffer, 'base64') : buffer; var res = this.keyPair.decrypt(buffer); + if (res === null) { throw Error('Key decrypt method returns null.'); } + return this.$getDecryptedData(res, encoding); } catch (e) { throw Error('Error during decryption (probably incorrect key). Original error: ' + e); @@ -268,11 +272,13 @@ module.exports = (function () { if (!this.isPrivate()) { throw Error("It is not private key"); } + var res = this.keyPair.sign(this.$getDataForEncrypt(buffer, source_encoding)); if (encoding && encoding != 'buffer') { res = res.toString(encoding); } + return res; }; diff --git a/src/formats/formats.js b/src/formats/formats.js index f38c648..6ef0bfa 100644 --- a/src/formats/formats.js +++ b/src/formats/formats.js @@ -31,7 +31,7 @@ module.exports = { var keyType = 'private'; var keyOpt = {type: 'default'}; - for(var i = 1; i < fmt.length; i++) { + for (var i = 1; i < fmt.length; i++) { if (fmt[i]) { switch (fmt[i]) { case 'public': @@ -64,13 +64,13 @@ module.exports = { return false; }, - detectAndExport: function(key, format) { + detectAndExport: function (key, format) { if (format) { var fmt = format.split('-'); var keyType = 'private'; var keyOpt = {type: 'default'}; - for(var i = 1; i < fmt.length; i++) { + for (var i = 1; i < fmt.length; i++) { if (fmt[i]) { switch (fmt[i]) { case 'public': diff --git a/src/formats/pkcs1.js b/src/formats/pkcs1.js index 91ffe8d..715e7c0 100644 --- a/src/formats/pkcs1.js +++ b/src/formats/pkcs1.js @@ -93,7 +93,7 @@ module.exports = { } }, - publicImport: function(key, data, options) { + publicImport: function (key, data, options) { options = options || {}; var buffer; diff --git a/src/formats/pkcs8.js b/src/formats/pkcs8.js index 0c4fe37..9647879 100644 --- a/src/formats/pkcs8.js +++ b/src/formats/pkcs8.js @@ -74,6 +74,7 @@ module.exports = { reader.readSequence(); reader.readInt(0); var header = new ber.Reader(reader.readString(0x30, true)); + if (header.readOID(0x06, true) !== PUBLIC_RSA_OID) { throw Error('Invalid Public key format'); } @@ -93,7 +94,7 @@ module.exports = { ); }, - publicExport: function(key, options) { + publicExport: function (key, options) { options = options || {}; var n = key.n.toBuffer(); @@ -122,7 +123,7 @@ module.exports = { } }, - publicImport: function(key, data, options) { + publicImport: function (key, data, options) { options = options || {}; var buffer; @@ -146,6 +147,7 @@ module.exports = { var reader = new ber.Reader(buffer); reader.readSequence(); var header = new ber.Reader(reader.readString(0x30, true)); + if (header.readOID(0x06, true) !== PUBLIC_RSA_OID) { throw Error('Invalid Public key format'); } From 93d1dde91c93017a0e090c5f7b430ba12b0cd20a Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sat, 29 Nov 2014 04:22:07 +0500 Subject: [PATCH 007/146] readme --- README.md | 64 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 50 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index c0bfa20..9af467a 100644 --- a/README.md +++ b/README.md @@ -46,18 +46,19 @@ This library developed and tested primary for Node.js, but it still can work in ```javascript var NodeRSA = require('node-rsa'); -var key = new NodeRSA([key], [options]); +var key = new NodeRSA([keyData], [format], [options]); ``` -**key** - parameters of a generated key or the key in PEM format.
-**options** - additional settings +**keyData** — `{string|buffer|object}` — parameters of a generated key or the key in one of supported formats.
+**format** — `{string}` — format for importing key. See more details about formats in **Export/Import** section
+**options** — `{object}` — additional settings #### Options You can specify some options by second constructor argument, or over `key.setOptions()` method. -* **environment** - working environment, `'browser'` or `'node'`. Default autodetect. -* **encryptionScheme** - padding scheme for encrypt/decrypt. Can be `'pkcs1_oaep'` or `'pkcs1'`. Default `'pkcs1_oaep'`. -* **signingScheme** - scheme used for signing and verifying. Can be `'pkcs1'` or `'pss'` or 'scheme-hash' format string (eg `'pss-sha1'`). Default `'pkcs1-sha256'`, or, if chosen pss: `'pss-sha1'`. +* **environment** — working environment, `'browser'` or `'node'`. Default autodetect. +* **encryptionScheme** — padding scheme for encrypt/decrypt. Can be `'pkcs1_oaep'` or `'pkcs1'`. Default `'pkcs1_oaep'`. +* **signingScheme** — scheme used for signing and verifying. Can be `'pkcs1'` or `'pss'` or 'scheme-hash' format string (eg `'pss-sha1'`). Default `'pkcs1-sha256'`, or, if chosen pss: `'pss-sha1'`. **Advanced options:**
You also can specify advanced options for some schemes like this: @@ -78,7 +79,6 @@ options = { This lib supporting next hash algorithms: `'md5'`, `'ripemd160'`, `'sha1'`, `'sha256'`, `'sha512'` in browser and node environment and additional `'md4'`, `'sha'`, `'sha224'`, `'sha384'` in node only. - #### Creating "empty" key ```javascript var key = new NodeRSA(); @@ -107,16 +107,48 @@ Also you can use next methods: ```javascript key.generateKeyPair([bits], [exp]); -key.importKey(pem_string|buffer_contains_pem); ``` -**bits** - key size in bits. 2048 by default. -**exp** - public exponent. 65537 by default. +**bits** — `{int}` — key size in bits. 2048 by default. +**exp** — `{int}` — public exponent. 65537 by default. -### Export keys +### Import/Export keys ```javascript -key.exportPrivate(); -key.exportPublic(); +key.importKey(keyData, [format]); +key.exportKey([format]); +``` +**keyData** — `{string|buffer}` — key in PEM string **or** Buffer contains PEM string **or** Buffer contains DER encoded data. +**format** — `{string}` — format id for export/import. + +#### Format string syntax +Format string composed of several parts: `scheme-[key_type]-[output_type]` + + * **Scheme** — NodeRSA supports multiple format schemes for import/export keys: + * `'pkcs1'` — public key starts from `'-----BEGIN RSA PUBLIC KEY-----'` header and private key starts from `'-----BEGIN RSA PRIVATE KEY-----' header` + * `'pkcs8'` — public key starts from `'-----BEGIN PUBLIC KEY-----'` header and private key starts from `'-----BEGIN PRIVATE KEY-----' header` + * **Key type** — can be `'private'` or `'public'`. Default `'private'` + * **Output type** — can be: + * `'pem'` — Base64 encoded string with header and footer. Used by default. + * `'der'` — Binary encoded key data. + +Notice: If you provide **keyData** as DER you must specify it in format string. + + +**Shortcuts and examples** + * `'private'` or `'pkcs1'` or `'pkcs1-private'` — `'pkcs1-private-pem'` — private key encoded in pcks1 scheme as pem string. + * `'public'` or `'pkcs8-public'` — `'pkcs8-public-pem'` — public key encoded in pcks8 scheme as pem string. + * `'pkcs8'` or `'pkcs8-private'` — `'pkcs8-private-pem'` — private key encoded in pcks8 scheme as pem string. + * `'pkcs1-der'` — `'pkcs1-private-der'` — private key encoded in pcks1 scheme as binary buffer. + * `'pkcs8-public-der'` — public key encoded in pcks8 scheme as binary buffer. + +**Code example** + ``` +var keyData = '-----BEGIN PUBLIC KEY-----' + .... + '-----BEGIN PRIVATE KEY-----'; +key.importKey(keyData, 'pkcs8'); +var publicDer = key.exportKey('pkcs8-public-der'); +var privateDer = key.exportKey('pkcs1-der'); +``` + ### Properties @@ -125,7 +157,7 @@ key.exportPublic(); key.isPrivate(); key.isPublic([strict]); ``` -**strict** - if true method will return false if key pair have private exponent. Default `false`. +**strict** — `{boolean}` if true method will return false if key pair have private exponent. Default `false`. ```javascript key.isEmpty(); @@ -181,6 +213,10 @@ Questions, comments, bug reports, and pull requests are all welcome. ## Changelog +### 0.2.10 + * **Methods `.exportPrivate()` and `.exportPublic()` was replaced by `.exportKey([format])`. By default `.exportKey()` returns private key as `.exportPrivate()`, if you need public key from `.exportPublic()` you must specify format as `'public'` or `'pkcs8-public-pem'`.** + * Method `.importKey(key, [format])` now has second argument. + ### 0.2.0 * **`.getPublicPEM()` method was renamed to `.exportPublic()`** * **`.getPrivatePEM()` method was renamed to `.exportPrivate()`** From 4231f9334f1a09b539c8c922a0c252a43c654c86 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sat, 29 Nov 2014 18:49:37 +0500 Subject: [PATCH 008/146] readme --- README.md | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 9af467a..95ad0da 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ var key = new NodeRSA([keyData], [format], [options]); ``` **keyData** — `{string|buffer|object}` — parameters of a generated key or the key in one of supported formats.
-**format** — `{string}` — format for importing key. See more details about formats in **Export/Import** section
+**format** — `{string}` — format for importing key. See more details about formats in [Export/Import](#importexport-keys) section
**options** — `{object}` — additional settings #### Options @@ -121,23 +121,21 @@ key.exportKey([format]); #### Format string syntax Format string composed of several parts: `scheme-[key_type]-[output_type]` +**Scheme** — NodeRSA supports multiple format schemes for import/export keys: + * `'pkcs1'` — public key starts from `'-----BEGIN RSA PUBLIC KEY-----'` header and private key starts from `'-----BEGIN RSA PRIVATE KEY-----' header` + * `'pkcs8'` — public key starts from `'-----BEGIN PUBLIC KEY-----'` header and private key starts from `'-----BEGIN PRIVATE KEY-----' header` +**Key type** — can be `'private'` or `'public'`. Default `'private'` +**Output type** — can be: + * `'pem'` — Base64 encoded string with header and footer. Used by default. + * `'der'` — Binary encoded key data. - * **Scheme** — NodeRSA supports multiple format schemes for import/export keys: - * `'pkcs1'` — public key starts from `'-----BEGIN RSA PUBLIC KEY-----'` header and private key starts from `'-----BEGIN RSA PRIVATE KEY-----' header` - * `'pkcs8'` — public key starts from `'-----BEGIN PUBLIC KEY-----'` header and private key starts from `'-----BEGIN PRIVATE KEY-----' header` - * **Key type** — can be `'private'` or `'public'`. Default `'private'` - * **Output type** — can be: - * `'pem'` — Base64 encoded string with header and footer. Used by default. - * `'der'` — Binary encoded key data. - -Notice: If you provide **keyData** as DER you must specify it in format string. - +**Notice:** For import, if *keyData* is pem string or buffer containing string, you can do not specify format, but if you provide *keyData* as DER you must specify it in format string. **Shortcuts and examples** - * `'private'` or `'pkcs1'` or `'pkcs1-private'` — `'pkcs1-private-pem'` — private key encoded in pcks1 scheme as pem string. - * `'public'` or `'pkcs8-public'` — `'pkcs8-public-pem'` — public key encoded in pcks8 scheme as pem string. - * `'pkcs8'` or `'pkcs8-private'` — `'pkcs8-private-pem'` — private key encoded in pcks8 scheme as pem string. - * `'pkcs1-der'` — `'pkcs1-private-der'` — private key encoded in pcks1 scheme as binary buffer. + * `'private'` or `'pkcs1'` or `'pkcs1-private'` == `'pkcs1-private-pem'` — private key encoded in pcks1 scheme as pem string. + * `'public'` or `'pkcs8-public'` == `'pkcs8-public-pem'` — public key encoded in pcks8 scheme as pem string. + * `'pkcs8'` or `'pkcs8-private'` == `'pkcs8-private-pem'` — private key encoded in pcks8 scheme as pem string. + * `'pkcs1-der'` == `'pkcs1-private-der'` — private key encoded in pcks1 scheme as binary buffer. * `'pkcs8-public-der'` — public key encoded in pcks8 scheme as binary buffer. **Code example** From e7abb552becceb8f9b1f8ba068e45684ec83bf37 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sat, 29 Nov 2014 18:56:48 +0500 Subject: [PATCH 009/146] readme --- README.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 95ad0da..90d5015 100644 --- a/README.md +++ b/README.md @@ -46,15 +46,15 @@ This library developed and tested primary for Node.js, but it still can work in ```javascript var NodeRSA = require('node-rsa'); -var key = new NodeRSA([keyData], [format], [options]); +var key = new NodeRSA([keyData, [format]], [options]); ``` -**keyData** — `{string|buffer|object}` — parameters of a generated key or the key in one of supported formats.
-**format** — `{string}` — format for importing key. See more details about formats in [Export/Import](#importexport-keys) section
-**options** — `{object}` — additional settings +* **keyData** — `{string|buffer|object}` — parameters for generating key or the key in one of supported formats.
+* **format** — `{string}` — format for importing key. See more details about formats in [Export/Import](#importexport-keys) section.
+* **options** — `{object}` — additional settings. #### Options -You can specify some options by second constructor argument, or over `key.setOptions()` method. +You can specify some options by second/third constructor argument, or over `key.setOptions()` method. * **environment** — working environment, `'browser'` or `'node'`. Default autodetect. * **encryptionScheme** — padding scheme for encrypt/decrypt. Can be `'pkcs1_oaep'` or `'pkcs1'`. Default `'pkcs1_oaep'`. @@ -89,6 +89,14 @@ var key = new NodeRSA(); var key = new NodeRSA({b: 512}); ``` +Also you can use next method: + +```javascript +key.generateKeyPair([bits], [exp]); +``` +**bits** — `{int}` — key size in bits. 2048 by default. +**exp** — `{int}` — public exponent. 65537 by default. + #### Load key from PEM string ```javascript @@ -103,14 +111,6 @@ var key = new NodeRSA('-----BEGIN RSA PRIVATE KEY-----\n'+ '-----END RSA PRIVATE KEY-----'); ``` -Also you can use next methods: - -```javascript -key.generateKeyPair([bits], [exp]); -``` -**bits** — `{int}` — key size in bits. 2048 by default. -**exp** — `{int}` — public exponent. 65537 by default. - ### Import/Export keys ```javascript key.importKey(keyData, [format]); From c90e841e1a63c299cbc019fa7180a9b10c56c667 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sat, 29 Nov 2014 19:02:15 +0500 Subject: [PATCH 010/146] readme --- README.md | 11 +++++------ src/NodeRSA.js | 4 +++- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 90d5015..558c781 100644 --- a/README.md +++ b/README.md @@ -94,8 +94,8 @@ Also you can use next method: ```javascript key.generateKeyPair([bits], [exp]); ``` -**bits** — `{int}` — key size in bits. 2048 by default. -**exp** — `{int}` — public exponent. 65537 by default. +* **bits** — `{int}` — key size in bits. 2048 by default. +* **exp** — `{int}` — public exponent. 65537 by default. #### Load key from PEM string @@ -116,8 +116,8 @@ var key = new NodeRSA('-----BEGIN RSA PRIVATE KEY-----\n'+ key.importKey(keyData, [format]); key.exportKey([format]); ``` -**keyData** — `{string|buffer}` — key in PEM string **or** Buffer contains PEM string **or** Buffer contains DER encoded data. -**format** — `{string}` — format id for export/import. +* **keyData** — `{string|buffer}` — key in PEM string **or** Buffer contains PEM string **or** Buffer contains DER encoded data. +* **format** — `{string}` — format id for export/import. #### Format string syntax Format string composed of several parts: `scheme-[key_type]-[output_type]` @@ -129,7 +129,7 @@ Format string composed of several parts: `scheme-[key_type]-[output_type]` * `'pem'` — Base64 encoded string with header and footer. Used by default. * `'der'` — Binary encoded key data. -**Notice:** For import, if *keyData* is pem string or buffer containing string, you can do not specify format, but if you provide *keyData* as DER you must specify it in format string. +**Notice:** For import, if *keyData* is PEM string or buffer containing string, you can do not specify format, but if you provide *keyData* as DER you must specify it in format string. **Shortcuts and examples** * `'private'` or `'pkcs1'` or `'pkcs1-private'` == `'pkcs1-private-pem'` — private key encoded in pcks1 scheme as pem string. @@ -147,7 +147,6 @@ var publicDer = key.exportKey('pkcs8-public-der'); var privateDer = key.exportKey('pkcs1-der'); ``` - ### Properties #### Key testing diff --git a/src/NodeRSA.js b/src/NodeRSA.js index 27c201a..572d11d 100644 --- a/src/NodeRSA.js +++ b/src/NodeRSA.js @@ -27,7 +27,9 @@ module.exports = (function () { var DEFAULT_EXPORT_FORMAT = 'private'; var EXPORT_FORMAT_ALIASES = { 'private': 'pkcs1-private-pem', - 'public': 'pkcs8-public-pem' + 'private-der': 'pkcs1-private-der', + 'public': 'pkcs8-public-pem', + 'public-der': 'pkcs8-public-der' }; /** From ec52a27b31c638e68e89bda0b177a0cb25c1caa9 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sat, 29 Nov 2014 19:03:37 +0500 Subject: [PATCH 011/146] readme --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 558c781..cad3380 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,7 @@ Also you can use next method: ```javascript key.generateKeyPair([bits], [exp]); ``` + * **bits** — `{int}` — key size in bits. 2048 by default. * **exp** — `{int}` — public exponent. 65537 by default. @@ -116,16 +117,20 @@ var key = new NodeRSA('-----BEGIN RSA PRIVATE KEY-----\n'+ key.importKey(keyData, [format]); key.exportKey([format]); ``` + * **keyData** — `{string|buffer}` — key in PEM string **or** Buffer contains PEM string **or** Buffer contains DER encoded data. * **format** — `{string}` — format id for export/import. #### Format string syntax Format string composed of several parts: `scheme-[key_type]-[output_type]` **Scheme** — NodeRSA supports multiple format schemes for import/export keys: + * `'pkcs1'` — public key starts from `'-----BEGIN RSA PUBLIC KEY-----'` header and private key starts from `'-----BEGIN RSA PRIVATE KEY-----' header` * `'pkcs8'` — public key starts from `'-----BEGIN PUBLIC KEY-----'` header and private key starts from `'-----BEGIN PRIVATE KEY-----' header` + **Key type** — can be `'private'` or `'public'`. Default `'private'` **Output type** — can be: + * `'pem'` — Base64 encoded string with header and footer. Used by default. * `'der'` — Binary encoded key data. From 65a73af580ee32c5400552adb2b1c5f2a73f2889 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sat, 29 Nov 2014 19:03:47 +0500 Subject: [PATCH 012/146] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cad3380..d3f36d8 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,7 @@ Format string composed of several parts: `scheme-[key_type]-[output_type]` * `'pkcs1'` — public key starts from `'-----BEGIN RSA PUBLIC KEY-----'` header and private key starts from `'-----BEGIN RSA PRIVATE KEY-----' header` * `'pkcs8'` — public key starts from `'-----BEGIN PUBLIC KEY-----'` header and private key starts from `'-----BEGIN PRIVATE KEY-----' header` -**Key type** — can be `'private'` or `'public'`. Default `'private'` +**Key type** — can be `'private'` or `'public'`. Default `'private'`
**Output type** — can be: * `'pem'` — Base64 encoded string with header and footer. Used by default. From 4474665682c47082e253f18bda83e4ed8675d386 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sat, 29 Nov 2014 19:04:07 +0500 Subject: [PATCH 013/146] readme --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d3f36d8..c188be4 100644 --- a/README.md +++ b/README.md @@ -122,7 +122,8 @@ key.exportKey([format]); * **format** — `{string}` — format id for export/import. #### Format string syntax -Format string composed of several parts: `scheme-[key_type]-[output_type]` +Format string composed of several parts: `scheme-[key_type]-[output_type]`
+ **Scheme** — NodeRSA supports multiple format schemes for import/export keys: * `'pkcs1'` — public key starts from `'-----BEGIN RSA PUBLIC KEY-----'` header and private key starts from `'-----BEGIN RSA PRIVATE KEY-----' header` From 507be4ab712052f6bcfa596e6bd3131701ca1500 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sat, 29 Nov 2014 19:12:39 +0500 Subject: [PATCH 014/146] Update README.md --- README.md | 52 ++++++++++++++++++++++++++++------------------------ 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index c188be4..7ff5e35 100644 --- a/README.md +++ b/README.md @@ -49,16 +49,16 @@ var NodeRSA = require('node-rsa'); var key = new NodeRSA([keyData, [format]], [options]); ``` -* **keyData** — `{string|buffer|object}` — parameters for generating key or the key in one of supported formats.
-* **format** — `{string}` — format for importing key. See more details about formats in [Export/Import](#importexport-keys) section.
-* **options** — `{object}` — additional settings. +* keyData — `{string|buffer|object}` — parameters for generating key or the key in one of supported formats.
+* format — `{string}` — format for importing key. See more details about formats in [Export/Import](#importexport-keys) section.
+* options — `{object}` — additional settings. #### Options You can specify some options by second/third constructor argument, or over `key.setOptions()` method. -* **environment** — working environment, `'browser'` or `'node'`. Default autodetect. -* **encryptionScheme** — padding scheme for encrypt/decrypt. Can be `'pkcs1_oaep'` or `'pkcs1'`. Default `'pkcs1_oaep'`. -* **signingScheme** — scheme used for signing and verifying. Can be `'pkcs1'` or `'pss'` or 'scheme-hash' format string (eg `'pss-sha1'`). Default `'pkcs1-sha256'`, or, if chosen pss: `'pss-sha1'`. +* environment — working environment, `'browser'` or `'node'`. Default autodetect. +* encryptionScheme — padding scheme for encrypt/decrypt. Can be `'pkcs1_oaep'` or `'pkcs1'`. Default `'pkcs1_oaep'`. +* signingScheme — scheme used for signing and verifying. Can be `'pkcs1'` or `'pss'` or 'scheme-hash' format string (eg `'pss-sha1'`). Default `'pkcs1-sha256'`, or, if chosen pss: `'pss-sha1'`. **Advanced options:**
You also can specify advanced options for some schemes like this: @@ -95,8 +95,8 @@ Also you can use next method: key.generateKeyPair([bits], [exp]); ``` -* **bits** — `{int}` — key size in bits. 2048 by default. -* **exp** — `{int}` — public exponent. 65537 by default. +* bits — `{int}` — key size in bits. 2048 by default. +* exp — `{int}` — public exponent. 65537 by default. #### Load key from PEM string @@ -118,19 +118,19 @@ key.importKey(keyData, [format]); key.exportKey([format]); ``` -* **keyData** — `{string|buffer}` — key in PEM string **or** Buffer contains PEM string **or** Buffer contains DER encoded data. -* **format** — `{string}` — format id for export/import. +* keyData — `{string|buffer}` — key in PEM string **or** Buffer contains PEM string **or** Buffer contains DER encoded data. +* format — `{string}` — format id for export/import. #### Format string syntax Format string composed of several parts: `scheme-[key_type]-[output_type]`
-**Scheme** — NodeRSA supports multiple format schemes for import/export keys: +Scheme — NodeRSA supports multiple format schemes for import/export keys: * `'pkcs1'` — public key starts from `'-----BEGIN RSA PUBLIC KEY-----'` header and private key starts from `'-----BEGIN RSA PRIVATE KEY-----' header` * `'pkcs8'` — public key starts from `'-----BEGIN PUBLIC KEY-----'` header and private key starts from `'-----BEGIN PRIVATE KEY-----' header` -**Key type** — can be `'private'` or `'public'`. Default `'private'`
-**Output type** — can be: +Key type — can be `'private'` or `'public'`. Default `'private'`
+Output type — can be: * `'pem'` — Base64 encoded string with header and footer. Used by default. * `'der'` — Binary encoded key data. @@ -160,7 +160,7 @@ var privateDer = key.exportKey('pkcs1-der'); key.isPrivate(); key.isPublic([strict]); ``` -**strict** — `{boolean}` if true method will return false if key pair have private exponent. Default `false`. +strict — `{boolean}` — if true method will return false if key pair have private exponent. Default `false`. ```javascript key.isEmpty(); @@ -184,16 +184,18 @@ Return max data size for encrypt in bytes. key.encrypt(buffer, [encoding], [source_encoding]); ``` Return encrypted data.
-**buffer** - data for encrypting, may be string, Buffer, or any object/array. Arrays and objects will encoded to JSON string first.
-**encoding** - encoding for output result, may be `'buffer'`, `'binary'`, `'hex'` or `'base64'`. Default `'buffer'`.
-**source_encoding** - source encoding, works only with string buffer. Can take standard Node.js Buffer encodings (hex, utf8, base64, etc). `'utf8'` by default.
+ +* buffer — `{buffer}` — data for encrypting, may be string, Buffer, or any object/array. Arrays and objects will encoded to JSON string first.
+* encoding — `{string}` — encoding for output result, may be `'buffer'`, `'binary'`, `'hex'` or `'base64'`. Default `'buffer'`.
+* source_encoding — `{string}` — source encoding, works only with string buffer. Can take standard Node.js Buffer encodings (hex, utf8, base64, etc). `'utf8'` by default.
```javascript key.decrypt(buffer, [encoding]); ``` Return decrypted data.
-**buffer** - data for decrypting. Takes Buffer object or base64 encoded string.
-**encoding** - encoding for result string. Can also take `'buffer'` for raw Buffer object, or `'json'` for automatic JSON.parse result. Default `'buffer'`. + +* buffer — `{buffer}` — data for decrypting. Takes Buffer object or base64 encoded string.
+* encoding — `{string}` — encoding for result string. Can also take `'buffer'` for raw Buffer object, or `'json'` for automatic JSON.parse result. Default `'buffer'`. ### Signing/Verifying ```javascript @@ -205,10 +207,11 @@ Return signature for buffer. All the arguments are the same as for `encrypt` met key.verify(buffer, signature, [source_encoding], [signature_encoding]) ``` Return result of check, `true` or `false`.
-**buffer** - data for check, same as `encrypt` method.
-**signature** - signature for check, result of `sign` method.
-**source_encoding** - same as for `encrypt` method.
-**signature_encoding** - encoding of given signature. May be `'buffer'`, `'binary'`, `'hex'` or `'base64'`. Default `'buffer'`. + +* buffer — `{buffer}` — data for check, same as `encrypt` method.
+* signature — `{string}` — signature for check, result of `sign` method.
+* source_encoding — `{string}` — same as for `encrypt` method.
+* signature_encoding — `{string}` — encoding of given signature. May be `'buffer'`, `'binary'`, `'hex'` or `'base64'`. Default `'buffer'`. ## Contributing @@ -217,7 +220,8 @@ Questions, comments, bug reports, and pull requests are all welcome. ## Changelog ### 0.2.10 - * **Methods `.exportPrivate()` and `.exportPublic()` was replaced by `.exportKey([format])`. By default `.exportKey()` returns private key as `.exportPrivate()`, if you need public key from `.exportPublic()` you must specify format as `'public'` or `'pkcs8-public-pem'`.** + * **Methods `.exportPrivate()` and `.exportPublic()` was replaced by `.exportKey([format])`.** + * By default `.exportKey()` returns private key as `.exportPrivate()`, if you need public key from `.exportPublic()` you must specify format as `'public'` or `'pkcs8-public-pem'`. * Method `.importKey(key, [format])` now has second argument. ### 0.2.0 From 9e52aadd93fd13f796c3b02664b0877eeca841f4 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sat, 29 Nov 2014 19:17:41 +0500 Subject: [PATCH 015/146] readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7ff5e35..984c6d7 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ You can specify some options by second/third constructor argument, or over `key. **Advanced options:**
You also can specify advanced options for some schemes like this: -``` +```javascript options = { encryptionScheme: { scheme: 'pkcs1_oaep', //scheme @@ -146,7 +146,7 @@ Output type — can be: **Code example** -``` +```javascript var keyData = '-----BEGIN PUBLIC KEY-----' + .... + '-----BEGIN PRIVATE KEY-----'; key.importKey(keyData, 'pkcs8'); var publicDer = key.exportKey('pkcs8-public-der'); From b5b798614863718304d9e3f65233e5c480ac92fd Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sat, 29 Nov 2014 19:18:00 +0500 Subject: [PATCH 016/146] version bump --- package.json | 2 +- test/private_pkcs1.pem | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 test/private_pkcs1.pem diff --git a/package.json b/package.json index d3be58c..608ea37 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "0.2.0", + "version": "0.2.10", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { diff --git a/test/private_pkcs1.pem b/test/private_pkcs1.pem new file mode 100644 index 0000000..2ea486c --- /dev/null +++ b/test/private_pkcs1.pem @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXAIBAAKBgQCCdY+EpDC/vPa335l751SBM8d5Lf4z4QZX4bc+DqTY9zVY/rmP +GbTkCueKnIKApuOGMXJOaCwNH9wUftNt7T0foEwjl16uIC8m4hwSjjNL5TKqMVey +Syv04oBuidv76u5yNiLC4J85lbmW3WAyYkTCbm/VJZAXNJuqCm7AVWmQMQIDAQAB +AoGAEYR3oPfrE9PrzQTZNyn4zuCFCGCEobK1h1dno42T1Q5cu3Z4tB5fi79rF9Gs +NFo0cvBwyNZ0E88TXi0pdrlEW6mdPgQFd3CFxrOgKt9AGpOtI1zzVOb1Uddywq/m +WBPyETwEKzq7lC2nAcMUr0rlFrrDmUT2dafHeuWnFMZ/1YECQQDCtftsH9/prbgu +Q4F2lOWsLz96aix/jnI8FhBmukKmfLMXjCZYYv+Dsr8TIl/iriGqcSgGkBHHoGe1 +nmLUZ4EHAkEAq4YcB8T9DLIYUeaS+JRWwLOejU6/rYdgxBIaGn2m0Ldp/z7lLM7g +b0H5Al+7POajkAdnDclBDhyxqInHO4VvBwJBAJ25jNEpgNhqQKg5RsYoF2RDYchn ++WPan+7McLzGZPc4TFrmzKkMiK7GPMHjNokJRXwr7aBjVAPBjEEy7BvjPEECQFOJ +4rcKAzEewGeLREObg9Eg6nTqSMLMb52vL1V9ozR+UDrHuDilnXuyhwPX+kqEDl+E +q3V0cqHb6c8rI4TizRsCQANIyhoJ33ughNzbCIknkMPKtgvLOUARnbya/bkfRexL +icyYzXPNuqZDY8JZQHlshN8cCcZcYjGPYYscd2LKB6o= +-----END RSA PRIVATE KEY----- \ No newline at end of file From 9c7d62cb74ee05d79a85577523917f8b854fc4fd Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sat, 29 Nov 2014 20:04:07 +0500 Subject: [PATCH 017/146] formats refact --- src/formats/formats.js | 95 ++++++++++++++++++------------------------ test/tests.js | 13 +++++- 2 files changed, 52 insertions(+), 56 deletions(-) diff --git a/src/formats/formats.js b/src/formats/formats.js index 6ef0bfa..e975b2a 100644 --- a/src/formats/formats.js +++ b/src/formats/formats.js @@ -1,4 +1,32 @@ var _ = require('lodash'); + +function formatParse(format) { + format = format.split('-'); + var keyType = 'private'; + var keyOpt = {type: 'default'}; + + for (var i = 1; i < format.length; i++) { + if (format[i]) { + switch (format[i]) { + case 'public': + keyType = format[i]; + break; + case 'private': + keyType = format[i]; + break; + case 'pem': + keyOpt.type = format[i]; + break; + case 'der': + keyOpt.type = format[i]; + break; + } + } + } + + return {scheme: format[0], keyType: keyType, keyOpt: keyOpt}; +} + module.exports = { pkcs1: require('./pkcs1'), pkcs8: require('./pkcs8'), @@ -21,40 +49,18 @@ module.exports = { detectAndImport: function (key, data, format) { if (format === undefined) { - for (var format in module.exports) { - if (typeof module.exports[format].autoImport === 'function' && module.exports[format].autoImport(key, data)) { + for (var scheme in module.exports) { + if (typeof module.exports[scheme].autoImport === 'function' && module.exports[scheme].autoImport(key, data)) { return true; } } } else if (format) { - var fmt = format.split('-'); - var keyType = 'private'; - var keyOpt = {type: 'default'}; - - for (var i = 1; i < fmt.length; i++) { - if (fmt[i]) { - switch (fmt[i]) { - case 'public': - keyType = fmt[i]; - break; - case 'private': - keyType = fmt[i]; - break; - case 'pem': - keyOpt.type = fmt[i]; - break; - case 'der': - keyOpt.type = fmt[i]; - break; - } - } - } - - if (module.exports[fmt[0]]) { - if (keyType === 'private') { - module.exports[fmt[0]].privateImport(key, data, keyOpt); + var fmt = formatParse(format); + if (module.exports[fmt.scheme]) { + if (fmt.keyType === 'private') { + module.exports[fmt.scheme].privateImport(key, data, fmt.keyOpt); } else { - module.exports[fmt[0]].publicImport(key, data, keyOpt); + module.exports[fmt.scheme].publicImport(key, data, fmt.keyOpt); } } else { throw Error('Unsupported key format'); @@ -66,40 +72,19 @@ module.exports = { detectAndExport: function (key, format) { if (format) { - var fmt = format.split('-'); - var keyType = 'private'; - var keyOpt = {type: 'default'}; - - for (var i = 1; i < fmt.length; i++) { - if (fmt[i]) { - switch (fmt[i]) { - case 'public': - keyType = fmt[i]; - break; - case 'private': - keyType = fmt[i]; - break; - case 'pem': - keyOpt.type = fmt[i]; - break; - case 'der': - keyOpt.type = fmt[i]; - break; - } - } - } + var fmt = formatParse(format); - if (module.exports[fmt[0]]) { - if (keyType === 'private') { + if (module.exports[fmt.scheme]) { + if (fmt.keyType === 'private') { if (!key.isPrivate()) { throw Error("It is not private key"); } - return module.exports[fmt[0]].privateExport(key, keyOpt); + return module.exports[fmt.scheme].privateExport(key, fmt.keyOpt); } else { if (!key.isPublic()) { throw Error("It is not public key"); } - return module.exports[fmt[0]].publicExport(key, keyOpt); + return module.exports[fmt.scheme].publicExport(key, fmt.keyOpt); } } else { throw Error('Unsupported key format'); diff --git a/test/tests.js b/test/tests.js index 8cc9589..f6aea3a 100644 --- a/test/tests.js +++ b/test/tests.js @@ -235,7 +235,18 @@ describe("NodeRSA", function(){ 'pkcs8-public-pem': {public: true, der: false, file: 'public_pkcs8.pem'}, 'private': {public: false, der: false, file: 'private_pkcs1.pem'}, - 'public': {public: true, der: false, file: 'public_pkcs8.pem'} + 'public': {public: true, der: false, file: 'public_pkcs8.pem'}, + 'private-der': {public: false, der: true, file: 'private_pkcs1.der'}, + 'public-der': {public: true, der: true, file: 'public_pkcs8.der'}, + + 'pkcs1': {public: false, der: false, file: 'private_pkcs1.pem'}, + 'pkcs1-private': {public: false, der: false, file: 'private_pkcs1.pem'}, + 'pkcs1-der': {public: false, der: true, file: 'private_pkcs1.der'}, + 'pkcs8': {public: false, der: false, file: 'private_pkcs8.pem'}, + 'pkcs8-private': {public: false, der: false, file: 'private_pkcs8.pem'}, + 'pkcs8-der': {public: false, der: true, file: 'private_pkcs8.der'}, + 'pkcs1-public': {public: true, der: false, file: 'public_pkcs1.pem'}, + 'pkcs8-public': {public: true, der: false, file: 'public_pkcs8.pem'} }; describe("Good cases", function () { From c2800e3fe6b08fbfa06b33853f756aaec944df6f Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sat, 29 Nov 2014 20:25:33 +0500 Subject: [PATCH 018/146] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 984c6d7..a40b62a 100644 --- a/README.md +++ b/README.md @@ -147,7 +147,7 @@ Output type — can be: **Code example** ```javascript -var keyData = '-----BEGIN PUBLIC KEY-----' + .... + '-----BEGIN PRIVATE KEY-----'; +var keyData = '-----BEGIN PUBLIC KEY----- ... -----BEGIN PRIVATE KEY-----'; key.importKey(keyData, 'pkcs8'); var publicDer = key.exportKey('pkcs8-public-der'); var privateDer = key.exportKey('pkcs1-der'); From 54147ab9adcd159b482fc5e6847ae50e8f8d9190 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sun, 30 Nov 2014 00:09:04 +0500 Subject: [PATCH 019/146] fix constructor --- package.json | 2 +- src/NodeRSA.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 608ea37..4dbd9c8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "0.2.10", + "version": "0.2.11", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { diff --git a/src/NodeRSA.js b/src/NodeRSA.js index 572d11d..8cad54d 100644 --- a/src/NodeRSA.js +++ b/src/NodeRSA.js @@ -37,7 +37,7 @@ module.exports = (function () { * @constructor */ function NodeRSA(key, format, options) { - if (!this instanceof NodeRSA) { + if (!(this instanceof NodeRSA)) { return new NodeRSA(key, options); } From 65b1a4a8892014cecb56d0eaa1c5171acc4ea693 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sun, 30 Nov 2014 00:44:20 +0500 Subject: [PATCH 020/146] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a40b62a..beb75c2 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,7 @@ key.importKey(keyData, [format]); key.exportKey([format]); ``` -* keyData — `{string|buffer}` — key in PEM string **or** Buffer contains PEM string **or** Buffer contains DER encoded data. +* keyData — `{string|buffer}` — key in PEM string **or** Buffer containing PEM string **or** Buffer contains DER encoded data. * format — `{string}` — format id for export/import. #### Format string syntax @@ -258,7 +258,7 @@ Questions, comments, bug reports, and pull requests are all welcome. * Added long message support -## License for NodeRSA.js +## License Copyright (c) 2014 rzcoder
All Rights Reserved. From ba1dd78eb7f064a381f16d7f170df4b2e3e7d3c8 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sun, 30 Nov 2014 03:23:10 +0500 Subject: [PATCH 021/146] code style --- src/formats/formats.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/formats/formats.js b/src/formats/formats.js index e975b2a..6e59dfb 100644 --- a/src/formats/formats.js +++ b/src/formats/formats.js @@ -56,6 +56,7 @@ module.exports = { } } else if (format) { var fmt = formatParse(format); + if (module.exports[fmt.scheme]) { if (fmt.keyType === 'private') { module.exports[fmt.scheme].privateImport(key, data, fmt.keyOpt); From 1572217557bb553a9877daf2c62d2a7c60e45b2d Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sun, 30 Nov 2014 18:04:35 +0500 Subject: [PATCH 022/146] constructor fix 2 --- src/NodeRSA.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NodeRSA.js b/src/NodeRSA.js index 8cad54d..b8fd620 100644 --- a/src/NodeRSA.js +++ b/src/NodeRSA.js @@ -38,7 +38,7 @@ module.exports = (function () { */ function NodeRSA(key, format, options) { if (!(this instanceof NodeRSA)) { - return new NodeRSA(key, options); + return new NodeRSA(key, format, options); } if (_.isObject(format)) { From add0a81a2ca714b635f5d2aaac807420e247d6ba Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sun, 30 Nov 2014 18:04:53 +0500 Subject: [PATCH 023/146] version bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4dbd9c8..5e9babb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "0.2.11", + "version": "0.2.12", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { From d028184097010bf74bc149ae57afe222e93e94de Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sun, 30 Nov 2014 18:42:10 +0500 Subject: [PATCH 024/146] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index beb75c2..82fea7a 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,7 @@ key.importKey(keyData, [format]); key.exportKey([format]); ``` -* keyData — `{string|buffer}` — key in PEM string **or** Buffer containing PEM string **or** Buffer contains DER encoded data. +* keyData — `{string|buffer}` — key in PEM string **or** Buffer containing PEM string **or** Buffer containing DER encoded data. * format — `{string}` — format id for export/import. #### Format string syntax From 31593c06b521841fb239e6c94b98ebc38af5983b Mon Sep 17 00:00:00 2001 From: rzcoder Date: Wed, 10 Dec 2014 14:47:51 +0500 Subject: [PATCH 025/146] fix "for in" --- package.json | 2 +- src/libs/rsa.js | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 5e9babb..a0f03c9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "0.2.12", + "version": "0.2.13", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { diff --git a/src/libs/rsa.js b/src/libs/rsa.js index fe1dccd..f3a0197 100644 --- a/src/libs/rsa.js +++ b/src/libs/rsa.js @@ -221,7 +221,7 @@ module.exports.Key = (function() { } } - for(var i in buffers) { + for(var i = 0; i < buffers.length; i++) { var buf = buffers[i]; var m = new BigInteger(this.encryptionScheme.encPad(buf)); @@ -232,11 +232,6 @@ module.exports.Key = (function() { } var encryptedBuffer = c.toBuffer(this.encryptedDataLength); - /*var encryptedBuffer = c.toBuffer(true); - while (encryptedBuffer.length < this.encryptedDataLength) { - encryptedBuffer = Buffer.concat([new Buffer([0]), encryptedBuffer]); - }*/ - results.push(encryptedBuffer); } From efb6a901f02a87177aa381bd54a943259cdbb568 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Mon, 5 Jan 2015 15:12:55 +0500 Subject: [PATCH 026/146] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 82fea7a..4e402a0 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ console.log('decrypted: ', decrypted); ```shell npm install node-rsa ``` +*Requires nodejs >= 0.10.x* ### Testing From c3228f1acd1a0a8d3f843580103781cfe3e75ecb Mon Sep 17 00:00:00 2001 From: rzcoder Date: Mon, 23 Feb 2015 03:10:48 +0500 Subject: [PATCH 027/146] adding nodejs 0.12.x and io.js support --- README.md | 2 +- src/NodeRSA.js | 2 ++ src/utils.js | 8 ++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4e402a0..37011c9 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ var key = new NodeRSA([keyData, [format]], [options]); #### Options You can specify some options by second/third constructor argument, or over `key.setOptions()` method. -* environment — working environment, `'browser'` or `'node'`. Default autodetect. +* environment — working environment, `'browser'`, `'node'` for `nodejs 0.10.x`, `'node12'` for `nodejs 0.12.x` or `'io'` for `io.js 1.x`. `nodejs12` and `io` provide native encryption/decryption methods Default autodetect. * encryptionScheme — padding scheme for encrypt/decrypt. Can be `'pkcs1_oaep'` or `'pkcs1'`. Default `'pkcs1_oaep'`. * signingScheme — scheme used for signing and verifying. Can be `'pkcs1'` or `'pss'` or 'scheme-hash' format string (eg `'pss-sha1'`). Default `'pkcs1-sha256'`, or, if chosen pss: `'pss-sha1'`. diff --git a/src/NodeRSA.js b/src/NodeRSA.js index b8fd620..6048598 100644 --- a/src/NodeRSA.js +++ b/src/NodeRSA.js @@ -18,6 +18,8 @@ var formats = require('./formats/formats.js'); module.exports = (function () { var SUPPORTED_HASH_ALGORITHMS = { node: ['md4', 'md5', 'ripemd160', 'sha', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'], + node12: ['md4', 'md5', 'ripemd160', 'sha', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'], + io: ['md4', 'md5', 'ripemd160', 'sha', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'], browser: ['md5', 'ripemd160', 'sha1', 'sha256', 'sha512'] }; diff --git a/src/utils.js b/src/utils.js index 6e9edda..20b3ec5 100644 --- a/src/utils.js +++ b/src/utils.js @@ -3,6 +3,8 @@ * */ +var crypt = require('crypto'); + /** * Break string str each maxLen symbols * @param str @@ -21,6 +23,12 @@ module.exports.linebrk = function (str, maxLen) { module.exports.detectEnvironment = function () { if (process && process.title != 'browser') { + if (typeof crypt.publicEncrypt === 'function' && typeof crypt.privateDecrypt === 'function') { + if (typeof crypt.publicDecrypt === 'function' && typeof crypt.privateEncrypt === 'function') { + return 'io'; + } + return 'node12'; + } return 'node'; } else if (window) { return 'browser'; From 3c1b3c44cbb7b34658aea6225ea9164dae65a200 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Mon, 23 Feb 2015 03:15:03 +0500 Subject: [PATCH 028/146] adding nodejs 0.12.x and io.js support --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 37011c9..9eff34c 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,11 @@ var key = new NodeRSA([keyData, [format]], [options]); #### Options You can specify some options by second/third constructor argument, or over `key.setOptions()` method. -* environment — working environment, `'browser'`, `'node'` for `nodejs 0.10.x`, `'node12'` for `nodejs 0.12.x` or `'io'` for `io.js 1.x`. `nodejs12` and `io` provide native encryption/decryption methods Default autodetect. +* environment — working environment (default autodetect): + * `'browser'`, + * `'node'` for `nodejs 0.10.x` — provide native sign/verify methods. + * `'node12'` for `nodejs 0.12.x` — provide also native publicEncrypt/privateDecrypt methods. + * `'io'` for `io.js 1.x` — provide also native publicDecrypt/privateEncrypt methods. * encryptionScheme — padding scheme for encrypt/decrypt. Can be `'pkcs1_oaep'` or `'pkcs1'`. Default `'pkcs1_oaep'`. * signingScheme — scheme used for signing and verifying. Can be `'pkcs1'` or `'pss'` or 'scheme-hash' format string (eg `'pss-sha1'`). Default `'pkcs1-sha256'`, or, if chosen pss: `'pss-sha1'`. From 7420fcb5e24ad724d0566d1ab481e71e17d9f09c Mon Sep 17 00:00:00 2001 From: rzcoder Date: Tue, 24 Feb 2015 03:08:45 +0500 Subject: [PATCH 029/146] prepare tests for new envs --- README.md | 6 +-- package.json | 14 +++---- src/NodeRSA.js | 4 +- src/utils.js | 7 ++-- test/tests.js | 107 +++++++++++++++++++++++++++++-------------------- 5 files changed, 79 insertions(+), 59 deletions(-) diff --git a/README.md b/README.md index 9eff34c..eee19ce 100644 --- a/README.md +++ b/README.md @@ -59,9 +59,9 @@ You can specify some options by second/third constructor argument, or over `key. * environment — working environment (default autodetect): * `'browser'`, - * `'node'` for `nodejs 0.10.x` — provide native sign/verify methods. - * `'node12'` for `nodejs 0.12.x` — provide also native publicEncrypt/privateDecrypt methods. - * `'io'` for `io.js 1.x` — provide also native publicDecrypt/privateEncrypt methods. + * `'node10'` for `nodejs 0.10.x` — provide native sign/verify methods. + * `'node'` for `nodejs 0.12.x` — provide also native publicEncrypt/privateDecrypt methods. + * `'iojs'` for `io.js 1.x` — provide also native publicDecrypt/privateEncrypt methods. * encryptionScheme — padding scheme for encrypt/decrypt. Can be `'pkcs1_oaep'` or `'pkcs1'`. Default `'pkcs1_oaep'`. * signingScheme — scheme used for signing and verifying. Can be `'pkcs1'` or `'pss'` or 'scheme-hash' format string (eg `'pss-sha1'`). Default `'pkcs1-sha256'`, or, if chosen pss: `'pss-sha1'`. diff --git a/package.json b/package.json index a0f03c9..fa7e738 100644 --- a/package.json +++ b/package.json @@ -30,14 +30,14 @@ }, "homepage": "https://github.com/rzcoder/node-rsa", "devDependencies": { - "grunt": "^0.4.4", - "grunt-simple-mocha": "^0.4.0", - "jit-grunt": "^0.3.2", - "chai": "^1.9.1", - "grunt-contrib-jshint": "^0.9.2" + "grunt": "0.4.5", + "grunt-simple-mocha": "0.4.0", + "jit-grunt": "0.9.1", + "chai": "2.0.0", + "grunt-contrib-jshint": "0.11.0" }, "dependencies": { - "lodash": "^2.4.1", - "asn1": "^0.2.0" + "lodash": "3.3.0", + "asn1": "0.2.2" } } diff --git a/src/NodeRSA.js b/src/NodeRSA.js index 6048598..e0b0c3e 100644 --- a/src/NodeRSA.js +++ b/src/NodeRSA.js @@ -17,9 +17,9 @@ var formats = require('./formats/formats.js'); module.exports = (function () { var SUPPORTED_HASH_ALGORITHMS = { + node10: ['md4', 'md5', 'ripemd160', 'sha', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'], node: ['md4', 'md5', 'ripemd160', 'sha', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'], - node12: ['md4', 'md5', 'ripemd160', 'sha', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'], - io: ['md4', 'md5', 'ripemd160', 'sha', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'], + iojs: ['md4', 'md5', 'ripemd160', 'sha', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'], browser: ['md5', 'ripemd160', 'sha1', 'sha256', 'sha512'] }; diff --git a/src/utils.js b/src/utils.js index 20b3ec5..b1e299c 100644 --- a/src/utils.js +++ b/src/utils.js @@ -25,15 +25,14 @@ module.exports.detectEnvironment = function () { if (process && process.title != 'browser') { if (typeof crypt.publicEncrypt === 'function' && typeof crypt.privateDecrypt === 'function') { if (typeof crypt.publicDecrypt === 'function' && typeof crypt.privateEncrypt === 'function') { - return 'io'; + return 'iojs'; } - return 'node12'; + return 'node'; } - return 'node'; + return 'node10'; } else if (window) { return 'browser'; } - return 'node'; }; diff --git a/test/tests.js b/test/tests.js index f6aea3a..05c05e4 100644 --- a/test/tests.js +++ b/test/tests.js @@ -17,11 +17,13 @@ describe("NodeRSA", function(){ {b: 1024} // 'e' should be 65537 ]; - var environments = ['browser', 'node']; + var environments = ['browser', 'node10', 'node', 'iojs']; var encryptSchemes = ['pkcs1', 'pkcs1_oaep']; var signingSchemes = ['pkcs1', 'pss']; var signHashAlgorithms = { 'node': ['MD4', 'MD5', 'RIPEMD160', 'SHA', 'SHA1', 'SHA224', 'SHA256', 'SHA384', 'SHA512'], + 'node10': ['MD4', 'MD5', 'RIPEMD160', 'SHA', 'SHA1', 'SHA224', 'SHA256', 'SHA384', 'SHA512'], + 'iojs': ['MD4', 'MD5', 'RIPEMD160', 'SHA', 'SHA1', 'SHA224', 'SHA256', 'SHA384', 'SHA512'], 'browser': ['MD5', 'RIPEMD160', 'SHA1', 'SHA256', 'SHA512'] }; @@ -61,6 +63,14 @@ describe("NodeRSA", function(){ var publicNodeRSA = null; describe("Setup options", function(){ + it("should use browser environment", function () { + assert.equal((new NodeRSA(null, {environment: 'browser'})).$options.environment, 'browser'); + }); + + it("should use io.js environment", function () { + assert.equal((new NodeRSA(null, {environment: 'iojs'})).$options.environment, 'iojs'); + }); + it("should make empty key pair with default options", function () { var key = new NodeRSA(null); assert.equal(key.isEmpty(), true); @@ -104,7 +114,6 @@ describe("NodeRSA", function(){ assert.equal(key.$options.signingSchemeOptions.hash, 'sha256'); }); - it("advanced options change", function () { var key = new NodeRSA(null); key.setOptions({ @@ -339,51 +348,63 @@ describe("NodeRSA", function(){ }); describe("Encrypting & decrypting", function () { - for (var scheme_i in encryptSchemes) { - (function (scheme) { - describe("Encryption scheme: " + scheme, function () { - describe("Good cases", function () { - var encrypted = {}; - var decrypted = {}; - for (var i in dataBundle) { - (function (i) { - var key = null; - var suit = dataBundle[i]; - - it("should encrypt " + i, function () { - key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length]; - key.setOptions({encryptionScheme: scheme}); - encrypted[i] = key.encrypt(suit.data); - assert(Buffer.isBuffer(encrypted[i])); - assert(encrypted[i].length > 0); - }); + for (var env in environments) { + (function (env) { + for (var scheme_i in encryptSchemes) { + (function (scheme) { + describe("Environment: " + env + ". Encryption scheme: " + scheme, function () { + describe("Good cases", function () { + var encrypted = {}; + var decrypted = {}; + for (var i in dataBundle) { + (function (i) { + var key = null; + var suit = dataBundle[i]; - it("should decrypt " + i, function () { - decrypted[i] = key.decrypt(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); - if (Buffer.isBuffer(decrypted[i])) { - assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); - } else { - assert(_.isEqual(suit.data, decrypted[i])); - } - }); - })(i); - } - }); + it("should encrypt " + i, function () { + key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length]; + key.setOptions({encryptionScheme: scheme}); + encrypted[i] = key.encrypt(suit.data); + assert(Buffer.isBuffer(encrypted[i])); + assert(encrypted[i].length > 0); + }); - describe("Bad cases", function () { - it("unsupported data types", function(){ - assert.throw(function(){ generatedKeys[0].encrypt(null); }, Error, "Unexpected data type"); - assert.throw(function(){ generatedKeys[0].encrypt(undefined); }, Error, "Unexpected data type"); - assert.throw(function(){ generatedKeys[0].encrypt(true); }, Error, "Unexpected data type"); - }); + it("should decrypt " + i, function () { + decrypted[i] = key.decrypt(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); + if (Buffer.isBuffer(decrypted[i])) { + assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); + } else { + assert(_.isEqual(suit.data, decrypted[i])); + } + }); + })(i); + } + }); + + describe("Bad cases", function () { + it("unsupported data types", function () { + assert.throw(function () { + generatedKeys[0].encrypt(null); + }, Error, "Unexpected data type"); + assert.throw(function () { + generatedKeys[0].encrypt(undefined); + }, Error, "Unexpected data type"); + assert.throw(function () { + generatedKeys[0].encrypt(true); + }, Error, "Unexpected data type"); + }); - it("incorrect key for decrypting", function(){ - var encrypted = generatedKeys[0].encrypt('data'); - assert.throw(function(){ generatedKeys[1].decrypt(encrypted); }, Error, "Error during decryption"); + it("incorrect key for decrypting", function () { + var encrypted = generatedKeys[0].encrypt('data'); + assert.throw(function () { + generatedKeys[1].decrypt(encrypted); + }, Error, "Error during decryption"); + }); + }); }); - }); - }); - })(encryptSchemes[scheme_i]); + })(encryptSchemes[scheme_i]); + } + })(environments[env]); } }); From 55a095ae6e6970d313faae0871837a3f168c52bd Mon Sep 17 00:00:00 2001 From: rzcoder Date: Wed, 25 Feb 2015 01:58:54 +0500 Subject: [PATCH 030/146] added encryptPrivate, decryptPublic methods --- src/NodeRSA.js | 50 ++++++++++++++++++++++++++++++++++++++++--------- src/libs/rsa.js | 9 +++++---- test/tests.js | 28 +++++++++++++++++++++++++-- 3 files changed, 72 insertions(+), 15 deletions(-) diff --git a/src/NodeRSA.js b/src/NodeRSA.js index e0b0c3e..b2b3676 100644 --- a/src/NodeRSA.js +++ b/src/NodeRSA.js @@ -221,7 +221,7 @@ module.exports = (function () { }; /** - * Encrypting data method + * Encrypting data method with public key * * @param buffer {string|number|object|array|Buffer} - data for encrypting. Object and array will convert to JSON string. * @param encoding {string} - optional. Encoding for output result, may be 'buffer', 'binary', 'hex' or 'base64'. Default 'buffer'. @@ -229,8 +229,44 @@ module.exports = (function () { * @returns {string|Buffer} */ NodeRSA.prototype.encrypt = function (buffer, encoding, source_encoding) { + return this.$$encryptKey(false, buffer, encoding, source_encoding); + }; + + /** + * Decrypting data method with private key + * + * @param buffer {Buffer} - buffer for decrypting + * @param encoding - encoding for result string, can also take 'json' or 'buffer' for the automatic conversion of this type + * @returns {Buffer|object|string} + */ + NodeRSA.prototype.decrypt = function (buffer, encoding) { + return this.$$decryptKey(false, buffer, encoding); + }; + + /** + * Encrypting data method with private key + * + * Parameters same as `encrypt` method + */ + NodeRSA.prototype.encryptPrivate = function (buffer, encoding, source_encoding) { + return this.$$encryptKey(true, buffer, encoding, source_encoding); + }; + + /** + * Decrypting data method with public key + * + * Parameters same as `decrypt` method + */ + NodeRSA.prototype.decryptPublic = function (buffer, encoding) { + return this.$$decryptKey(true, buffer, encoding); + }; + + /** + * Encrypting data method with custom key + */ + NodeRSA.prototype.$$encryptKey = function (usePrivate, buffer, encoding, source_encoding) { try { - var res = this.keyPair.encrypt(this.$getDataForEncrypt(buffer, source_encoding)); + var res = this.keyPair.encrypt(this.$getDataForEncrypt(buffer, source_encoding), usePrivate); if (encoding == 'buffer' || !encoding) { return res; @@ -243,16 +279,12 @@ module.exports = (function () { }; /** - * Decrypting data method - * - * @param buffer {Buffer} - buffer for decrypting - * @param encoding - encoding for result string, can also take 'json' or 'buffer' for the automatic conversion of this type - * @returns {Buffer|object|string} + * Decrypting data method with custom key */ - NodeRSA.prototype.decrypt = function (buffer, encoding) { + NodeRSA.prototype.$$decryptKey = function (usePublic, buffer, encoding) { try { buffer = _.isString(buffer) ? new Buffer(buffer, 'base64') : buffer; - var res = this.keyPair.decrypt(buffer); + var res = this.keyPair.decrypt(buffer, usePublic); if (res === null) { throw Error('Key decrypt method returns null.'); diff --git a/src/libs/rsa.js b/src/libs/rsa.js index f3a0197..6376e0e 100644 --- a/src/libs/rsa.js +++ b/src/libs/rsa.js @@ -206,7 +206,7 @@ module.exports.Key = (function() { * @param buffer {Buffer} * @returns {Buffer} */ - RSAKey.prototype.encrypt = function (buffer) { + RSAKey.prototype.encrypt = function (buffer, usePrivate) { var buffers = []; var results = []; var bufferSize = buffer.length; @@ -225,7 +225,7 @@ module.exports.Key = (function() { var buf = buffers[i]; var m = new BigInteger(this.encryptionScheme.encPad(buf)); - var c = this.$doPublic(m); + var c = usePrivate ? this.$doPrivate(m) : this.$doPublic(m); if (c === null) { return null; @@ -243,7 +243,7 @@ module.exports.Key = (function() { * @param buffer {Buffer} * @returns {Buffer} */ - RSAKey.prototype.decrypt = function (buffer) { + RSAKey.prototype.decrypt = function (buffer, usePublic) { if (buffer.length % this.encryptedDataLength > 0) { throw Error('Incorrect data or key'); } @@ -258,7 +258,8 @@ module.exports.Key = (function() { length = offset + this.encryptedDataLength; var c = new BigInteger(buffer.slice(offset, Math.min(length, buffer.length))); - var m = this.$doPrivate(c); + var m = usePublic ? this.$doPublic(c) : this.$doPrivate(c); + result.push(this.encryptionScheme.encUnPad(m.toBuffer(this.encryptedDataLength))); } diff --git a/test/tests.js b/test/tests.js index 05c05e4..8cdd312 100644 --- a/test/tests.js +++ b/test/tests.js @@ -361,7 +361,7 @@ describe("NodeRSA", function(){ var key = null; var suit = dataBundle[i]; - it("should encrypt " + i, function () { + it("`encrypt()` should encrypt " + i, function () { key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length]; key.setOptions({encryptionScheme: scheme}); encrypted[i] = key.encrypt(suit.data); @@ -369,7 +369,7 @@ describe("NodeRSA", function(){ assert(encrypted[i].length > 0); }); - it("should decrypt " + i, function () { + it("`decrypt()` should decrypt " + i, function () { decrypted[i] = key.decrypt(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); if (Buffer.isBuffer(decrypted[i])) { assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); @@ -379,6 +379,30 @@ describe("NodeRSA", function(){ }); })(i); } + + for (var i in dataBundle) { + (function (i) { + var key = null; + var suit = dataBundle[i]; + + it("`encryptPrivate()` should encrypt " + i, function () { + key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length]; + key.setOptions({encryptionScheme: scheme}); + encrypted[i] = key.encryptPrivate(suit.data); + assert(Buffer.isBuffer(encrypted[i])); + assert(encrypted[i].length > 0); + }); + + it("`decryptPublic()` should decrypt " + i, function () { + decrypted[i] = key.decryptPublic(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); + if (Buffer.isBuffer(decrypted[i])) { + assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); + } else { + assert(_.isEqual(suit.data, decrypted[i])); + } + }); + })(i); + } }); describe("Bad cases", function () { From e2487732212757b1316f4dcf16d8c17187a0bbbc Mon Sep 17 00:00:00 2001 From: rzcoder Date: Thu, 26 Feb 2015 23:46:22 +0500 Subject: [PATCH 031/146] encrypt/decrypt methods now using native implementation if possible --- README.md | 17 ++++++--- package.json | 2 +- src/encryptEngines/encryptEngines.js | 19 ++++++++++ src/encryptEngines/io.js | 56 ++++++++++++++++++++++++++++ src/encryptEngines/js.js | 17 +++++++++ src/encryptEngines/node12.js | 38 +++++++++++++++++++ src/libs/rsa.js | 47 +++++++++++------------ src/utils.js | 8 +--- test/tests.js | 4 +- 9 files changed, 166 insertions(+), 42 deletions(-) create mode 100644 src/encryptEngines/encryptEngines.js create mode 100644 src/encryptEngines/io.js create mode 100644 src/encryptEngines/js.js create mode 100644 src/encryptEngines/node12.js diff --git a/README.md b/README.md index eee19ce..3e3ae85 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ console.log('decrypted: ', decrypted); ```shell npm install node-rsa ``` -*Requires nodejs >= 0.10.x* +*Requires nodejs >= 0.10.x or io.js >= 1.x* ### Testing @@ -58,10 +58,8 @@ var key = new NodeRSA([keyData, [format]], [options]); You can specify some options by second/third constructor argument, or over `key.setOptions()` method. * environment — working environment (default autodetect): - * `'browser'`, - * `'node10'` for `nodejs 0.10.x` — provide native sign/verify methods. - * `'node'` for `nodejs 0.12.x` — provide also native publicEncrypt/privateDecrypt methods. - * `'iojs'` for `io.js 1.x` — provide also native publicDecrypt/privateEncrypt methods. + * `'browser'` — will run pure js implementation of RSA algorithms. + * `'node'` for `nodejs >= 0.10.x or io.js >= 1.x` — provide some native methods like sign/verify and encrypt/decrypt. * encryptionScheme — padding scheme for encrypt/decrypt. Can be `'pkcs1_oaep'` or `'pkcs1'`. Default `'pkcs1_oaep'`. * signingScheme — scheme used for signing and verifying. Can be `'pkcs1'` or `'pss'` or 'scheme-hash' format string (eg `'pss-sha1'`). Default `'pkcs1-sha256'`, or, if chosen pss: `'pss-sha1'`. @@ -187,6 +185,7 @@ Return max data size for encrypt in bytes. ```javascript key.encrypt(buffer, [encoding], [source_encoding]); +key.encryptPrivate(buffer, [encoding], [source_encoding]); // using private key for encryption ``` Return encrypted data.
@@ -196,6 +195,7 @@ Return encrypted data.
```javascript key.decrypt(buffer, [encoding]); +key.decryptPublic(buffer, [encoding]); // using public key for decryption ``` Return decrypted data.
@@ -224,6 +224,13 @@ Questions, comments, bug reports, and pull requests are all welcome. ## Changelog +### 0.2.20 + * Added `.encryptPrivate()` and `.decryptPublic()` methods + * Encrypt/decrypt methods in nodejs 0.12.x and io.js using native implementation (40x speed boost) + * **KNOWN ISSUES**: + * `encryptPrivate` and `decryptPublic` don't have native implementation in nodejs + * `encryptPrivate` and `decryptPublic` with pkcs1_oaep padding scheme don't work in io.js and using js implementation + ### 0.2.10 * **Methods `.exportPrivate()` and `.exportPublic()` was replaced by `.exportKey([format])`.** * By default `.exportKey()` returns private key as `.exportPrivate()`, if you need public key from `.exportPublic()` you must specify format as `'public'` or `'pkcs8-public-pem'`. diff --git a/package.json b/package.json index fa7e738..f063666 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "0.2.13", + "version": "0.2.20", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { diff --git a/src/encryptEngines/encryptEngines.js b/src/encryptEngines/encryptEngines.js new file mode 100644 index 0000000..ad22a9e --- /dev/null +++ b/src/encryptEngines/encryptEngines.js @@ -0,0 +1,19 @@ +var crypt = require('crypto'); + +module.exports = { + getEngine: function (keyPair, options) { + var engine; + if (options.environment === 'browser') { + engine = require('./js.js'); + } else { + if (typeof crypt.publicEncrypt === 'function' && typeof crypt.privateDecrypt === 'function') { + if (typeof crypt.privateEncrypt === 'function' && typeof crypt.publicDecrypt === 'function') { + engine = require('./io.js'); + } else { + engine = require('./node12.js'); + } + } + } + return engine(keyPair, options); + } +}; \ No newline at end of file diff --git a/src/encryptEngines/io.js b/src/encryptEngines/io.js new file mode 100644 index 0000000..6b26a76 --- /dev/null +++ b/src/encryptEngines/io.js @@ -0,0 +1,56 @@ +var crypto = require('crypto'); +var constants = require('constants'); + +module.exports = function (keyPair, options) { + var jsEngine = require('./js.js')(keyPair); + + return { + encrypt: function (buffer, usePrivate) { + var padding = constants.RSA_PKCS1_OAEP_PADDING; + if (options.encryptionScheme === 'pkcs1') { + padding = constants.RSA_PKCS1_PADDING; + } + + /* io.js 1.3.x bug */ + if (padding === constants.RSA_PKCS1_OAEP_PADDING) { + return jsEngine.encrypt(buffer, usePrivate); + } + + if (usePrivate) { + return crypto.privateEncrypt({ + key: options.rsaUtils.exportKey('private'), + padding: padding + }, buffer); + } else { + return crypto.publicEncrypt({ + key: options.rsaUtils.exportKey('public'), + padding: padding + }, buffer); + } + }, + + decrypt: function (buffer, usePublic) { + var padding = constants.RSA_PKCS1_OAEP_PADDING; + if (options.encryptionScheme === 'pkcs1') { + padding = constants.RSA_PKCS1_PADDING; + } + + /* io.js 1.3.x bug */ + if (padding === constants.RSA_PKCS1_OAEP_PADDING) { + return jsEngine.decrypt(buffer, usePrivate); + } + + if (usePublic) { + return crypto.publicDecrypt({ + key: options.rsaUtils.exportKey('public'), + padding: padding + }, buffer); + } else { + return crypto.privateDecrypt({ + key: options.rsaUtils.exportKey('private'), + padding: padding + }, buffer); + } + } + }; +}; \ No newline at end of file diff --git a/src/encryptEngines/js.js b/src/encryptEngines/js.js new file mode 100644 index 0000000..6f9d756 --- /dev/null +++ b/src/encryptEngines/js.js @@ -0,0 +1,17 @@ +var BigInteger = require('../libs/jsbn.js'); + +module.exports = function (keyPair, options) { + return { + encrypt: function (buffer, usePrivate) { + var m = new BigInteger(keyPair.encryptionScheme.encPad(buffer)); + var c = usePrivate ? keyPair.$doPrivate(m) : keyPair.$doPublic(m); + return c.toBuffer(keyPair.encryptedDataLength); + }, + + decrypt: function (buffer, usePublic) { + var c = new BigInteger(buffer); + var m = usePublic ? keyPair.$doPublic(c) : keyPair.$doPrivate(c); + return keyPair.encryptionScheme.encUnPad(m.toBuffer(keyPair.encryptedDataLength)); + } + }; +}; \ No newline at end of file diff --git a/src/encryptEngines/node12.js b/src/encryptEngines/node12.js new file mode 100644 index 0000000..d1e065d --- /dev/null +++ b/src/encryptEngines/node12.js @@ -0,0 +1,38 @@ +var crypto = require('crypto'); +var constants = require('constants'); + +module.exports = function (keyPair, options) { + var jsEngine = require('./js.js')(keyPair); + + return { + encrypt: function (buffer, usePrivate) { + if (usePrivate) { + return jsEngine.encrypt(buffer, usePrivate); + } + var padding = constants.RSA_PKCS1_OAEP_PADDING; + if (options.encryptionScheme === 'pkcs1') { + padding = constants.RSA_PKCS1_PADDING; + } + + return crypto.publicEncrypt({ + key: options.rsaUtils.exportKey('public'), + padding: padding + }, buffer); + }, + + decrypt: function (buffer, usePublic) { + if (usePublic) { + return jsEngine.decrypt(buffer, usePublic); + } + var padding = constants.RSA_PKCS1_OAEP_PADDING; + if (options.encryptionScheme === 'pkcs1') { + padding = constants.RSA_PKCS1_PADDING; + } + + return crypto.privateDecrypt({ + key: options.rsaUtils.exportKey('private'), + padding: padding + }, buffer); + } + }; +}; \ No newline at end of file diff --git a/src/libs/rsa.js b/src/libs/rsa.js index 6376e0e..7a11eef 100644 --- a/src/libs/rsa.js +++ b/src/libs/rsa.js @@ -44,9 +44,10 @@ var crypt = require('crypto'); var BigInteger = require('./jsbn.js'); var utils = require('../utils.js'); var schemes = require('../schemes/schemes.js'); +var encryptEngines = require('../encryptEngines/encryptEngines.js'); exports.BigInteger = BigInteger; -module.exports.Key = (function() { +module.exports.Key = (function () { /** * RSA key constructor * @@ -80,6 +81,8 @@ module.exports.Key = (function() { this.encryptionScheme = encryptionSchemeProvider.makeScheme(this, options); this.signingScheme = signingSchemeProvider.makeScheme(this, options); } + + this.encryptEngine = encryptEngines.getEngine(this, options); }; /** @@ -91,13 +94,13 @@ module.exports.Key = (function() { var qs = B >> 1; this.e = parseInt(E, 16); var ee = new BigInteger(E, 16); - for (; ;) { - for (; ;) { + while (true) { + while (true) { this.p = new BigInteger(B - qs, 1); if (this.p.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) === 0 && this.p.isProbablePrime(10)) break; } - for (; ;) { + while (true) { this.q = new BigInteger(qs, 1); if (this.q.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) === 0 && this.q.isProbablePrime(10)) break; @@ -213,26 +216,16 @@ module.exports.Key = (function() { var buffersCount = Math.ceil(bufferSize / this.maxMessageLength) || 1; // total buffers count for encrypt var dividedSize = Math.ceil(bufferSize / buffersCount || 1); // each buffer size - if ( buffersCount == 1) { + if (buffersCount == 1) { buffers.push(buffer); } else { for (var bufNum = 0; bufNum < buffersCount; bufNum++) { - buffers.push(buffer.slice(bufNum * dividedSize, (bufNum+1) * dividedSize)); + buffers.push(buffer.slice(bufNum * dividedSize, (bufNum + 1) * dividedSize)); } } - for(var i = 0; i < buffers.length; i++) { - var buf = buffers[i]; - - var m = new BigInteger(this.encryptionScheme.encPad(buf)); - var c = usePrivate ? this.$doPrivate(m) : this.$doPublic(m); - - if (c === null) { - return null; - } - - var encryptedBuffer = c.toBuffer(this.encryptedDataLength); - results.push(encryptedBuffer); + for (var i = 0; i < buffers.length; i++) { + results.push(this.encryptEngine.encrypt(buffers[i], usePrivate)); } return Buffer.concat(results); @@ -256,11 +249,7 @@ module.exports.Key = (function() { for (var i = 0; i < buffersCount; i++) { offset = i * this.encryptedDataLength; length = offset + this.encryptedDataLength; - - var c = new BigInteger(buffer.slice(offset, Math.min(length, buffer.length))); - var m = usePublic ? this.$doPublic(c) : this.$doPrivate(c); - - result.push(this.encryptionScheme.encUnPad(m.toBuffer(this.encryptedDataLength))); + result.push(this.encryptEngine.decrypt(buffer.slice(offset, Math.min(length, buffer.length)), usePublic)); } return Buffer.concat(result); @@ -290,15 +279,21 @@ module.exports.Key = (function() { }; Object.defineProperty(RSAKey.prototype, 'keySize', { - get: function() { return this.cache.keyBitLength; } + get: function () { + return this.cache.keyBitLength; + } }); Object.defineProperty(RSAKey.prototype, 'encryptedDataLength', { - get: function() { return this.cache.keyByteLength; } + get: function () { + return this.cache.keyByteLength; + } }); Object.defineProperty(RSAKey.prototype, 'maxMessageLength', { - get: function() { return this.encryptionScheme.maxMessageLength(); } + get: function () { + return this.encryptionScheme.maxMessageLength(); + } }); /** diff --git a/src/utils.js b/src/utils.js index b1e299c..b6dff0a 100644 --- a/src/utils.js +++ b/src/utils.js @@ -23,13 +23,7 @@ module.exports.linebrk = function (str, maxLen) { module.exports.detectEnvironment = function () { if (process && process.title != 'browser') { - if (typeof crypt.publicEncrypt === 'function' && typeof crypt.privateDecrypt === 'function') { - if (typeof crypt.publicDecrypt === 'function' && typeof crypt.privateEncrypt === 'function') { - return 'iojs'; - } - return 'node'; - } - return 'node10'; + return 'node'; } else if (window) { return 'browser'; } diff --git a/test/tests.js b/test/tests.js index 8cdd312..709b035 100644 --- a/test/tests.js +++ b/test/tests.js @@ -17,13 +17,11 @@ describe("NodeRSA", function(){ {b: 1024} // 'e' should be 65537 ]; - var environments = ['browser', 'node10', 'node', 'iojs']; + var environments = ['browser', 'node']; var encryptSchemes = ['pkcs1', 'pkcs1_oaep']; var signingSchemes = ['pkcs1', 'pss']; var signHashAlgorithms = { 'node': ['MD4', 'MD5', 'RIPEMD160', 'SHA', 'SHA1', 'SHA224', 'SHA256', 'SHA384', 'SHA512'], - 'node10': ['MD4', 'MD5', 'RIPEMD160', 'SHA', 'SHA1', 'SHA224', 'SHA256', 'SHA384', 'SHA512'], - 'iojs': ['MD4', 'MD5', 'RIPEMD160', 'SHA', 'SHA1', 'SHA224', 'SHA256', 'SHA384', 'SHA512'], 'browser': ['MD5', 'RIPEMD160', 'SHA1', 'SHA256', 'SHA512'] }; From 407022a6559e55ff1e7acabad22abf87ab4efaa5 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Fri, 27 Feb 2015 01:52:41 +0500 Subject: [PATCH 032/146] update readme --- README.md | 24 ++++-------------------- src/encryptEngines/io.js | 4 ++-- 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 3e3ae85..87a68e2 100644 --- a/README.md +++ b/README.md @@ -63,31 +63,16 @@ You can specify some options by second/third constructor argument, or over `key. * encryptionScheme — padding scheme for encrypt/decrypt. Can be `'pkcs1_oaep'` or `'pkcs1'`. Default `'pkcs1_oaep'`. * signingScheme — scheme used for signing and verifying. Can be `'pkcs1'` or `'pss'` or 'scheme-hash' format string (eg `'pss-sha1'`). Default `'pkcs1-sha256'`, or, if chosen pss: `'pss-sha1'`. -**Advanced options:**
-You also can specify advanced options for some schemes like this: -```javascript -options = { - encryptionScheme: { - scheme: 'pkcs1_oaep', //scheme - hash: 'md5', //hash using for scheme - mgf: function(...) {...} //mask generation function - }, - signingScheme: { - scheme: 'pss', //scheme - hash: 'sha1', //hash using for scheme - saltLength: 20 //salt length for pss sign - } -} -``` - This lib supporting next hash algorithms: `'md5'`, `'ripemd160'`, `'sha1'`, `'sha256'`, `'sha512'` in browser and node environment and additional `'md4'`, `'sha'`, `'sha224'`, `'sha384'` in node only. +Some [advanced options info](https://github.com/rzcoder/node-rsa/wiki/Advanced-options) + #### Creating "empty" key ```javascript var key = new NodeRSA(); ``` -#### Generate new key 512bit-length and with public exponent 65537 +#### Generate new 512bit-length key ```javascript var key = new NodeRSA({b: 512}); ``` @@ -228,8 +213,7 @@ Questions, comments, bug reports, and pull requests are all welcome. * Added `.encryptPrivate()` and `.decryptPublic()` methods * Encrypt/decrypt methods in nodejs 0.12.x and io.js using native implementation (40x speed boost) * **KNOWN ISSUES**: - * `encryptPrivate` and `decryptPublic` don't have native implementation in nodejs - * `encryptPrivate` and `decryptPublic` with pkcs1_oaep padding scheme don't work in io.js and using js implementation + * `encryptPrivate` and `decryptPublic` don't have native implementation in nodejs and can't be use in native implementation with pkcs1_oaep padding in io.js ### 0.2.10 * **Methods `.exportPrivate()` and `.exportPublic()` was replaced by `.exportKey([format])`.** diff --git a/src/encryptEngines/io.js b/src/encryptEngines/io.js index 6b26a76..719c63e 100644 --- a/src/encryptEngines/io.js +++ b/src/encryptEngines/io.js @@ -11,7 +11,7 @@ module.exports = function (keyPair, options) { padding = constants.RSA_PKCS1_PADDING; } - /* io.js 1.3.x bug */ + /* opennssl can't make it */ if (padding === constants.RSA_PKCS1_OAEP_PADDING) { return jsEngine.encrypt(buffer, usePrivate); } @@ -35,7 +35,7 @@ module.exports = function (keyPair, options) { padding = constants.RSA_PKCS1_PADDING; } - /* io.js 1.3.x bug */ + /* opennssl can't make it */ if (padding === constants.RSA_PKCS1_OAEP_PADDING) { return jsEngine.decrypt(buffer, usePrivate); } From ea2acfac2f012a0b6799dec3aaccdb265b689b0d Mon Sep 17 00:00:00 2001 From: rzcoder Date: Fri, 27 Feb 2015 02:00:48 +0500 Subject: [PATCH 033/146] Update readme --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 87a68e2..7dc2c5f 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ You can specify some options by second/third constructor argument, or over `key. * encryptionScheme — padding scheme for encrypt/decrypt. Can be `'pkcs1_oaep'` or `'pkcs1'`. Default `'pkcs1_oaep'`. * signingScheme — scheme used for signing and verifying. Can be `'pkcs1'` or `'pss'` or 'scheme-hash' format string (eg `'pss-sha1'`). Default `'pkcs1-sha256'`, or, if chosen pss: `'pss-sha1'`. -This lib supporting next hash algorithms: `'md5'`, `'ripemd160'`, `'sha1'`, `'sha256'`, `'sha512'` in browser and node environment and additional `'md4'`, `'sha'`, `'sha224'`, `'sha384'` in node only. +> *NOTICE:* This lib supporting next hash algorithms: `'md5'`, `'ripemd160'`, `'sha1'`, `'sha256'`, `'sha512'` in browser and node environment and additional `'md4'`, `'sha'`, `'sha224'`, `'sha384'` in node only. Some [advanced options info](https://github.com/rzcoder/node-rsa/wiki/Advanced-options) @@ -123,7 +123,7 @@ Output type — can be: * `'pem'` — Base64 encoded string with header and footer. Used by default. * `'der'` — Binary encoded key data. -**Notice:** For import, if *keyData* is PEM string or buffer containing string, you can do not specify format, but if you provide *keyData* as DER you must specify it in format string. +> *Notice:* For import, if *keyData* is PEM string or buffer containing string, you can do not specify format, but if you provide *keyData* as DER you must specify it in format string. **Shortcuts and examples** * `'private'` or `'pkcs1'` or `'pkcs1-private'` == `'pkcs1-private-pem'` — private key encoded in pcks1 scheme as pem string. @@ -211,9 +211,10 @@ Questions, comments, bug reports, and pull requests are all welcome. ### 0.2.20 * Added `.encryptPrivate()` and `.decryptPublic()` methods - * Encrypt/decrypt methods in nodejs 0.12.x and io.js using native implementation (40x speed boost) - * **KNOWN ISSUES**: - * `encryptPrivate` and `decryptPublic` don't have native implementation in nodejs and can't be use in native implementation with pkcs1_oaep padding in io.js + * Encrypt/decrypt methods in nodejs 0.12.x and io.js using native implementation (> 40x speed boost) + +**KNOWN ISSUES**: + * `encryptPrivate` and `decryptPublic` don't have native implementation in nodejs and can't be use in native implementation with pkcs1_oaep padding in io.js ### 0.2.10 * **Methods `.exportPrivate()` and `.exportPublic()` was replaced by `.exportKey([format])`.** From c816fac276d9f294bd4d6ae0bc06bb6e6c278443 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Fri, 27 Feb 2015 02:04:57 +0500 Subject: [PATCH 034/146] iojs engine fix --- src/encryptEngines/io.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/encryptEngines/io.js b/src/encryptEngines/io.js index 719c63e..cb2284c 100644 --- a/src/encryptEngines/io.js +++ b/src/encryptEngines/io.js @@ -37,7 +37,7 @@ module.exports = function (keyPair, options) { /* opennssl can't make it */ if (padding === constants.RSA_PKCS1_OAEP_PADDING) { - return jsEngine.decrypt(buffer, usePrivate); + return jsEngine.decrypt(buffer, usePublic); } if (usePublic) { From a809ab665550c14a4b7722f503e6f4902e63f418 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Fri, 27 Feb 2015 02:06:41 +0500 Subject: [PATCH 035/146] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7dc2c5f..2adcebd 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ You can specify some options by second/third constructor argument, or over `key. * encryptionScheme — padding scheme for encrypt/decrypt. Can be `'pkcs1_oaep'` or `'pkcs1'`. Default `'pkcs1_oaep'`. * signingScheme — scheme used for signing and verifying. Can be `'pkcs1'` or `'pss'` or 'scheme-hash' format string (eg `'pss-sha1'`). Default `'pkcs1-sha256'`, or, if chosen pss: `'pss-sha1'`. -> *NOTICE:* This lib supporting next hash algorithms: `'md5'`, `'ripemd160'`, `'sha1'`, `'sha256'`, `'sha512'` in browser and node environment and additional `'md4'`, `'sha'`, `'sha224'`, `'sha384'` in node only. +> *Notice:* This lib supporting next hash algorithms: `'md5'`, `'ripemd160'`, `'sha1'`, `'sha256'`, `'sha512'` in browser and node environment and additional `'md4'`, `'sha'`, `'sha224'`, `'sha384'` in node only. Some [advanced options info](https://github.com/rzcoder/node-rsa/wiki/Advanced-options) From 0cefeba4f45856455a08c98bf9f90de9dd500070 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Fri, 27 Feb 2015 02:31:48 +0500 Subject: [PATCH 036/146] update tests --- test/tests.js | 134 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 130 insertions(+), 4 deletions(-) diff --git a/test/tests.js b/test/tests.js index 709b035..0a2c901 100644 --- a/test/tests.js +++ b/test/tests.js @@ -360,8 +360,10 @@ describe("NodeRSA", function(){ var suit = dataBundle[i]; it("`encrypt()` should encrypt " + i, function () { - key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length]; - key.setOptions({encryptionScheme: scheme}); + key = new NodeRSA(generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(), { + environment: env, + encryptionScheme: scheme + }); encrypted[i] = key.encrypt(suit.data); assert(Buffer.isBuffer(encrypted[i])); assert(encrypted[i].length > 0); @@ -384,8 +386,10 @@ describe("NodeRSA", function(){ var suit = dataBundle[i]; it("`encryptPrivate()` should encrypt " + i, function () { - key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length]; - key.setOptions({encryptionScheme: scheme}); + key = new NodeRSA(generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(), { + environment: env, + encryptionScheme: scheme + }); encrypted[i] = key.encryptPrivate(suit.data); assert(Buffer.isBuffer(encrypted[i])); assert(encrypted[i].length > 0); @@ -428,6 +432,128 @@ describe("NodeRSA", function(){ } })(environments[env]); } + + describe("Compatibility of different environments", function () { + var encrypted = {}; + var decrypted = {}; + for (var i in dataBundle) { + (function (i) { + var key1 = null; + var key2 = null; + var suit = dataBundle[i]; + + it("`encrypt()` by browser" + i, function () { + var key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); + key1 = new NodeRSA(key, {environment: 'browser'}); + key2 = new NodeRSA(key, {environment: 'node'}); + encrypted[i] = key1.encrypt(suit.data); + assert(Buffer.isBuffer(encrypted[i])); + assert(encrypted[i].length > 0); + }); + + it("`decrypt()` by node" + i, function () { + decrypted[i] = key2.decrypt(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); + if (Buffer.isBuffer(decrypted[i])) { + assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); + } else { + assert(_.isEqual(suit.data, decrypted[i])); + } + }); + })(i); + } + + for (var i in dataBundle) { + (function (i) { + var key1 = null; + var key2 = null; + var suit = dataBundle[i]; + + it("`encryptPrivate()` by browser " + i, function () { + var key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); + key1 = new NodeRSA(key, { + environment: 'browser', + encryptionScheme: 'pkcs1' + }); + key2 = new NodeRSA(key, { + environment: 'node', + encryptionScheme: 'pkcs1' + }); + encrypted[i] = key1.encryptPrivate(suit.data); + assert(Buffer.isBuffer(encrypted[i])); + assert(encrypted[i].length > 0); + }); + + it("`decryptPublic()` by node " + i, function () { + decrypted[i] = key2.decryptPublic(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); + if (Buffer.isBuffer(decrypted[i])) { + assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); + } else { + assert(_.isEqual(suit.data, decrypted[i])); + } + }); + })(i); + } + + var encrypted = {}; + var decrypted = {}; + for (var i in dataBundle) { + (function (i) { + var key1 = null; + var key2 = null; + var suit = dataBundle[i]; + + it("`encrypt()` by node" + i, function () { + var key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); + key1 = new NodeRSA(key, {environment: 'node'}); + key2 = new NodeRSA(key, {environment: 'browser'}); + encrypted[i] = key1.encrypt(suit.data); + assert(Buffer.isBuffer(encrypted[i])); + assert(encrypted[i].length > 0); + }); + + it("`decrypt()` by browser" + i, function () { + decrypted[i] = key2.decrypt(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); + if (Buffer.isBuffer(decrypted[i])) { + assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); + } else { + assert(_.isEqual(suit.data, decrypted[i])); + } + }); + })(i); + } + + for (var i in dataBundle) { + (function (i) { + var key1 = null; + var key2 = null; + var suit = dataBundle[i]; + + it("`encryptPrivate()` by node " + i, function () { + var key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); + key1 = new NodeRSA(key, { + environment: 'browser', + encryptionScheme: 'pkcs1' + }); + key2 = new NodeRSA(key, { + environment: 'node', + encryptionScheme: 'pkcs1' + }); + encrypted[i] = key1.encryptPrivate(suit.data); + assert(Buffer.isBuffer(encrypted[i])); + assert(encrypted[i].length > 0); + }); + + it("`decryptPublic()` by browser " + i, function () { + decrypted[i] = key2.decryptPublic(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); + if (Buffer.isBuffer(decrypted[i])) { + assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); + } else { + assert(_.isEqual(suit.data, decrypted[i])); + } + }); + })(i); + } + }); }); describe("Signing & verifying", function () { From e2497a87f3816999295e219799fc711e2b2f4201 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Fri, 27 Feb 2015 02:38:31 +0500 Subject: [PATCH 037/146] update readme --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2adcebd..4c36c2b 100644 --- a/README.md +++ b/README.md @@ -187,6 +187,8 @@ Return decrypted data.
* buffer — `{buffer}` — data for decrypting. Takes Buffer object or base64 encoded string.
* encoding — `{string}` — encoding for result string. Can also take `'buffer'` for raw Buffer object, or `'json'` for automatic JSON.parse result. Default `'buffer'`. +> *Notice:* usage encryptPrivate and decryptPublic with `pkcs1_oaep` padding not described in the RSA [specification](http://www.emc.com/collateral/white-papers/h11300-pkcs-1v2-2-rsa-cryptography-standard-wp.pdf) + ### Signing/Verifying ```javascript key.sign(buffer, [encoding], [source_encoding]); @@ -212,9 +214,7 @@ Questions, comments, bug reports, and pull requests are all welcome. ### 0.2.20 * Added `.encryptPrivate()` and `.decryptPublic()` methods * Encrypt/decrypt methods in nodejs 0.12.x and io.js using native implementation (> 40x speed boost) - -**KNOWN ISSUES**: - * `encryptPrivate` and `decryptPublic` don't have native implementation in nodejs and can't be use in native implementation with pkcs1_oaep padding in io.js + * *KNOWN ISSUE*:`encryptPrivate` and `decryptPublic` don't have native implementation in nodejs and can't be use in native implementation with pkcs1_oaep padding in io.js ### 0.2.10 * **Methods `.exportPrivate()` and `.exportPublic()` was replaced by `.exportKey([format])`.** From 08bcad225b898a465cbccbe4a527ae0392f8fa40 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Fri, 27 Feb 2015 02:39:17 +0500 Subject: [PATCH 038/146] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4c36c2b..8a6d6ea 100644 --- a/README.md +++ b/README.md @@ -187,7 +187,7 @@ Return decrypted data.
* buffer — `{buffer}` — data for decrypting. Takes Buffer object or base64 encoded string.
* encoding — `{string}` — encoding for result string. Can also take `'buffer'` for raw Buffer object, or `'json'` for automatic JSON.parse result. Default `'buffer'`. -> *Notice:* usage encryptPrivate and decryptPublic with `pkcs1_oaep` padding not described in the RSA [specification](http://www.emc.com/collateral/white-papers/h11300-pkcs-1v2-2-rsa-cryptography-standard-wp.pdf) +> *Notice:* usage `encryptPrivate` and `decryptPublic` with `pkcs1_oaep` padding not described in the RSA [specification](http://www.emc.com/collateral/white-papers/h11300-pkcs-1v2-2-rsa-cryptography-standard-wp.pdf) ### Signing/Verifying ```javascript From 96bff7181d2018ed83d563098948bda6476fff48 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Fri, 27 Feb 2015 02:41:17 +0500 Subject: [PATCH 039/146] update readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8a6d6ea..44c096d 100644 --- a/README.md +++ b/README.md @@ -170,7 +170,7 @@ Return max data size for encrypt in bytes. ```javascript key.encrypt(buffer, [encoding], [source_encoding]); -key.encryptPrivate(buffer, [encoding], [source_encoding]); // using private key for encryption +key.encryptPrivate(buffer, [encoding], [source_encoding]); // use private key for encryption ``` Return encrypted data.
@@ -180,7 +180,7 @@ Return encrypted data.
```javascript key.decrypt(buffer, [encoding]); -key.decryptPublic(buffer, [encoding]); // using public key for decryption +key.decryptPublic(buffer, [encoding]); // use public key for decryption ``` Return decrypted data.
From 8edbf6f31e54a40fd6337b58e66bbe20146090c0 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Fri, 27 Feb 2015 02:51:59 +0500 Subject: [PATCH 040/146] fix regex issues --- src/formats/pkcs1.js | 4 ++-- src/formats/pkcs8.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/formats/pkcs1.js b/src/formats/pkcs1.js index 715e7c0..6f76f6d 100644 --- a/src/formats/pkcs1.js +++ b/src/formats/pkcs1.js @@ -128,12 +128,12 @@ module.exports = { * @param data */ autoImport: function (key, data) { - if (/^\s*-----BEGIN RSA PRIVATE KEY-----\s*([A-Za-z0-9+/=]+\s*)+-----END RSA PRIVATE KEY-----\s*$/g.test(data)) { + if (/^\s*-----BEGIN RSA PRIVATE KEY-----\s*(?=(([A-Za-z0-9+/=]+\s*)+))\1-----END RSA PRIVATE KEY-----\s*$/g.test(data)) { module.exports.privateImport(key, data); return true; } - if (/^\s*-----BEGIN RSA PUBLIC KEY-----\s*([A-Za-z0-9+/=]+\s*)+-----END RSA PUBLIC KEY-----\s*$/g.test(data)) { + if (/^\s*-----BEGIN RSA PUBLIC KEY-----\s*(?=(([A-Za-z0-9+/=]+\s*)+))\1-----END RSA PUBLIC KEY-----\s*$/g.test(data)) { module.exports.publicImport(key, data); return true; } diff --git a/src/formats/pkcs8.js b/src/formats/pkcs8.js index 9647879..add72de 100644 --- a/src/formats/pkcs8.js +++ b/src/formats/pkcs8.js @@ -167,12 +167,12 @@ module.exports = { * @param data */ autoImport: function (key, data) { - if (/^\s*-----BEGIN PRIVATE KEY-----\s*([A-Za-z0-9+/=]+\s*)+-----END PRIVATE KEY-----\s*$/g.test(data)) { + if (/^\s*-----BEGIN PRIVATE KEY-----\s*(?=(([A-Za-z0-9+/=]+\s*)+))\1-----END PRIVATE KEY-----\s*$/g.test(data)) { module.exports.privateImport(key, data); return true; } - if (/^\s*-----BEGIN PUBLIC KEY-----\s*([A-Za-z0-9+/=]+\s*)+-----END PUBLIC KEY-----\s*$/g.test(data)) { + if (/^\s*-----BEGIN PUBLIC KEY-----\s*(?=(([A-Za-z0-9+/=]+\s*)+))\1-----END PUBLIC KEY-----\s*$/g.test(data)) { module.exports.publicImport(key, data); return true; } From e0a2fd6a0ad91d169dc0902865fe2fcb0814146c Mon Sep 17 00:00:00 2001 From: rzcoder Date: Fri, 27 Feb 2015 02:54:10 +0500 Subject: [PATCH 041/146] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 44c096d..7a495fe 100644 --- a/README.md +++ b/README.md @@ -214,6 +214,7 @@ Questions, comments, bug reports, and pull requests are all welcome. ### 0.2.20 * Added `.encryptPrivate()` and `.decryptPublic()` methods * Encrypt/decrypt methods in nodejs 0.12.x and io.js using native implementation (> 40x speed boost) + * Fixed some regex issue causing catastrophic backtracking. * *KNOWN ISSUE*:`encryptPrivate` and `decryptPublic` don't have native implementation in nodejs and can't be use in native implementation with pkcs1_oaep padding in io.js ### 0.2.10 From fe0a7d7608f59819a1e53e2718ae036a3cffef20 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Fri, 27 Feb 2015 02:56:08 +0500 Subject: [PATCH 042/146] update readme --- README.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 7a495fe..a7c131e 100644 --- a/README.md +++ b/README.md @@ -212,10 +212,10 @@ Questions, comments, bug reports, and pull requests are all welcome. ## Changelog ### 0.2.20 - * Added `.encryptPrivate()` and `.decryptPublic()` methods - * Encrypt/decrypt methods in nodejs 0.12.x and io.js using native implementation (> 40x speed boost) + * Added `.encryptPrivate()` and `.decryptPublic()` methods. + * Encrypt/decrypt methods in nodejs 0.12.x and io.js using native implementation (> 40x speed boost). * Fixed some regex issue causing catastrophic backtracking. - * *KNOWN ISSUE*:`encryptPrivate` and `decryptPublic` don't have native implementation in nodejs and can't be use in native implementation with pkcs1_oaep padding in io.js + * *KNOWN ISSUE*:`encryptPrivate` and `decryptPublic` don't have native implementation in nodejs and can't be use in native implementation with pkcs1_oaep padding in io.js. ### 0.2.10 * **Methods `.exportPrivate()` and `.exportPublic()` was replaced by `.exportKey([format])`.** @@ -226,34 +226,34 @@ Questions, comments, bug reports, and pull requests are all welcome. * **`.getPublicPEM()` method was renamed to `.exportPublic()`** * **`.getPrivatePEM()` method was renamed to `.exportPrivate()`** * **`.loadFromPEM()` method was renamed to `.importKey()`** - * Added PKCS1_OAEP encrypting/decrypting support - * **PKCS1_OAEP now default scheme, you need to specify 'encryptingScheme' option to 'pkcs1' for compatibility with 0.1.x version of NodeRSA** - * Added PSS signing/verifying support + * Added PKCS1_OAEP encrypting/decrypting support. + * **PKCS1_OAEP now default scheme, you need to specify 'encryptingScheme' option to 'pkcs1' for compatibility with 0.1.x version of NodeRSA.** + * Added PSS signing/verifying support. * Signing now supports `'md5'`, `'ripemd160'`, `'sha1'`, `'sha256'`, `'sha512'` hash algorithms in both environments and additional `'md4'`, `'sha'`, `'sha224'`, `'sha384'` for nodejs env. * **`options.signingAlgorithm` was renamed to `options.signingScheme`** - * Added `encryptingScheme` option + * Added `encryptingScheme` option. * Property `key.options` now mark as private. Added `key.setOptions(options)` method. ### 0.1.54 - * Added support for loading PEM key from Buffer (`fs.readFileSync()` output) - * Added `isEmpty()` method + * Added support for loading PEM key from Buffer (`fs.readFileSync()` output). + * Added `isEmpty()` method. ### 0.1.52 - * Improve work with not properly trimming PEM strings + * Improve work with not properly trimming PEM strings. ### 0.1.50 - * Implemented native js signing and verifying for browsers - * `options.signingAlgorithm` now takes only hash-algorithm name - * Added `.getKeySize()` and `.getMaxMessageSize()` methods - * `.loadFromPublicPEM` and `.loadFromPrivatePEM` methods marked as private + * Implemented native js signing and verifying for browsers. + * `options.signingAlgorithm` now takes only hash-algorithm name. + * Added `.getKeySize()` and `.getMaxMessageSize()` methods. + * `.loadFromPublicPEM` and `.loadFromPrivatePEM` methods marked as private. ### 0.1.40 - * Added signing/verifying + * Added signing/verifying. ### 0.1.30 - * Added long message support + * Added long message support. ## License From ed9d31d7a7b92eb10910f20e671860d33596aee0 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Fri, 27 Feb 2015 03:03:11 +0500 Subject: [PATCH 043/146] iojs engine fix --- src/encryptEngines/io.js | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/encryptEngines/io.js b/src/encryptEngines/io.js index cb2284c..68004b2 100644 --- a/src/encryptEngines/io.js +++ b/src/encryptEngines/io.js @@ -10,13 +10,11 @@ module.exports = function (keyPair, options) { if (options.encryptionScheme === 'pkcs1') { padding = constants.RSA_PKCS1_PADDING; } - - /* opennssl can't make it */ - if (padding === constants.RSA_PKCS1_OAEP_PADDING) { - return jsEngine.encrypt(buffer, usePrivate); - } - if (usePrivate) { + /* opennssl can't make it */ + if (padding === constants.RSA_PKCS1_OAEP_PADDING) { + return jsEngine.encrypt(buffer, usePrivate); + } return crypto.privateEncrypt({ key: options.rsaUtils.exportKey('private'), padding: padding @@ -35,12 +33,11 @@ module.exports = function (keyPair, options) { padding = constants.RSA_PKCS1_PADDING; } - /* opennssl can't make it */ - if (padding === constants.RSA_PKCS1_OAEP_PADDING) { - return jsEngine.decrypt(buffer, usePublic); - } - if (usePublic) { + /* opennssl can't make it */ + if (padding === constants.RSA_PKCS1_OAEP_PADDING) { + return jsEngine.decrypt(buffer, usePublic); + } return crypto.publicDecrypt({ key: options.rsaUtils.exportKey('public'), padding: padding From 4e843c85e6a413cbdbf1579112b11ce7b8d84fdc Mon Sep 17 00:00:00 2001 From: rzcoder Date: Fri, 27 Feb 2015 18:33:49 +0500 Subject: [PATCH 044/146] iojs engine fix --- src/encryptEngines/io.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/encryptEngines/io.js b/src/encryptEngines/io.js index 68004b2..40071a3 100644 --- a/src/encryptEngines/io.js +++ b/src/encryptEngines/io.js @@ -11,7 +11,7 @@ module.exports = function (keyPair, options) { padding = constants.RSA_PKCS1_PADDING; } if (usePrivate) { - /* opennssl can't make it */ + // openssl don't support oaep padding for private encrypt if (padding === constants.RSA_PKCS1_OAEP_PADDING) { return jsEngine.encrypt(buffer, usePrivate); } @@ -34,7 +34,7 @@ module.exports = function (keyPair, options) { } if (usePublic) { - /* opennssl can't make it */ + // openssl don't support oaep padding for public decrypt if (padding === constants.RSA_PKCS1_OAEP_PADDING) { return jsEngine.decrypt(buffer, usePublic); } From b4547a7513a815169b6042621474de155c2612c9 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Fri, 27 Feb 2015 18:34:13 +0500 Subject: [PATCH 045/146] iojs engine fix --- src/encryptEngines/io.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/encryptEngines/io.js b/src/encryptEngines/io.js index 40071a3..6c5c799 100644 --- a/src/encryptEngines/io.js +++ b/src/encryptEngines/io.js @@ -32,7 +32,6 @@ module.exports = function (keyPair, options) { if (options.encryptionScheme === 'pkcs1') { padding = constants.RSA_PKCS1_PADDING; } - if (usePublic) { // openssl don't support oaep padding for public decrypt if (padding === constants.RSA_PKCS1_OAEP_PADDING) { From 66f53233d74fd819c8997dfba92ef5e5ed048174 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Fri, 27 Feb 2015 19:09:04 +0500 Subject: [PATCH 046/146] code style fix --- src/libs/jsbn.js | 36 ++++++++++++++++++++++++------------ src/schemes/oaep.js | 2 +- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/libs/jsbn.js b/src/libs/jsbn.js index 3bca543..28ca2f2 100644 --- a/src/libs/jsbn.js +++ b/src/libs/jsbn.js @@ -182,13 +182,25 @@ function nbv(i) { // (protected) set from string and radix function bnpFromString(data, radix, unsigned) { var k; - switch(radix) { - case 2: k=1; break; - case 4: k=2; break; - case 8: k=3; break; - case 16: k=4; break; - case 32: k=5; break; - case 256: k=8; break; + switch (radix) { + case 2: + k = 1; + break; + case 4: + k = 2; + break; + case 8: + k = 3; + break; + case 16: + k = 4; + break; + case 32: + k = 5; + break; + case 256: + k = 8; + break; default: this.fromRadix(data, radix); return; @@ -839,13 +851,13 @@ function bnToBuffer(trimOrSize) { } function bnEquals(a) { - return(this.compareTo(a) == 0); + return (this.compareTo(a) == 0); } function bnMin(a) { - return(this.compareTo(a) < 0) ? this : a; + return (this.compareTo(a) < 0) ? this : a; } function bnMax(a) { - return(this.compareTo(a) > 0) ? this : a; + return (this.compareTo(a) > 0) ? this : a; } //(protected) r = this op a (bitwise) @@ -981,8 +993,8 @@ function bnBitCount() { //(public) true iff nth bit is set function bnTestBit(n) { var j = Math.floor(n / this.DB); - if (j >= this.t) return(this.s != 0); - return((this[j] & (1 << (n % this.DB))) != 0); + if (j >= this.t) return (this.s != 0); + return ((this[j] & (1 << (n % this.DB))) != 0); } //(protected) this op (1< Date: Sun, 1 Mar 2015 20:01:15 +0500 Subject: [PATCH 047/146] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a7c131e..27df938 100644 --- a/README.md +++ b/README.md @@ -215,7 +215,7 @@ Questions, comments, bug reports, and pull requests are all welcome. * Added `.encryptPrivate()` and `.decryptPublic()` methods. * Encrypt/decrypt methods in nodejs 0.12.x and io.js using native implementation (> 40x speed boost). * Fixed some regex issue causing catastrophic backtracking. - * *KNOWN ISSUE*:`encryptPrivate` and `decryptPublic` don't have native implementation in nodejs and can't be use in native implementation with pkcs1_oaep padding in io.js. + * *KNOWN ISSUE*: `encryptPrivate` and `decryptPublic` don't have native implementation in nodejs and can't be use in native implementation with pkcs1_oaep padding in io.js. ### 0.2.10 * **Methods `.exportPrivate()` and `.exportPublic()` was replaced by `.exportKey([format])`.** From c86d46f976645b70678143bd53ea50da09131f8b Mon Sep 17 00:00:00 2001 From: rzcoder Date: Tue, 3 Mar 2015 02:49:00 +0500 Subject: [PATCH 048/146] fix encrypt engine choice bug --- package.json | 2 +- src/encryptEngines/encryptEngines.js | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index f063666..9334353 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "0.2.20", + "version": "0.2.21", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { diff --git a/src/encryptEngines/encryptEngines.js b/src/encryptEngines/encryptEngines.js index ad22a9e..d359452 100644 --- a/src/encryptEngines/encryptEngines.js +++ b/src/encryptEngines/encryptEngines.js @@ -2,10 +2,8 @@ var crypt = require('crypto'); module.exports = { getEngine: function (keyPair, options) { - var engine; - if (options.environment === 'browser') { - engine = require('./js.js'); - } else { + var engine = require('./js.js'); + if (options.environment === 'node') { if (typeof crypt.publicEncrypt === 'function' && typeof crypt.privateDecrypt === 'function') { if (typeof crypt.privateEncrypt === 'function' && typeof crypt.publicDecrypt === 'function') { engine = require('./io.js'); From 9520a751864e2da32528de7d518ebaa3b7c9f533 Mon Sep 17 00:00:00 2001 From: Thomas Parisot Date: Mon, 2 Mar 2015 22:43:47 +0000 Subject: [PATCH 049/146] Create .travis.yml --- .travis.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..56e2e37 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,11 @@ +language: node_js +node_js: + - '0.8' + - '0.10' + - '0.12' + - 'iojs-v1.3' + +sudo: false + +before_install: + - npm install --global npm@latest From bb2168a8419ae086315a53d3e520f8c02322be95 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Tue, 3 Mar 2015 03:58:05 +0500 Subject: [PATCH 050/146] readme formating --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 27df938..5eb6fd3 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,6 @@ Based on jsbn library from Tom Wu http://www-cs-students.stanford.edu/~tjw/jsbn/ * Supports long messages for encrypt/decrypt * Signing and verifying - ## Example ```javascript @@ -23,7 +22,6 @@ var decrypted = key.decrypt(encrypted, 'utf8'); console.log('decrypted: ', decrypted); ``` - ## Installing ```shell From abe96ef9a42574c98f79318a2437c3824686c89b Mon Sep 17 00:00:00 2001 From: rzcoder Date: Tue, 3 Mar 2015 04:02:42 +0500 Subject: [PATCH 051/146] fix travis config --- .travis.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 56e2e37..bf30399 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,4 +8,8 @@ node_js: sudo: false before_install: - - npm install --global npm@latest + - npm install -g npm@latest + - npm install -g grunt-cli +install: + - npm install + From e6d442372289e8f4d5812ab2766e27ec23ac01b8 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Tue, 3 Mar 2015 04:15:00 +0500 Subject: [PATCH 052/146] fix gruntfile --- gruntfile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gruntfile.js b/gruntfile.js index 5cf07bf..ecdb7f1 100644 --- a/gruntfile.js +++ b/gruntfile.js @@ -16,7 +16,7 @@ module.exports = function (grunt) { simplemocha: { options: { - reporter: 'List' + reporter: 'list' }, all: {src: ['test/**/*.js']} } From f2914436e3b73aa922eef4f19ea2ac1135cc7f39 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Tue, 3 Mar 2015 16:19:59 +0500 Subject: [PATCH 053/146] removed node 0.8.x from travis --- .travis.yml | 1 - test/tests.js | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index bf30399..16098a9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,5 @@ language: node_js node_js: - - '0.8' - '0.10' - '0.12' - 'iojs-v1.3' diff --git a/test/tests.js b/test/tests.js index 0a2c901..2b60bdb 100644 --- a/test/tests.js +++ b/test/tests.js @@ -442,7 +442,7 @@ describe("NodeRSA", function(){ var key2 = null; var suit = dataBundle[i]; - it("`encrypt()` by browser" + i, function () { + it("`encrypt()` by browser " + i, function () { var key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); key1 = new NodeRSA(key, {environment: 'browser'}); key2 = new NodeRSA(key, {environment: 'node'}); @@ -451,7 +451,7 @@ describe("NodeRSA", function(){ assert(encrypted[i].length > 0); }); - it("`decrypt()` by node" + i, function () { + it("`decrypt()` by node " + i, function () { decrypted[i] = key2.decrypt(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); if (Buffer.isBuffer(decrypted[i])) { assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); From 4382a4bac8ae3916373472f0c0752edbad6d60b0 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Tue, 3 Mar 2015 17:39:13 +0500 Subject: [PATCH 054/146] removed native support for `encryptPrivate` and `decryptPublic` --- README.md | 3 +++ package.json | 2 +- src/encryptEngines/encryptEngines.js | 8 +++++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5eb6fd3..dda2643 100644 --- a/README.md +++ b/README.md @@ -209,6 +209,9 @@ Questions, comments, bug reports, and pull requests are all welcome. ## Changelog +### 0.2.22 + * Native support for `encryptPrivate` and `decryptPublic` in io.js caused error in linux and was removed. + ### 0.2.20 * Added `.encryptPrivate()` and `.decryptPublic()` methods. * Encrypt/decrypt methods in nodejs 0.12.x and io.js using native implementation (> 40x speed boost). diff --git a/package.json b/package.json index 9334353..59239e3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "0.2.21", + "version": "0.2.22", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { diff --git a/src/encryptEngines/encryptEngines.js b/src/encryptEngines/encryptEngines.js index d359452..21d9c83 100644 --- a/src/encryptEngines/encryptEngines.js +++ b/src/encryptEngines/encryptEngines.js @@ -5,11 +5,17 @@ module.exports = { var engine = require('./js.js'); if (options.environment === 'node') { if (typeof crypt.publicEncrypt === 'function' && typeof crypt.privateDecrypt === 'function') { + engine = require('./node12.js'); + + /* + + io.js privateEncrypt/publicDecrypt with different environments causing error in linux + if (typeof crypt.privateEncrypt === 'function' && typeof crypt.publicDecrypt === 'function') { engine = require('./io.js'); } else { engine = require('./node12.js'); - } + }*/ } } return engine(keyPair, options); From a838ee00efb0359ccd79c50fd2b152ba69d8f853 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Tue, 3 Mar 2015 18:48:08 +0500 Subject: [PATCH 055/146] test formatting --- test/tests.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/tests.js b/test/tests.js index 2b60bdb..f84754e 100644 --- a/test/tests.js +++ b/test/tests.js @@ -502,7 +502,7 @@ describe("NodeRSA", function(){ var key2 = null; var suit = dataBundle[i]; - it("`encrypt()` by node" + i, function () { + it("`encrypt()` by node " + i, function () { var key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); key1 = new NodeRSA(key, {environment: 'node'}); key2 = new NodeRSA(key, {environment: 'browser'}); @@ -511,7 +511,7 @@ describe("NodeRSA", function(){ assert(encrypted[i].length > 0); }); - it("`decrypt()` by browser" + i, function () { + it("`decrypt()` by browser " + i, function () { decrypted[i] = key2.decrypt(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); if (Buffer.isBuffer(decrypted[i])) { assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); @@ -567,7 +567,7 @@ describe("NodeRSA", function(){ } for (var env in envs) { (function (env) { - describe("Good cases" + (envs.length > 1 ? " in " + env + " environment" : ""), function () { + describe("Good cases " + (envs.length > 1 ? " in " + env + " environment" : ""), function () { var signed = {}; var key = null; From 458900c4451ad10d29dec1bf368256dc035f8c72 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Tue, 3 Mar 2015 08:41:31 -0800 Subject: [PATCH 056/146] privateEncrypt padding fix --- README.md | 3 +- src/encryptEngines/encryptEngines.js | 8 +- src/encryptEngines/io.js | 32 ++- src/encryptEngines/js.js | 22 ++- src/encryptEngines/node12.js | 2 +- src/schemes/pkcs1.js | 89 +++++++-- test/tests.js | 280 ++++++++++++++------------- 7 files changed, 251 insertions(+), 185 deletions(-) diff --git a/README.md b/README.md index dda2643..d413da6 100644 --- a/README.md +++ b/README.md @@ -210,13 +210,12 @@ Questions, comments, bug reports, and pull requests are all welcome. ## Changelog ### 0.2.22 - * Native support for `encryptPrivate` and `decryptPublic` in io.js caused error in linux and was removed. + * `encryptPrivate` and `decryptPublic` now using only pkcs1 (type 1) padding. ### 0.2.20 * Added `.encryptPrivate()` and `.decryptPublic()` methods. * Encrypt/decrypt methods in nodejs 0.12.x and io.js using native implementation (> 40x speed boost). * Fixed some regex issue causing catastrophic backtracking. - * *KNOWN ISSUE*: `encryptPrivate` and `decryptPublic` don't have native implementation in nodejs and can't be use in native implementation with pkcs1_oaep padding in io.js. ### 0.2.10 * **Methods `.exportPrivate()` and `.exportPublic()` was replaced by `.exportKey([format])`.** diff --git a/src/encryptEngines/encryptEngines.js b/src/encryptEngines/encryptEngines.js index 21d9c83..d359452 100644 --- a/src/encryptEngines/encryptEngines.js +++ b/src/encryptEngines/encryptEngines.js @@ -5,17 +5,11 @@ module.exports = { var engine = require('./js.js'); if (options.environment === 'node') { if (typeof crypt.publicEncrypt === 'function' && typeof crypt.privateDecrypt === 'function') { - engine = require('./node12.js'); - - /* - - io.js privateEncrypt/publicDecrypt with different environments causing error in linux - if (typeof crypt.privateEncrypt === 'function' && typeof crypt.publicDecrypt === 'function') { engine = require('./io.js'); } else { engine = require('./node12.js'); - }*/ + } } } return engine(keyPair, options); diff --git a/src/encryptEngines/io.js b/src/encryptEngines/io.js index 6c5c799..6170e88 100644 --- a/src/encryptEngines/io.js +++ b/src/encryptEngines/io.js @@ -2,24 +2,21 @@ var crypto = require('crypto'); var constants = require('constants'); module.exports = function (keyPair, options) { - var jsEngine = require('./js.js')(keyPair); + var jsEngine = require('./js.js')(keyPair, options); return { encrypt: function (buffer, usePrivate) { - var padding = constants.RSA_PKCS1_OAEP_PADDING; - if (options.encryptionScheme === 'pkcs1') { - padding = constants.RSA_PKCS1_PADDING; - } if (usePrivate) { - // openssl don't support oaep padding for private encrypt - if (padding === constants.RSA_PKCS1_OAEP_PADDING) { - return jsEngine.encrypt(buffer, usePrivate); - } return crypto.privateEncrypt({ key: options.rsaUtils.exportKey('private'), - padding: padding + padding: constants.RSA_PKCS1_PADDING }, buffer); } else { + var padding = constants.RSA_PKCS1_OAEP_PADDING; + if (options.encryptionScheme === 'pkcs1') { + padding = constants.RSA_PKCS1_PADDING; + } + return crypto.publicEncrypt({ key: options.rsaUtils.exportKey('public'), padding: padding @@ -28,20 +25,17 @@ module.exports = function (keyPair, options) { }, decrypt: function (buffer, usePublic) { - var padding = constants.RSA_PKCS1_OAEP_PADDING; - if (options.encryptionScheme === 'pkcs1') { - padding = constants.RSA_PKCS1_PADDING; - } if (usePublic) { - // openssl don't support oaep padding for public decrypt - if (padding === constants.RSA_PKCS1_OAEP_PADDING) { - return jsEngine.decrypt(buffer, usePublic); - } return crypto.publicDecrypt({ key: options.rsaUtils.exportKey('public'), - padding: padding + padding: constants.RSA_PKCS1_PADDING }, buffer); } else { + var padding = constants.RSA_PKCS1_OAEP_PADDING; + if (options.encryptionScheme === 'pkcs1') { + padding = constants.RSA_PKCS1_PADDING; + } + return crypto.privateDecrypt({ key: options.rsaUtils.exportKey('private'), padding: padding diff --git a/src/encryptEngines/js.js b/src/encryptEngines/js.js index 6f9d756..099bc15 100644 --- a/src/encryptEngines/js.js +++ b/src/encryptEngines/js.js @@ -1,17 +1,31 @@ var BigInteger = require('../libs/jsbn.js'); +var schemes = require('../schemes/schemes.js'); module.exports = function (keyPair, options) { + var pkcs1Scheme = schemes.pkcs1.makeScheme(keyPair, options); + return { encrypt: function (buffer, usePrivate) { - var m = new BigInteger(keyPair.encryptionScheme.encPad(buffer)); - var c = usePrivate ? keyPair.$doPrivate(m) : keyPair.$doPublic(m); + if (usePrivate) { + var m = new BigInteger(pkcs1Scheme.encPad(buffer, {type: 1})); + var c = keyPair.$doPrivate(m); + } else { + var m = new BigInteger(keyPair.encryptionScheme.encPad(buffer)); + var c = keyPair.$doPublic(m); + } return c.toBuffer(keyPair.encryptedDataLength); }, decrypt: function (buffer, usePublic) { var c = new BigInteger(buffer); - var m = usePublic ? keyPair.$doPublic(c) : keyPair.$doPrivate(c); - return keyPair.encryptionScheme.encUnPad(m.toBuffer(keyPair.encryptedDataLength)); + + if (usePublic) { + var m = keyPair.$doPublic(c); + return pkcs1Scheme.encUnPad(m.toBuffer(keyPair.encryptedDataLength), {type: 1}); + } else { + var m = keyPair.$doPrivate(c); + return keyPair.encryptionScheme.encUnPad(m.toBuffer(keyPair.encryptedDataLength)); + } } }; }; \ No newline at end of file diff --git a/src/encryptEngines/node12.js b/src/encryptEngines/node12.js index d1e065d..25b9b9d 100644 --- a/src/encryptEngines/node12.js +++ b/src/encryptEngines/node12.js @@ -2,7 +2,7 @@ var crypto = require('crypto'); var constants = require('constants'); module.exports = function (keyPair, options) { - var jsEngine = require('./js.js')(keyPair); + var jsEngine = require('./js.js')(keyPair, options); return { encrypt: function (buffer, usePrivate) { diff --git a/src/schemes/pkcs1.js b/src/schemes/pkcs1.js index d6907c6..98c5d41 100644 --- a/src/schemes/pkcs1.js +++ b/src/schemes/pkcs1.js @@ -39,32 +39,55 @@ module.exports.makeScheme = function (key, options) { /** * Pad input Buffer to encryptedDataLength bytes, and return new Buffer - * alg: PKCS#1 (type 2, random) + * alg: PKCS#1 * @param buffer * @returns {Buffer} */ - Scheme.prototype.encPad = function (buffer) { + Scheme.prototype.encPad = function (buffer, options) { + options = options || {}; if (buffer.length > this.key.maxMessageLength) { throw new Error("Message too long for RSA (n=" + this.key.encryptedDataLength + ", l=" + buffer.length + ")"); } - // TODO: make n-length buffer - var ba = Array.prototype.slice.call(buffer, 0); + if (options.type === 1) { + var filled = new Buffer(this.key.encryptedDataLength - buffer.length - 1); + filled.fill(0xff, 0, filled.length - 1); + filled[0] = 1; + filled[filled.length - 1] = 0; - // random padding - ba.unshift(0); - var rand = crypt.randomBytes(this.key.encryptedDataLength - ba.length - 2); - for (var i = 0; i < rand.length; i++) { - var r = rand[i]; - while (r === 0) { // non-zero only - r = crypt.randomBytes(1)[0]; + return Buffer.concat([filled, buffer]); + } else { + /*// random padding + // TODO: make n-length buffer + var ba = Array.prototype.slice.call(buffer, 0); + ba.unshift(0); + var rand = crypt.randomBytes(this.key.encryptedDataLength - ba.length - 2); + for (var i = 0; i < rand.length; i++) { + var r = rand[i]; + while (r === 0) { // non-zero only + r = crypt.randomBytes(1)[0]; + } + ba.unshift(r); + } + ba.unshift(2); + ba.unshift(0); + // return ba; + */ + + var filled = new Buffer(this.key.encryptedDataLength - buffer.length); + filled[0] = 0; + filled[1] = 2; + var rand = crypt.randomBytes(filled.length - 3); + for (var i = 0; i < rand.length; i++) { + var r = rand[i]; + while (r === 0) { // non-zero only + r = crypt.randomBytes(1)[0]; + } + filled[i + 2] = r; } - ba.unshift(r); + filled[filled.length - 1] = 0; + return Buffer.concat([filled, buffer]); } - ba.unshift(2); - ba.unshift(0); - - return ba; }; /** @@ -73,10 +96,38 @@ module.exports.makeScheme = function (key, options) { * @param buffer * @returns {Buffer} */ - Scheme.prototype.encUnPad = function (buffer) { - //var buffer = buffer.toByteArray(); + Scheme.prototype.encUnPad = function (buffer, options) { + options = options || {}; var i = 0; + if (buffer.length < 4) { + return null; + } + + if (options.type === 1) { + if (buffer[0] !== 0 && buffer[1] !== 1) { + return null; + } + i = 3; + while (buffer[i] !== 0) { + if (buffer[i] != 0xFF || ++i >= buffer.length) { + return null; + } + } + } else { + if (buffer[0] !== 0 && buffer[1] !== 2) { + return null; + } + i = 3; + while (buffer[i] !== 0) { + if (++i >= buffer.length) { + return null; + } + } + } + return buffer.slice(i + 1, buffer.length); + /*var i = 0; + while (i < buffer.length && buffer[i] === 0) { ++i; } @@ -96,7 +147,7 @@ module.exports.makeScheme = function (key, options) { var res = new Buffer(buffer.length - i - 1); while (++i < buffer.length) { res[c++] = buffer[i] & 255; - } + }*/ return res; }; diff --git a/test/tests.js b/test/tests.js index f84754e..23f8451 100644 --- a/test/tests.js +++ b/test/tests.js @@ -380,31 +380,7 @@ describe("NodeRSA", function(){ })(i); } - for (var i in dataBundle) { - (function (i) { - var key = null; - var suit = dataBundle[i]; - it("`encryptPrivate()` should encrypt " + i, function () { - key = new NodeRSA(generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(), { - environment: env, - encryptionScheme: scheme - }); - encrypted[i] = key.encryptPrivate(suit.data); - assert(Buffer.isBuffer(encrypted[i])); - assert(encrypted[i].length > 0); - }); - - it("`decryptPublic()` should decrypt " + i, function () { - decrypted[i] = key.decryptPublic(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); - if (Buffer.isBuffer(decrypted[i])) { - assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); - } else { - assert(_.isEqual(suit.data, decrypted[i])); - } - }); - })(i); - } }); describe("Bad cases", function () { @@ -430,129 +406,167 @@ describe("NodeRSA", function(){ }); })(encryptSchemes[scheme_i]); } + + describe("Environment: " + env + ". encryptPrivate & decryptPublic", function () { + var encrypted = {}; + var decrypted = {}; + for (var i in dataBundle) { + (function (i) { + var key = null; + var suit = dataBundle[i]; + + it("`encryptPrivate()` should encrypt " + i, function () { + key = new NodeRSA(generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(), { + environment: env + }); + encrypted[i] = key.encryptPrivate(suit.data); + assert(Buffer.isBuffer(encrypted[i])); + assert(encrypted[i].length > 0); + }); + + it("`decryptPublic()` should decrypt " + i, function () { + decrypted[i] = key.decryptPublic(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); + if (Buffer.isBuffer(decrypted[i])) { + assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); + } else { + assert(_.isEqual(suit.data, decrypted[i])); + } + }); + })(i); + } + }); })(environments[env]); } describe("Compatibility of different environments", function () { - var encrypted = {}; - var decrypted = {}; - for (var i in dataBundle) { - (function (i) { - var key1 = null; - var key2 = null; - var suit = dataBundle[i]; - - it("`encrypt()` by browser " + i, function () { - var key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); - key1 = new NodeRSA(key, {environment: 'browser'}); - key2 = new NodeRSA(key, {environment: 'node'}); - encrypted[i] = key1.encrypt(suit.data); - assert(Buffer.isBuffer(encrypted[i])); - assert(encrypted[i].length > 0); - }); + for (var scheme_i in encryptSchemes) { + (function (scheme) { + var encrypted = {}; + var decrypted = {}; + for (var i in dataBundle) { + (function (i) { + var key1 = null; + var key2 = null; + var suit = dataBundle[i]; + + it("Encryption scheme: " + scheme + " `encrypt()` by browser " + i, function () { + var key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); + key1 = new NodeRSA(key, { + environment: 'browser', + encryptionScheme: scheme + }); + key2 = new NodeRSA(key, { + environment: 'node', + encryptionScheme: scheme + }); + encrypted[i] = key1.encrypt(suit.data); + assert(Buffer.isBuffer(encrypted[i])); + assert(encrypted[i].length > 0); + }); - it("`decrypt()` by node " + i, function () { - decrypted[i] = key2.decrypt(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); - if (Buffer.isBuffer(decrypted[i])) { - assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); - } else { - assert(_.isEqual(suit.data, decrypted[i])); - } - }); - })(i); - } + it("Encryption scheme: " + scheme + " `decrypt()` by node " + i, function () { + decrypted[i] = key2.decrypt(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); + if (Buffer.isBuffer(decrypted[i])) { + assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); + } else { + assert(_.isEqual(suit.data, decrypted[i])); + } + }); + })(i); + } - for (var i in dataBundle) { - (function (i) { - var key1 = null; - var key2 = null; - var suit = dataBundle[i]; - - it("`encryptPrivate()` by browser " + i, function () { - var key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); - key1 = new NodeRSA(key, { - environment: 'browser', - encryptionScheme: 'pkcs1' - }); - key2 = new NodeRSA(key, { - environment: 'node', - encryptionScheme: 'pkcs1' - }); - encrypted[i] = key1.encryptPrivate(suit.data); - assert(Buffer.isBuffer(encrypted[i])); - assert(encrypted[i].length > 0); - }); + var encrypted = {}; + var decrypted = {}; + for (var i in dataBundle) { + (function (i) { + var key1 = null; + var key2 = null; + var suit = dataBundle[i]; + + it("Encryption scheme: " + scheme + " `encrypt()` by node " + i + ". Scheme", function () { + var key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); + key1 = new NodeRSA(key, { + environment: 'node', + encryptionScheme: scheme + }); + key2 = new NodeRSA(key, { + environment: 'browser', + encryptionScheme: scheme + }); + encrypted[i] = key1.encrypt(suit.data); + assert(Buffer.isBuffer(encrypted[i])); + assert(encrypted[i].length > 0); + }); - it("`decryptPublic()` by node " + i, function () { - decrypted[i] = key2.decryptPublic(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); - if (Buffer.isBuffer(decrypted[i])) { - assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); - } else { - assert(_.isEqual(suit.data, decrypted[i])); - } - }); - })(i); + it("Encryption scheme: " + scheme + " `decrypt()` by browser " + i, function () { + decrypted[i] = key2.decrypt(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); + if (Buffer.isBuffer(decrypted[i])) { + assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); + } else { + assert(_.isEqual(suit.data, decrypted[i])); + } + }); + })(i); + } + })(encryptSchemes[scheme_i]); } - var encrypted = {}; - var decrypted = {}; - for (var i in dataBundle) { - (function (i) { - var key1 = null; - var key2 = null; - var suit = dataBundle[i]; - - it("`encrypt()` by node " + i, function () { - var key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); - key1 = new NodeRSA(key, {environment: 'node'}); - key2 = new NodeRSA(key, {environment: 'browser'}); - encrypted[i] = key1.encrypt(suit.data); - assert(Buffer.isBuffer(encrypted[i])); - assert(encrypted[i].length > 0); - }); - it("`decrypt()` by browser " + i, function () { - decrypted[i] = key2.decrypt(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); - if (Buffer.isBuffer(decrypted[i])) { - assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); - } else { - assert(_.isEqual(suit.data, decrypted[i])); - } - }); - })(i); - } + describe("encryptPrivate & decryptPublic", function () { + var encrypted = {}; + var decrypted = {}; + for (var i in dataBundle) { + (function (i) { + var key1 = null; + var key2 = null; + var suit = dataBundle[i]; + + it("`encryptPrivate()` by browser " + i, function () { + var key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); + key1 = new NodeRSA(key, {environment: 'browser'}); + key2 = new NodeRSA(key, {environment: 'node'}); + encrypted[i] = key1.encryptPrivate(suit.data); + assert(Buffer.isBuffer(encrypted[i])); + assert(encrypted[i].length > 0); + }); - for (var i in dataBundle) { - (function (i) { - var key1 = null; - var key2 = null; - var suit = dataBundle[i]; - - it("`encryptPrivate()` by node " + i, function () { - var key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); - key1 = new NodeRSA(key, { - environment: 'browser', - encryptionScheme: 'pkcs1' + it("`decryptPublic()` by node " + i, function () { + decrypted[i] = key2.decryptPublic(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); + if (Buffer.isBuffer(decrypted[i])) { + assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); + } else { + assert(_.isEqual(suit.data, decrypted[i])); + } }); - key2 = new NodeRSA(key, { - environment: 'node', - encryptionScheme: 'pkcs1' + })(i); + } + + for (var i in dataBundle) { + (function (i) { + var key1 = null; + var key2 = null; + var suit = dataBundle[i]; + + it("`encryptPrivate()` by node " + i, function () { + var key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); + key1 = new NodeRSA(key, {environment: 'browser'}); + key2 = new NodeRSA(key, {environment: 'node'}); + encrypted[i] = key1.encryptPrivate(suit.data); + assert(Buffer.isBuffer(encrypted[i])); + assert(encrypted[i].length > 0); }); - encrypted[i] = key1.encryptPrivate(suit.data); - assert(Buffer.isBuffer(encrypted[i])); - assert(encrypted[i].length > 0); - }); - it("`decryptPublic()` by browser " + i, function () { - decrypted[i] = key2.decryptPublic(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); - if (Buffer.isBuffer(decrypted[i])) { - assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); - } else { - assert(_.isEqual(suit.data, decrypted[i])); - } - }); - })(i); - } + it("`decryptPublic()` by browser " + i, function () { + decrypted[i] = key2.decryptPublic(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); + if (Buffer.isBuffer(decrypted[i])) { + assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); + } else { + assert(_.isEqual(suit.data, decrypted[i])); + } + }); + })(i); + } + }); }); }); From 1829853e59f8e97086cc5bead238079628310b90 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Tue, 3 Mar 2015 21:47:16 +0500 Subject: [PATCH 057/146] formatting --- src/encryptEngines/js.js | 15 ++-- src/schemes/pkcs1.js | 46 +----------- test/tests.js | 155 ++++++++++++++++++++------------------- 3 files changed, 92 insertions(+), 124 deletions(-) diff --git a/src/encryptEngines/js.js b/src/encryptEngines/js.js index 099bc15..0b2cbcd 100644 --- a/src/encryptEngines/js.js +++ b/src/encryptEngines/js.js @@ -6,24 +6,25 @@ module.exports = function (keyPair, options) { return { encrypt: function (buffer, usePrivate) { + var m, c; if (usePrivate) { - var m = new BigInteger(pkcs1Scheme.encPad(buffer, {type: 1})); - var c = keyPair.$doPrivate(m); + m = new BigInteger(pkcs1Scheme.encPad(buffer, {type: 1})); + c = keyPair.$doPrivate(m); } else { - var m = new BigInteger(keyPair.encryptionScheme.encPad(buffer)); - var c = keyPair.$doPublic(m); + m = new BigInteger(keyPair.encryptionScheme.encPad(buffer)); + c = keyPair.$doPublic(m); } return c.toBuffer(keyPair.encryptedDataLength); }, decrypt: function (buffer, usePublic) { - var c = new BigInteger(buffer); + var m, c = new BigInteger(buffer); if (usePublic) { - var m = keyPair.$doPublic(c); + m = keyPair.$doPublic(c); return pkcs1Scheme.encUnPad(m.toBuffer(keyPair.encryptedDataLength), {type: 1}); } else { - var m = keyPair.$doPrivate(c); + m = keyPair.$doPrivate(c); return keyPair.encryptionScheme.encUnPad(m.toBuffer(keyPair.encryptedDataLength)); } } diff --git a/src/schemes/pkcs1.js b/src/schemes/pkcs1.js index 98c5d41..6c5c25e 100644 --- a/src/schemes/pkcs1.js +++ b/src/schemes/pkcs1.js @@ -45,36 +45,20 @@ module.exports.makeScheme = function (key, options) { */ Scheme.prototype.encPad = function (buffer, options) { options = options || {}; + var filled; if (buffer.length > this.key.maxMessageLength) { throw new Error("Message too long for RSA (n=" + this.key.encryptedDataLength + ", l=" + buffer.length + ")"); } if (options.type === 1) { - var filled = new Buffer(this.key.encryptedDataLength - buffer.length - 1); + filled = new Buffer(this.key.encryptedDataLength - buffer.length - 1); filled.fill(0xff, 0, filled.length - 1); filled[0] = 1; filled[filled.length - 1] = 0; return Buffer.concat([filled, buffer]); } else { - /*// random padding - // TODO: make n-length buffer - var ba = Array.prototype.slice.call(buffer, 0); - ba.unshift(0); - var rand = crypt.randomBytes(this.key.encryptedDataLength - ba.length - 2); - for (var i = 0; i < rand.length; i++) { - var r = rand[i]; - while (r === 0) { // non-zero only - r = crypt.randomBytes(1)[0]; - } - ba.unshift(r); - } - ba.unshift(2); - ba.unshift(0); - // return ba; - */ - - var filled = new Buffer(this.key.encryptedDataLength - buffer.length); + filled = new Buffer(this.key.encryptedDataLength - buffer.length); filled[0] = 0; filled[1] = 2; var rand = crypt.randomBytes(filled.length - 3); @@ -126,30 +110,6 @@ module.exports.makeScheme = function (key, options) { } } return buffer.slice(i + 1, buffer.length); - /*var i = 0; - - while (i < buffer.length && buffer[i] === 0) { - ++i; - } - - if (buffer.length - i != this.key.encryptedDataLength - 1 || buffer[i] != 2) { - return null; - } - - ++i; - while (buffer[i] !== 0) { - if (++i >= buffer.length) { - return null; - } - } - - var c = 0; - var res = new Buffer(buffer.length - i - 1); - while (++i < buffer.length) { - res[c++] = buffer[i] & 255; - }*/ - - return res; }; Scheme.prototype.sign = function (buffer) { diff --git a/test/tests.js b/test/tests.js index 23f8451..4af8516 100644 --- a/test/tests.js +++ b/test/tests.js @@ -7,7 +7,7 @@ var assert = require("chai").assert; var _ = require("lodash"); var NodeRSA = require("../src/NodeRSA"); -describe("NodeRSA", function(){ +describe("NodeRSA", function () { var keySizes = [ {b: 512, e: 3}, {b: 512, e: 5}, @@ -47,11 +47,11 @@ describe("NodeRSA", function(){ encoding: "buffer" }, "json object": { - data: {str: "string", arr: ["a","r","r", "a", "y", true, "⑨"], int: 42, nested: {key: {key: 1}}}, + data: {str: "string", arr: ["a", "r", "r", "a", "y", true, "⑨"], int: 42, nested: {key: {key: 1}}}, encoding: "json" }, "json array": { - data: [1,2,3,4,5,6,7,8,9,[10,11,12,[13],14,15,[16,17,[18]]]], + data: [1, 2, 3, 4, 5, 6, 7, 8, 9, [10, 11, 12, [13], 14, 15, [16, 17, [18]]]], encoding: "json" } }; @@ -60,7 +60,7 @@ describe("NodeRSA", function(){ var privateNodeRSA = null; var publicNodeRSA = null; - describe("Setup options", function(){ + describe("Setup options", function () { it("should use browser environment", function () { assert.equal((new NodeRSA(null, {environment: 'browser'})).$options.environment, 'browser'); }); @@ -141,7 +141,7 @@ describe("NodeRSA", function(){ assert.equal(key.$options.signingScheme, 'pkcs1'); assert.equal(key.$options.signingSchemeOptions.hash, 'sha256'); - assert.throw(function(){ + assert.throw(function () { key.setOptions({ environment: 'browser', signingScheme: 'md4' @@ -150,8 +150,8 @@ describe("NodeRSA", function(){ }); }); - describe("Work with keys", function() { - describe("Generating keys", function() { + describe("Work with keys", function () { + describe("Generating keys", function () { for (var size in keySizes) { (function (size) { it("should make key pair " + size.b + "-bit length and public exponent is " + (size.e ? size.e : size.e + " and should be 65537"), function () { @@ -166,69 +166,69 @@ describe("NodeRSA", function(){ } }); - describe("Imprt/Export keys", function(){ - var privateKeyPKCS1 = "-----BEGIN RSA PRIVATE KEY-----\n"+ - "MIIFwgIBAAKCAUEAsE1edyfToZRv6cFOkB0tAJ5qJor4YF5CccJAL0fS/o1Yk10V\n"+ - "SXH4Xx4peSJgYQKkO0HqO1hAz6k9dFQB4U1CnWtRjtNEcIfycqrZrhu6you5syb6\n"+ - "ScV3Zu/9bm7/DyaLlx/gJhUPR1OxOzaqsEvlu7hbDhNLIYo1zKFb/aUBbD6+UcaG\n"+ - "xH2BfFNdzVAtVSVpc/s2Y3sboMN7rByUj7937iQlaMINvVjyasynYuzHNw6ZRP9J\n"+ - "P9fwxrCyaxnTPWxVl0qvVaQO2+TtFMtDXH2OVZtWWeLHAL8cildw0G+u2qVqTqIG\n"+ - "EwNyJlsAHykaPFAMW0xLueumrSlB+JUJPrRvvw4nBCd4GOrNSlPCE/xlk1Cb8JaI\n"+ - "CTLvDUcYc3ZqL3jqAueBhkpw2uCz8xVJeOA1KY4kQIIx8JEBsAYzgyP2iy0CAwEA\n"+ - "AQKCAUAjBcudShkdgRpWSmNr94/IDrAxpeu/YRo79QXBHriIftW4uIYRCAX6B0jf\n"+ - "2ndg7iBn8Skxzs9ZMVqW8FVLR4jTMs2J3Og8npUIOG5zyuhpciZas4SHASY+GbCz\n"+ - "rnMWtGaIh/mENyzI05RimfKAgSNLDk1wV17Wc9lKJEfc9Fl7Al/WaOS+xdviMcFx\n"+ - "ltrajksLkjz0uDD917eKskbE45lULfGqeI0kYDadWp88pw6ikXJln2p3Y1PNQF3e\n"+ - "y2cN+Snzd0jx/c5fD9B1zxKYv5bUo+UnTzBxV81e9xCJfkdXv+6D5qDn1gGLdZZa\n"+ - "5FxtZbRgVh/ZlqP9xYr72as/WFmIA20wRgHPgWvLyHsh0XThqZf2/O3R8KmFv8aT\n"+ - "+kmc5is6sVItIIi7ltorVapTkJai3zz/VSMBBaL+ytFN9jVl4QKBoQDfL8TMeZXu\n"+ - "gBTN7yq6zZWN8+60MUaxz0/lKdzmo35z32rpVKdsYd922pmcsNYaoj/H9L3j/NP4\n"+ - "9z+SHfYpWvTa7AvJfNlXYc3BRXIarpfnXsm65IzKzHaF9i2xdXxkfTEYIvOQDMLF\n"+ - "SiiObWJMV+QqUxb3luu3/CR3IcbgeTOpdiC/T/Zl/YYl17JqZTHmLFZPq7xewttg\n"+ - "zQorDRWIFDtlAoGhAMo4+uM9f4BpOHSmayhLhHArIGs4386BkXSeOLeQitaQJ/2c\n"+ - "zb459O87XoCAonZbq+dI7XRnBU3toQvEsZgrtGkOFXCZJMWAQxD5BQ5vEYT6c86h\n"+ - "uGpX6h3ODlJ6UGi+5CWyMQ1cFlBkfffFAarjSYTVlyj736sOeDuJWX133z5VQBQ8\n"+ - "1xSH23kNF95vxB4I1fXG8WL11YZU7VEwSLC4aCkCgaAKRj+wDhTZ4umSRWVZLiep\n"+ - "XkZp4y7W9q095nx13abvnKRmU3BVq/fGl++kZ/ujRD7dbKXlPflgJ7m0d06ivr4w\n"+ - "6dbtEqNKw4TeVd0X31u82f89bFIS7/Cw4BFgbwEn+x9sdgdyZTP+MxjE3cI9s3oc\n"+ - "fLC8+ySk1qWzGkn2gX3gWkDNrdexAEfRrClZfokaiIX8qvJEBoJk5WuHadXI6u2F\n"+ - "AoGgByidOQ4kRVd0OCzr/jEuLwpXy3Pn+Fd93rL7LwRe5dmUkNXMMr+6e/2OCt6C\n"+ - "4c28+CMMxOIgvfF7kf8Uil6BtHZbK/E/6/3uYdtu4mPsKtjy4I25CYqzLvrsZt8N\n"+ - "maeoS+1S7zYjVBU6oFrJBFOndpxZDYpdEKEigHkMQfTMYliCPDUrJ/7nNhHQln8+\n"+ - "YhHOATVZtjcdp/O5svYSnK7qgQKBoDd3lFWrPatgxpF1JXMEFFbaIRdNxHkKA4YY\n"+ - "gMTM4MPgViunYX/yJ7SaX8jWnC231A9uVn4+kb+DvKjc+ZuTQvnIUK2u6LvIinVF\n"+ - "snDEA+BbXwehAtwdHDMDtqYFdx4hvCWQwBNn4p3J0OO2tbYVMtvM5aOEfRSYagfm\n"+ - "RywhDUAjW8U0RBnzlmXhQQ6B9bjqooS2MsRrJrS5CU682fb3hBo=\n"+ + describe("Imprt/Export keys", function () { + var privateKeyPKCS1 = "-----BEGIN RSA PRIVATE KEY-----\n" + + "MIIFwgIBAAKCAUEAsE1edyfToZRv6cFOkB0tAJ5qJor4YF5CccJAL0fS/o1Yk10V\n" + + "SXH4Xx4peSJgYQKkO0HqO1hAz6k9dFQB4U1CnWtRjtNEcIfycqrZrhu6you5syb6\n" + + "ScV3Zu/9bm7/DyaLlx/gJhUPR1OxOzaqsEvlu7hbDhNLIYo1zKFb/aUBbD6+UcaG\n" + + "xH2BfFNdzVAtVSVpc/s2Y3sboMN7rByUj7937iQlaMINvVjyasynYuzHNw6ZRP9J\n" + + "P9fwxrCyaxnTPWxVl0qvVaQO2+TtFMtDXH2OVZtWWeLHAL8cildw0G+u2qVqTqIG\n" + + "EwNyJlsAHykaPFAMW0xLueumrSlB+JUJPrRvvw4nBCd4GOrNSlPCE/xlk1Cb8JaI\n" + + "CTLvDUcYc3ZqL3jqAueBhkpw2uCz8xVJeOA1KY4kQIIx8JEBsAYzgyP2iy0CAwEA\n" + + "AQKCAUAjBcudShkdgRpWSmNr94/IDrAxpeu/YRo79QXBHriIftW4uIYRCAX6B0jf\n" + + "2ndg7iBn8Skxzs9ZMVqW8FVLR4jTMs2J3Og8npUIOG5zyuhpciZas4SHASY+GbCz\n" + + "rnMWtGaIh/mENyzI05RimfKAgSNLDk1wV17Wc9lKJEfc9Fl7Al/WaOS+xdviMcFx\n" + + "ltrajksLkjz0uDD917eKskbE45lULfGqeI0kYDadWp88pw6ikXJln2p3Y1PNQF3e\n" + + "y2cN+Snzd0jx/c5fD9B1zxKYv5bUo+UnTzBxV81e9xCJfkdXv+6D5qDn1gGLdZZa\n" + + "5FxtZbRgVh/ZlqP9xYr72as/WFmIA20wRgHPgWvLyHsh0XThqZf2/O3R8KmFv8aT\n" + + "+kmc5is6sVItIIi7ltorVapTkJai3zz/VSMBBaL+ytFN9jVl4QKBoQDfL8TMeZXu\n" + + "gBTN7yq6zZWN8+60MUaxz0/lKdzmo35z32rpVKdsYd922pmcsNYaoj/H9L3j/NP4\n" + + "9z+SHfYpWvTa7AvJfNlXYc3BRXIarpfnXsm65IzKzHaF9i2xdXxkfTEYIvOQDMLF\n" + + "SiiObWJMV+QqUxb3luu3/CR3IcbgeTOpdiC/T/Zl/YYl17JqZTHmLFZPq7xewttg\n" + + "zQorDRWIFDtlAoGhAMo4+uM9f4BpOHSmayhLhHArIGs4386BkXSeOLeQitaQJ/2c\n" + + "zb459O87XoCAonZbq+dI7XRnBU3toQvEsZgrtGkOFXCZJMWAQxD5BQ5vEYT6c86h\n" + + "uGpX6h3ODlJ6UGi+5CWyMQ1cFlBkfffFAarjSYTVlyj736sOeDuJWX133z5VQBQ8\n" + + "1xSH23kNF95vxB4I1fXG8WL11YZU7VEwSLC4aCkCgaAKRj+wDhTZ4umSRWVZLiep\n" + + "XkZp4y7W9q095nx13abvnKRmU3BVq/fGl++kZ/ujRD7dbKXlPflgJ7m0d06ivr4w\n" + + "6dbtEqNKw4TeVd0X31u82f89bFIS7/Cw4BFgbwEn+x9sdgdyZTP+MxjE3cI9s3oc\n" + + "fLC8+ySk1qWzGkn2gX3gWkDNrdexAEfRrClZfokaiIX8qvJEBoJk5WuHadXI6u2F\n" + + "AoGgByidOQ4kRVd0OCzr/jEuLwpXy3Pn+Fd93rL7LwRe5dmUkNXMMr+6e/2OCt6C\n" + + "4c28+CMMxOIgvfF7kf8Uil6BtHZbK/E/6/3uYdtu4mPsKtjy4I25CYqzLvrsZt8N\n" + + "maeoS+1S7zYjVBU6oFrJBFOndpxZDYpdEKEigHkMQfTMYliCPDUrJ/7nNhHQln8+\n" + + "YhHOATVZtjcdp/O5svYSnK7qgQKBoDd3lFWrPatgxpF1JXMEFFbaIRdNxHkKA4YY\n" + + "gMTM4MPgViunYX/yJ7SaX8jWnC231A9uVn4+kb+DvKjc+ZuTQvnIUK2u6LvIinVF\n" + + "snDEA+BbXwehAtwdHDMDtqYFdx4hvCWQwBNn4p3J0OO2tbYVMtvM5aOEfRSYagfm\n" + + "RywhDUAjW8U0RBnzlmXhQQ6B9bjqooS2MsRrJrS5CU682fb3hBo=\n" + "-----END RSA PRIVATE KEY-----"; - var publicKeyPKCS8 = "-----BEGIN PUBLIC KEY-----\n"+ - "MIIBYjANBgkqhkiG9w0BAQEFAAOCAU8AMIIBSgKCAUEAsE1edyfToZRv6cFOkB0t\n"+ - "AJ5qJor4YF5CccJAL0fS/o1Yk10VSXH4Xx4peSJgYQKkO0HqO1hAz6k9dFQB4U1C\n"+ - "nWtRjtNEcIfycqrZrhu6you5syb6ScV3Zu/9bm7/DyaLlx/gJhUPR1OxOzaqsEvl\n"+ - "u7hbDhNLIYo1zKFb/aUBbD6+UcaGxH2BfFNdzVAtVSVpc/s2Y3sboMN7rByUj793\n"+ - "7iQlaMINvVjyasynYuzHNw6ZRP9JP9fwxrCyaxnTPWxVl0qvVaQO2+TtFMtDXH2O\n"+ - "VZtWWeLHAL8cildw0G+u2qVqTqIGEwNyJlsAHykaPFAMW0xLueumrSlB+JUJPrRv\n"+ - "vw4nBCd4GOrNSlPCE/xlk1Cb8JaICTLvDUcYc3ZqL3jqAueBhkpw2uCz8xVJeOA1\n"+ - "KY4kQIIx8JEBsAYzgyP2iy0CAwEAAQ==\n"+ + var publicKeyPKCS8 = "-----BEGIN PUBLIC KEY-----\n" + + "MIIBYjANBgkqhkiG9w0BAQEFAAOCAU8AMIIBSgKCAUEAsE1edyfToZRv6cFOkB0t\n" + + "AJ5qJor4YF5CccJAL0fS/o1Yk10VSXH4Xx4peSJgYQKkO0HqO1hAz6k9dFQB4U1C\n" + + "nWtRjtNEcIfycqrZrhu6you5syb6ScV3Zu/9bm7/DyaLlx/gJhUPR1OxOzaqsEvl\n" + + "u7hbDhNLIYo1zKFb/aUBbD6+UcaGxH2BfFNdzVAtVSVpc/s2Y3sboMN7rByUj793\n" + + "7iQlaMINvVjyasynYuzHNw6ZRP9JP9fwxrCyaxnTPWxVl0qvVaQO2+TtFMtDXH2O\n" + + "VZtWWeLHAL8cildw0G+u2qVqTqIGEwNyJlsAHykaPFAMW0xLueumrSlB+JUJPrRv\n" + + "vw4nBCd4GOrNSlPCE/xlk1Cb8JaICTLvDUcYc3ZqL3jqAueBhkpw2uCz8xVJeOA1\n" + + "KY4kQIIx8JEBsAYzgyP2iy0CAwEAAQ==\n" + "-----END PUBLIC KEY-----"; var privateKeyPEMNotTrimmed = ' \n\n \n\n ' + privateKeyPKCS1 + '\n \n \n\n '; var publicKeyPEMNotTrimmed = '\n\n\n\n ' + publicKeyPKCS8 + '\n \n\n\n '; - var fileKeyPKCS1 = "-----BEGIN RSA PRIVATE KEY-----\n"+ - "MIICXAIBAAKBgQCCdY+EpDC/vPa335l751SBM8d5Lf4z4QZX4bc+DqTY9zVY/rmP\n"+ - "GbTkCueKnIKApuOGMXJOaCwNH9wUftNt7T0foEwjl16uIC8m4hwSjjNL5TKqMVey\n"+ - "Syv04oBuidv76u5yNiLC4J85lbmW3WAyYkTCbm/VJZAXNJuqCm7AVWmQMQIDAQAB\n"+ - "AoGAEYR3oPfrE9PrzQTZNyn4zuCFCGCEobK1h1dno42T1Q5cu3Z4tB5fi79rF9Gs\n"+ - "NFo0cvBwyNZ0E88TXi0pdrlEW6mdPgQFd3CFxrOgKt9AGpOtI1zzVOb1Uddywq/m\n"+ - "WBPyETwEKzq7lC2nAcMUr0rlFrrDmUT2dafHeuWnFMZ/1YECQQDCtftsH9/prbgu\n"+ - "Q4F2lOWsLz96aix/jnI8FhBmukKmfLMXjCZYYv+Dsr8TIl/iriGqcSgGkBHHoGe1\n"+ - "nmLUZ4EHAkEAq4YcB8T9DLIYUeaS+JRWwLOejU6/rYdgxBIaGn2m0Ldp/z7lLM7g\n"+ - "b0H5Al+7POajkAdnDclBDhyxqInHO4VvBwJBAJ25jNEpgNhqQKg5RsYoF2RDYchn\n"+ - "+WPan+7McLzGZPc4TFrmzKkMiK7GPMHjNokJRXwr7aBjVAPBjEEy7BvjPEECQFOJ\n"+ - "4rcKAzEewGeLREObg9Eg6nTqSMLMb52vL1V9ozR+UDrHuDilnXuyhwPX+kqEDl+E\n"+ - "q3V0cqHb6c8rI4TizRsCQANIyhoJ33ughNzbCIknkMPKtgvLOUARnbya/bkfRexL\n"+ - "icyYzXPNuqZDY8JZQHlshN8cCcZcYjGPYYscd2LKB6o=\n"+ + var fileKeyPKCS1 = "-----BEGIN RSA PRIVATE KEY-----\n" + + "MIICXAIBAAKBgQCCdY+EpDC/vPa335l751SBM8d5Lf4z4QZX4bc+DqTY9zVY/rmP\n" + + "GbTkCueKnIKApuOGMXJOaCwNH9wUftNt7T0foEwjl16uIC8m4hwSjjNL5TKqMVey\n" + + "Syv04oBuidv76u5yNiLC4J85lbmW3WAyYkTCbm/VJZAXNJuqCm7AVWmQMQIDAQAB\n" + + "AoGAEYR3oPfrE9PrzQTZNyn4zuCFCGCEobK1h1dno42T1Q5cu3Z4tB5fi79rF9Gs\n" + + "NFo0cvBwyNZ0E88TXi0pdrlEW6mdPgQFd3CFxrOgKt9AGpOtI1zzVOb1Uddywq/m\n" + + "WBPyETwEKzq7lC2nAcMUr0rlFrrDmUT2dafHeuWnFMZ/1YECQQDCtftsH9/prbgu\n" + + "Q4F2lOWsLz96aix/jnI8FhBmukKmfLMXjCZYYv+Dsr8TIl/iriGqcSgGkBHHoGe1\n" + + "nmLUZ4EHAkEAq4YcB8T9DLIYUeaS+JRWwLOejU6/rYdgxBIaGn2m0Ldp/z7lLM7g\n" + + "b0H5Al+7POajkAdnDclBDhyxqInHO4VvBwJBAJ25jNEpgNhqQKg5RsYoF2RDYchn\n" + + "+WPan+7McLzGZPc4TFrmzKkMiK7GPMHjNokJRXwr7aBjVAPBjEEy7BvjPEECQFOJ\n" + + "4rcKAzEewGeLREObg9Eg6nTqSMLMb52vL1V9ozR+UDrHuDilnXuyhwPX+kqEDl+E\n" + + "q3V0cqHb6c8rI4TizRsCQANIyhoJ33ughNzbCIknkMPKtgvLOUARnbya/bkfRexL\n" + + "icyYzXPNuqZDY8JZQHlshN8cCcZcYjGPYYscd2LKB6o=\n" + "-----END RSA PRIVATE KEY-----"; var keysFolder = __dirname + '/keys/'; var keys_formats = { @@ -299,8 +299,8 @@ describe("NodeRSA", function(){ describe("Different key formats", function () { var sampleKey = new NodeRSA(fileKeyPKCS1); - for(var format in keys_formats) { - (function(format) { + for (var format in keys_formats) { + (function (format) { var options = keys_formats[format]; it("should load from " + options.file + " (" + format + ")", function () { @@ -330,16 +330,24 @@ describe("NodeRSA", function(){ }); describe("Bad cases", function () { - it("not public key", function(){ + it("not public key", function () { var key = new NodeRSA(); - assert.throw(function(){ key.exportKey(); }, Error, "It is not private key"); - assert.throw(function(){ key.exportKey('public'); }, Error, "It is not public key"); + assert.throw(function () { + key.exportKey(); + }, Error, "It is not private key"); + assert.throw(function () { + key.exportKey('public'); + }, Error, "It is not public key"); }); - it("not private key", function(){ + it("not private key", function () { var key = new NodeRSA(publicKeyPKCS8); - assert.throw(function(){ key.exportKey(); }, Error, "It is not private key"); - assert.doesNotThrow(function(){ key.exportKey('public'); }, Error, "It is not public key"); + assert.throw(function () { + key.exportKey(); + }, Error, "It is not private key"); + assert.doesNotThrow(function () { + key.exportKey('public'); + }, Error, "It is not public key"); }); }); }); @@ -511,7 +519,6 @@ describe("NodeRSA", function(){ })(encryptSchemes[scheme_i]); } - describe("encryptPrivate & decryptPublic", function () { var encrypted = {}; var decrypted = {}; @@ -599,7 +606,7 @@ describe("NodeRSA", function(){ }); it("should verify " + i, function () { - if(!key.verify(suit.data, signed[i])) { + if (!key.verify(suit.data, signed[i])) { key.verify(suit.data, signed[i]); } assert(key.verify(suit.data, signed[i])); @@ -615,7 +622,7 @@ describe("NodeRSA", function(){ environment: env }); var signed = key.sign('data'); - if(!key.verify('data', signed)) { + if (!key.verify('data', signed)) { key.verify('data', signed); } assert(key.verify('data', signed)); From 33d3ad58bfa25cf4f6bb839788531fc47b206368 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Wed, 4 Mar 2015 00:36:19 +0500 Subject: [PATCH 058/146] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d413da6..9007682 100644 --- a/README.md +++ b/README.md @@ -185,7 +185,7 @@ Return decrypted data.
* buffer — `{buffer}` — data for decrypting. Takes Buffer object or base64 encoded string.
* encoding — `{string}` — encoding for result string. Can also take `'buffer'` for raw Buffer object, or `'json'` for automatic JSON.parse result. Default `'buffer'`. -> *Notice:* usage `encryptPrivate` and `decryptPublic` with `pkcs1_oaep` padding not described in the RSA [specification](http://www.emc.com/collateral/white-papers/h11300-pkcs-1v2-2-rsa-cryptography-standard-wp.pdf) +> *Notice:*`encryptPrivate` and `decryptPublic` using only pkcs1 padding type 1 (not random) ### Signing/Verifying ```javascript From 6a1e6c22f464ea026c56c303b2ed274c6aec20cb Mon Sep 17 00:00:00 2001 From: rzcoder Date: Wed, 4 Mar 2015 01:48:54 +0500 Subject: [PATCH 059/146] update readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 9007682..3856e16 100644 --- a/README.md +++ b/README.md @@ -292,3 +292,5 @@ In addition, the following condition applies: All redistributions must retain an intact copy of this copyright notice and disclaimer. + +[![Build Status](https://travis-ci.org/rzcoder/node-rsa.svg?branch=master)](https://travis-ci.org/rzcoder/node-rsa) From 47060602934c0cb845828f3642a9be54025493fe Mon Sep 17 00:00:00 2001 From: rzcoder Date: Wed, 4 Mar 2015 01:50:57 +0500 Subject: [PATCH 060/146] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3856e16..c54f07f 100644 --- a/README.md +++ b/README.md @@ -185,7 +185,7 @@ Return decrypted data.
* buffer — `{buffer}` — data for decrypting. Takes Buffer object or base64 encoded string.
* encoding — `{string}` — encoding for result string. Can also take `'buffer'` for raw Buffer object, or `'json'` for automatic JSON.parse result. Default `'buffer'`. -> *Notice:*`encryptPrivate` and `decryptPublic` using only pkcs1 padding type 1 (not random) +> *Notice:* `encryptPrivate` and `decryptPublic` using only pkcs1 padding type 1 (not random) ### Signing/Verifying ```javascript From 1821a2db891560b28e8e2f872d2b4fe20fed361c Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sun, 8 Mar 2015 18:26:26 +0500 Subject: [PATCH 061/146] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c54f07f..bbbfd59 100644 --- a/README.md +++ b/README.md @@ -133,7 +133,7 @@ Output type — can be: **Code example** ```javascript -var keyData = '-----BEGIN PUBLIC KEY----- ... -----BEGIN PRIVATE KEY-----'; +var keyData = '-----BEGIN PUBLIC KEY----- ... -----END PUBLIC KEY-----'; key.importKey(keyData, 'pkcs8'); var publicDer = key.exportKey('pkcs8-public-der'); var privateDer = key.exportKey('pkcs1-der'); From d0bdfd9a1cd062dafbc6bab736efeb21976793c4 Mon Sep 17 00:00:00 2001 From: pkinney Date: Wed, 11 Mar 2015 18:03:36 -0500 Subject: [PATCH 062/146] Fixing global variable leak in schemes.js. --- src/schemes/schemes.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/schemes/schemes.js b/src/schemes/schemes.js index 0b81a51..ad023ae 100644 --- a/src/schemes/schemes.js +++ b/src/schemes/schemes.js @@ -1,4 +1,4 @@ -module.exports = schemes = { +var schemes = { pkcs1: require('./pkcs1'), pkcs1_oaep: require('./oaep'), pss: require('./pss'), @@ -21,3 +21,5 @@ module.exports = schemes = { return schemes[scheme] && schemes[scheme].isSignature; } }; + +module.exports = schemes; From c8c81345e49e50ab04bee760d88404aeb26cbc98 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Thu, 12 Mar 2015 16:03:20 +0500 Subject: [PATCH 063/146] bump package.json version --- package.json | 2 +- src/schemes/schemes.js | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 59239e3..fffd120 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "0.2.22", + "version": "0.2.23", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { diff --git a/src/schemes/schemes.js b/src/schemes/schemes.js index ad023ae..3eb8261 100644 --- a/src/schemes/schemes.js +++ b/src/schemes/schemes.js @@ -1,4 +1,4 @@ -var schemes = { +module.exports = { pkcs1: require('./pkcs1'), pkcs1_oaep: require('./oaep'), pss: require('./pss'), @@ -9,7 +9,7 @@ var schemes = { * @returns {Boolean} */ isEncryption: function (scheme) { - return schemes[scheme] && schemes[scheme].isEncryption; + return module.exports[scheme] && module.exports[scheme].isEncryption; }, /** @@ -18,8 +18,6 @@ var schemes = { * @returns {Boolean} */ isSignature: function (scheme) { - return schemes[scheme] && schemes[scheme].isSignature; + return module.exports[scheme] && module.exports[scheme].isSignature; } -}; - -module.exports = schemes; +}; \ No newline at end of file From b003387d15b968837ea257857e16cf17a9e448cb Mon Sep 17 00:00:00 2001 From: rzcoder Date: Thu, 12 Mar 2015 17:13:29 +0500 Subject: [PATCH 064/146] update travis config --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 16098a9..e3ef114 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,7 @@ node_js: - '0.10' - '0.12' - 'iojs-v1.3' + - 'iojs-v1.5' sudo: false From ed0b9226248e0009552fae037ff8fa5734418a05 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sat, 28 Mar 2015 16:54:43 +0500 Subject: [PATCH 065/146] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bbbfd59..79304b5 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ console.log('decrypted: ', decrypted); ```shell npm install node-rsa ``` -*Requires nodejs >= 0.10.x or io.js >= 1.x* +> Requires nodejs >= 0.10.x or io.js >= 1.x ### Testing From fe3f92e8178e8d7dea1bc502e15af6bcaf39bcc6 Mon Sep 17 00:00:00 2001 From: "A. Rex Sutton" Date: Sat, 20 Jun 2015 18:42:29 -0600 Subject: [PATCH 066/146] Webpack compatibility --- src/schemes/oaep.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/schemes/oaep.js b/src/schemes/oaep.js index 87bb8ea..2d3db6c 100644 --- a/src/schemes/oaep.js +++ b/src/schemes/oaep.js @@ -48,10 +48,10 @@ module.exports.eme_oaep_mgf1 = function (seed, maskLength, hashFunction) { var c = new Buffer(4); for (var i = 0; i < count; ++i) { var hash = crypt.createHash(hashFunction); - hash.write(seed); + hash.update(seed); c.writeUInt32BE(i, 0); - hash.end(c); - hash.read().copy(T, i * hLen); + hash.update(c); + hash.digest().copy(T, i * hLen); } return T.slice(0, maskLength); }; @@ -177,4 +177,4 @@ module.exports.makeScheme = function (key, options) { }; return new Scheme(key, options); -}; \ No newline at end of file +}; From 42b2a65a96b7de2d8e41ba34c0bbee0c21745aba Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sun, 21 Jun 2015 14:09:21 +0500 Subject: [PATCH 067/146] Using old hash APIs for webpack compatible --- .travis.yml | 2 +- README.md | 3 +++ package.json | 2 +- src/schemes/pss.js | 8 ++++---- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index e3ef114..cdbbfe5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,7 @@ node_js: - '0.10' - '0.12' - 'iojs-v1.3' - - 'iojs-v1.5' + - 'iojs-v2.3' sudo: false diff --git a/README.md b/README.md index 79304b5..94ca935 100644 --- a/README.md +++ b/README.md @@ -209,6 +209,9 @@ Questions, comments, bug reports, and pull requests are all welcome. ## Changelog +### 0.2.24 + * Using old hash APIs for webpack compatible + ### 0.2.22 * `encryptPrivate` and `decryptPublic` now using only pkcs1 (type 1) padding. diff --git a/package.json b/package.json index fffd120..e994c00 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "0.2.23", + "version": "0.2.24", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { diff --git a/src/schemes/pss.js b/src/schemes/pss.js index c37be42..89b447a 100644 --- a/src/schemes/pss.js +++ b/src/schemes/pss.js @@ -168,8 +168,8 @@ module.exports.makeScheme = function (key, options) { var salt = DB.slice(DB.length - sLen); var mHash = crypt.createHash(hash); - mHash.end(M); - mHash = mHash.read(); + mHash.update(M); + mHash = mHash.digest(); var Mapostrophe = new Buffer(8 + hLen + sLen); Mapostrophe.fill(0, 0, 8); @@ -177,8 +177,8 @@ module.exports.makeScheme = function (key, options) { salt.copy(Mapostrophe, 8 + mHash.length); var Hapostrophe = crypt.createHash(hash); - Hapostrophe.end(Mapostrophe); - Hapostrophe = Hapostrophe.read(); + Hapostrophe.update(Mapostrophe); + Hapostrophe = Hapostrophe.digest(); return H.toString("hex") === Hapostrophe.toString("hex"); }; From 67904f15b70e95fe44169e5ae04f2eebc558fb78 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sun, 21 Jun 2015 14:14:10 +0500 Subject: [PATCH 068/146] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 94ca935..775f13f 100644 --- a/README.md +++ b/README.md @@ -210,7 +210,7 @@ Questions, comments, bug reports, and pull requests are all welcome. ## Changelog ### 0.2.24 - * Using old hash APIs for webpack compatible + * Now used old hash APIs for webpack compatible ### 0.2.22 * `encryptPrivate` and `decryptPublic` now using only pkcs1 (type 1) padding. From 02eb0ca57382d125ff6c33cdddcbfedf7d9c0387 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sun, 21 Jun 2015 14:14:18 +0500 Subject: [PATCH 069/146] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 775f13f..51656be 100644 --- a/README.md +++ b/README.md @@ -210,7 +210,7 @@ Questions, comments, bug reports, and pull requests are all welcome. ## Changelog ### 0.2.24 - * Now used old hash APIs for webpack compatible + * Now used old hash APIs for webpack compatible. ### 0.2.22 * `encryptPrivate` and `decryptPublic` now using only pkcs1 (type 1) padding. From a3762566254325b5080a9b9dcfa3fe20023a1d26 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Thu, 23 Jul 2015 14:41:59 +0500 Subject: [PATCH 070/146] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 51656be..31e1f9d 100644 --- a/README.md +++ b/README.md @@ -112,8 +112,8 @@ Format string composed of several parts: `scheme-[key_type]-[output_type]`
Scheme — NodeRSA supports multiple format schemes for import/export keys: - * `'pkcs1'` — public key starts from `'-----BEGIN RSA PUBLIC KEY-----'` header and private key starts from `'-----BEGIN RSA PRIVATE KEY-----' header` - * `'pkcs8'` — public key starts from `'-----BEGIN PUBLIC KEY-----'` header and private key starts from `'-----BEGIN PRIVATE KEY-----' header` + * `'pkcs1'` — public key starts from `'-----BEGIN RSA PUBLIC KEY-----'` header and private key starts from `'-----BEGIN RSA PRIVATE KEY-----'` header + * `'pkcs8'` — public key starts from `'-----BEGIN PUBLIC KEY-----'` header and private key starts from `'-----BEGIN PRIVATE KEY-----'` header Key type — can be `'private'` or `'public'`. Default `'private'`
Output type — can be: From 1fc1000a62dbb56ce6fb5c98bc2c8945a9c23d4e Mon Sep 17 00:00:00 2001 From: Pavel Vanecek Date: Fri, 24 Jul 2015 12:09:51 +0200 Subject: [PATCH 071/146] added .npmignore file including the test/ folder to .npmignore means it will not be downloaded on npm install. This has two advantages: 1. less data to download on `npm install` 2. when developing a google chrome extension, a warning pops out, saying *This extension includes the key file '.../node-rsa/test/private_pkcs1.pem'. You probably don't want to do that.* There is no security threat since the key is not used anyway; the npmignore just gets rid of the warning. --- .npmignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .npmignore diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..977af21 --- /dev/null +++ b/.npmignore @@ -0,0 +1,2 @@ +test +.travis.yml \ No newline at end of file From 292ea1db4408332ee9989a9ad802b95ce1280c22 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Fri, 24 Jul 2015 21:18:55 +0500 Subject: [PATCH 072/146] bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e994c00..fab5049 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "0.2.24", + "version": "0.2.25", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { From b2e509eff5ce39ade516e5777109d7b386a74b94 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Fri, 24 Jul 2015 21:25:02 +0500 Subject: [PATCH 073/146] Update .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index cdbbfe5..6dc50ee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,7 @@ node_js: - '0.10' - '0.12' - 'iojs-v1.3' - - 'iojs-v2.3' + - 'iojs' sudo: false From d2d9470cd99687501b6100639c37d0d8709911a9 Mon Sep 17 00:00:00 2001 From: Kasper Borup Date: Fri, 16 Oct 2015 10:25:09 +0200 Subject: [PATCH 074/146] fix to support internet explorer 10. _defineSetter_ updated to defineProperty in reader.js and writer.js of asn1 version 0.2.3 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index fab5049..f104159 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "grunt-contrib-jshint": "0.11.0" }, "dependencies": { - "lodash": "3.3.0", - "asn1": "0.2.2" + "asn1": "^0.2.3", + "lodash": "3.3.0" } } From 10478121d6bbcdea94c554bfe4be0adbebb32d53 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Fri, 16 Oct 2015 13:32:59 +0500 Subject: [PATCH 075/146] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f104159..d481f32 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "0.2.25", + "version": "0.2.26", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { From 725b335a3378c6e7977cd1608417fd23b926f38f Mon Sep 17 00:00:00 2001 From: rzcoder Date: Fri, 16 Oct 2015 13:33:16 +0500 Subject: [PATCH 076/146] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d481f32..955d102 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "grunt-contrib-jshint": "0.11.0" }, "dependencies": { - "asn1": "^0.2.3", + "asn1": "0.2.3", "lodash": "3.3.0" } } From 6132c07f27a8636ee5c36bfe7889ee73cbcd1237 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Fri, 6 Nov 2015 15:23:46 +0500 Subject: [PATCH 077/146] Update .travis.yml --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 6dc50ee..20482ef 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,7 @@ language: node_js node_js: - '0.10' - '0.12' + - 'stable' - 'iojs-v1.3' - 'iojs' From c061fdbf84745597b7222c99af59779887d45039 Mon Sep 17 00:00:00 2001 From: "s.vychegzhanin" Date: Mon, 11 Jan 2016 18:57:53 +0500 Subject: [PATCH 078/146] Fixed a issue when the key was generated by 1 bit smaller than specified --- README.md | 3 +++ package.json | 2 +- src/libs/rsa.js | 7 +++---- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 31e1f9d..6594096 100644 --- a/README.md +++ b/README.md @@ -209,6 +209,9 @@ Questions, comments, bug reports, and pull requests are all welcome. ## Changelog +### 0.2.30 + * Fixed a issue when the key was generated by 1 bit smaller than specified. It may slow down the generation of large keys. + ### 0.2.24 * Now used old hash APIs for webpack compatible. diff --git a/package.json b/package.json index 955d102..2e2d177 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "0.2.26", + "version": "0.2.30", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { diff --git a/src/libs/rsa.js b/src/libs/rsa.js index 7a11eef..1630b24 100644 --- a/src/libs/rsa.js +++ b/src/libs/rsa.js @@ -115,6 +115,9 @@ module.exports.Key = (function () { var phi = p1.multiply(q1); if (phi.gcd(ee).compareTo(BigInteger.ONE) === 0) { this.n = this.p.multiply(this.q); + if (this.n.bitLength() < B) { + continue; + } this.d = ee.modInverse(phi); this.dmp1 = this.d.mod(p1); this.dmq1 = this.d.mod(q1); @@ -303,10 +306,6 @@ module.exports.Key = (function () { this.cache = this.cache || {}; // Bit & byte length this.cache.keyBitLength = this.n.bitLength(); - if (this.cache.keyBitLength % 2 == 1) { - this.cache.keyBitLength = this.cache.keyBitLength + 1; - } - this.cache.keyByteLength = (this.cache.keyBitLength + 6) >> 3; }; From c766bc6092ea37ba06ba8861240918fabd7d1744 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sun, 24 Jan 2016 21:28:04 +0500 Subject: [PATCH 079/146] Added import/export from/to raw key components. Removed lodash from dependencies. --- README.md | 27 +- package.json | 8 +- src/NodeRSA.js | 18 +- src/formats/components.js | 71 +++++ src/formats/formats.js | 7 +- src/formats/pkcs1.js | 2 +- src/formats/pkcs8.js | 2 +- src/libs/jsbn.js | 2 +- src/libs/rsa.js | 16 +- src/utils.js | 33 +++ test/tests.js | 593 +++++++++++++++++++++----------------- 11 files changed, 488 insertions(+), 291 deletions(-) create mode 100644 src/formats/components.js diff --git a/README.md b/README.md index 6594096..53ccbc5 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,11 @@ key.importKey(keyData, [format]); key.exportKey([format]); ``` -* keyData — `{string|buffer}` — key in PEM string **or** Buffer containing PEM string **or** Buffer containing DER encoded data. +* keyData — `{string|buffer}` — may be: + * key in PEM string + * Buffer containing PEM string + * Buffer containing DER encoded data + * Object contains key components * format — `{string}` — format id for export/import. #### Format string syntax @@ -114,6 +118,7 @@ Scheme — NodeRSA supports multiple format schemes for import/export keys: * `'pkcs1'` — public key starts from `'-----BEGIN RSA PUBLIC KEY-----'` header and private key starts from `'-----BEGIN RSA PRIVATE KEY-----'` header * `'pkcs8'` — public key starts from `'-----BEGIN PUBLIC KEY-----'` header and private key starts from `'-----BEGIN PRIVATE KEY-----'` header + * `'components'` — use it for import/export key from/to raw components (see example below). For private key, importing data should contain all private key components, for public key: only public exponent (`e`) and modulus (`n`). All components (except `e`) should be Buffer, `e` could be Buffer or just normal Number. Key type — can be `'private'` or `'public'`. Default `'private'`
Output type — can be: @@ -139,6 +144,22 @@ var publicDer = key.exportKey('pkcs8-public-der'); var privateDer = key.exportKey('pkcs1-der'); ``` +```javascript +key.importKey({ + n: new Buffer('0086fa9ba066685845fc03833a9699c8baefb53cfbf19052a7f10f1eaa30488cec1ceb752bdff2df9fad6c64b3498956e7dbab4035b4823c99a44cc57088a23783', 'hex'), + e: 65537, + d: new Buffer('5d2f0dd982596ef781affb1cab73a77c46985c6da2aafc252cea3f4546e80f40c0e247d7d9467750ea1321cc5aa638871b3ed96d19dcc124916b0bcb296f35e1', 'hex'), + p: new Buffer('00c59419db615e56b9805cc45673a32d278917534804171edcf925ab1df203927f', 'hex'), + q: new Buffer('00aee3f86b66087abc069b8b1736e38ad6af624f7ea80e70b95f4ff2bf77cd90fd', 'hex'), + dmp1: new Buffer('008112f5a969fcb56f4e3a4c51a60dcdebec157ee4a7376b843487b53844e8ac85', 'hex'), + dmq1: new Buffer('1a7370470e0f8a4095df40922a430fe498720e03e1f70d257c3ce34202249d21', 'hex'), + coeff: new Buffer('00b399675e5e81506b729a777cc03026f0b2119853dfc5eb124610c0ab82999e45', 'hex') +}, 'components'); +var publicComponents = key.exportKey('components-public'); +``` + + + ### Properties #### Key testing @@ -209,6 +230,10 @@ Questions, comments, bug reports, and pull requests are all welcome. ## Changelog +### 0.3.0 + * Added import/export from/to raw key components. + * Removed lodash from dependencies. + ### 0.2.30 * Fixed a issue when the key was generated by 1 bit smaller than specified. It may slow down the generation of large keys. diff --git a/package.json b/package.json index 2e2d177..86ab2bc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "0.2.30", + "version": "0.3.0", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { @@ -34,10 +34,10 @@ "grunt-simple-mocha": "0.4.0", "jit-grunt": "0.9.1", "chai": "2.0.0", - "grunt-contrib-jshint": "0.11.0" + "grunt-contrib-jshint": "0.11.0", + "lodash": "^4.0.0" }, "dependencies": { - "asn1": "0.2.3", - "lodash": "3.3.0" + "asn1": "0.2.3" } } diff --git a/src/NodeRSA.js b/src/NodeRSA.js index b2b3676..7fe7a97 100644 --- a/src/NodeRSA.js +++ b/src/NodeRSA.js @@ -10,7 +10,7 @@ var rsa = require('./libs/rsa.js'); var crypt = require('crypto'); var ber = require('asn1').Ber; -var _ = require('lodash'); +var _ = require('./utils')._; var utils = require('./utils'); var schemes = require('./schemes/schemes.js'); var formats = require('./formats/formats.js'); @@ -31,7 +31,7 @@ module.exports = (function () { 'private': 'pkcs1-private-pem', 'private-der': 'pkcs1-private-der', 'public': 'pkcs8-public-pem', - 'public-der': 'pkcs8-public-der' + 'public-der': 'pkcs8-public-der', }; /** @@ -88,7 +88,7 @@ module.exports = (function () { if (_.isString(options.signingScheme)) { var signingScheme = options.signingScheme.toLowerCase().split('-'); if (signingScheme.length == 1) { - if (_.indexOf(SUPPORTED_HASH_ALGORITHMS.node, signingScheme[0]) > -1) { + if (SUPPORTED_HASH_ALGORITHMS.node.indexOf(signingScheme[0]) > -1) { this.$options.signingSchemeOptions = { hash: signingScheme[0] }; @@ -115,7 +115,7 @@ module.exports = (function () { } if (this.$options.signingSchemeOptions.hash && - _.indexOf(SUPPORTED_HASH_ALGORITHMS[this.$options.environment], this.$options.signingSchemeOptions.hash) == -1) { + SUPPORTED_HASH_ALGORITHMS[this.$options.environment].indexOf(this.$options.signingSchemeOptions.hash) === -1) { throw Error('Unsupported hashing algorithm for ' + this.$options.environment + ' environment'); } } @@ -134,7 +134,7 @@ module.exports = (function () { } if (this.$options.encryptionSchemeOptions.hash && - _.indexOf(SUPPORTED_HASH_ALGORITHMS[this.$options.environment], this.$options.encryptionSchemeOptions.hash) == -1) { + SUPPORTED_HASH_ALGORITHMS[this.$options.environment].indexOf(this.$options.encryptionSchemeOptions.hash) === -1) { throw Error('Unsupported hashing algorithm for ' + this.$options.environment + ' environment'); } } @@ -164,7 +164,7 @@ module.exports = (function () { /** * Importing key - * @param keyData {string|buffer} + * @param keyData {string|buffer|Object} * @param format {string} */ NodeRSA.prototype.importKey = function (keyData, format) { @@ -207,7 +207,7 @@ module.exports = (function () { /** * Check if key pair contains public key - * @param strict {boolean} - public key only, return false if have private exponent + * @param [strict] {boolean} - public key only, return false if have private exponent */ NodeRSA.prototype.isPublic = function (strict) { return this.keyPair.isPublic(strict); @@ -306,7 +306,7 @@ module.exports = (function () { */ NodeRSA.prototype.sign = function (buffer, encoding, source_encoding) { if (!this.isPrivate()) { - throw Error("It is not private key"); + throw Error("This is not private key"); } var res = this.keyPair.sign(this.$getDataForEncrypt(buffer, source_encoding)); @@ -329,7 +329,7 @@ module.exports = (function () { */ NodeRSA.prototype.verify = function (buffer, signature, source_encoding, signature_encoding) { if (!this.isPublic()) { - throw Error("It is not public key"); + throw Error("This is not public key"); } signature_encoding = (!signature_encoding || signature_encoding == 'buffer' ? null : signature_encoding); return this.keyPair.verify(this.$getDataForEncrypt(buffer, source_encoding), signature, signature_encoding); diff --git a/src/formats/components.js b/src/formats/components.js new file mode 100644 index 0000000..779cd75 --- /dev/null +++ b/src/formats/components.js @@ -0,0 +1,71 @@ +var _ = require('../utils')._; +var utils = require('../utils'); + +module.exports = { + privateExport: function (key, options) { + return { + n: key.n.toBuffer(), + e: key.e, + d: key.d.toBuffer(), + p: key.p.toBuffer(), + q: key.q.toBuffer(), + dmp1: key.dmp1.toBuffer(), + dmq1: key.dmq1.toBuffer(), + coeff: key.coeff.toBuffer() + } + }, + + privateImport: function (key, data, options) { + if (data.n && data.e && data.d && data.p && data.q && data.dmp1 && data.dmq1 && data.coeff) { + key.setPrivate( + data.n, + data.e, + data.d, + data.p, + data.q, + data.dmp1, + data.dmq1, + data.coeff + ); + } else { + throw Error("Invalid key data"); + } + }, + + publicExport: function (key, options) { + return { + n: key.n.toBuffer(), + e: key.e + } + }, + + publicImport: function (key, data, options) { + if (data.n && data.e) { + key.setPublic( + data.n, + data.e + ); + } else { + throw Error("Invalid key data"); + } + }, + + /** + * Trying autodetect and import key + * @param key + * @param data + */ + autoImport: function (key, data) { + if (data.n && data.e) { + if (data.d && data.p && data.q && data.dmp1 && data.dmq1 && data.coeff) { + module.exports.privateImport(key, data); + return true; + } else { + module.exports.publicImport(key, data); + return true; + } + } + + return false; + } +}; diff --git a/src/formats/formats.js b/src/formats/formats.js index 6e59dfb..4db1fc6 100644 --- a/src/formats/formats.js +++ b/src/formats/formats.js @@ -1,4 +1,4 @@ -var _ = require('lodash'); +var _ = require('../utils')._; function formatParse(format) { format = format.split('-'); @@ -30,6 +30,7 @@ function formatParse(format) { module.exports = { pkcs1: require('./pkcs1'), pkcs8: require('./pkcs8'), + components: require('./components'), isPrivateExport: function (format) { return module.exports[format] && typeof module.exports[format].privateExport === 'function'; @@ -78,12 +79,12 @@ module.exports = { if (module.exports[fmt.scheme]) { if (fmt.keyType === 'private') { if (!key.isPrivate()) { - throw Error("It is not private key"); + throw Error("This is not private key"); } return module.exports[fmt.scheme].privateExport(key, fmt.keyOpt); } else { if (!key.isPublic()) { - throw Error("It is not public key"); + throw Error("This is not public key"); } return module.exports[fmt.scheme].publicExport(key, fmt.keyOpt); } diff --git a/src/formats/pkcs1.js b/src/formats/pkcs1.js index 6f76f6d..22b5139 100644 --- a/src/formats/pkcs1.js +++ b/src/formats/pkcs1.js @@ -1,5 +1,5 @@ var ber = require('asn1').Ber; -var _ = require('lodash'); +var _ = require('../utils')._; var utils = require('../utils'); module.exports = { diff --git a/src/formats/pkcs8.js b/src/formats/pkcs8.js index add72de..6b23a7e 100644 --- a/src/formats/pkcs8.js +++ b/src/formats/pkcs8.js @@ -1,5 +1,5 @@ var ber = require('asn1').Ber; -var _ = require('lodash'); +var _ = require('../utils')._; var PUBLIC_RSA_OID = '1.2.840.113549.1.1.1'; var utils = require('../utils'); diff --git a/src/libs/jsbn.js b/src/libs/jsbn.js index 28ca2f2..100c0ea 100644 --- a/src/libs/jsbn.js +++ b/src/libs/jsbn.js @@ -37,7 +37,7 @@ */ var crypt = require('crypto'); -var _ = require('lodash'); +var _ = require('../utils')._; // Bits per digit var dbits; diff --git a/src/libs/rsa.js b/src/libs/rsa.js index 1630b24..6f47b9d 100644 --- a/src/libs/rsa.js +++ b/src/libs/rsa.js @@ -39,7 +39,7 @@ * 2014 rzcoder */ -var _ = require('lodash'); +var _ = require('../utils')._; var crypt = require('crypto'); var BigInteger = require('./jsbn.js'); var utils = require('../utils.js'); @@ -141,9 +141,9 @@ module.exports.Key = (function () { * @param C */ RSAKey.prototype.setPrivate = function (N, E, D, P, Q, DP, DQ, C) { - if (N && E && D && N.length > 0 && E.length > 0 && D.length > 0) { + if (N && E && D && N.length > 0 && (_.isNumber(E) || E.length > 0) && D.length > 0) { this.n = new BigInteger(N); - this.e = utils.get32IntFromBuffer(E, 0); + this.e = _.isNumber(E) ? E : utils.get32IntFromBuffer(E, 0); this.d = new BigInteger(D); if (P && Q && DP && DQ && C) { @@ -156,8 +156,9 @@ module.exports.Key = (function () { // TODO: re-calculate any missing CRT params } this.$$recalculateCache(); - } else + } else { throw Error("Invalid RSA private key"); + } }; /** @@ -166,12 +167,13 @@ module.exports.Key = (function () { * @param E */ RSAKey.prototype.setPublic = function (N, E) { - if (N && E && N.length > 0 && E.length > 0) { + if (N && E && N.length > 0 && (_.isNumber(E) || E.length > 0)) { this.n = new BigInteger(N); - this.e = utils.get32IntFromBuffer(E, 0); + this.e = _.isNumber(E) ? E : utils.get32IntFromBuffer(E, 0); this.$$recalculateCache(); - } else + } else { throw Error("Invalid RSA public key"); + } }; /** diff --git a/src/utils.js b/src/utils.js index b6dff0a..0376a3d 100644 --- a/src/utils.js +++ b/src/utils.js @@ -53,3 +53,36 @@ module.exports.get32IntFromBuffer = function (buffer, offset) { return NaN; } }; + +module.exports._ = { + isObject: function (value) { + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); + }, + + isString: function (value) { + return typeof value == 'string' || value instanceof String; + }, + + isNumber: function (value) { + return typeof value == 'number' || !isNaN(parseFloat(value)) && isFinite(value); + }, + + /** + * Returns copy of `obj` without `removeProp` field. + * @param obj + * @param removeProp + * @returns Object + */ + omit: function (obj, removeProp) { + var newObj = {}; + for (var prop in obj) { + if (!obj.hasOwnProperty(prop) || prop === removeProp) { + continue; + } + newObj[prop] = obj[prop]; + } + + return newObj; + } +}; \ No newline at end of file diff --git a/test/tests.js b/test/tests.js index 4af8516..bea11fa 100644 --- a/test/tests.js +++ b/test/tests.js @@ -1,14 +1,12 @@ -/** - * TODO: tests for compatibility with other rsa libraries - */ +"use strict"; -var fs = require('fs'); -var assert = require("chai").assert; -var _ = require("lodash"); -var NodeRSA = require("../src/NodeRSA"); +let fs = require('fs'); +let assert = require('chai').assert; +let _ = require('lodash'); +let NodeRSA = require('../src/NodeRSA'); -describe("NodeRSA", function () { - var keySizes = [ +describe('NodeRSA', function () { + let keySizes = [ {b: 512, e: 3}, {b: 512, e: 5}, {b: 512, e: 257}, @@ -17,60 +15,60 @@ describe("NodeRSA", function () { {b: 1024} // 'e' should be 65537 ]; - var environments = ['browser', 'node']; - var encryptSchemes = ['pkcs1', 'pkcs1_oaep']; - var signingSchemes = ['pkcs1', 'pss']; - var signHashAlgorithms = { + let environments = ['browser', 'node']; + let encryptSchemes = ['pkcs1', 'pkcs1_oaep']; + let signingSchemes = ['pkcs1', 'pss']; + let signHashAlgorithms = { 'node': ['MD4', 'MD5', 'RIPEMD160', 'SHA', 'SHA1', 'SHA224', 'SHA256', 'SHA384', 'SHA512'], 'browser': ['MD5', 'RIPEMD160', 'SHA1', 'SHA256', 'SHA512'] }; - var dataBundle = { - "string": { - data: "ascii + 12345678", - encoding: "utf8" + let dataBundle = { + 'string': { + data: 'ascii + 12345678', + encoding: 'utf8' }, - "unicode string": { - data: "ascii + юникод スラ ⑨", - encoding: "utf8" + 'unicode string': { + data: 'ascii + юникод スラ ⑨', + encoding: 'utf8' }, - "empty string": { - data: "", - encoding: ["utf8", "ascii", "hex", "base64"] + 'empty string': { + data: '', + encoding: ['utf8', 'ascii', 'hex', 'base64'] }, - "long string": { - data: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", - encoding: ["utf8", "ascii"] + 'long string': { + data: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', + encoding: ['utf8', 'ascii'] }, - "buffer": { - data: new Buffer("ascii + юникод スラ ⑨"), - encoding: "buffer" + 'buffer': { + data: new Buffer('ascii + юникод スラ ⑨'), + encoding: 'buffer' }, - "json object": { - data: {str: "string", arr: ["a", "r", "r", "a", "y", true, "⑨"], int: 42, nested: {key: {key: 1}}}, - encoding: "json" + 'json object': { + data: {str: 'string', arr: ['a', 'r', 'r', 'a', 'y', true, '⑨'], int: 42, nested: {key: {key: 1}}}, + encoding: 'json' }, - "json array": { + 'json array': { data: [1, 2, 3, 4, 5, 6, 7, 8, 9, [10, 11, 12, [13], 14, 15, [16, 17, [18]]]], - encoding: "json" + encoding: 'json' } }; - var generatedKeys = []; - var privateNodeRSA = null; - var publicNodeRSA = null; + let generatedKeys = []; + let privateNodeRSA = null; + let publicNodeRSA = null; - describe("Setup options", function () { - it("should use browser environment", function () { + describe('Setup options', function () { + it('should use browser environment', function () { assert.equal((new NodeRSA(null, {environment: 'browser'})).$options.environment, 'browser'); }); - it("should use io.js environment", function () { + it('should use io.js environment', function () { assert.equal((new NodeRSA(null, {environment: 'iojs'})).$options.environment, 'iojs'); }); - it("should make empty key pair with default options", function () { - var key = new NodeRSA(null); + it('should make empty key pair with default options', function () { + let key = new NodeRSA(null); assert.equal(key.isEmpty(), true); assert.equal(key.$options.signingScheme, 'pkcs1'); assert.equal(key.$options.signingSchemeOptions.hash, 'sha256'); @@ -81,27 +79,27 @@ describe("NodeRSA", function () { assert.equal(key.$options.encryptionSchemeOptions.label, null); }); - it("should make key pair with pkcs1-md5 signing scheme", function () { - var key = new NodeRSA(null, {signingScheme: 'md5'}); + it('should make key pair with pkcs1-md5 signing scheme', function () { + let key = new NodeRSA(null, {signingScheme: 'md5'}); assert.equal(key.$options.signingScheme, 'pkcs1'); assert.equal(key.$options.signingSchemeOptions.hash, 'md5'); }); - it("should make key pair with pss-sha512 signing scheme", function () { - var key = new NodeRSA(null, {signingScheme: 'pss-sha512'}); + it('should make key pair with pss-sha512 signing scheme', function () { + let key = new NodeRSA(null, {signingScheme: 'pss-sha512'}); assert.equal(key.$options.signingScheme, 'pss'); assert.equal(key.$options.signingSchemeOptions.hash, 'sha512'); }); - it("should make key pair with pkcs1 encryption scheme, and pss-sha1 signing scheme", function () { - var key = new NodeRSA(null, {encryptionScheme: 'pkcs1', signingScheme: 'pss'}); + it('should make key pair with pkcs1 encryption scheme, and pss-sha1 signing scheme', function () { + let key = new NodeRSA(null, {encryptionScheme: 'pkcs1', signingScheme: 'pss'}); assert.equal(key.$options.encryptionScheme, 'pkcs1'); assert.equal(key.$options.signingScheme, 'pss'); assert.equal(key.$options.signingSchemeOptions.hash, null); }); - it("change options", function () { - var key = new NodeRSA(null, {signingScheme: 'pss-sha1'}); + it('change options', function () { + let key = new NodeRSA(null, {signingScheme: 'pss-sha1'}); assert.equal(key.$options.signingScheme, 'pss'); assert.equal(key.$options.signingSchemeOptions.hash, 'sha1'); key.setOptions({signingScheme: 'pkcs1'}); @@ -112,8 +110,8 @@ describe("NodeRSA", function () { assert.equal(key.$options.signingSchemeOptions.hash, 'sha256'); }); - it("advanced options change", function () { - var key = new NodeRSA(null); + it('advanced options change', function () { + let key = new NodeRSA(null); key.setOptions({ encryptionScheme: { scheme: 'pkcs1_oaep', @@ -135,8 +133,8 @@ describe("NodeRSA", function () { assert.equal(key.$options.encryptionSchemeOptions.label, 'horay'); }); - it("should throw \"unsupported hashing algorithm\" exception", function () { - var key = new NodeRSA(null); + it('should throw \'unsupported hashing algorithm\' exception', function () { + let key = new NodeRSA(null); assert.equal(key.isEmpty(), true); assert.equal(key.$options.signingScheme, 'pkcs1'); assert.equal(key.$options.signingSchemeOptions.hash, 'sha256'); @@ -146,15 +144,15 @@ describe("NodeRSA", function () { environment: 'browser', signingScheme: 'md4' }); - }, Error, "Unsupported hashing algorithm"); + }, Error, 'Unsupported hashing algorithm'); }); }); - describe("Work with keys", function () { - describe("Generating keys", function () { - for (var size in keySizes) { + describe('Work with keys', function () { + describe('Generating keys', function () { + for (let size in keySizes) { (function (size) { - it("should make key pair " + size.b + "-bit length and public exponent is " + (size.e ? size.e : size.e + " and should be 65537"), function () { + it('should make key pair ' + size.b + '-bit length and public exponent is ' + (size.e ? size.e : size.e + ' and should be 65537'), function () { generatedKeys.push(new NodeRSA({b: size.b, e: size.e}, {encryptionScheme: 'pkcs1'})); assert.instanceOf(generatedKeys[generatedKeys.length - 1].keyPair, Object); assert.equal(generatedKeys[generatedKeys.length - 1].isEmpty(), false); @@ -166,72 +164,88 @@ describe("NodeRSA", function () { } }); - describe("Imprt/Export keys", function () { - var privateKeyPKCS1 = "-----BEGIN RSA PRIVATE KEY-----\n" + - "MIIFwgIBAAKCAUEAsE1edyfToZRv6cFOkB0tAJ5qJor4YF5CccJAL0fS/o1Yk10V\n" + - "SXH4Xx4peSJgYQKkO0HqO1hAz6k9dFQB4U1CnWtRjtNEcIfycqrZrhu6you5syb6\n" + - "ScV3Zu/9bm7/DyaLlx/gJhUPR1OxOzaqsEvlu7hbDhNLIYo1zKFb/aUBbD6+UcaG\n" + - "xH2BfFNdzVAtVSVpc/s2Y3sboMN7rByUj7937iQlaMINvVjyasynYuzHNw6ZRP9J\n" + - "P9fwxrCyaxnTPWxVl0qvVaQO2+TtFMtDXH2OVZtWWeLHAL8cildw0G+u2qVqTqIG\n" + - "EwNyJlsAHykaPFAMW0xLueumrSlB+JUJPrRvvw4nBCd4GOrNSlPCE/xlk1Cb8JaI\n" + - "CTLvDUcYc3ZqL3jqAueBhkpw2uCz8xVJeOA1KY4kQIIx8JEBsAYzgyP2iy0CAwEA\n" + - "AQKCAUAjBcudShkdgRpWSmNr94/IDrAxpeu/YRo79QXBHriIftW4uIYRCAX6B0jf\n" + - "2ndg7iBn8Skxzs9ZMVqW8FVLR4jTMs2J3Og8npUIOG5zyuhpciZas4SHASY+GbCz\n" + - "rnMWtGaIh/mENyzI05RimfKAgSNLDk1wV17Wc9lKJEfc9Fl7Al/WaOS+xdviMcFx\n" + - "ltrajksLkjz0uDD917eKskbE45lULfGqeI0kYDadWp88pw6ikXJln2p3Y1PNQF3e\n" + - "y2cN+Snzd0jx/c5fD9B1zxKYv5bUo+UnTzBxV81e9xCJfkdXv+6D5qDn1gGLdZZa\n" + - "5FxtZbRgVh/ZlqP9xYr72as/WFmIA20wRgHPgWvLyHsh0XThqZf2/O3R8KmFv8aT\n" + - "+kmc5is6sVItIIi7ltorVapTkJai3zz/VSMBBaL+ytFN9jVl4QKBoQDfL8TMeZXu\n" + - "gBTN7yq6zZWN8+60MUaxz0/lKdzmo35z32rpVKdsYd922pmcsNYaoj/H9L3j/NP4\n" + - "9z+SHfYpWvTa7AvJfNlXYc3BRXIarpfnXsm65IzKzHaF9i2xdXxkfTEYIvOQDMLF\n" + - "SiiObWJMV+QqUxb3luu3/CR3IcbgeTOpdiC/T/Zl/YYl17JqZTHmLFZPq7xewttg\n" + - "zQorDRWIFDtlAoGhAMo4+uM9f4BpOHSmayhLhHArIGs4386BkXSeOLeQitaQJ/2c\n" + - "zb459O87XoCAonZbq+dI7XRnBU3toQvEsZgrtGkOFXCZJMWAQxD5BQ5vEYT6c86h\n" + - "uGpX6h3ODlJ6UGi+5CWyMQ1cFlBkfffFAarjSYTVlyj736sOeDuJWX133z5VQBQ8\n" + - "1xSH23kNF95vxB4I1fXG8WL11YZU7VEwSLC4aCkCgaAKRj+wDhTZ4umSRWVZLiep\n" + - "XkZp4y7W9q095nx13abvnKRmU3BVq/fGl++kZ/ujRD7dbKXlPflgJ7m0d06ivr4w\n" + - "6dbtEqNKw4TeVd0X31u82f89bFIS7/Cw4BFgbwEn+x9sdgdyZTP+MxjE3cI9s3oc\n" + - "fLC8+ySk1qWzGkn2gX3gWkDNrdexAEfRrClZfokaiIX8qvJEBoJk5WuHadXI6u2F\n" + - "AoGgByidOQ4kRVd0OCzr/jEuLwpXy3Pn+Fd93rL7LwRe5dmUkNXMMr+6e/2OCt6C\n" + - "4c28+CMMxOIgvfF7kf8Uil6BtHZbK/E/6/3uYdtu4mPsKtjy4I25CYqzLvrsZt8N\n" + - "maeoS+1S7zYjVBU6oFrJBFOndpxZDYpdEKEigHkMQfTMYliCPDUrJ/7nNhHQln8+\n" + - "YhHOATVZtjcdp/O5svYSnK7qgQKBoDd3lFWrPatgxpF1JXMEFFbaIRdNxHkKA4YY\n" + - "gMTM4MPgViunYX/yJ7SaX8jWnC231A9uVn4+kb+DvKjc+ZuTQvnIUK2u6LvIinVF\n" + - "snDEA+BbXwehAtwdHDMDtqYFdx4hvCWQwBNn4p3J0OO2tbYVMtvM5aOEfRSYagfm\n" + - "RywhDUAjW8U0RBnzlmXhQQ6B9bjqooS2MsRrJrS5CU682fb3hBo=\n" + - "-----END RSA PRIVATE KEY-----"; - - var publicKeyPKCS8 = "-----BEGIN PUBLIC KEY-----\n" + - "MIIBYjANBgkqhkiG9w0BAQEFAAOCAU8AMIIBSgKCAUEAsE1edyfToZRv6cFOkB0t\n" + - "AJ5qJor4YF5CccJAL0fS/o1Yk10VSXH4Xx4peSJgYQKkO0HqO1hAz6k9dFQB4U1C\n" + - "nWtRjtNEcIfycqrZrhu6you5syb6ScV3Zu/9bm7/DyaLlx/gJhUPR1OxOzaqsEvl\n" + - "u7hbDhNLIYo1zKFb/aUBbD6+UcaGxH2BfFNdzVAtVSVpc/s2Y3sboMN7rByUj793\n" + - "7iQlaMINvVjyasynYuzHNw6ZRP9JP9fwxrCyaxnTPWxVl0qvVaQO2+TtFMtDXH2O\n" + - "VZtWWeLHAL8cildw0G+u2qVqTqIGEwNyJlsAHykaPFAMW0xLueumrSlB+JUJPrRv\n" + - "vw4nBCd4GOrNSlPCE/xlk1Cb8JaICTLvDUcYc3ZqL3jqAueBhkpw2uCz8xVJeOA1\n" + - "KY4kQIIx8JEBsAYzgyP2iy0CAwEAAQ==\n" + - "-----END PUBLIC KEY-----"; - - var privateKeyPEMNotTrimmed = ' \n\n \n\n ' + privateKeyPKCS1 + '\n \n \n\n '; - var publicKeyPEMNotTrimmed = '\n\n\n\n ' + publicKeyPKCS8 + '\n \n\n\n '; - - var fileKeyPKCS1 = "-----BEGIN RSA PRIVATE KEY-----\n" + - "MIICXAIBAAKBgQCCdY+EpDC/vPa335l751SBM8d5Lf4z4QZX4bc+DqTY9zVY/rmP\n" + - "GbTkCueKnIKApuOGMXJOaCwNH9wUftNt7T0foEwjl16uIC8m4hwSjjNL5TKqMVey\n" + - "Syv04oBuidv76u5yNiLC4J85lbmW3WAyYkTCbm/VJZAXNJuqCm7AVWmQMQIDAQAB\n" + - "AoGAEYR3oPfrE9PrzQTZNyn4zuCFCGCEobK1h1dno42T1Q5cu3Z4tB5fi79rF9Gs\n" + - "NFo0cvBwyNZ0E88TXi0pdrlEW6mdPgQFd3CFxrOgKt9AGpOtI1zzVOb1Uddywq/m\n" + - "WBPyETwEKzq7lC2nAcMUr0rlFrrDmUT2dafHeuWnFMZ/1YECQQDCtftsH9/prbgu\n" + - "Q4F2lOWsLz96aix/jnI8FhBmukKmfLMXjCZYYv+Dsr8TIl/iriGqcSgGkBHHoGe1\n" + - "nmLUZ4EHAkEAq4YcB8T9DLIYUeaS+JRWwLOejU6/rYdgxBIaGn2m0Ldp/z7lLM7g\n" + - "b0H5Al+7POajkAdnDclBDhyxqInHO4VvBwJBAJ25jNEpgNhqQKg5RsYoF2RDYchn\n" + - "+WPan+7McLzGZPc4TFrmzKkMiK7GPMHjNokJRXwr7aBjVAPBjEEy7BvjPEECQFOJ\n" + - "4rcKAzEewGeLREObg9Eg6nTqSMLMb52vL1V9ozR+UDrHuDilnXuyhwPX+kqEDl+E\n" + - "q3V0cqHb6c8rI4TizRsCQANIyhoJ33ughNzbCIknkMPKtgvLOUARnbya/bkfRexL\n" + - "icyYzXPNuqZDY8JZQHlshN8cCcZcYjGPYYscd2LKB6o=\n" + - "-----END RSA PRIVATE KEY-----"; - var keysFolder = __dirname + '/keys/'; - var keys_formats = { + describe('Imprt/Export keys', function () { + let privateKeyPKCS1 = '-----BEGIN RSA PRIVATE KEY-----\n' + + 'MIIFwgIBAAKCAUEAsE1edyfToZRv6cFOkB0tAJ5qJor4YF5CccJAL0fS/o1Yk10V\n' + + 'SXH4Xx4peSJgYQKkO0HqO1hAz6k9dFQB4U1CnWtRjtNEcIfycqrZrhu6you5syb6\n' + + 'ScV3Zu/9bm7/DyaLlx/gJhUPR1OxOzaqsEvlu7hbDhNLIYo1zKFb/aUBbD6+UcaG\n' + + 'xH2BfFNdzVAtVSVpc/s2Y3sboMN7rByUj7937iQlaMINvVjyasynYuzHNw6ZRP9J\n' + + 'P9fwxrCyaxnTPWxVl0qvVaQO2+TtFMtDXH2OVZtWWeLHAL8cildw0G+u2qVqTqIG\n' + + 'EwNyJlsAHykaPFAMW0xLueumrSlB+JUJPrRvvw4nBCd4GOrNSlPCE/xlk1Cb8JaI\n' + + 'CTLvDUcYc3ZqL3jqAueBhkpw2uCz8xVJeOA1KY4kQIIx8JEBsAYzgyP2iy0CAwEA\n' + + 'AQKCAUAjBcudShkdgRpWSmNr94/IDrAxpeu/YRo79QXBHriIftW4uIYRCAX6B0jf\n' + + '2ndg7iBn8Skxzs9ZMVqW8FVLR4jTMs2J3Og8npUIOG5zyuhpciZas4SHASY+GbCz\n' + + 'rnMWtGaIh/mENyzI05RimfKAgSNLDk1wV17Wc9lKJEfc9Fl7Al/WaOS+xdviMcFx\n' + + 'ltrajksLkjz0uDD917eKskbE45lULfGqeI0kYDadWp88pw6ikXJln2p3Y1PNQF3e\n' + + 'y2cN+Snzd0jx/c5fD9B1zxKYv5bUo+UnTzBxV81e9xCJfkdXv+6D5qDn1gGLdZZa\n' + + '5FxtZbRgVh/ZlqP9xYr72as/WFmIA20wRgHPgWvLyHsh0XThqZf2/O3R8KmFv8aT\n' + + '+kmc5is6sVItIIi7ltorVapTkJai3zz/VSMBBaL+ytFN9jVl4QKBoQDfL8TMeZXu\n' + + 'gBTN7yq6zZWN8+60MUaxz0/lKdzmo35z32rpVKdsYd922pmcsNYaoj/H9L3j/NP4\n' + + '9z+SHfYpWvTa7AvJfNlXYc3BRXIarpfnXsm65IzKzHaF9i2xdXxkfTEYIvOQDMLF\n' + + 'SiiObWJMV+QqUxb3luu3/CR3IcbgeTOpdiC/T/Zl/YYl17JqZTHmLFZPq7xewttg\n' + + 'zQorDRWIFDtlAoGhAMo4+uM9f4BpOHSmayhLhHArIGs4386BkXSeOLeQitaQJ/2c\n' + + 'zb459O87XoCAonZbq+dI7XRnBU3toQvEsZgrtGkOFXCZJMWAQxD5BQ5vEYT6c86h\n' + + 'uGpX6h3ODlJ6UGi+5CWyMQ1cFlBkfffFAarjSYTVlyj736sOeDuJWX133z5VQBQ8\n' + + '1xSH23kNF95vxB4I1fXG8WL11YZU7VEwSLC4aCkCgaAKRj+wDhTZ4umSRWVZLiep\n' + + 'XkZp4y7W9q095nx13abvnKRmU3BVq/fGl++kZ/ujRD7dbKXlPflgJ7m0d06ivr4w\n' + + '6dbtEqNKw4TeVd0X31u82f89bFIS7/Cw4BFgbwEn+x9sdgdyZTP+MxjE3cI9s3oc\n' + + 'fLC8+ySk1qWzGkn2gX3gWkDNrdexAEfRrClZfokaiIX8qvJEBoJk5WuHadXI6u2F\n' + + 'AoGgByidOQ4kRVd0OCzr/jEuLwpXy3Pn+Fd93rL7LwRe5dmUkNXMMr+6e/2OCt6C\n' + + '4c28+CMMxOIgvfF7kf8Uil6BtHZbK/E/6/3uYdtu4mPsKtjy4I25CYqzLvrsZt8N\n' + + 'maeoS+1S7zYjVBU6oFrJBFOndpxZDYpdEKEigHkMQfTMYliCPDUrJ/7nNhHQln8+\n' + + 'YhHOATVZtjcdp/O5svYSnK7qgQKBoDd3lFWrPatgxpF1JXMEFFbaIRdNxHkKA4YY\n' + + 'gMTM4MPgViunYX/yJ7SaX8jWnC231A9uVn4+kb+DvKjc+ZuTQvnIUK2u6LvIinVF\n' + + 'snDEA+BbXwehAtwdHDMDtqYFdx4hvCWQwBNn4p3J0OO2tbYVMtvM5aOEfRSYagfm\n' + + 'RywhDUAjW8U0RBnzlmXhQQ6B9bjqooS2MsRrJrS5CU682fb3hBo=\n' + + '-----END RSA PRIVATE KEY-----'; + + let privateKeyComponents = { + n: 'ALBNXncn06GUb+nBTpAdLQCeaiaK+GBeQnHCQC9H0v6NWJNdFUlx+F8eKXkiYGECpDtB6jtYQM+pPXRUAeFNQp1rUY7TRHCH8nKq2a4busqLubMm+knFd2bv/W5u/w8mi5cf4CYVD0dTsTs2qrBL5bu4Ww4TSyGKNcyhW/2lAWw+vlHGhsR9gXxTXc1QLVUlaXP7NmN7G6DDe6wclI+/d+4kJWjCDb1Y8mrMp2LsxzcOmUT/ST/X8MawsmsZ0z1sVZdKr1WkDtvk7RTLQ1x9jlWbVlnixwC/HIpXcNBvrtqlak6iBhMDciZbAB8pGjxQDFtMS7nrpq0pQfiVCT60b78OJwQneBjqzUpTwhP8ZZNQm/CWiAky7w1HGHN2ai946gLngYZKcNrgs/MVSXjgNSmOJECCMfCRAbAGM4Mj9ost', + e: 65537, + d: 'IwXLnUoZHYEaVkpja/ePyA6wMaXrv2EaO/UFwR64iH7VuLiGEQgF+gdI39p3YO4gZ/EpMc7PWTFalvBVS0eI0zLNidzoPJ6VCDhuc8roaXImWrOEhwEmPhmws65zFrRmiIf5hDcsyNOUYpnygIEjSw5NcFde1nPZSiRH3PRZewJf1mjkvsXb4jHBcZba2o5LC5I89Lgw/de3irJGxOOZVC3xqniNJGA2nVqfPKcOopFyZZ9qd2NTzUBd3stnDfkp83dI8f3OXw/Qdc8SmL+W1KPlJ08wcVfNXvcQiX5HV7/ug+ag59YBi3WWWuRcbWW0YFYf2Zaj/cWK+9mrP1hZiANtMEYBz4Fry8h7IdF04amX9vzt0fCphb/Gk/pJnOYrOrFSLSCIu5baK1WqU5CWot88/1UjAQWi/srRTfY1ZeE=', + p: 'AN8vxMx5le6AFM3vKrrNlY3z7rQxRrHPT+Up3OajfnPfaulUp2xh33bamZyw1hqiP8f0veP80/j3P5Id9ila9NrsC8l82VdhzcFFchqul+deybrkjMrMdoX2LbF1fGR9MRgi85AMwsVKKI5tYkxX5CpTFveW67f8JHchxuB5M6l2IL9P9mX9hiXXsmplMeYsVk+rvF7C22DNCisNFYgUO2U=', + q: 'AMo4+uM9f4BpOHSmayhLhHArIGs4386BkXSeOLeQitaQJ/2czb459O87XoCAonZbq+dI7XRnBU3toQvEsZgrtGkOFXCZJMWAQxD5BQ5vEYT6c86huGpX6h3ODlJ6UGi+5CWyMQ1cFlBkfffFAarjSYTVlyj736sOeDuJWX133z5VQBQ81xSH23kNF95vxB4I1fXG8WL11YZU7VEwSLC4aCk=', + dmp1: 'CkY/sA4U2eLpkkVlWS4nqV5GaeMu1vatPeZ8dd2m75ykZlNwVav3xpfvpGf7o0Q+3Wyl5T35YCe5tHdOor6+MOnW7RKjSsOE3lXdF99bvNn/PWxSEu/wsOARYG8BJ/sfbHYHcmUz/jMYxN3CPbN6HHywvPskpNalsxpJ9oF94FpAza3XsQBH0awpWX6JGoiF/KryRAaCZOVrh2nVyOrthQ==', + dmq1: 'ByidOQ4kRVd0OCzr/jEuLwpXy3Pn+Fd93rL7LwRe5dmUkNXMMr+6e/2OCt6C4c28+CMMxOIgvfF7kf8Uil6BtHZbK/E/6/3uYdtu4mPsKtjy4I25CYqzLvrsZt8NmaeoS+1S7zYjVBU6oFrJBFOndpxZDYpdEKEigHkMQfTMYliCPDUrJ/7nNhHQln8+YhHOATVZtjcdp/O5svYSnK7qgQ==', + coeff: 'N3eUVas9q2DGkXUlcwQUVtohF03EeQoDhhiAxMzgw+BWK6dhf/IntJpfyNacLbfUD25Wfj6Rv4O8qNz5m5NC+chQra7ou8iKdUWycMQD4FtfB6EC3B0cMwO2pgV3HiG8JZDAE2fincnQ47a1thUy28zlo4R9FJhqB+ZHLCENQCNbxTREGfOWZeFBDoH1uOqihLYyxGsmtLkJTrzZ9veEGg==' + }; + + let publicKeyPKCS8 = '-----BEGIN PUBLIC KEY-----\n' + + 'MIIBYjANBgkqhkiG9w0BAQEFAAOCAU8AMIIBSgKCAUEAsE1edyfToZRv6cFOkB0t\n' + + 'AJ5qJor4YF5CccJAL0fS/o1Yk10VSXH4Xx4peSJgYQKkO0HqO1hAz6k9dFQB4U1C\n' + + 'nWtRjtNEcIfycqrZrhu6you5syb6ScV3Zu/9bm7/DyaLlx/gJhUPR1OxOzaqsEvl\n' + + 'u7hbDhNLIYo1zKFb/aUBbD6+UcaGxH2BfFNdzVAtVSVpc/s2Y3sboMN7rByUj793\n' + + '7iQlaMINvVjyasynYuzHNw6ZRP9JP9fwxrCyaxnTPWxVl0qvVaQO2+TtFMtDXH2O\n' + + 'VZtWWeLHAL8cildw0G+u2qVqTqIGEwNyJlsAHykaPFAMW0xLueumrSlB+JUJPrRv\n' + + 'vw4nBCd4GOrNSlPCE/xlk1Cb8JaICTLvDUcYc3ZqL3jqAueBhkpw2uCz8xVJeOA1\n' + + 'KY4kQIIx8JEBsAYzgyP2iy0CAwEAAQ==\n' + + '-----END PUBLIC KEY-----'; + + let publicKeyComponents = { + n: 'ALBNXncn06GUb+nBTpAdLQCeaiaK+GBeQnHCQC9H0v6NWJNdFUlx+F8eKXkiYGECpDtB6jtYQM+pPXRUAeFNQp1rUY7TRHCH8nKq2a4busqLubMm+knFd2bv/W5u/w8mi5cf4CYVD0dTsTs2qrBL5bu4Ww4TSyGKNcyhW/2lAWw+vlHGhsR9gXxTXc1QLVUlaXP7NmN7G6DDe6wclI+/d+4kJWjCDb1Y8mrMp2LsxzcOmUT/ST/X8MawsmsZ0z1sVZdKr1WkDtvk7RTLQ1x9jlWbVlnixwC/HIpXcNBvrtqlak6iBhMDciZbAB8pGjxQDFtMS7nrpq0pQfiVCT60b78OJwQneBjqzUpTwhP8ZZNQm/CWiAky7w1HGHN2ai946gLngYZKcNrgs/MVSXjgNSmOJECCMfCRAbAGM4Mj9ost', + e: 65537, + }; + + let privateKeyPEMNotTrimmed = ' \n\n \n\n ' + privateKeyPKCS1 + '\n \n \n\n '; + let publicKeyPEMNotTrimmed = '\n\n\n\n ' + publicKeyPKCS8 + '\n \n\n\n '; + + let fileKeyPKCS1 = '-----BEGIN RSA PRIVATE KEY-----\n' + + 'MIICXAIBAAKBgQCCdY+EpDC/vPa335l751SBM8d5Lf4z4QZX4bc+DqTY9zVY/rmP\n' + + 'GbTkCueKnIKApuOGMXJOaCwNH9wUftNt7T0foEwjl16uIC8m4hwSjjNL5TKqMVey\n' + + 'Syv04oBuidv76u5yNiLC4J85lbmW3WAyYkTCbm/VJZAXNJuqCm7AVWmQMQIDAQAB\n' + + 'AoGAEYR3oPfrE9PrzQTZNyn4zuCFCGCEobK1h1dno42T1Q5cu3Z4tB5fi79rF9Gs\n' + + 'NFo0cvBwyNZ0E88TXi0pdrlEW6mdPgQFd3CFxrOgKt9AGpOtI1zzVOb1Uddywq/m\n' + + 'WBPyETwEKzq7lC2nAcMUr0rlFrrDmUT2dafHeuWnFMZ/1YECQQDCtftsH9/prbgu\n' + + 'Q4F2lOWsLz96aix/jnI8FhBmukKmfLMXjCZYYv+Dsr8TIl/iriGqcSgGkBHHoGe1\n' + + 'nmLUZ4EHAkEAq4YcB8T9DLIYUeaS+JRWwLOejU6/rYdgxBIaGn2m0Ldp/z7lLM7g\n' + + 'b0H5Al+7POajkAdnDclBDhyxqInHO4VvBwJBAJ25jNEpgNhqQKg5RsYoF2RDYchn\n' + + '+WPan+7McLzGZPc4TFrmzKkMiK7GPMHjNokJRXwr7aBjVAPBjEEy7BvjPEECQFOJ\n' + + '4rcKAzEewGeLREObg9Eg6nTqSMLMb52vL1V9ozR+UDrHuDilnXuyhwPX+kqEDl+E\n' + + 'q3V0cqHb6c8rI4TizRsCQANIyhoJ33ughNzbCIknkMPKtgvLOUARnbya/bkfRexL\n' + + 'icyYzXPNuqZDY8JZQHlshN8cCcZcYjGPYYscd2LKB6o=\n' + + '-----END RSA PRIVATE KEY-----'; + let keysFolder = __dirname + '/keys/'; + let keys_formats = { 'pkcs1-private-der': {public: false, der: true, file: 'private_pkcs1.der'}, 'pkcs1-private-pem': {public: false, der: false, file: 'private_pkcs1.pem'}, 'pkcs8-private-der': {public: false, der: true, file: 'private_pkcs8.der'}, @@ -256,9 +270,9 @@ describe("NodeRSA", function () { 'pkcs8-public': {public: true, der: false, file: 'public_pkcs8.pem'} }; - describe("Good cases", function () { - describe("Common cases", function () { - it("should load private key from (not trimmed) PKCS1-PEM string", function () { + describe('Good cases', function () { + describe('Common cases', function () { + it('should load private key from (not trimmed) PKCS1-PEM string', function () { privateNodeRSA = new NodeRSA(privateKeyPEMNotTrimmed); assert.instanceOf(privateNodeRSA.keyPair, Object); assert(privateNodeRSA.isPrivate()); @@ -266,7 +280,7 @@ describe("NodeRSA", function () { assert(!privateNodeRSA.isPublic(true)); }); - it("should load public key from (not trimmed) PKCS8-PEM string", function () { + it('should load public key from (not trimmed) PKCS8-PEM string', function () { publicNodeRSA = new NodeRSA(publicKeyPEMNotTrimmed); assert.instanceOf(privateNodeRSA.keyPair, Object); assert(publicNodeRSA.isPublic()); @@ -274,37 +288,88 @@ describe("NodeRSA", function () { assert(!publicNodeRSA.isPrivate()); }); - it(".exportKey() should return private PEM string", function () { + it('.exportKey() should return private PEM string', function () { assert.equal(privateNodeRSA.exportKey('private'), privateKeyPKCS1); assert.equal(privateNodeRSA.exportKey(), privateKeyPKCS1); }); - it(".exportKey() from public key should return pkcs8 public PEM string", function () { + it('.exportKey() from public key should return pkcs8 public PEM string', function () { assert.equal(publicNodeRSA.exportKey('public'), publicKeyPKCS8); }); - it(".exportKey() from private key should return pkcs8 public PEM string", function () { + it('.exportKey() from private key should return pkcs8 public PEM string', function () { assert.equal(privateNodeRSA.exportKey('public'), publicKeyPKCS8); }); - it("should create and load key from buffer/fs.readFileSync output", function () { - var key = new NodeRSA(fs.readFileSync(keysFolder + 'private_pkcs1.pem')); + it('should create and load key from buffer/fs.readFileSync output', function () { + let key = new NodeRSA(fs.readFileSync(keysFolder + 'private_pkcs1.pem')); assert.equal(key.exportKey(), fileKeyPKCS1); key = new NodeRSA(); key.importKey(fs.readFileSync(keysFolder + 'private_pkcs1.pem')); assert.equal(key.exportKey(), fileKeyPKCS1); }); + + it('.importKey() from private components', function () { + let key = new NodeRSA(); + key.importKey({ + n: new Buffer(privateKeyComponents.n, 'base64'), + e: 65537, + d: new Buffer(privateKeyComponents.d, 'base64'), + p: new Buffer(privateKeyComponents.p, 'base64'), + q: new Buffer(privateKeyComponents.q, 'base64'), + dmp1: new Buffer(privateKeyComponents.dmp1, 'base64'), + dmq1: new Buffer(privateKeyComponents.dmq1, 'base64'), + coeff: new Buffer(privateKeyComponents.coeff, 'base64') + }, 'components'); + assert(key.isPrivate()); + assert.equal(key.exportKey('pkcs1-private'), privateKeyPKCS1); + assert.equal(key.exportKey('pkcs8-public'), publicKeyPKCS8); + }); + + it('.importKey() from public components', function () { + let key = new NodeRSA(); + key.importKey({ + n: new Buffer(publicKeyComponents.n, 'base64'), + e: 65537 + }, 'components-public'); + assert(key.isPublic(true)); + assert.equal(key.exportKey('pkcs8-public'), publicKeyPKCS8); + }); + + it('.exportKey() private components', function () { + let key = new NodeRSA(privateKeyPKCS1); + let components = key.exportKey('components'); + assert(_.isEqual({ + n: components.n.toString('base64'), + e: components.e, + d: components.d.toString('base64'), + p: components.p.toString('base64'), + q: components.q.toString('base64'), + dmp1: components.dmp1.toString('base64'), + dmq1: components.dmq1.toString('base64'), + coeff: components.coeff.toString('base64') + }, privateKeyComponents)); + }); + + it('.exportKey() public components', function () { + let key = new NodeRSA(publicKeyPKCS8); + let components = key.exportKey('components-public'); + assert(_.isEqual({ + n: components.n.toString('base64'), + e: components.e + }, publicKeyComponents)); + }); }); - describe("Different key formats", function () { - var sampleKey = new NodeRSA(fileKeyPKCS1); + describe('Different key formats', function () { + let sampleKey = new NodeRSA(fileKeyPKCS1); - for (var format in keys_formats) { + for (let format in keys_formats) { (function (format) { - var options = keys_formats[format]; + let options = keys_formats[format]; - it("should load from " + options.file + " (" + format + ")", function () { - var key = new NodeRSA(fs.readFileSync(keysFolder + options.file), format); + it('should load from ' + options.file + ' (' + format + ')', function () { + let key = new NodeRSA(fs.readFileSync(keysFolder + options.file), format); if (options.public) { assert.equal(key.exportKey('public'), sampleKey.exportKey('public')); } else { @@ -312,9 +377,9 @@ describe("NodeRSA", function () { } }); - it("should export to \"" + format + "\" format", function () { - var keyData = fs.readFileSync(keysFolder + options.file); - var exported = sampleKey.exportKey(format); + it('should export to \'' + format + '\' format', function () { + let keyData = fs.readFileSync(keysFolder + options.file); + let exported = sampleKey.exportKey(format); if (options.der) { assert(Buffer.isBuffer(exported)); @@ -329,45 +394,45 @@ describe("NodeRSA", function () { }); }); - describe("Bad cases", function () { - it("not public key", function () { - var key = new NodeRSA(); + describe('Bad cases', function () { + it('not public key', function () { + let key = new NodeRSA(); assert.throw(function () { key.exportKey(); - }, Error, "It is not private key"); + }, Error, 'This is not private key'); assert.throw(function () { key.exportKey('public'); - }, Error, "It is not public key"); + }, Error, 'This is not public key'); }); - it("not private key", function () { - var key = new NodeRSA(publicKeyPKCS8); + it('not private key', function () { + let key = new NodeRSA(publicKeyPKCS8); assert.throw(function () { key.exportKey(); - }, Error, "It is not private key"); + }, Error, 'This is not private key'); assert.doesNotThrow(function () { key.exportKey('public'); - }, Error, "It is not public key"); + }, Error, 'This is not public key'); }); }); }); }); - describe("Encrypting & decrypting", function () { - for (var env in environments) { + describe('Encrypting & decrypting', function () { + for (let env in environments) { (function (env) { - for (var scheme_i in encryptSchemes) { + for (let scheme_i in encryptSchemes) { (function (scheme) { - describe("Environment: " + env + ". Encryption scheme: " + scheme, function () { - describe("Good cases", function () { - var encrypted = {}; - var decrypted = {}; - for (var i in dataBundle) { + describe('Environment: ' + env + '. Encryption scheme: ' + scheme, function () { + describe('Good cases', function () { + let encrypted = {}; + let decrypted = {}; + for (let i in dataBundle) { (function (i) { - var key = null; - var suit = dataBundle[i]; + let key = null; + let suit = dataBundle[i]; - it("`encrypt()` should encrypt " + i, function () { + it('`encrypt()` should encrypt ' + i, function () { key = new NodeRSA(generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(), { environment: env, encryptionScheme: scheme @@ -377,7 +442,7 @@ describe("NodeRSA", function () { assert(encrypted[i].length > 0); }); - it("`decrypt()` should decrypt " + i, function () { + it('`decrypt()` should decrypt ' + i, function () { decrypted[i] = key.decrypt(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); if (Buffer.isBuffer(decrypted[i])) { assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); @@ -391,39 +456,39 @@ describe("NodeRSA", function () { }); - describe("Bad cases", function () { - it("unsupported data types", function () { + describe('Bad cases', function () { + it('unsupported data types', function () { assert.throw(function () { generatedKeys[0].encrypt(null); - }, Error, "Unexpected data type"); + }, Error, 'Unexpected data type'); assert.throw(function () { generatedKeys[0].encrypt(undefined); - }, Error, "Unexpected data type"); + }, Error, 'Unexpected data type'); assert.throw(function () { generatedKeys[0].encrypt(true); - }, Error, "Unexpected data type"); + }, Error, 'Unexpected data type'); }); - it("incorrect key for decrypting", function () { - var encrypted = generatedKeys[0].encrypt('data'); + it('incorrect key for decrypting', function () { + let encrypted = generatedKeys[0].encrypt('data'); assert.throw(function () { generatedKeys[1].decrypt(encrypted); - }, Error, "Error during decryption"); + }, Error, 'Error during decryption'); }); }); }); })(encryptSchemes[scheme_i]); } - describe("Environment: " + env + ". encryptPrivate & decryptPublic", function () { - var encrypted = {}; - var decrypted = {}; - for (var i in dataBundle) { + describe('Environment: ' + env + '. encryptPrivate & decryptPublic', function () { + let encrypted = {}; + let decrypted = {}; + for (let i in dataBundle) { (function (i) { - var key = null; - var suit = dataBundle[i]; + let key = null; + let suit = dataBundle[i]; - it("`encryptPrivate()` should encrypt " + i, function () { + it('`encryptPrivate()` should encrypt ' + i, function () { key = new NodeRSA(generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(), { environment: env }); @@ -432,7 +497,7 @@ describe("NodeRSA", function () { assert(encrypted[i].length > 0); }); - it("`decryptPublic()` should decrypt " + i, function () { + it('`decryptPublic()` should decrypt ' + i, function () { decrypted[i] = key.decryptPublic(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); if (Buffer.isBuffer(decrypted[i])) { assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); @@ -446,19 +511,19 @@ describe("NodeRSA", function () { })(environments[env]); } - describe("Compatibility of different environments", function () { - for (var scheme_i in encryptSchemes) { + describe('Compatibility of different environments', function () { + for (let scheme_i in encryptSchemes) { (function (scheme) { - var encrypted = {}; - var decrypted = {}; - for (var i in dataBundle) { + let encrypted = {}; + let decrypted = {}; + for (let i in dataBundle) { (function (i) { - var key1 = null; - var key2 = null; - var suit = dataBundle[i]; + let key1 = null; + let key2 = null; + let suit = dataBundle[i]; - it("Encryption scheme: " + scheme + " `encrypt()` by browser " + i, function () { - var key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); + it('Encryption scheme: ' + scheme + ' `encrypt()` by browser ' + i, function () { + let key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); key1 = new NodeRSA(key, { environment: 'browser', encryptionScheme: scheme @@ -472,7 +537,7 @@ describe("NodeRSA", function () { assert(encrypted[i].length > 0); }); - it("Encryption scheme: " + scheme + " `decrypt()` by node " + i, function () { + it('Encryption scheme: ' + scheme + ' `decrypt()` by node ' + i, function () { decrypted[i] = key2.decrypt(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); if (Buffer.isBuffer(decrypted[i])) { assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); @@ -483,16 +548,16 @@ describe("NodeRSA", function () { })(i); } - var encrypted = {}; - var decrypted = {}; - for (var i in dataBundle) { + encrypted = {}; + decrypted = {}; + for (let i in dataBundle) { (function (i) { - var key1 = null; - var key2 = null; - var suit = dataBundle[i]; + let key1 = null; + let key2 = null; + let suit = dataBundle[i]; - it("Encryption scheme: " + scheme + " `encrypt()` by node " + i + ". Scheme", function () { - var key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); + it('Encryption scheme: ' + scheme + ' `encrypt()` by node ' + i + '. Scheme', function () { + let key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); key1 = new NodeRSA(key, { environment: 'node', encryptionScheme: scheme @@ -506,7 +571,7 @@ describe("NodeRSA", function () { assert(encrypted[i].length > 0); }); - it("Encryption scheme: " + scheme + " `decrypt()` by browser " + i, function () { + it('Encryption scheme: ' + scheme + ' `decrypt()` by browser ' + i, function () { decrypted[i] = key2.decrypt(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); if (Buffer.isBuffer(decrypted[i])) { assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); @@ -519,17 +584,17 @@ describe("NodeRSA", function () { })(encryptSchemes[scheme_i]); } - describe("encryptPrivate & decryptPublic", function () { - var encrypted = {}; - var decrypted = {}; - for (var i in dataBundle) { + describe('encryptPrivate & decryptPublic', function () { + let encrypted = {}; + let decrypted = {}; + for (let i in dataBundle) { (function (i) { - var key1 = null; - var key2 = null; - var suit = dataBundle[i]; + let key1 = null; + let key2 = null; + let suit = dataBundle[i]; - it("`encryptPrivate()` by browser " + i, function () { - var key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); + it('`encryptPrivate()` by browser ' + i, function () { + let key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); key1 = new NodeRSA(key, {environment: 'browser'}); key2 = new NodeRSA(key, {environment: 'node'}); encrypted[i] = key1.encryptPrivate(suit.data); @@ -537,7 +602,7 @@ describe("NodeRSA", function () { assert(encrypted[i].length > 0); }); - it("`decryptPublic()` by node " + i, function () { + it('`decryptPublic()` by node ' + i, function () { decrypted[i] = key2.decryptPublic(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); if (Buffer.isBuffer(decrypted[i])) { assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); @@ -548,14 +613,14 @@ describe("NodeRSA", function () { })(i); } - for (var i in dataBundle) { + for (let i in dataBundle) { (function (i) { - var key1 = null; - var key2 = null; - var suit = dataBundle[i]; + let key1 = null; + let key2 = null; + let suit = dataBundle[i]; - it("`encryptPrivate()` by node " + i, function () { - var key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); + it('`encryptPrivate()` by node ' + i, function () { + let key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); key1 = new NodeRSA(key, {environment: 'browser'}); key2 = new NodeRSA(key, {environment: 'node'}); encrypted[i] = key1.encryptPrivate(suit.data); @@ -563,7 +628,7 @@ describe("NodeRSA", function () { assert(encrypted[i].length > 0); }); - it("`decryptPublic()` by browser " + i, function () { + it('`decryptPublic()` by browser ' + i, function () { decrypted[i] = key2.decryptPublic(encrypted[i], _.isArray(suit.encoding) ? suit.encoding[0] : suit.encoding); if (Buffer.isBuffer(decrypted[i])) { assert.equal(suit.data.toString('hex'), decrypted[i].toString('hex')); @@ -577,25 +642,25 @@ describe("NodeRSA", function () { }); }); - describe("Signing & verifying", function () { - for (var scheme_i in signingSchemes) { + describe('Signing & verifying', function () { + for (let scheme_i in signingSchemes) { (function (scheme) { - describe("Signing scheme: " + scheme, function () { + describe('Signing scheme: ' + scheme, function () { + let envs = ['node']; if (scheme == 'pkcs1') { - var envs = environments; - } else { - var envs = ['node']; + envs = environments; } - for (var env in envs) { + + for (let env in envs) { (function (env) { - describe("Good cases " + (envs.length > 1 ? " in " + env + " environment" : ""), function () { - var signed = {}; - var key = null; + describe('Good cases ' + (envs.length > 1 ? ' in ' + env + ' environment' : ''), function () { + let signed = {}; + let key = null; - for (var i in dataBundle) { + for (let i in dataBundle) { (function (i) { - var suit = dataBundle[i]; - it("should sign " + i, function () { + let suit = dataBundle[i]; + it('should sign ' + i, function () { key = new NodeRSA(generatedKeys[generatedKeys.length - 1].exportKey(), { signingScheme: scheme + '-sha256', environment: env @@ -605,7 +670,7 @@ describe("NodeRSA", function () { assert(signed[i].length > 0); }); - it("should verify " + i, function () { + it('should verify ' + i, function () { if (!key.verify(suit.data, signed[i])) { key.verify(suit.data, signed[i]); } @@ -614,14 +679,14 @@ describe("NodeRSA", function () { })(i); } - for (var alg in signHashAlgorithms[env]) { + for (let alg in signHashAlgorithms[env]) { (function (alg) { - it("signing with custom algorithm (" + alg + ")", function () { - var key = new NodeRSA(generatedKeys[generatedKeys.length - 1].exportKey(), { + it('signing with custom algorithm (' + alg + ')', function () { + let key = new NodeRSA(generatedKeys[generatedKeys.length - 1].exportKey(), { signingScheme: scheme + '-' + alg, environment: env }); - var signed = key.sign('data'); + let signed = key.sign('data'); if (!key.verify('data', signed)) { key.verify('data', signed); } @@ -631,57 +696,57 @@ describe("NodeRSA", function () { } }); - describe("Bad cases" + (envs.length > 1 ? " in " + env + " environment" : ""), function () { - it("incorrect data for verifying", function () { - var key = new NodeRSA(generatedKeys[0].exportKey(), { + describe('Bad cases' + (envs.length > 1 ? ' in ' + env + ' environment' : ''), function () { + it('incorrect data for verifying', function () { + let key = new NodeRSA(generatedKeys[0].exportKey(), { signingScheme: scheme + '-sha256', environment: env }); - var signed = key.sign('data1'); + let signed = key.sign('data1'); assert(!key.verify('data2', signed)); }); - it("incorrect key for signing", function () { - var key = new NodeRSA(generatedKeys[0].exportKey('pkcs8-public'), { + it('incorrect key for signing', function () { + let key = new NodeRSA(generatedKeys[0].exportKey('pkcs8-public'), { signingScheme: scheme + '-sha256', environment: env }); assert.throw(function () { key.sign('data'); - }, Error, "It is not private key"); + }, Error, 'This is not private key'); }); - it("incorrect key for verifying", function () { - var key1 = new NodeRSA(generatedKeys[0].exportKey(), { + it('incorrect key for verifying', function () { + let key1 = new NodeRSA(generatedKeys[0].exportKey(), { signingScheme: scheme + '-sha256', environment: env }); - var key2 = new NodeRSA(generatedKeys[1].exportKey('pkcs8-public'), { + let key2 = new NodeRSA(generatedKeys[1].exportKey('pkcs8-public'), { signingScheme: scheme + '-sha256', environment: env }); - var signed = key1.sign('data'); + let signed = key1.sign('data'); assert(!key2.verify('data', signed)); }); - it("incorrect key for verifying (empty)", function () { - var key = new NodeRSA(null, {environment: env}); + it('incorrect key for verifying (empty)', function () { + let key = new NodeRSA(null, {environment: env}); assert.throw(function () { key.verify('data', 'somesignature'); - }, Error, "It is not public key"); + }, Error, 'This is not public key'); }); - it("different algorithms", function () { - var singKey = new NodeRSA(generatedKeys[0].exportKey(), { + it('different algorithms', function () { + let singKey = new NodeRSA(generatedKeys[0].exportKey(), { signingScheme: scheme + '-md5', environment: env }); - var verifyKey = new NodeRSA(generatedKeys[0].exportKey(), { + let verifyKey = new NodeRSA(generatedKeys[0].exportKey(), { signingScheme: scheme + '-sha1', environment: env }); - var signed = singKey.sign('data'); + let signed = singKey.sign('data'); assert(!verifyKey.verify('data', signed)); }); }); @@ -692,15 +757,15 @@ describe("NodeRSA", function () { return; } - describe("Compatibility of different environments", function () { - for (var alg in signHashAlgorithms['browser']) { + describe('Compatibility of different environments', function () { + for (let alg in signHashAlgorithms['browser']) { (function (alg) { - it("signing with custom algorithm (" + alg + ") (equal test)", function () { - var nodeKey = new NodeRSA(generatedKeys[5].exportKey(), { + it('signing with custom algorithm (' + alg + ') (equal test)', function () { + let nodeKey = new NodeRSA(generatedKeys[5].exportKey(), { signingScheme: scheme + '-' + alg, environment: 'node' }); - var browserKey = new NodeRSA(generatedKeys[5].exportKey(), { + let browserKey = new NodeRSA(generatedKeys[5].exportKey(), { signingScheme: scheme + '-' + alg, environment: 'browser' }); @@ -708,12 +773,12 @@ describe("NodeRSA", function () { assert.equal(nodeKey.sign('data', 'hex'), browserKey.sign('data', 'hex')); }); - it("sign in node & verify in browser (" + alg + ")", function () { - var nodeKey = new NodeRSA(generatedKeys[5].exportKey(), { + it('sign in node & verify in browser (' + alg + ')', function () { + let nodeKey = new NodeRSA(generatedKeys[5].exportKey(), { signingScheme: scheme + '-' + alg, environment: 'node' }); - var browserKey = new NodeRSA(generatedKeys[5].exportKey(), { + let browserKey = new NodeRSA(generatedKeys[5].exportKey(), { signingScheme: scheme + '-' + alg, environment: 'browser' }); @@ -721,12 +786,12 @@ describe("NodeRSA", function () { assert(browserKey.verify('data', nodeKey.sign('data'))); }); - it("sign in browser & verify in node (" + alg + ")", function () { - var nodeKey = new NodeRSA(generatedKeys[5].exportKey(), { + it('sign in browser & verify in node (' + alg + ')', function () { + let nodeKey = new NodeRSA(generatedKeys[5].exportKey(), { signingScheme: scheme + '-' + alg, environment: 'node' }); - var browserKey = new NodeRSA(generatedKeys[5].exportKey(), { + let browserKey = new NodeRSA(generatedKeys[5].exportKey(), { signingScheme: scheme + '-' + alg, environment: 'browser' }); From 9820b46975248d5a899640f3b00be0347d7ef337 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sun, 24 Jan 2016 21:30:44 +0500 Subject: [PATCH 080/146] Readme update --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 53ccbc5..0c7bd62 100644 --- a/README.md +++ b/README.md @@ -156,6 +156,13 @@ key.importKey({ coeff: new Buffer('00b399675e5e81506b729a777cc03026f0b2119853dfc5eb124610c0ab82999e45', 'hex') }, 'components'); var publicComponents = key.exportKey('components-public'); +console.log(publicComponents); + +/* +{ n: , + e: 65537 +} +*/ ``` From c20a2c84d8979bbcc5665561cbc25bf3f2cb245b Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sun, 24 Jan 2016 21:33:19 +0500 Subject: [PATCH 081/146] tests es5 compatible --- test/tests.js | 222 +++++++++++++++++++++++++------------------------- 1 file changed, 110 insertions(+), 112 deletions(-) diff --git a/test/tests.js b/test/tests.js index bea11fa..1bf0034 100644 --- a/test/tests.js +++ b/test/tests.js @@ -1,12 +1,10 @@ -"use strict"; - -let fs = require('fs'); -let assert = require('chai').assert; -let _ = require('lodash'); -let NodeRSA = require('../src/NodeRSA'); +var fs = require('fs'); +var assert = require('chai').assert; +var _ = require('lodash'); +var NodeRSA = require('../src/NodeRSA'); describe('NodeRSA', function () { - let keySizes = [ + var keySizes = [ {b: 512, e: 3}, {b: 512, e: 5}, {b: 512, e: 257}, @@ -15,15 +13,15 @@ describe('NodeRSA', function () { {b: 1024} // 'e' should be 65537 ]; - let environments = ['browser', 'node']; - let encryptSchemes = ['pkcs1', 'pkcs1_oaep']; - let signingSchemes = ['pkcs1', 'pss']; - let signHashAlgorithms = { + var environments = ['browser', 'node']; + var encryptSchemes = ['pkcs1', 'pkcs1_oaep']; + var signingSchemes = ['pkcs1', 'pss']; + var signHashAlgorithms = { 'node': ['MD4', 'MD5', 'RIPEMD160', 'SHA', 'SHA1', 'SHA224', 'SHA256', 'SHA384', 'SHA512'], 'browser': ['MD5', 'RIPEMD160', 'SHA1', 'SHA256', 'SHA512'] }; - let dataBundle = { + var dataBundle = { 'string': { data: 'ascii + 12345678', encoding: 'utf8' @@ -54,9 +52,9 @@ describe('NodeRSA', function () { } }; - let generatedKeys = []; - let privateNodeRSA = null; - let publicNodeRSA = null; + var generatedKeys = []; + var privateNodeRSA = null; + var publicNodeRSA = null; describe('Setup options', function () { it('should use browser environment', function () { @@ -68,7 +66,7 @@ describe('NodeRSA', function () { }); it('should make empty key pair with default options', function () { - let key = new NodeRSA(null); + var key = new NodeRSA(null); assert.equal(key.isEmpty(), true); assert.equal(key.$options.signingScheme, 'pkcs1'); assert.equal(key.$options.signingSchemeOptions.hash, 'sha256'); @@ -80,26 +78,26 @@ describe('NodeRSA', function () { }); it('should make key pair with pkcs1-md5 signing scheme', function () { - let key = new NodeRSA(null, {signingScheme: 'md5'}); + var key = new NodeRSA(null, {signingScheme: 'md5'}); assert.equal(key.$options.signingScheme, 'pkcs1'); assert.equal(key.$options.signingSchemeOptions.hash, 'md5'); }); it('should make key pair with pss-sha512 signing scheme', function () { - let key = new NodeRSA(null, {signingScheme: 'pss-sha512'}); + var key = new NodeRSA(null, {signingScheme: 'pss-sha512'}); assert.equal(key.$options.signingScheme, 'pss'); assert.equal(key.$options.signingSchemeOptions.hash, 'sha512'); }); it('should make key pair with pkcs1 encryption scheme, and pss-sha1 signing scheme', function () { - let key = new NodeRSA(null, {encryptionScheme: 'pkcs1', signingScheme: 'pss'}); + var key = new NodeRSA(null, {encryptionScheme: 'pkcs1', signingScheme: 'pss'}); assert.equal(key.$options.encryptionScheme, 'pkcs1'); assert.equal(key.$options.signingScheme, 'pss'); assert.equal(key.$options.signingSchemeOptions.hash, null); }); it('change options', function () { - let key = new NodeRSA(null, {signingScheme: 'pss-sha1'}); + var key = new NodeRSA(null, {signingScheme: 'pss-sha1'}); assert.equal(key.$options.signingScheme, 'pss'); assert.equal(key.$options.signingSchemeOptions.hash, 'sha1'); key.setOptions({signingScheme: 'pkcs1'}); @@ -111,7 +109,7 @@ describe('NodeRSA', function () { }); it('advanced options change', function () { - let key = new NodeRSA(null); + var key = new NodeRSA(null); key.setOptions({ encryptionScheme: { scheme: 'pkcs1_oaep', @@ -134,7 +132,7 @@ describe('NodeRSA', function () { }); it('should throw \'unsupported hashing algorithm\' exception', function () { - let key = new NodeRSA(null); + var key = new NodeRSA(null); assert.equal(key.isEmpty(), true); assert.equal(key.$options.signingScheme, 'pkcs1'); assert.equal(key.$options.signingSchemeOptions.hash, 'sha256'); @@ -150,7 +148,7 @@ describe('NodeRSA', function () { describe('Work with keys', function () { describe('Generating keys', function () { - for (let size in keySizes) { + for (var size in keySizes) { (function (size) { it('should make key pair ' + size.b + '-bit length and public exponent is ' + (size.e ? size.e : size.e + ' and should be 65537'), function () { generatedKeys.push(new NodeRSA({b: size.b, e: size.e}, {encryptionScheme: 'pkcs1'})); @@ -165,7 +163,7 @@ describe('NodeRSA', function () { }); describe('Imprt/Export keys', function () { - let privateKeyPKCS1 = '-----BEGIN RSA PRIVATE KEY-----\n' + + var privateKeyPKCS1 = '-----BEGIN RSA PRIVATE KEY-----\n' + 'MIIFwgIBAAKCAUEAsE1edyfToZRv6cFOkB0tAJ5qJor4YF5CccJAL0fS/o1Yk10V\n' + 'SXH4Xx4peSJgYQKkO0HqO1hAz6k9dFQB4U1CnWtRjtNEcIfycqrZrhu6you5syb6\n' + 'ScV3Zu/9bm7/DyaLlx/gJhUPR1OxOzaqsEvlu7hbDhNLIYo1zKFb/aUBbD6+UcaG\n' + @@ -199,7 +197,7 @@ describe('NodeRSA', function () { 'RywhDUAjW8U0RBnzlmXhQQ6B9bjqooS2MsRrJrS5CU682fb3hBo=\n' + '-----END RSA PRIVATE KEY-----'; - let privateKeyComponents = { + var privateKeyComponents = { n: 'ALBNXncn06GUb+nBTpAdLQCeaiaK+GBeQnHCQC9H0v6NWJNdFUlx+F8eKXkiYGECpDtB6jtYQM+pPXRUAeFNQp1rUY7TRHCH8nKq2a4busqLubMm+knFd2bv/W5u/w8mi5cf4CYVD0dTsTs2qrBL5bu4Ww4TSyGKNcyhW/2lAWw+vlHGhsR9gXxTXc1QLVUlaXP7NmN7G6DDe6wclI+/d+4kJWjCDb1Y8mrMp2LsxzcOmUT/ST/X8MawsmsZ0z1sVZdKr1WkDtvk7RTLQ1x9jlWbVlnixwC/HIpXcNBvrtqlak6iBhMDciZbAB8pGjxQDFtMS7nrpq0pQfiVCT60b78OJwQneBjqzUpTwhP8ZZNQm/CWiAky7w1HGHN2ai946gLngYZKcNrgs/MVSXjgNSmOJECCMfCRAbAGM4Mj9ost', e: 65537, d: 'IwXLnUoZHYEaVkpja/ePyA6wMaXrv2EaO/UFwR64iH7VuLiGEQgF+gdI39p3YO4gZ/EpMc7PWTFalvBVS0eI0zLNidzoPJ6VCDhuc8roaXImWrOEhwEmPhmws65zFrRmiIf5hDcsyNOUYpnygIEjSw5NcFde1nPZSiRH3PRZewJf1mjkvsXb4jHBcZba2o5LC5I89Lgw/de3irJGxOOZVC3xqniNJGA2nVqfPKcOopFyZZ9qd2NTzUBd3stnDfkp83dI8f3OXw/Qdc8SmL+W1KPlJ08wcVfNXvcQiX5HV7/ug+ag59YBi3WWWuRcbWW0YFYf2Zaj/cWK+9mrP1hZiANtMEYBz4Fry8h7IdF04amX9vzt0fCphb/Gk/pJnOYrOrFSLSCIu5baK1WqU5CWot88/1UjAQWi/srRTfY1ZeE=', @@ -210,7 +208,7 @@ describe('NodeRSA', function () { coeff: 'N3eUVas9q2DGkXUlcwQUVtohF03EeQoDhhiAxMzgw+BWK6dhf/IntJpfyNacLbfUD25Wfj6Rv4O8qNz5m5NC+chQra7ou8iKdUWycMQD4FtfB6EC3B0cMwO2pgV3HiG8JZDAE2fincnQ47a1thUy28zlo4R9FJhqB+ZHLCENQCNbxTREGfOWZeFBDoH1uOqihLYyxGsmtLkJTrzZ9veEGg==' }; - let publicKeyPKCS8 = '-----BEGIN PUBLIC KEY-----\n' + + var publicKeyPKCS8 = '-----BEGIN PUBLIC KEY-----\n' + 'MIIBYjANBgkqhkiG9w0BAQEFAAOCAU8AMIIBSgKCAUEAsE1edyfToZRv6cFOkB0t\n' + 'AJ5qJor4YF5CccJAL0fS/o1Yk10VSXH4Xx4peSJgYQKkO0HqO1hAz6k9dFQB4U1C\n' + 'nWtRjtNEcIfycqrZrhu6you5syb6ScV3Zu/9bm7/DyaLlx/gJhUPR1OxOzaqsEvl\n' + @@ -221,15 +219,15 @@ describe('NodeRSA', function () { 'KY4kQIIx8JEBsAYzgyP2iy0CAwEAAQ==\n' + '-----END PUBLIC KEY-----'; - let publicKeyComponents = { + var publicKeyComponents = { n: 'ALBNXncn06GUb+nBTpAdLQCeaiaK+GBeQnHCQC9H0v6NWJNdFUlx+F8eKXkiYGECpDtB6jtYQM+pPXRUAeFNQp1rUY7TRHCH8nKq2a4busqLubMm+knFd2bv/W5u/w8mi5cf4CYVD0dTsTs2qrBL5bu4Ww4TSyGKNcyhW/2lAWw+vlHGhsR9gXxTXc1QLVUlaXP7NmN7G6DDe6wclI+/d+4kJWjCDb1Y8mrMp2LsxzcOmUT/ST/X8MawsmsZ0z1sVZdKr1WkDtvk7RTLQ1x9jlWbVlnixwC/HIpXcNBvrtqlak6iBhMDciZbAB8pGjxQDFtMS7nrpq0pQfiVCT60b78OJwQneBjqzUpTwhP8ZZNQm/CWiAky7w1HGHN2ai946gLngYZKcNrgs/MVSXjgNSmOJECCMfCRAbAGM4Mj9ost', e: 65537, }; - let privateKeyPEMNotTrimmed = ' \n\n \n\n ' + privateKeyPKCS1 + '\n \n \n\n '; - let publicKeyPEMNotTrimmed = '\n\n\n\n ' + publicKeyPKCS8 + '\n \n\n\n '; + var privateKeyPEMNotTrimmed = ' \n\n \n\n ' + privateKeyPKCS1 + '\n \n \n\n '; + var publicKeyPEMNotTrimmed = '\n\n\n\n ' + publicKeyPKCS8 + '\n \n\n\n '; - let fileKeyPKCS1 = '-----BEGIN RSA PRIVATE KEY-----\n' + + var fileKeyPKCS1 = '-----BEGIN RSA PRIVATE KEY-----\n' + 'MIICXAIBAAKBgQCCdY+EpDC/vPa335l751SBM8d5Lf4z4QZX4bc+DqTY9zVY/rmP\n' + 'GbTkCueKnIKApuOGMXJOaCwNH9wUftNt7T0foEwjl16uIC8m4hwSjjNL5TKqMVey\n' + 'Syv04oBuidv76u5yNiLC4J85lbmW3WAyYkTCbm/VJZAXNJuqCm7AVWmQMQIDAQAB\n' + @@ -244,8 +242,8 @@ describe('NodeRSA', function () { 'q3V0cqHb6c8rI4TizRsCQANIyhoJ33ughNzbCIknkMPKtgvLOUARnbya/bkfRexL\n' + 'icyYzXPNuqZDY8JZQHlshN8cCcZcYjGPYYscd2LKB6o=\n' + '-----END RSA PRIVATE KEY-----'; - let keysFolder = __dirname + '/keys/'; - let keys_formats = { + var keysFolder = __dirname + '/keys/'; + var keys_formats = { 'pkcs1-private-der': {public: false, der: true, file: 'private_pkcs1.der'}, 'pkcs1-private-pem': {public: false, der: false, file: 'private_pkcs1.pem'}, 'pkcs8-private-der': {public: false, der: true, file: 'private_pkcs8.der'}, @@ -302,7 +300,7 @@ describe('NodeRSA', function () { }); it('should create and load key from buffer/fs.readFileSync output', function () { - let key = new NodeRSA(fs.readFileSync(keysFolder + 'private_pkcs1.pem')); + var key = new NodeRSA(fs.readFileSync(keysFolder + 'private_pkcs1.pem')); assert.equal(key.exportKey(), fileKeyPKCS1); key = new NodeRSA(); key.importKey(fs.readFileSync(keysFolder + 'private_pkcs1.pem')); @@ -310,7 +308,7 @@ describe('NodeRSA', function () { }); it('.importKey() from private components', function () { - let key = new NodeRSA(); + var key = new NodeRSA(); key.importKey({ n: new Buffer(privateKeyComponents.n, 'base64'), e: 65537, @@ -327,7 +325,7 @@ describe('NodeRSA', function () { }); it('.importKey() from public components', function () { - let key = new NodeRSA(); + var key = new NodeRSA(); key.importKey({ n: new Buffer(publicKeyComponents.n, 'base64'), e: 65537 @@ -337,8 +335,8 @@ describe('NodeRSA', function () { }); it('.exportKey() private components', function () { - let key = new NodeRSA(privateKeyPKCS1); - let components = key.exportKey('components'); + var key = new NodeRSA(privateKeyPKCS1); + var components = key.exportKey('components'); assert(_.isEqual({ n: components.n.toString('base64'), e: components.e, @@ -352,8 +350,8 @@ describe('NodeRSA', function () { }); it('.exportKey() public components', function () { - let key = new NodeRSA(publicKeyPKCS8); - let components = key.exportKey('components-public'); + var key = new NodeRSA(publicKeyPKCS8); + var components = key.exportKey('components-public'); assert(_.isEqual({ n: components.n.toString('base64'), e: components.e @@ -362,14 +360,14 @@ describe('NodeRSA', function () { }); describe('Different key formats', function () { - let sampleKey = new NodeRSA(fileKeyPKCS1); + var sampleKey = new NodeRSA(fileKeyPKCS1); - for (let format in keys_formats) { + for (var format in keys_formats) { (function (format) { - let options = keys_formats[format]; + var options = keys_formats[format]; it('should load from ' + options.file + ' (' + format + ')', function () { - let key = new NodeRSA(fs.readFileSync(keysFolder + options.file), format); + var key = new NodeRSA(fs.readFileSync(keysFolder + options.file), format); if (options.public) { assert.equal(key.exportKey('public'), sampleKey.exportKey('public')); } else { @@ -378,8 +376,8 @@ describe('NodeRSA', function () { }); it('should export to \'' + format + '\' format', function () { - let keyData = fs.readFileSync(keysFolder + options.file); - let exported = sampleKey.exportKey(format); + var keyData = fs.readFileSync(keysFolder + options.file); + var exported = sampleKey.exportKey(format); if (options.der) { assert(Buffer.isBuffer(exported)); @@ -396,7 +394,7 @@ describe('NodeRSA', function () { describe('Bad cases', function () { it('not public key', function () { - let key = new NodeRSA(); + var key = new NodeRSA(); assert.throw(function () { key.exportKey(); }, Error, 'This is not private key'); @@ -406,7 +404,7 @@ describe('NodeRSA', function () { }); it('not private key', function () { - let key = new NodeRSA(publicKeyPKCS8); + var key = new NodeRSA(publicKeyPKCS8); assert.throw(function () { key.exportKey(); }, Error, 'This is not private key'); @@ -419,18 +417,18 @@ describe('NodeRSA', function () { }); describe('Encrypting & decrypting', function () { - for (let env in environments) { + for (var env in environments) { (function (env) { - for (let scheme_i in encryptSchemes) { + for (var scheme_i in encryptSchemes) { (function (scheme) { describe('Environment: ' + env + '. Encryption scheme: ' + scheme, function () { describe('Good cases', function () { - let encrypted = {}; - let decrypted = {}; - for (let i in dataBundle) { + var encrypted = {}; + var decrypted = {}; + for (var i in dataBundle) { (function (i) { - let key = null; - let suit = dataBundle[i]; + var key = null; + var suit = dataBundle[i]; it('`encrypt()` should encrypt ' + i, function () { key = new NodeRSA(generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(), { @@ -470,7 +468,7 @@ describe('NodeRSA', function () { }); it('incorrect key for decrypting', function () { - let encrypted = generatedKeys[0].encrypt('data'); + var encrypted = generatedKeys[0].encrypt('data'); assert.throw(function () { generatedKeys[1].decrypt(encrypted); }, Error, 'Error during decryption'); @@ -481,12 +479,12 @@ describe('NodeRSA', function () { } describe('Environment: ' + env + '. encryptPrivate & decryptPublic', function () { - let encrypted = {}; - let decrypted = {}; - for (let i in dataBundle) { + var encrypted = {}; + var decrypted = {}; + for (var i in dataBundle) { (function (i) { - let key = null; - let suit = dataBundle[i]; + var key = null; + var suit = dataBundle[i]; it('`encryptPrivate()` should encrypt ' + i, function () { key = new NodeRSA(generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(), { @@ -512,18 +510,18 @@ describe('NodeRSA', function () { } describe('Compatibility of different environments', function () { - for (let scheme_i in encryptSchemes) { + for (var scheme_i in encryptSchemes) { (function (scheme) { - let encrypted = {}; - let decrypted = {}; - for (let i in dataBundle) { + var encrypted = {}; + var decrypted = {}; + for (var i in dataBundle) { (function (i) { - let key1 = null; - let key2 = null; - let suit = dataBundle[i]; + var key1 = null; + var key2 = null; + var suit = dataBundle[i]; it('Encryption scheme: ' + scheme + ' `encrypt()` by browser ' + i, function () { - let key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); + var key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); key1 = new NodeRSA(key, { environment: 'browser', encryptionScheme: scheme @@ -550,14 +548,14 @@ describe('NodeRSA', function () { encrypted = {}; decrypted = {}; - for (let i in dataBundle) { + for (var i in dataBundle) { (function (i) { - let key1 = null; - let key2 = null; - let suit = dataBundle[i]; + var key1 = null; + var key2 = null; + var suit = dataBundle[i]; it('Encryption scheme: ' + scheme + ' `encrypt()` by node ' + i + '. Scheme', function () { - let key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); + var key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); key1 = new NodeRSA(key, { environment: 'node', encryptionScheme: scheme @@ -585,16 +583,16 @@ describe('NodeRSA', function () { } describe('encryptPrivate & decryptPublic', function () { - let encrypted = {}; - let decrypted = {}; - for (let i in dataBundle) { + var encrypted = {}; + var decrypted = {}; + for (var i in dataBundle) { (function (i) { - let key1 = null; - let key2 = null; - let suit = dataBundle[i]; + var key1 = null; + var key2 = null; + var suit = dataBundle[i]; it('`encryptPrivate()` by browser ' + i, function () { - let key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); + var key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); key1 = new NodeRSA(key, {environment: 'browser'}); key2 = new NodeRSA(key, {environment: 'node'}); encrypted[i] = key1.encryptPrivate(suit.data); @@ -613,14 +611,14 @@ describe('NodeRSA', function () { })(i); } - for (let i in dataBundle) { + for (var i in dataBundle) { (function (i) { - let key1 = null; - let key2 = null; - let suit = dataBundle[i]; + var key1 = null; + var key2 = null; + var suit = dataBundle[i]; it('`encryptPrivate()` by node ' + i, function () { - let key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); + var key = generatedKeys[Math.round(Math.random() * 1000) % generatedKeys.length].exportKey(); key1 = new NodeRSA(key, {environment: 'browser'}); key2 = new NodeRSA(key, {environment: 'node'}); encrypted[i] = key1.encryptPrivate(suit.data); @@ -643,23 +641,23 @@ describe('NodeRSA', function () { }); describe('Signing & verifying', function () { - for (let scheme_i in signingSchemes) { + for (var scheme_i in signingSchemes) { (function (scheme) { describe('Signing scheme: ' + scheme, function () { - let envs = ['node']; + var envs = ['node']; if (scheme == 'pkcs1') { envs = environments; } - for (let env in envs) { + for (var env in envs) { (function (env) { describe('Good cases ' + (envs.length > 1 ? ' in ' + env + ' environment' : ''), function () { - let signed = {}; - let key = null; + var signed = {}; + var key = null; - for (let i in dataBundle) { + for (var i in dataBundle) { (function (i) { - let suit = dataBundle[i]; + var suit = dataBundle[i]; it('should sign ' + i, function () { key = new NodeRSA(generatedKeys[generatedKeys.length - 1].exportKey(), { signingScheme: scheme + '-sha256', @@ -679,14 +677,14 @@ describe('NodeRSA', function () { })(i); } - for (let alg in signHashAlgorithms[env]) { + for (var alg in signHashAlgorithms[env]) { (function (alg) { it('signing with custom algorithm (' + alg + ')', function () { - let key = new NodeRSA(generatedKeys[generatedKeys.length - 1].exportKey(), { + var key = new NodeRSA(generatedKeys[generatedKeys.length - 1].exportKey(), { signingScheme: scheme + '-' + alg, environment: env }); - let signed = key.sign('data'); + var signed = key.sign('data'); if (!key.verify('data', signed)) { key.verify('data', signed); } @@ -698,16 +696,16 @@ describe('NodeRSA', function () { describe('Bad cases' + (envs.length > 1 ? ' in ' + env + ' environment' : ''), function () { it('incorrect data for verifying', function () { - let key = new NodeRSA(generatedKeys[0].exportKey(), { + var key = new NodeRSA(generatedKeys[0].exportKey(), { signingScheme: scheme + '-sha256', environment: env }); - let signed = key.sign('data1'); + var signed = key.sign('data1'); assert(!key.verify('data2', signed)); }); it('incorrect key for signing', function () { - let key = new NodeRSA(generatedKeys[0].exportKey('pkcs8-public'), { + var key = new NodeRSA(generatedKeys[0].exportKey('pkcs8-public'), { signingScheme: scheme + '-sha256', environment: env }); @@ -717,20 +715,20 @@ describe('NodeRSA', function () { }); it('incorrect key for verifying', function () { - let key1 = new NodeRSA(generatedKeys[0].exportKey(), { + var key1 = new NodeRSA(generatedKeys[0].exportKey(), { signingScheme: scheme + '-sha256', environment: env }); - let key2 = new NodeRSA(generatedKeys[1].exportKey('pkcs8-public'), { + var key2 = new NodeRSA(generatedKeys[1].exportKey('pkcs8-public'), { signingScheme: scheme + '-sha256', environment: env }); - let signed = key1.sign('data'); + var signed = key1.sign('data'); assert(!key2.verify('data', signed)); }); it('incorrect key for verifying (empty)', function () { - let key = new NodeRSA(null, {environment: env}); + var key = new NodeRSA(null, {environment: env}); assert.throw(function () { key.verify('data', 'somesignature'); @@ -738,15 +736,15 @@ describe('NodeRSA', function () { }); it('different algorithms', function () { - let singKey = new NodeRSA(generatedKeys[0].exportKey(), { + var singKey = new NodeRSA(generatedKeys[0].exportKey(), { signingScheme: scheme + '-md5', environment: env }); - let verifyKey = new NodeRSA(generatedKeys[0].exportKey(), { + var verifyKey = new NodeRSA(generatedKeys[0].exportKey(), { signingScheme: scheme + '-sha1', environment: env }); - let signed = singKey.sign('data'); + var signed = singKey.sign('data'); assert(!verifyKey.verify('data', signed)); }); }); @@ -758,14 +756,14 @@ describe('NodeRSA', function () { } describe('Compatibility of different environments', function () { - for (let alg in signHashAlgorithms['browser']) { + for (var alg in signHashAlgorithms['browser']) { (function (alg) { it('signing with custom algorithm (' + alg + ') (equal test)', function () { - let nodeKey = new NodeRSA(generatedKeys[5].exportKey(), { + var nodeKey = new NodeRSA(generatedKeys[5].exportKey(), { signingScheme: scheme + '-' + alg, environment: 'node' }); - let browserKey = new NodeRSA(generatedKeys[5].exportKey(), { + var browserKey = new NodeRSA(generatedKeys[5].exportKey(), { signingScheme: scheme + '-' + alg, environment: 'browser' }); @@ -774,11 +772,11 @@ describe('NodeRSA', function () { }); it('sign in node & verify in browser (' + alg + ')', function () { - let nodeKey = new NodeRSA(generatedKeys[5].exportKey(), { + var nodeKey = new NodeRSA(generatedKeys[5].exportKey(), { signingScheme: scheme + '-' + alg, environment: 'node' }); - let browserKey = new NodeRSA(generatedKeys[5].exportKey(), { + var browserKey = new NodeRSA(generatedKeys[5].exportKey(), { signingScheme: scheme + '-' + alg, environment: 'browser' }); @@ -787,11 +785,11 @@ describe('NodeRSA', function () { }); it('sign in browser & verify in node (' + alg + ')', function () { - let nodeKey = new NodeRSA(generatedKeys[5].exportKey(), { + var nodeKey = new NodeRSA(generatedKeys[5].exportKey(), { signingScheme: scheme + '-' + alg, environment: 'node' }); - let browserKey = new NodeRSA(generatedKeys[5].exportKey(), { + var browserKey = new NodeRSA(generatedKeys[5].exportKey(), { signingScheme: scheme + '-' + alg, environment: 'browser' }); From f637c44b20be15bec724f9fee4243bce808ff157 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sun, 31 Jan 2016 20:13:06 +0500 Subject: [PATCH 082/146] Fixed environment detection in web worker. --- README.md | 3 +++ package.json | 2 +- src/formats/components.js | 4 ++-- src/utils.js | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 0c7bd62..b0436e6 100644 --- a/README.md +++ b/README.md @@ -237,6 +237,9 @@ Questions, comments, bug reports, and pull requests are all welcome. ## Changelog +### 0.3.1 + * Fixed environment detection in web worker. + ### 0.3.0 * Added import/export from/to raw key components. * Removed lodash from dependencies. diff --git a/package.json b/package.json index 86ab2bc..1d11cbd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "0.3.0", + "version": "0.3.1", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { diff --git a/src/formats/components.js b/src/formats/components.js index 779cd75..a275314 100644 --- a/src/formats/components.js +++ b/src/formats/components.js @@ -12,7 +12,7 @@ module.exports = { dmp1: key.dmp1.toBuffer(), dmq1: key.dmq1.toBuffer(), coeff: key.coeff.toBuffer() - } + }; }, privateImport: function (key, data, options) { @@ -36,7 +36,7 @@ module.exports = { return { n: key.n.toBuffer(), e: key.e - } + }; }, publicImport: function (key, data, options) { diff --git a/src/utils.js b/src/utils.js index 0376a3d..61205a0 100644 --- a/src/utils.js +++ b/src/utils.js @@ -24,7 +24,7 @@ module.exports.linebrk = function (str, maxLen) { module.exports.detectEnvironment = function () { if (process && process.title != 'browser') { return 'node'; - } else if (window) { + } else if (typeof(window) !== 'undefined' && window) { return 'browser'; } return 'node'; From fb40aed60cbe540decd2bb9be3b5688708b82eb0 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sun, 31 Jan 2016 20:54:16 +0500 Subject: [PATCH 083/146] Fixed environment detection in web worker. --- package.json | 2 +- src/NodeRSA.js | 2 +- src/schemes/pkcs1.js | 4 ++-- src/utils.js | 7 +++---- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 1d11cbd..c1dcc7f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "0.3.1", + "version": "0.3.2", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { diff --git a/src/NodeRSA.js b/src/NodeRSA.js index 7fe7a97..710dcd9 100644 --- a/src/NodeRSA.js +++ b/src/NodeRSA.js @@ -185,7 +185,7 @@ module.exports = (function () { /** * Exporting key - * @param format {string} + * @param [format] {string} */ NodeRSA.prototype.exportKey = function (format) { format = format || DEFAULT_EXPORT_FORMAT; diff --git a/src/schemes/pkcs1.js b/src/schemes/pkcs1.js index 6c5c25e..e91f278 100644 --- a/src/schemes/pkcs1.js +++ b/src/schemes/pkcs1.js @@ -114,7 +114,7 @@ module.exports.makeScheme = function (key, options) { Scheme.prototype.sign = function (buffer) { var hashAlgorithm = this.options.signingSchemeOptions.hash || DEFAULT_HASH_FUNCTION; - if (this.options.environment == 'browser') { + if (this.options.environment === 'browser') { hashAlgorithm = SIGN_ALG_TO_HASH_ALIASES[hashAlgorithm] || hashAlgorithm; var hasher = crypt.createHash(hashAlgorithm); @@ -132,7 +132,7 @@ module.exports.makeScheme = function (key, options) { Scheme.prototype.verify = function (buffer, signature, signature_encoding) { var hashAlgorithm = this.options.signingSchemeOptions.hash || DEFAULT_HASH_FUNCTION; - if (this.options.environment == 'browser') { + if (this.options.environment === 'browser') { hashAlgorithm = SIGN_ALG_TO_HASH_ALIASES[hashAlgorithm] || hashAlgorithm; if (signature_encoding) { diff --git a/src/utils.js b/src/utils.js index 61205a0..81b1b22 100644 --- a/src/utils.js +++ b/src/utils.js @@ -12,7 +12,7 @@ var crypt = require('crypto'); * @returns {string} */ module.exports.linebrk = function (str, maxLen) { - var res = ""; + var res = ''; var i = 0; while (i + maxLen < str.length) { res += str.substring(i, i + maxLen) + "\n"; @@ -22,11 +22,10 @@ module.exports.linebrk = function (str, maxLen) { }; module.exports.detectEnvironment = function () { - if (process && process.title != 'browser') { - return 'node'; - } else if (typeof(window) !== 'undefined' && window) { + if (process && process.title === 'browser' || (typeof(window) !== 'undefined' && window)) { return 'browser'; } + return 'node'; }; From a5578a2c1e6e5a878d43b3e5d33e89087276c64c Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sun, 31 Jan 2016 20:54:32 +0500 Subject: [PATCH 084/146] Fixed environment detection in web worker. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b0436e6..fd2e7ee 100644 --- a/README.md +++ b/README.md @@ -237,7 +237,7 @@ Questions, comments, bug reports, and pull requests are all welcome. ## Changelog -### 0.3.1 +### 0.3.2 * Fixed environment detection in web worker. ### 0.3.0 From cd68bdb51eb52c5f3bb7709733935b85518e8f38 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Tue, 14 Jun 2016 01:19:35 +0500 Subject: [PATCH 085/146] fix (?) pss sign encode/decode --- src/schemes/pss.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/schemes/pss.js b/src/schemes/pss.js index 89b447a..2c7dcff 100644 --- a/src/schemes/pss.js +++ b/src/schemes/pss.js @@ -101,9 +101,9 @@ module.exports.makeScheme = function (key, options) { maskedDB[i] = DB[i] ^ dbMask[i]; } - var bits = emBits - 8 * (emLen - 1); - var mask = 255 << 8 - bits >> 8 - bits; - maskedDB[0] &= ((maskedDB[0] ^ mask) & maskedDB[0]); + var bits = 8 * emLen - emBits; + var mask = 255 ^ (255 >> 8 - bits << 8 - bits); + maskedDB[0] = maskedDB[0] & mask; var EM = new Buffer(maskedDB.length + H.length + 1); maskedDB.copy(EM, 0); @@ -153,13 +153,19 @@ module.exports.makeScheme = function (key, options) { DB[i] ^= dbMask[i]; } - mask = 0; - for (i = 0, bits = emBits - 8 * (emLen - 1); i < bits; i++) { + /* mask = 0; + var bits = emBits - 8 * (emLen - 1); + for (i = 0; i < bits; i++) { mask |= 1 << i; } - DB[0] &= mask; + DB[0] &= mask;*/ + + var bits = 8 * emLen - emBits; + var mask = 255 ^ (255 >> 8 - bits << 8 - bits); + DB[0] = DB[0] & mask; // Filter out padding + i = 0; while (DB[i++] === 0 && i < DB.length); if (DB[i - 1] != 1) { return false; From 793a2aecafdb79acc165461c616461db0f4cd04c Mon Sep 17 00:00:00 2001 From: "s.vychegzhanin" Date: Tue, 14 Jun 2016 17:51:32 +0500 Subject: [PATCH 086/146] version bump some test fixes --- README.md | 3 +++ package.json | 2 +- src/schemes/pss.js | 5 ++--- test/tests.js | 23 ++++++++++++++++------- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index fd2e7ee..91e80d0 100644 --- a/README.md +++ b/README.md @@ -237,6 +237,9 @@ Questions, comments, bug reports, and pull requests are all welcome. ## Changelog +### 0.3.3 + * Fixed PSS encode/verify methods with max salt length. + ### 0.3.2 * Fixed environment detection in web worker. diff --git a/package.json b/package.json index c1dcc7f..2f32152 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "0.3.2", + "version": "0.3.3", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { diff --git a/src/schemes/pss.js b/src/schemes/pss.js index 2c7dcff..c394f3c 100644 --- a/src/schemes/pss.js +++ b/src/schemes/pss.js @@ -165,9 +165,8 @@ module.exports.makeScheme = function (key, options) { DB[0] = DB[0] & mask; // Filter out padding - i = 0; - while (DB[i++] === 0 && i < DB.length); - if (DB[i - 1] != 1) { + for (i = 0; DB[i] === 0 && i < DB.length; i++); + if (DB[i] != 1) { return false; } diff --git a/test/tests.js b/test/tests.js index 1bf0034..2059b87 100644 --- a/test/tests.js +++ b/test/tests.js @@ -2,6 +2,7 @@ var fs = require('fs'); var assert = require('chai').assert; var _ = require('lodash'); var NodeRSA = require('../src/NodeRSA'); +var OAEP = require('../src/schemes/oaep'); describe('NodeRSA', function () { var keySizes = [ @@ -10,7 +11,8 @@ describe('NodeRSA', function () { {b: 512, e: 257}, {b: 512, e: 65537}, {b: 768}, // 'e' should be 65537 - {b: 1024} // 'e' should be 65537 + {b: 1024}, // 'e' should be 65537 + {b: 2048} // 'e' should be 65537 ]; var environments = ['browser', 'node']; @@ -151,6 +153,7 @@ describe('NodeRSA', function () { for (var size in keySizes) { (function (size) { it('should make key pair ' + size.b + '-bit length and public exponent is ' + (size.e ? size.e : size.e + ' and should be 65537'), function () { + this.timeout(15000); generatedKeys.push(new NodeRSA({b: size.b, e: size.e}, {encryptionScheme: 'pkcs1'})); assert.instanceOf(generatedKeys[generatedKeys.length - 1].keyPair, Object); assert.equal(generatedKeys[generatedKeys.length - 1].isEmpty(), false); @@ -669,9 +672,6 @@ describe('NodeRSA', function () { }); it('should verify ' + i, function () { - if (!key.verify(suit.data, signed[i])) { - key.verify(suit.data, signed[i]); - } assert(key.verify(suit.data, signed[i])); }); })(i); @@ -685,11 +685,20 @@ describe('NodeRSA', function () { environment: env }); var signed = key.sign('data'); - if (!key.verify('data', signed)) { - key.verify('data', signed); - } assert(key.verify('data', signed)); }); + + if (scheme === 'pss') { + it('signing with custom algorithm (' + alg + ') with max salt length', function () { + var a = alg.toLowerCase(); + var key = new NodeRSA(generatedKeys[generatedKeys.length - 1].exportKey(), { + signingScheme: { scheme: scheme, hash: a, saltLength: OAEP.digestLength[a] }, + environment: env + }); + var signed = key.sign('data'); + assert(key.verify('data', signed)); + }); + } })(signHashAlgorithms[env][alg]); } }); From 24e89d16969067468e7f935ef34d501e5e590c0b Mon Sep 17 00:00:00 2001 From: "s.vychegzhanin" Date: Tue, 14 Jun 2016 17:59:59 +0500 Subject: [PATCH 087/146] remove iojs from travis config --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 20482ef..ef90c34 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,8 +3,6 @@ node_js: - '0.10' - '0.12' - 'stable' - - 'iojs-v1.3' - - 'iojs' sudo: false From 9ce020a1cadcffa39ee760fb2fb3549726af6a59 Mon Sep 17 00:00:00 2001 From: "s.vychegzhanin" Date: Tue, 14 Jun 2016 18:09:07 +0500 Subject: [PATCH 088/146] increase timeout for long key gen --- test/tests.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/tests.js b/test/tests.js index 2059b87..bec9c22 100644 --- a/test/tests.js +++ b/test/tests.js @@ -153,7 +153,7 @@ describe('NodeRSA', function () { for (var size in keySizes) { (function (size) { it('should make key pair ' + size.b + '-bit length and public exponent is ' + (size.e ? size.e : size.e + ' and should be 65537'), function () { - this.timeout(15000); + this.timeout(35000); generatedKeys.push(new NodeRSA({b: size.b, e: size.e}, {encryptionScheme: 'pkcs1'})); assert.instanceOf(generatedKeys[generatedKeys.length - 1].keyPair, Object); assert.equal(generatedKeys[generatedKeys.length - 1].isEmpty(), false); From 0da8fd16ff50db79a7f57ac82ceb3ef62e99d8ae Mon Sep 17 00:00:00 2001 From: roblabla Date: Sun, 26 Jun 2016 15:19:56 +0200 Subject: [PATCH 089/146] Make pss_encode and pss_verify take already hashed buffers --- src/schemes/pss.js | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/schemes/pss.js b/src/schemes/pss.js index c394f3c..c14cc35 100644 --- a/src/schemes/pss.js +++ b/src/schemes/pss.js @@ -31,7 +31,10 @@ module.exports.makeScheme = function (key, options) { } Scheme.prototype.sign = function (buffer) { - var encoded = this.emsa_pss_encode(buffer, this.key.keySize - 1); + var mHash = crypt.createHash(this.options.signingSchemeOptions.hash || DEFAULT_HASH_FUNCTION); + mHash.update(buffer); + + var encoded = this.emsa_pss_encode(mHash.digest(), this.key.keySize - 1); var res = this.key.$doPrivate(new BigInteger(encoded)).toBuffer(this.key.encryptedDataLength); return res; }; @@ -45,17 +48,20 @@ module.exports.makeScheme = function (key, options) { var emLen = Math.ceil((this.key.keySize - 1) / 8); var m = this.key.$doPublic(signature).toBuffer(emLen); - return this.emsa_pss_verify(buffer, m, this.key.keySize - 1); + var mHash = crypt.createHash(this.options.signingSchemeOptions.hash || DEFAULT_HASH_FUNCTION); + mHash.update(buffer); + + return this.emsa_pss_verify(mHash.digest(), m, this.key.keySize - 1); }; /* * https://tools.ietf.org/html/rfc3447#section-9.1.1 * - * M [Buffer] Message to encode + * mHash [Buffer] Hashed message to encode * emBits [uint] Maximum length of output in bits. Must be at least 8hLen + 8sLen + 9 (hLen = Hash digest length in bytes | sLen = length of salt in bytes) * @returns {Buffer} The encoded message */ - Scheme.prototype.emsa_pss_encode = function (M, emBits) { + Scheme.prototype.emsa_pss_encode = function (mHash, emBits) { var hash = this.options.signingSchemeOptions.hash || DEFAULT_HASH_FUNCTION; var mgf = this.options.signingSchemeOptions.mgf || OAEP.eme_oaep_mgf1; var sLen = this.options.signingSchemeOptions.saltLength || DEFAULT_SALT_LENGTH; @@ -70,10 +76,6 @@ module.exports.makeScheme = function (key, options) { ); } - var mHash = crypt.createHash(hash); - mHash.update(M); - mHash = mHash.digest(); - var salt = crypt.randomBytes(sLen); var Mapostrophe = new Buffer(8 + hLen + sLen); @@ -116,12 +118,12 @@ module.exports.makeScheme = function (key, options) { /* * https://tools.ietf.org/html/rfc3447#section-9.1.2 * - * M [Buffer] Message + * mHash [Buffer] Hashed message * EM [Buffer] Signature * emBits [uint] Length of EM in bits. Must be at least 8hLen + 8sLen + 9 to be a valid signature. (hLen = Hash digest length in bytes | sLen = length of salt in bytes) * @returns {Boolean} True if signature(EM) matches message(M) */ - Scheme.prototype.emsa_pss_verify = function (M, EM, emBits) { + Scheme.prototype.emsa_pss_verify = function (mHash, EM, emBits) { var hash = this.options.signingSchemeOptions.hash || DEFAULT_HASH_FUNCTION; var mgf = this.options.signingSchemeOptions.mgf || OAEP.eme_oaep_mgf1; var sLen = this.options.signingSchemeOptions.saltLength || DEFAULT_SALT_LENGTH; @@ -172,10 +174,6 @@ module.exports.makeScheme = function (key, options) { var salt = DB.slice(DB.length - sLen); - var mHash = crypt.createHash(hash); - mHash.update(M); - mHash = mHash.digest(); - var Mapostrophe = new Buffer(8 + hLen + sLen); Mapostrophe.fill(0, 0, 8); mHash.copy(Mapostrophe, 8); @@ -189,4 +187,4 @@ module.exports.makeScheme = function (key, options) { }; return new Scheme(key, options); -}; \ No newline at end of file +}; From 39ce9f6c292bd09702cb8a234a06fa8c3a241cf1 Mon Sep 17 00:00:00 2001 From: "s.vychegzhanin" Date: Mon, 27 Jun 2016 17:08:15 +0500 Subject: [PATCH 090/146] version bump --- package.json | 2 +- src/schemes/pss.js | 19 ++++++------------- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 2f32152..c02cb01 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "0.3.3", + "version": "0.3.4", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { diff --git a/src/schemes/pss.js b/src/schemes/pss.js index c14cc35..937c0f9 100644 --- a/src/schemes/pss.js +++ b/src/schemes/pss.js @@ -18,6 +18,7 @@ module.exports.makeScheme = function (key, options) { /** * @param key + * @param options * options [Object] An object that contains the following keys that specify certain options for encoding. * └>signingSchemeOptions * ├>hash [String] Hash function to use when encoding and generating masks. Must be a string accepted by node's crypto.createHash function. (default = "sha1") @@ -35,8 +36,7 @@ module.exports.makeScheme = function (key, options) { mHash.update(buffer); var encoded = this.emsa_pss_encode(mHash.digest(), this.key.keySize - 1); - var res = this.key.$doPrivate(new BigInteger(encoded)).toBuffer(this.key.encryptedDataLength); - return res; + return this.key.$doPrivate(new BigInteger(encoded)).toBuffer(this.key.encryptedDataLength); }; Scheme.prototype.verify = function (buffer, signature, signature_encoding) { @@ -57,7 +57,7 @@ module.exports.makeScheme = function (key, options) { /* * https://tools.ietf.org/html/rfc3447#section-9.1.1 * - * mHash [Buffer] Hashed message to encode + * mHash [Buffer] Hashed message to encode * emBits [uint] Maximum length of output in bits. Must be at least 8hLen + 8sLen + 9 (hLen = Hash digest length in bytes | sLen = length of salt in bytes) * @returns {Buffer} The encoded message */ @@ -118,7 +118,7 @@ module.exports.makeScheme = function (key, options) { /* * https://tools.ietf.org/html/rfc3447#section-9.1.2 * - * mHash [Buffer] Hashed message + * mHash [Buffer] Hashed message * EM [Buffer] Signature * emBits [uint] Length of EM in bits. Must be at least 8hLen + 8sLen + 9 to be a valid signature. (hLen = Hash digest length in bytes | sLen = length of salt in bytes) * @returns {Boolean} True if signature(EM) matches message(M) @@ -155,15 +155,8 @@ module.exports.makeScheme = function (key, options) { DB[i] ^= dbMask[i]; } - /* mask = 0; - var bits = emBits - 8 * (emLen - 1); - for (i = 0; i < bits; i++) { - mask |= 1 << i; - } - DB[0] &= mask;*/ - - var bits = 8 * emLen - emBits; - var mask = 255 ^ (255 >> 8 - bits << 8 - bits); + bits = 8 * emLen - emBits; + mask = 255 ^ (255 >> 8 - bits << 8 - bits); DB[0] = DB[0] & mask; // Filter out padding From 0d85bb7573ccda5c0d977a3c2c5c36b9b82c45cb Mon Sep 17 00:00:00 2001 From: "s.vychegzhanin" Date: Mon, 27 Jun 2016 17:18:14 +0500 Subject: [PATCH 091/146] license change --- README.md | 13 ++++++++++--- package.json | 4 ++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 91e80d0..c82a536 100644 --- a/README.md +++ b/README.md @@ -236,7 +236,11 @@ Return result of check, `true` or `false`.
Questions, comments, bug reports, and pull requests are all welcome. ## Changelog - + +### 0.4.0 + * License changed from BSD to MIT. + * Some changes in internal api. + ### 0.3.3 * Fixed PSS encode/verify methods with max salt length. @@ -303,9 +307,12 @@ Questions, comments, bug reports, and pull requests are all welcome. ## License Copyright (c) 2014 rzcoder
-All Rights Reserved. -BSD +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ## Licensing for code used in rsa.js and jsbn.js diff --git a/package.json b/package.json index c02cb01..500b0d8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "0.3.4", + "version": "0.4.0", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { @@ -24,7 +24,7 @@ "pss" ], "author": "rzcoder", - "license": "BSD", + "license": "MIT", "bugs": { "url": "https://github.com/rzcoder/node-rsa/issues" }, From a9008f15d9c4f13199da0797e68f017f368638c8 Mon Sep 17 00:00:00 2001 From: "s.vychegzhanin" Date: Mon, 27 Jun 2016 17:26:55 +0500 Subject: [PATCH 092/146] npm libs updated --- package.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 500b0d8..90a8f25 100644 --- a/package.json +++ b/package.json @@ -30,12 +30,12 @@ }, "homepage": "https://github.com/rzcoder/node-rsa", "devDependencies": { - "grunt": "0.4.5", - "grunt-simple-mocha": "0.4.0", - "jit-grunt": "0.9.1", - "chai": "2.0.0", - "grunt-contrib-jshint": "0.11.0", - "lodash": "^4.0.0" + "chai": "^3.5.0", + "grunt": "^1.0.1", + "grunt-contrib-jshint": "^1.0.0", + "grunt-simple-mocha": "^0.4.1", + "jit-grunt": "^0.10.0", + "lodash": "^4.13.1" }, "dependencies": { "asn1": "0.2.3" From e045714c25eb1aea17095ac33589b9f69999771d Mon Sep 17 00:00:00 2001 From: "s.vychegzhanin" Date: Tue, 2 Aug 2016 13:18:49 +0500 Subject: [PATCH 093/146] some comments --- src/encryptEngines/js.js | 2 ++ src/schemes/pkcs1.js | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/src/encryptEngines/js.js b/src/encryptEngines/js.js index 0b2cbcd..f148441 100644 --- a/src/encryptEngines/js.js +++ b/src/encryptEngines/js.js @@ -8,6 +8,7 @@ module.exports = function (keyPair, options) { encrypt: function (buffer, usePrivate) { var m, c; if (usePrivate) { + /* Type 1: zeros padding for private key encrypt */ m = new BigInteger(pkcs1Scheme.encPad(buffer, {type: 1})); c = keyPair.$doPrivate(m); } else { @@ -22,6 +23,7 @@ module.exports = function (keyPair, options) { if (usePublic) { m = keyPair.$doPublic(c); + /* Type 1: zeros padding for private key decrypt */ return pkcs1Scheme.encUnPad(m.toBuffer(keyPair.encryptedDataLength), {type: 1}); } else { m = keyPair.$doPrivate(c); diff --git a/src/schemes/pkcs1.js b/src/schemes/pkcs1.js index e91f278..ee0af3a 100644 --- a/src/schemes/pkcs1.js +++ b/src/schemes/pkcs1.js @@ -50,6 +50,7 @@ module.exports.makeScheme = function (key, options) { throw new Error("Message too long for RSA (n=" + this.key.encryptedDataLength + ", l=" + buffer.length + ")"); } + /* Type 1: zeros padding for private key encrypt */ if (options.type === 1) { filled = new Buffer(this.key.encryptedDataLength - buffer.length - 1); filled.fill(0xff, 0, filled.length - 1); @@ -58,6 +59,7 @@ module.exports.makeScheme = function (key, options) { return Buffer.concat([filled, buffer]); } else { + /* random padding for public key encrypt */ filled = new Buffer(this.key.encryptedDataLength - buffer.length); filled[0] = 0; filled[1] = 2; @@ -88,6 +90,7 @@ module.exports.makeScheme = function (key, options) { return null; } + /* Type 1: zeros padding for private key decrypt */ if (options.type === 1) { if (buffer[0] !== 0 && buffer[1] !== 1) { return null; @@ -99,6 +102,7 @@ module.exports.makeScheme = function (key, options) { } } } else { + /* random padding for public key decrypt */ if (buffer[0] !== 0 && buffer[1] !== 2) { return null; } From b1986ef327f59b39bc391978d88e844b52e1d75f Mon Sep 17 00:00:00 2001 From: ZhaoLei Date: Thu, 11 Aug 2016 18:39:09 +0800 Subject: [PATCH 094/146] add RSA_NO_PADDING support compatible with bouncycastle --- src/encryptEngines/io.js | 20 ++++++++++++++++---- src/encryptEngines/node12.js | 6 ++++++ src/schemes/pkcs1.js | 26 ++++++++++++++++++++++++++ test/tests.js | 7 +++++-- 4 files changed, 53 insertions(+), 6 deletions(-) diff --git a/src/encryptEngines/io.js b/src/encryptEngines/io.js index 6170e88..28ea4f2 100644 --- a/src/encryptEngines/io.js +++ b/src/encryptEngines/io.js @@ -7,16 +7,22 @@ module.exports = function (keyPair, options) { return { encrypt: function (buffer, usePrivate) { if (usePrivate) { + var padding = constants.RSA_PKCS1_PADDING; + if (options.encryptionSchemeOptions && options.encryptionSchemeOptions.padding) { + padding = options.encryptionSchemeOptions.padding; + } return crypto.privateEncrypt({ key: options.rsaUtils.exportKey('private'), - padding: constants.RSA_PKCS1_PADDING + padding: padding }, buffer); } else { var padding = constants.RSA_PKCS1_OAEP_PADDING; if (options.encryptionScheme === 'pkcs1') { padding = constants.RSA_PKCS1_PADDING; } - + if (options.encryptionSchemeOptions && options.encryptionSchemeOptions.padding) { + padding = options.encryptionSchemeOptions.padding; + } return crypto.publicEncrypt({ key: options.rsaUtils.exportKey('public'), padding: padding @@ -26,16 +32,22 @@ module.exports = function (keyPair, options) { decrypt: function (buffer, usePublic) { if (usePublic) { + var padding = constants.RSA_PKCS1_PADDING; + if (options.encryptionSchemeOptions && options.encryptionSchemeOptions.padding) { + padding = options.encryptionSchemeOptions.padding; + } return crypto.publicDecrypt({ key: options.rsaUtils.exportKey('public'), - padding: constants.RSA_PKCS1_PADDING + padding: padding }, buffer); } else { var padding = constants.RSA_PKCS1_OAEP_PADDING; if (options.encryptionScheme === 'pkcs1') { padding = constants.RSA_PKCS1_PADDING; } - + if (options.encryptionSchemeOptions && options.encryptionSchemeOptions.padding) { + padding = options.encryptionSchemeOptions.padding; + } return crypto.privateDecrypt({ key: options.rsaUtils.exportKey('private'), padding: padding diff --git a/src/encryptEngines/node12.js b/src/encryptEngines/node12.js index 25b9b9d..f8188bb 100644 --- a/src/encryptEngines/node12.js +++ b/src/encryptEngines/node12.js @@ -13,6 +13,9 @@ module.exports = function (keyPair, options) { if (options.encryptionScheme === 'pkcs1') { padding = constants.RSA_PKCS1_PADDING; } + if (options.encryptionSchemeOptions && options.encryptionSchemeOptions.padding) { + padding = options.encryptionSchemeOptions.padding; + } return crypto.publicEncrypt({ key: options.rsaUtils.exportKey('public'), @@ -28,6 +31,9 @@ module.exports = function (keyPair, options) { if (options.encryptionScheme === 'pkcs1') { padding = constants.RSA_PKCS1_PADDING; } + if (options.encryptionSchemeOptions && options.encryptionSchemeOptions.padding) { + padding = options.encryptionSchemeOptions.padding; + } return crypto.privateDecrypt({ key: options.rsaUtils.exportKey('private'), diff --git a/src/schemes/pkcs1.js b/src/schemes/pkcs1.js index ee0af3a..d688d72 100644 --- a/src/schemes/pkcs1.js +++ b/src/schemes/pkcs1.js @@ -4,6 +4,7 @@ var BigInteger = require('../libs/jsbn'); var crypt = require('crypto'); +var constants = require('constants'); var SIGN_INFO_HEAD = { md2: new Buffer('3020300c06082a864886f70d020205000410', 'hex'), md5: new Buffer('3020300c06082a864886f70d020505000410', 'hex'), @@ -34,6 +35,9 @@ module.exports.makeScheme = function (key, options) { } Scheme.prototype.maxMessageLength = function () { + if (this.options.encryptionSchemeOptions && this.options.encryptionSchemeOptions.padding == constants.RSA_NO_PADDING) { + return this.key.encryptedDataLength; + } return this.key.encryptedDataLength - 11; }; @@ -50,6 +54,13 @@ module.exports.makeScheme = function (key, options) { throw new Error("Message too long for RSA (n=" + this.key.encryptedDataLength + ", l=" + buffer.length + ")"); } + if (this.options.encryptionSchemeOptions && this.options.encryptionSchemeOptions.padding == constants.RSA_NO_PADDING) { + //RSA_NO_PADDING treated like JAVA left pad with zero character + filled = new Buffer(this.key.maxMessageLength - buffer.length); + filled.fill(0); + return Buffer.concat([filled, buffer]); + } + /* Type 1: zeros padding for private key encrypt */ if (options.type === 1) { filled = new Buffer(this.key.encryptedDataLength - buffer.length - 1); @@ -86,6 +97,17 @@ module.exports.makeScheme = function (key, options) { options = options || {}; var i = 0; + if (this.options.encryptionSchemeOptions && this.options.encryptionSchemeOptions.padding == constants.RSA_NO_PADDING) { + //RSA_NO_PADDING treated like JAVA left pad with zero character + var unPad; + if (typeof buffer.lastIndexOf == "function") { //patch for old node version + unPad = buffer.slice(buffer.lastIndexOf('\0') + 1, buffer.length); + } else { + unPad = buffer.slice(String.prototype.lastIndexOf.call(buffer, '\0') + 1, buffer.length); + } + return unPad; + } + if (buffer.length < 4) { return null; } @@ -135,6 +157,10 @@ module.exports.makeScheme = function (key, options) { }; Scheme.prototype.verify = function (buffer, signature, signature_encoding) { + if (this.options.encryptionSchemeOptions && this.options.encryptionSchemeOptions.padding == constants.RSA_NO_PADDING) { + //RSA_NO_PADDING has no verify data + return true; + } var hashAlgorithm = this.options.signingSchemeOptions.hash || DEFAULT_HASH_FUNCTION; if (this.options.environment === 'browser') { hashAlgorithm = SIGN_ALG_TO_HASH_ALIASES[hashAlgorithm] || hashAlgorithm; diff --git a/test/tests.js b/test/tests.js index bec9c22..33632c5 100644 --- a/test/tests.js +++ b/test/tests.js @@ -3,6 +3,7 @@ var assert = require('chai').assert; var _ = require('lodash'); var NodeRSA = require('../src/NodeRSA'); var OAEP = require('../src/schemes/oaep'); +var constants = require('constants'); describe('NodeRSA', function () { var keySizes = [ @@ -16,7 +17,7 @@ describe('NodeRSA', function () { ]; var environments = ['browser', 'node']; - var encryptSchemes = ['pkcs1', 'pkcs1_oaep']; + var encryptSchemes = ['pkcs1', 'pkcs1_oaep', {scheme:'pkcs1', encryptionScheme:{padding: constants.RSA_NO_PADDING}}]; var signingSchemes = ['pkcs1', 'pss']; var signHashAlgorithms = { 'node': ['MD4', 'MD5', 'RIPEMD160', 'SHA', 'SHA1', 'SHA224', 'SHA256', 'SHA384', 'SHA512'], @@ -116,7 +117,8 @@ describe('NodeRSA', function () { encryptionScheme: { scheme: 'pkcs1_oaep', hash: 'sha512', - label: 'horay' + label: 'horay', + padding: constants.RSA_NO_PADDING }, signingScheme: { scheme: 'pss', @@ -131,6 +133,7 @@ describe('NodeRSA', function () { assert.equal(key.$options.encryptionScheme, 'pkcs1_oaep'); assert.equal(key.$options.encryptionSchemeOptions.hash, 'sha512'); assert.equal(key.$options.encryptionSchemeOptions.label, 'horay'); + assert.equal(key.$options.encryptionSchemeOptions.padding, constants.RSA_NO_PADDING); }); it('should throw \'unsupported hashing algorithm\' exception', function () { From a5cd796847e51c433e5ca57074b22ab352c2adb7 Mon Sep 17 00:00:00 2001 From: ZhaoLei Date: Fri, 19 Aug 2016 15:42:17 +0800 Subject: [PATCH 095/146] add support for node v0.10.x --- src/schemes/pkcs1.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/schemes/pkcs1.js b/src/schemes/pkcs1.js index d688d72..90867c9 100644 --- a/src/schemes/pkcs1.js +++ b/src/schemes/pkcs1.js @@ -5,6 +5,7 @@ var BigInteger = require('../libs/jsbn'); var crypt = require('crypto'); var constants = require('constants'); +var _ = require('lodash'); var SIGN_INFO_HEAD = { md2: new Buffer('3020300c06082a864886f70d020205000410', 'hex'), md5: new Buffer('3020300c06082a864886f70d020505000410', 'hex'), @@ -23,6 +24,11 @@ var SIGN_ALG_TO_HASH_ALIASES = { var DEFAULT_HASH_FUNCTION = 'sha256'; +if (typeof constants.RSA_NO_PADDING == "undefined") { + //patch for node v0.10.x, constants do not defined + constants.RSA_NO_PADDING = 3; +} + module.exports = { isEncryption: true, isSignature: true @@ -35,7 +41,7 @@ module.exports.makeScheme = function (key, options) { } Scheme.prototype.maxMessageLength = function () { - if (this.options.encryptionSchemeOptions && this.options.encryptionSchemeOptions.padding == constants.RSA_NO_PADDING) { + if (!_.isEmpty(this.options.encryptionSchemeOptions) && this.options.encryptionSchemeOptions.padding == constants.RSA_NO_PADDING) { return this.key.encryptedDataLength; } return this.key.encryptedDataLength - 11; @@ -53,8 +59,7 @@ module.exports.makeScheme = function (key, options) { if (buffer.length > this.key.maxMessageLength) { throw new Error("Message too long for RSA (n=" + this.key.encryptedDataLength + ", l=" + buffer.length + ")"); } - - if (this.options.encryptionSchemeOptions && this.options.encryptionSchemeOptions.padding == constants.RSA_NO_PADDING) { + if (!_.isEmpty(this.options.encryptionSchemeOptions) && this.options.encryptionSchemeOptions.padding == constants.RSA_NO_PADDING) { //RSA_NO_PADDING treated like JAVA left pad with zero character filled = new Buffer(this.key.maxMessageLength - buffer.length); filled.fill(0); @@ -97,7 +102,7 @@ module.exports.makeScheme = function (key, options) { options = options || {}; var i = 0; - if (this.options.encryptionSchemeOptions && this.options.encryptionSchemeOptions.padding == constants.RSA_NO_PADDING) { + if (!_.isEmpty(this.options.encryptionSchemeOptions) && this.options.encryptionSchemeOptions.padding == constants.RSA_NO_PADDING) { //RSA_NO_PADDING treated like JAVA left pad with zero character var unPad; if (typeof buffer.lastIndexOf == "function") { //patch for old node version From ea5c17d9351c857c0594d7921c596ff5636882f1 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sat, 20 Aug 2016 21:44:22 +0500 Subject: [PATCH 096/146] version bump --- README.md | 3 +++ package.json | 2 +- src/NodeRSA.js | 6 ++++++ src/encryptEngines/io.js | 2 -- src/schemes/pkcs1.js | 14 ++++---------- test/tests.js | 18 ++++++++++++++---- 6 files changed, 28 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index c82a536..0c60148 100644 --- a/README.md +++ b/README.md @@ -236,6 +236,9 @@ Return result of check, `true` or `false`.
Questions, comments, bug reports, and pull requests are all welcome. ## Changelog + +### 0.4.1 + * `PKCS1 no padding` scheme support. ### 0.4.0 * License changed from BSD to MIT. diff --git a/package.json b/package.json index 90a8f25..8de27dd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "0.4.0", + "version": "0.4.1", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { diff --git a/src/NodeRSA.js b/src/NodeRSA.js index 710dcd9..26e1d51 100644 --- a/src/NodeRSA.js +++ b/src/NodeRSA.js @@ -7,6 +7,7 @@ * License BSD */ +var constants = require('constants'); var rsa = require('./libs/rsa.js'); var crypt = require('crypto'); var ber = require('asn1').Ber; @@ -15,6 +16,11 @@ var utils = require('./utils'); var schemes = require('./schemes/schemes.js'); var formats = require('./formats/formats.js'); +if (typeof constants.RSA_NO_PADDING == "undefined") { + //patch for node v0.10.x, constants do not defined + constants.RSA_NO_PADDING = 3; +} + module.exports = (function () { var SUPPORTED_HASH_ALGORITHMS = { node10: ['md4', 'md5', 'ripemd160', 'sha', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'], diff --git a/src/encryptEngines/io.js b/src/encryptEngines/io.js index 28ea4f2..deb61a9 100644 --- a/src/encryptEngines/io.js +++ b/src/encryptEngines/io.js @@ -2,8 +2,6 @@ var crypto = require('crypto'); var constants = require('constants'); module.exports = function (keyPair, options) { - var jsEngine = require('./js.js')(keyPair, options); - return { encrypt: function (buffer, usePrivate) { if (usePrivate) { diff --git a/src/schemes/pkcs1.js b/src/schemes/pkcs1.js index 90867c9..75f07e3 100644 --- a/src/schemes/pkcs1.js +++ b/src/schemes/pkcs1.js @@ -5,7 +5,6 @@ var BigInteger = require('../libs/jsbn'); var crypt = require('crypto'); var constants = require('constants'); -var _ = require('lodash'); var SIGN_INFO_HEAD = { md2: new Buffer('3020300c06082a864886f70d020205000410', 'hex'), md5: new Buffer('3020300c06082a864886f70d020505000410', 'hex'), @@ -24,11 +23,6 @@ var SIGN_ALG_TO_HASH_ALIASES = { var DEFAULT_HASH_FUNCTION = 'sha256'; -if (typeof constants.RSA_NO_PADDING == "undefined") { - //patch for node v0.10.x, constants do not defined - constants.RSA_NO_PADDING = 3; -} - module.exports = { isEncryption: true, isSignature: true @@ -41,7 +35,7 @@ module.exports.makeScheme = function (key, options) { } Scheme.prototype.maxMessageLength = function () { - if (!_.isEmpty(this.options.encryptionSchemeOptions) && this.options.encryptionSchemeOptions.padding == constants.RSA_NO_PADDING) { + if (this.options.encryptionSchemeOptions && this.options.encryptionSchemeOptions.padding == constants.RSA_NO_PADDING) { return this.key.encryptedDataLength; } return this.key.encryptedDataLength - 11; @@ -59,7 +53,7 @@ module.exports.makeScheme = function (key, options) { if (buffer.length > this.key.maxMessageLength) { throw new Error("Message too long for RSA (n=" + this.key.encryptedDataLength + ", l=" + buffer.length + ")"); } - if (!_.isEmpty(this.options.encryptionSchemeOptions) && this.options.encryptionSchemeOptions.padding == constants.RSA_NO_PADDING) { + if (this.options.encryptionSchemeOptions && this.options.encryptionSchemeOptions.padding == constants.RSA_NO_PADDING) { //RSA_NO_PADDING treated like JAVA left pad with zero character filled = new Buffer(this.key.maxMessageLength - buffer.length); filled.fill(0); @@ -102,7 +96,7 @@ module.exports.makeScheme = function (key, options) { options = options || {}; var i = 0; - if (!_.isEmpty(this.options.encryptionSchemeOptions) && this.options.encryptionSchemeOptions.padding == constants.RSA_NO_PADDING) { + if (this.options.encryptionSchemeOptions && this.options.encryptionSchemeOptions.padding == constants.RSA_NO_PADDING) { //RSA_NO_PADDING treated like JAVA left pad with zero character var unPad; if (typeof buffer.lastIndexOf == "function") { //patch for old node version @@ -164,7 +158,7 @@ module.exports.makeScheme = function (key, options) { Scheme.prototype.verify = function (buffer, signature, signature_encoding) { if (this.options.encryptionSchemeOptions && this.options.encryptionSchemeOptions.padding == constants.RSA_NO_PADDING) { //RSA_NO_PADDING has no verify data - return true; + return false; } var hashAlgorithm = this.options.signingSchemeOptions.hash || DEFAULT_HASH_FUNCTION; if (this.options.environment === 'browser') { diff --git a/test/tests.js b/test/tests.js index 33632c5..aa34a70 100644 --- a/test/tests.js +++ b/test/tests.js @@ -17,7 +17,19 @@ describe('NodeRSA', function () { ]; var environments = ['browser', 'node']; - var encryptSchemes = ['pkcs1', 'pkcs1_oaep', {scheme:'pkcs1', encryptionScheme:{padding: constants.RSA_NO_PADDING}}]; + var encryptSchemes = [ + 'pkcs1', + 'pkcs1_oaep', + { + scheme:'pkcs1', + encryptionScheme:{ + padding: constants.RSA_NO_PADDING + }, + toString: function() { + return 'pkcs1-nopadding'; + } + } + ]; var signingSchemes = ['pkcs1', 'pss']; var signHashAlgorithms = { 'node': ['MD4', 'MD5', 'RIPEMD160', 'SHA', 'SHA1', 'SHA224', 'SHA256', 'SHA384', 'SHA512'], @@ -117,8 +129,7 @@ describe('NodeRSA', function () { encryptionScheme: { scheme: 'pkcs1_oaep', hash: 'sha512', - label: 'horay', - padding: constants.RSA_NO_PADDING + label: 'horay' }, signingScheme: { scheme: 'pss', @@ -133,7 +144,6 @@ describe('NodeRSA', function () { assert.equal(key.$options.encryptionScheme, 'pkcs1_oaep'); assert.equal(key.$options.encryptionSchemeOptions.hash, 'sha512'); assert.equal(key.$options.encryptionSchemeOptions.label, 'horay'); - assert.equal(key.$options.encryptionSchemeOptions.padding, constants.RSA_NO_PADDING); }); it('should throw \'unsupported hashing algorithm\' exception', function () { From 955ae2b11d39ed4498ff4f8ace3db570745f807d Mon Sep 17 00:00:00 2001 From: rzcoder Date: Tue, 6 Sep 2016 02:13:49 +0500 Subject: [PATCH 097/146] removed all new Buffer() calls --- README.md | 3 +++ package.json | 2 +- src/NodeRSA.js | 6 +++--- src/encryptEngines/io.js | 10 ++++++---- src/formats/pkcs1.js | 4 ++-- src/formats/pkcs8.js | 4 ++-- src/libs/jsbn.js | 4 ++-- src/schemes/oaep.js | 12 ++++++------ src/schemes/pkcs1.js | 30 +++++++++++++++--------------- src/schemes/pss.js | 16 ++++++++-------- 10 files changed, 48 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index 0c60148..e1a4430 100644 --- a/README.md +++ b/README.md @@ -237,6 +237,9 @@ Questions, comments, bug reports, and pull requests are all welcome. ## Changelog +### 0.4.2 + * Removed all `new Buffer()` call. + ### 0.4.1 * `PKCS1 no padding` scheme support. diff --git a/package.json b/package.json index 8de27dd..3b2359d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "0.4.1", + "version": "0.4.2", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { diff --git a/src/NodeRSA.js b/src/NodeRSA.js index 26e1d51..05f3356 100644 --- a/src/NodeRSA.js +++ b/src/NodeRSA.js @@ -289,7 +289,7 @@ module.exports = (function () { */ NodeRSA.prototype.$$decryptKey = function (usePublic, buffer, encoding) { try { - buffer = _.isString(buffer) ? new Buffer(buffer, 'base64') : buffer; + buffer = _.isString(buffer) ? Buffer.from(buffer, 'base64') : buffer; var res = this.keyPair.decrypt(buffer, usePublic); if (res === null) { @@ -366,11 +366,11 @@ module.exports = (function () { */ NodeRSA.prototype.$getDataForEncrypt = function (buffer, encoding) { if (_.isString(buffer) || _.isNumber(buffer)) { - return new Buffer('' + buffer, encoding || 'utf8'); + return Buffer.from('' + buffer, encoding || 'utf8'); } else if (Buffer.isBuffer(buffer)) { return buffer; } else if (_.isObject(buffer)) { - return new Buffer(JSON.stringify(buffer)); + return Buffer.from(JSON.stringify(buffer)); } else { throw Error("Unexpected data type"); } diff --git a/src/encryptEngines/io.js b/src/encryptEngines/io.js index deb61a9..8900f3c 100644 --- a/src/encryptEngines/io.js +++ b/src/encryptEngines/io.js @@ -4,8 +4,9 @@ var constants = require('constants'); module.exports = function (keyPair, options) { return { encrypt: function (buffer, usePrivate) { + var padding; if (usePrivate) { - var padding = constants.RSA_PKCS1_PADDING; + padding = constants.RSA_PKCS1_PADDING; if (options.encryptionSchemeOptions && options.encryptionSchemeOptions.padding) { padding = options.encryptionSchemeOptions.padding; } @@ -14,7 +15,7 @@ module.exports = function (keyPair, options) { padding: padding }, buffer); } else { - var padding = constants.RSA_PKCS1_OAEP_PADDING; + padding = constants.RSA_PKCS1_OAEP_PADDING; if (options.encryptionScheme === 'pkcs1') { padding = constants.RSA_PKCS1_PADDING; } @@ -29,8 +30,9 @@ module.exports = function (keyPair, options) { }, decrypt: function (buffer, usePublic) { + var padding; if (usePublic) { - var padding = constants.RSA_PKCS1_PADDING; + padding = constants.RSA_PKCS1_PADDING; if (options.encryptionSchemeOptions && options.encryptionSchemeOptions.padding) { padding = options.encryptionSchemeOptions.padding; } @@ -39,7 +41,7 @@ module.exports = function (keyPair, options) { padding: padding }, buffer); } else { - var padding = constants.RSA_PKCS1_OAEP_PADDING; + padding = constants.RSA_PKCS1_OAEP_PADDING; if (options.encryptionScheme === 'pkcs1') { padding = constants.RSA_PKCS1_PADDING; } diff --git a/src/formats/pkcs1.js b/src/formats/pkcs1.js index 22b5139..d481810 100644 --- a/src/formats/pkcs1.js +++ b/src/formats/pkcs1.js @@ -49,7 +49,7 @@ module.exports = { var pem = data.replace('-----BEGIN RSA PRIVATE KEY-----', '') .replace('-----END RSA PRIVATE KEY-----', '') .replace(/\s+|\n\r|\n|\r$/gm, ''); - buffer = new Buffer(pem, 'base64'); + buffer = Buffer.from(pem, 'base64'); } else { throw Error('Unsupported key format'); } @@ -106,7 +106,7 @@ module.exports = { var pem = data.replace('-----BEGIN RSA PUBLIC KEY-----', '') .replace('-----END RSA PUBLIC KEY-----', '') .replace(/\s+|\n\r|\n|\r$/gm, ''); - buffer = new Buffer(pem, 'base64'); + buffer = Buffer.from(pem, 'base64'); } } else if (Buffer.isBuffer(data)) { buffer = data; diff --git a/src/formats/pkcs8.js b/src/formats/pkcs8.js index 6b23a7e..75a552d 100644 --- a/src/formats/pkcs8.js +++ b/src/formats/pkcs8.js @@ -60,7 +60,7 @@ module.exports = { var pem = data.replace('-----BEGIN PRIVATE KEY-----', '') .replace('-----END PRIVATE KEY-----', '') .replace(/\s+|\n\r|\n|\r$/gm, ''); - buffer = new Buffer(pem, 'base64'); + buffer = Buffer.from(pem, 'base64'); } else { throw Error('Unsupported key format'); } @@ -136,7 +136,7 @@ module.exports = { var pem = data.replace('-----BEGIN PUBLIC KEY-----', '') .replace('-----END PUBLIC KEY-----', '') .replace(/\s+|\n\r|\n|\r$/gm, ''); - buffer = new Buffer(pem, 'base64'); + buffer = Buffer.from(pem, 'base64'); } } else if (Buffer.isBuffer(data)) { buffer = data; diff --git a/src/libs/jsbn.js b/src/libs/jsbn.js index 100c0ea..6eb3cd4 100644 --- a/src/libs/jsbn.js +++ b/src/libs/jsbn.js @@ -829,7 +829,7 @@ function bnToByteArray() { * @returns {Buffer} */ function bnToBuffer(trimOrSize) { - var res = new Buffer(this.toByteArray()); + var res = Buffer.from(this.toByteArray()); if (trimOrSize === true && res[0] === 0) { res = res.slice(1); } else if (_.isNumber(trimOrSize)) { @@ -841,7 +841,7 @@ function bnToBuffer(trimOrSize) { } return res.slice(res.length - trimOrSize); } else if (res.length < trimOrSize) { - var padded = new Buffer(trimOrSize); + var padded = Buffer.alloc(trimOrSize); padded.fill(0, 0, trimOrSize - res.length); res.copy(padded, trimOrSize - res.length); return padded; diff --git a/src/schemes/oaep.js b/src/schemes/oaep.js index 2d3db6c..8b91ebc 100644 --- a/src/schemes/oaep.js +++ b/src/schemes/oaep.js @@ -44,8 +44,8 @@ module.exports.eme_oaep_mgf1 = function (seed, maskLength, hashFunction) { hashFunction = hashFunction || DEFAULT_HASH_FUNCTION; var hLen = module.exports.digestLength[hashFunction]; var count = Math.ceil(maskLength / hLen); - var T = new Buffer(hLen * count); - var c = new Buffer(4); + var T = Buffer.alloc(hLen * count); + var c = Buffer.alloc(4); for (var i = 0; i < count; ++i) { var hash = crypt.createHash(hashFunction); hash.update(seed); @@ -75,7 +75,7 @@ module.exports.makeScheme = function (key, options) { Scheme.prototype.encPad = function (buffer) { var hash = this.options.encryptionSchemeOptions.hash || DEFAULT_HASH_FUNCTION; var mgf = this.options.encryptionSchemeOptions.mgf || module.exports.eme_oaep_mgf1; - var label = this.options.encryptionSchemeOptions.label || new Buffer(0); + var label = this.options.encryptionSchemeOptions.label || Buffer.alloc(0); var emLen = this.key.encryptedDataLength; var hLen = module.exports.digestLength[hash]; @@ -90,7 +90,7 @@ module.exports.makeScheme = function (key, options) { lHash.update(label); lHash = lHash.digest(); - var PS = new Buffer(emLen - buffer.length - 2 * hLen - 1); // Padding "String" + var PS = Buffer.alloc(emLen - buffer.length - 2 * hLen - 1); // Padding "String" PS.fill(0); // Fill the buffer with octets of 0 PS[PS.length - 1] = 1; @@ -113,7 +113,7 @@ module.exports.makeScheme = function (key, options) { } // seed = maskedSeed - var em = new Buffer(1 + seed.length + DB.length); + var em = Buffer.alloc(1 + seed.length + DB.length); em[0] = 0; seed.copy(em, 1); DB.copy(em, 1 + seed.length); @@ -133,7 +133,7 @@ module.exports.makeScheme = function (key, options) { Scheme.prototype.encUnPad = function (buffer) { var hash = this.options.encryptionSchemeOptions.hash || DEFAULT_HASH_FUNCTION; var mgf = this.options.encryptionSchemeOptions.mgf || module.exports.eme_oaep_mgf1; - var label = this.options.encryptionSchemeOptions.label || new Buffer(0); + var label = this.options.encryptionSchemeOptions.label || Buffer.alloc(0); var hLen = module.exports.digestLength[hash]; diff --git a/src/schemes/pkcs1.js b/src/schemes/pkcs1.js index 75f07e3..4a67be1 100644 --- a/src/schemes/pkcs1.js +++ b/src/schemes/pkcs1.js @@ -6,15 +6,15 @@ var BigInteger = require('../libs/jsbn'); var crypt = require('crypto'); var constants = require('constants'); var SIGN_INFO_HEAD = { - md2: new Buffer('3020300c06082a864886f70d020205000410', 'hex'), - md5: new Buffer('3020300c06082a864886f70d020505000410', 'hex'), - sha1: new Buffer('3021300906052b0e03021a05000414', 'hex'), - sha224: new Buffer('302d300d06096086480165030402040500041c', 'hex'), - sha256: new Buffer('3031300d060960864801650304020105000420', 'hex'), - sha384: new Buffer('3041300d060960864801650304020205000430', 'hex'), - sha512: new Buffer('3051300d060960864801650304020305000440', 'hex'), - ripemd160: new Buffer('3021300906052b2403020105000414', 'hex'), - rmd160: new Buffer('3021300906052b2403020105000414', 'hex') + md2: Buffer.from('3020300c06082a864886f70d020205000410', 'hex'), + md5: Buffer.from('3020300c06082a864886f70d020505000410', 'hex'), + sha1: Buffer.from('3021300906052b0e03021a05000414', 'hex'), + sha224: Buffer.from('302d300d06096086480165030402040500041c', 'hex'), + sha256: Buffer.from('3031300d060960864801650304020105000420', 'hex'), + sha384: Buffer.from('3041300d060960864801650304020205000430', 'hex'), + sha512: Buffer.from('3051300d060960864801650304020305000440', 'hex'), + ripemd160: Buffer.from('3021300906052b2403020105000414', 'hex'), + rmd160: Buffer.from('3021300906052b2403020105000414', 'hex') }; var SIGN_ALG_TO_HASH_ALIASES = { @@ -42,7 +42,7 @@ module.exports.makeScheme = function (key, options) { }; /** - * Pad input Buffer to encryptedDataLength bytes, and return new Buffer + * Pad input Buffer to encryptedDataLength bytes, and return Buffer.from * alg: PKCS#1 * @param buffer * @returns {Buffer} @@ -55,14 +55,14 @@ module.exports.makeScheme = function (key, options) { } if (this.options.encryptionSchemeOptions && this.options.encryptionSchemeOptions.padding == constants.RSA_NO_PADDING) { //RSA_NO_PADDING treated like JAVA left pad with zero character - filled = new Buffer(this.key.maxMessageLength - buffer.length); + filled = Buffer.alloc(this.key.maxMessageLength - buffer.length); filled.fill(0); return Buffer.concat([filled, buffer]); } /* Type 1: zeros padding for private key encrypt */ if (options.type === 1) { - filled = new Buffer(this.key.encryptedDataLength - buffer.length - 1); + filled = Buffer.alloc(this.key.encryptedDataLength - buffer.length - 1); filled.fill(0xff, 0, filled.length - 1); filled[0] = 1; filled[filled.length - 1] = 0; @@ -70,7 +70,7 @@ module.exports.makeScheme = function (key, options) { return Buffer.concat([filled, buffer]); } else { /* random padding for public key encrypt */ - filled = new Buffer(this.key.encryptedDataLength - buffer.length); + filled = Buffer.alloc(this.key.encryptedDataLength - buffer.length); filled[0] = 0; filled[1] = 2; var rand = crypt.randomBytes(filled.length - 3); @@ -165,7 +165,7 @@ module.exports.makeScheme = function (key, options) { hashAlgorithm = SIGN_ALG_TO_HASH_ALIASES[hashAlgorithm] || hashAlgorithm; if (signature_encoding) { - signature = new Buffer(signature, signature_encoding); + signature = Buffer.from(signature, signature_encoding); } var hasher = crypt.createHash(hashAlgorithm); @@ -199,7 +199,7 @@ module.exports.makeScheme = function (key, options) { throw Error('Key is too short for signing algorithm (' + hashAlgorithm + ')'); } - var filled = new Buffer(this.key.encryptedDataLength - data.length - 1); + var filled = Buffer.alloc(this.key.encryptedDataLength - data.length - 1); filled.fill(0xff, 0, filled.length - 1); filled[0] = 1; filled[filled.length - 1] = 0; diff --git a/src/schemes/pss.js b/src/schemes/pss.js index 937c0f9..c6e037f 100644 --- a/src/schemes/pss.js +++ b/src/schemes/pss.js @@ -41,7 +41,7 @@ module.exports.makeScheme = function (key, options) { Scheme.prototype.verify = function (buffer, signature, signature_encoding) { if (signature_encoding) { - signature = new Buffer(signature, signature_encoding); + signature = Buffer.from(signature, signature_encoding); } signature = new BigInteger(signature); @@ -78,7 +78,7 @@ module.exports.makeScheme = function (key, options) { var salt = crypt.randomBytes(sLen); - var Mapostrophe = new Buffer(8 + hLen + sLen); + var Mapostrophe = Buffer.alloc(8 + hLen + sLen); Mapostrophe.fill(0, 0, 8); mHash.copy(Mapostrophe, 8); salt.copy(Mapostrophe, 8 + mHash.length); @@ -87,10 +87,10 @@ module.exports.makeScheme = function (key, options) { H.update(Mapostrophe); H = H.digest(); - var PS = new Buffer(emLen - salt.length - hLen - 2); + var PS = Buffer.alloc(emLen - salt.length - hLen - 2); PS.fill(0); - var DB = new Buffer(PS.length + 1 + salt.length); + var DB = Buffer.alloc(PS.length + 1 + salt.length); PS.copy(DB); DB[PS.length] = 0x01; salt.copy(DB, PS.length + 1); @@ -98,7 +98,7 @@ module.exports.makeScheme = function (key, options) { var dbMask = mgf(H, DB.length, hash); // XOR DB and dbMask together - var maskedDB = new Buffer(DB.length); + var maskedDB = Buffer.alloc(DB.length); for (var i = 0; i < dbMask.length; i++) { maskedDB[i] = DB[i] ^ dbMask[i]; } @@ -107,7 +107,7 @@ module.exports.makeScheme = function (key, options) { var mask = 255 ^ (255 >> 8 - bits << 8 - bits); maskedDB[0] = maskedDB[0] & mask; - var EM = new Buffer(maskedDB.length + H.length + 1); + var EM = Buffer.alloc(maskedDB.length + H.length + 1); maskedDB.copy(EM, 0); H.copy(EM, maskedDB.length); EM[EM.length - 1] = 0xbc; @@ -135,7 +135,7 @@ module.exports.makeScheme = function (key, options) { return false; } - var DB = new Buffer(emLen - hLen - 1); + var DB = Buffer.alloc(emLen - hLen - 1); EM.copy(DB, 0, 0, emLen - hLen - 1); var mask = 0; @@ -167,7 +167,7 @@ module.exports.makeScheme = function (key, options) { var salt = DB.slice(DB.length - sLen); - var Mapostrophe = new Buffer(8 + hLen + sLen); + var Mapostrophe = Buffer.alloc(8 + hLen + sLen); Mapostrophe.fill(0, 0, 8); mHash.copy(Mapostrophe, 8); salt.copy(Mapostrophe, 8 + mHash.length); From 5f169c8152ccf54238654ceb363bf724b02d5595 Mon Sep 17 00:00:00 2001 From: "s.vychegzhanin" Date: Mon, 19 Sep 2016 16:58:31 +0500 Subject: [PATCH 098/146] fixed no padding on node env fixed tests --- README.md | 3 +++ package.json | 2 +- src/encryptEngines/io.js | 18 ++++++++++++++++-- src/encryptEngines/node12.js | 16 ++++++++++++++-- src/schemes/pkcs1.js | 37 ++++++++++++++++++++++++++---------- test/tests.js | 6 ++---- 6 files changed, 63 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 0c60148..43f81a7 100644 --- a/README.md +++ b/README.md @@ -237,6 +237,9 @@ Questions, comments, bug reports, and pull requests are all welcome. ## Changelog +### 0.4.2 + * `no padding` scheme will padded data with zeros on all environments. + ### 0.4.1 * `PKCS1 no padding` scheme support. diff --git a/package.json b/package.json index 8de27dd..3b2359d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "0.4.1", + "version": "0.4.2", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { diff --git a/src/encryptEngines/io.js b/src/encryptEngines/io.js index deb61a9..f6f3c6c 100644 --- a/src/encryptEngines/io.js +++ b/src/encryptEngines/io.js @@ -1,7 +1,10 @@ var crypto = require('crypto'); var constants = require('constants'); +var schemes = require('../schemes/schemes.js'); module.exports = function (keyPair, options) { + var pkcs1Scheme = schemes.pkcs1.makeScheme(keyPair, options); + return { encrypt: function (buffer, usePrivate) { if (usePrivate) { @@ -21,10 +24,16 @@ module.exports = function (keyPair, options) { if (options.encryptionSchemeOptions && options.encryptionSchemeOptions.padding) { padding = options.encryptionSchemeOptions.padding; } + + var data = buffer; + if (padding === constants.RSA_NO_PADDING) { + data = pkcs1Scheme.pkcs0pad(buffer); + } + return crypto.publicEncrypt({ key: options.rsaUtils.exportKey('public'), padding: padding - }, buffer); + }, data); } }, @@ -46,10 +55,15 @@ module.exports = function (keyPair, options) { if (options.encryptionSchemeOptions && options.encryptionSchemeOptions.padding) { padding = options.encryptionSchemeOptions.padding; } - return crypto.privateDecrypt({ + var res = crypto.privateDecrypt({ key: options.rsaUtils.exportKey('private'), padding: padding }, buffer); + + if (padding === constants.RSA_NO_PADDING) { + return pkcs1Scheme.pkcs0unpad(res); + } + return res; } } }; diff --git a/src/encryptEngines/node12.js b/src/encryptEngines/node12.js index f8188bb..86e5836 100644 --- a/src/encryptEngines/node12.js +++ b/src/encryptEngines/node12.js @@ -1,8 +1,10 @@ var crypto = require('crypto'); var constants = require('constants'); +var schemes = require('../schemes/schemes.js'); module.exports = function (keyPair, options) { var jsEngine = require('./js.js')(keyPair, options); + var pkcs1Scheme = schemes.pkcs1.makeScheme(keyPair, options); return { encrypt: function (buffer, usePrivate) { @@ -17,10 +19,15 @@ module.exports = function (keyPair, options) { padding = options.encryptionSchemeOptions.padding; } + var data = buffer; + if (padding === constants.RSA_NO_PADDING) { + data = pkcs1Scheme.pkcs0pad(buffer); + } + return crypto.publicEncrypt({ key: options.rsaUtils.exportKey('public'), padding: padding - }, buffer); + }, data); }, decrypt: function (buffer, usePublic) { @@ -35,10 +42,15 @@ module.exports = function (keyPair, options) { padding = options.encryptionSchemeOptions.padding; } - return crypto.privateDecrypt({ + var res = crypto.privateDecrypt({ key: options.rsaUtils.exportKey('private'), padding: padding }, buffer); + + if (padding === constants.RSA_NO_PADDING) { + return pkcs1Scheme.pkcs0unpad(res); + } + return res; } }; }; \ No newline at end of file diff --git a/src/schemes/pkcs1.js b/src/schemes/pkcs1.js index 75f07e3..4d4f3ee 100644 --- a/src/schemes/pkcs1.js +++ b/src/schemes/pkcs1.js @@ -55,9 +55,7 @@ module.exports.makeScheme = function (key, options) { } if (this.options.encryptionSchemeOptions && this.options.encryptionSchemeOptions.padding == constants.RSA_NO_PADDING) { //RSA_NO_PADDING treated like JAVA left pad with zero character - filled = new Buffer(this.key.maxMessageLength - buffer.length); - filled.fill(0); - return Buffer.concat([filled, buffer]); + return this.pkcs0pad(buffer); } /* Type 1: zeros padding for private key encrypt */ @@ -98,13 +96,7 @@ module.exports.makeScheme = function (key, options) { if (this.options.encryptionSchemeOptions && this.options.encryptionSchemeOptions.padding == constants.RSA_NO_PADDING) { //RSA_NO_PADDING treated like JAVA left pad with zero character - var unPad; - if (typeof buffer.lastIndexOf == "function") { //patch for old node version - unPad = buffer.slice(buffer.lastIndexOf('\0') + 1, buffer.length); - } else { - unPad = buffer.slice(String.prototype.lastIndexOf.call(buffer, '\0') + 1, buffer.length); - } - return unPad; + return this.pkcs0unpad(buffer); } if (buffer.length < 4) { @@ -181,6 +173,31 @@ module.exports.makeScheme = function (key, options) { } }; + /** + * PKCS#1 zero pad input buffer to max data length + * @param hashBuf + * @param hashAlgorithm + * @returns {*} + */ + Scheme.prototype.pkcs0pad = function (buffer) { + var filled = new Buffer(this.key.maxMessageLength - buffer.length); + filled.fill(0); + return Buffer.concat([filled, buffer]); + + return filled; + }; + + Scheme.prototype.pkcs0unpad = function (buffer) { + var unPad; + if (typeof buffer.lastIndexOf == "function") { //patch for old node version + unPad = buffer.slice(buffer.lastIndexOf('\0') + 1, buffer.length); + } else { + unPad = buffer.slice(String.prototype.lastIndexOf.call(buffer, '\0') + 1, buffer.length); + } + + return unPad; + }; + /** * PKCS#1 pad input buffer to max data length * @param hashBuf diff --git a/test/tests.js b/test/tests.js index aa34a70..073d371 100644 --- a/test/tests.js +++ b/test/tests.js @@ -22,9 +22,7 @@ describe('NodeRSA', function () { 'pkcs1_oaep', { scheme:'pkcs1', - encryptionScheme:{ - padding: constants.RSA_NO_PADDING - }, + padding: constants.RSA_NO_PADDING, toString: function() { return 'pkcs1-nopadding'; } @@ -178,7 +176,7 @@ describe('NodeRSA', function () { } }); - describe('Imprt/Export keys', function () { + describe('Import/Export keys', function () { var privateKeyPKCS1 = '-----BEGIN RSA PRIVATE KEY-----\n' + 'MIIFwgIBAAKCAUEAsE1edyfToZRv6cFOkB0tAJ5qJor4YF5CccJAL0fS/o1Yk10V\n' + 'SXH4Xx4peSJgYQKkO0HqO1hAz6k9dFQB4U1CnWtRjtNEcIfycqrZrhu6you5syb6\n' + From 65820b0d7230be85d8a0e296e7dae23f9ba5ab2f Mon Sep 17 00:00:00 2001 From: rzcoder Date: Fri, 7 Apr 2017 22:29:27 +0500 Subject: [PATCH 099/146] update travis config --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index ef90c34..bc18e1a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,8 @@ language: node_js node_js: - - '0.10' - - '0.12' - - 'stable' + - '5.10' + - '6.10.2' + - 'stable' sudo: false From 4825109537e2105128e492c7bf5028a9dc495ccc Mon Sep 17 00:00:00 2001 From: rzcoder Date: Fri, 7 Apr 2017 22:35:32 +0500 Subject: [PATCH 100/146] update supported node ver --- .travis.yml | 1 - README.md | 4 ++-- package.json | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index bc18e1a..9e7824c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,5 @@ language: node_js node_js: - - '5.10' - '6.10.2' - 'stable' diff --git a/README.md b/README.md index bcefb05..33b8520 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ console.log('decrypted: ', decrypted); ```shell npm install node-rsa ``` -> Requires nodejs >= 5.10 +> Requires nodejs >= 6.10 ### Testing @@ -238,7 +238,7 @@ Questions, comments, bug reports, and pull requests are all welcome. ## Changelog ### 1.0.0 - * **Possible breaking changes** `new Buffer()` call as deprecated was replaced by `Buffer.from` & `Buffer.alloc`. As result dropped support for node version < 5.10. + * **Possible breaking changes** `new Buffer()` call as deprecated was replaced by `Buffer.from` & `Buffer.alloc`. As result dropped support for node version < 6.10. ### 0.4.2 * `no padding` scheme will padded data with zeros on all environments. diff --git a/package.json b/package.json index 3b2359d..6ea8e7c 100644 --- a/package.json +++ b/package.json @@ -32,10 +32,10 @@ "devDependencies": { "chai": "^3.5.0", "grunt": "^1.0.1", - "grunt-contrib-jshint": "^1.0.0", + "grunt-contrib-jshint": "^1.1.0", "grunt-simple-mocha": "^0.4.1", "jit-grunt": "^0.10.0", - "lodash": "^4.13.1" + "lodash": "^4.17.4" }, "dependencies": { "asn1": "0.2.3" From afac9f8e56824da72f038b1a2053837a49ceec05 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Fri, 8 Sep 2017 16:17:20 +0500 Subject: [PATCH 101/146] fix unreachable code --- src/schemes/pkcs1.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/schemes/pkcs1.js b/src/schemes/pkcs1.js index 4d4f3ee..da5d356 100644 --- a/src/schemes/pkcs1.js +++ b/src/schemes/pkcs1.js @@ -183,8 +183,6 @@ module.exports.makeScheme = function (key, options) { var filled = new Buffer(this.key.maxMessageLength - buffer.length); filled.fill(0); return Buffer.concat([filled, buffer]); - - return filled; }; Scheme.prototype.pkcs0unpad = function (buffer) { From 56a431c3a2f9147c681f5f850fa50ad701382cb9 Mon Sep 17 00:00:00 2001 From: Ackermann Yuriy Date: Mon, 14 May 2018 15:25:36 +0300 Subject: [PATCH 102/146] Improved browser/node detection --- src/utils.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/utils.js b/src/utils.js index 81b1b22..64bc205 100644 --- a/src/utils.js +++ b/src/utils.js @@ -22,7 +22,8 @@ module.exports.linebrk = function (str, maxLen) { }; module.exports.detectEnvironment = function () { - if (process && process.title === 'browser' || (typeof(window) !== 'undefined' && window)) { + + if (typeof(window) !== 'undefined' && window && !(process && process.title === 'node')) { return 'browser'; } From 3b231f2a7e9a51fd565cf80fb936a5e6ea36009b Mon Sep 17 00:00:00 2001 From: rzcoder Date: Mon, 14 May 2018 17:44:52 +0500 Subject: [PATCH 103/146] Update package.json --- package.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 3b2359d..e601e6a 100644 --- a/package.json +++ b/package.json @@ -30,12 +30,12 @@ }, "homepage": "https://github.com/rzcoder/node-rsa", "devDependencies": { - "chai": "^3.5.0", - "grunt": "^1.0.1", - "grunt-contrib-jshint": "^1.0.0", - "grunt-simple-mocha": "^0.4.1", - "jit-grunt": "^0.10.0", - "lodash": "^4.13.1" + "chai": "3.5.0", + "grunt": "1.0.1", + "grunt-contrib-jshint": "1.0.0", + "grunt-simple-mocha": "0.4.1", + "jit-grunt": "0.10.0", + "lodash": "4.13.1" }, "dependencies": { "asn1": "0.2.3" From aa575046e85fd36ce32d7dd8b1adc27a2e61a620 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Mon, 14 May 2018 17:47:43 +0500 Subject: [PATCH 104/146] Update supported node version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 43f81a7..bd747c8 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ console.log('decrypted: ', decrypted); ```shell npm install node-rsa ``` -> Requires nodejs >= 0.10.x or io.js >= 1.x +> Requires nodejs >= 8.11.1 ### Testing From 1b0a4b3da4200f000646d5c5e903a0761540409b Mon Sep 17 00:00:00 2001 From: rzcoder Date: Mon, 14 May 2018 17:48:10 +0500 Subject: [PATCH 105/146] Update supported node version --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index ef90c34..b6a7fd2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,6 @@ language: node_js node_js: - - '0.10' - - '0.12' + - '8.11.1' - 'stable' sudo: false From 9bd9942b06b0bbc205736366a31bf09a2556cfcb Mon Sep 17 00:00:00 2001 From: rzcoder Date: Mon, 14 May 2018 18:18:12 +0500 Subject: [PATCH 106/146] remove support sha hash scheme update pkg version update depends libs --- README.md | 7 + package-lock.json | 1261 +++++++++++++++++++++++++++++++++++++++++++ package.json | 10 +- src/NodeRSA.js | 6 +- src/schemes/oaep.js | 1 - src/utils.js | 1 - test/tests.js | 2 +- 7 files changed, 1277 insertions(+), 11 deletions(-) create mode 100644 package-lock.json diff --git a/README.md b/README.md index bd747c8..890eec2 100644 --- a/README.md +++ b/README.md @@ -237,6 +237,13 @@ Questions, comments, bug reports, and pull requests are all welcome. ## Changelog +### 1.0.0 + * Using semver now 🎉 + * **Possible breaking change**: Drop support nodejs < 8.11.1 + * **Possible breaking change**: Drop support for hash scheme `sha` (was removed in node ~10). `sha1`, `sha256` and others still works. + * **Possible breaking change**: Little change in environment detect algorithm. + + ### 0.4.2 * `no padding` scheme will padded data with zeros on all environments. diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..96a9e7d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1261 @@ +{ + "name": "node-rsa", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", + "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + } + }, + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "dev": true, + "requires": { + "assertion-error": "1.1.0", + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.8" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "dev": true, + "requires": { + "exit": "0.1.2", + "glob": "7.1.2" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + } + } + }, + "coffeescript": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.10.0.tgz", + "integrity": "sha1-56qDAZF+9iGzXYo580jc3R234z4=", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.1.4" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "4.0.1", + "meow": "3.7.0" + } + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dev": true + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "1.1.3", + "entities": "1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" + } + }, + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", + "dev": true + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "findup-sync": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "dev": true, + "requires": { + "glob": "5.0.15" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.3", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "getobject": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", + "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", + "dev": true + }, + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.3", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "grunt": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.2.tgz", + "integrity": "sha1-TmpeaVtwRy/VME9fqeNCNoNqc7w=", + "dev": true, + "requires": { + "coffeescript": "1.10.0", + "dateformat": "1.0.12", + "eventemitter2": "0.4.14", + "exit": "0.1.2", + "findup-sync": "0.3.0", + "glob": "7.0.6", + "grunt-cli": "1.2.0", + "grunt-known-options": "1.1.0", + "grunt-legacy-log": "1.0.2", + "grunt-legacy-util": "1.0.0", + "iconv-lite": "0.4.23", + "js-yaml": "3.5.5", + "minimatch": "3.0.3", + "nopt": "3.0.6", + "path-is-absolute": "1.0.1", + "rimraf": "2.2.8" + }, + "dependencies": { + "grunt-cli": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", + "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", + "dev": true, + "requires": { + "findup-sync": "0.3.0", + "grunt-known-options": "1.1.0", + "nopt": "3.0.6", + "resolve": "1.1.7" + } + } + } + }, + "grunt-contrib-jshint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-1.1.0.tgz", + "integrity": "sha1-Np2QmyWTxA6L55lAshNAhQx5Oaw=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "hooker": "0.2.3", + "jshint": "2.9.5" + } + }, + "grunt-known-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz", + "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=", + "dev": true + }, + "grunt-legacy-log": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-1.0.2.tgz", + "integrity": "sha512-WdedTJ/6zCXnI/coaouzqvkI19uwqbcPkdsXiDRKJyB5rOUlOxnCnTVbpeUdEckKVir2uHF3rDBYppj2p6N3+g==", + "dev": true, + "requires": { + "colors": "1.1.2", + "grunt-legacy-log-utils": "1.0.0", + "hooker": "0.2.3", + "lodash": "4.17.10" + } + }, + "grunt-legacy-log-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-1.0.0.tgz", + "integrity": "sha1-p7ji0Ps1taUPSvmG/BEnSevJbz0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "lodash": "4.3.0" + }, + "dependencies": { + "lodash": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", + "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", + "dev": true + } + } + }, + "grunt-legacy-util": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.0.0.tgz", + "integrity": "sha1-OGqnjcbtUJhsKxiVcmWxtIq7m4Y=", + "dev": true, + "requires": { + "async": "1.5.2", + "exit": "0.1.2", + "getobject": "0.1.0", + "hooker": "0.2.3", + "lodash": "4.3.0", + "underscore.string": "3.2.3", + "which": "1.2.14" + }, + "dependencies": { + "lodash": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", + "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", + "dev": true + } + } + }, + "grunt-simple-mocha": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/grunt-simple-mocha/-/grunt-simple-mocha-0.4.1.tgz", + "integrity": "sha1-V5RJJJ6vCoGHj6cvPtq1FF1F/Xc=", + "dev": true, + "requires": { + "mocha": "3.1.2" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", + "dev": true + }, + "hosted-git-info": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", + "dev": true + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.3.0", + "domutils": "1.5.1", + "entities": "1.0.0", + "readable-stream": "1.1.14" + } + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "jit-grunt": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/jit-grunt/-/jit-grunt-0.10.0.tgz", + "integrity": "sha1-AIw6f+Hpa9DYTiYOofoXg0V/ecI=", + "dev": true + }, + "js-yaml": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz", + "integrity": "sha1-A3fDgBfKvHMisNH7zSWkkWQfL74=", + "dev": true, + "requires": { + "argparse": "1.0.10", + "esprima": "2.7.3" + } + }, + "jshint": { + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.5.tgz", + "integrity": "sha1-HnJSkVzmgbQIJ+4UJIxG006apiw=", + "dev": true, + "requires": { + "cli": "1.0.1", + "console-browserify": "1.1.0", + "exit": "0.1.2", + "htmlparser2": "3.8.3", + "lodash": "3.7.0", + "minimatch": "3.0.3", + "shelljs": "0.3.0", + "strip-json-comments": "1.0.4" + }, + "dependencies": { + "lodash": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz", + "integrity": "sha1-Nni9irmVBXwHreg27S7wh9qBHUU=", + "dev": true + } + } + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true, + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._basecreate": "3.0.3", + "lodash._isiterateecall": "3.0.9" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + } + }, + "minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", + "dev": true, + "requires": { + "brace-expansion": "1.1.6" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "mocha": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.1.2.tgz", + "integrity": "sha1-Ufk7Qyv34bF1/8Iog8zQvjLbprU=", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.5", + "glob": "7.0.5", + "growl": "1.9.2", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + }, + "dependencies": { + "glob": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", + "integrity": "sha1-tCAqaQmbu00pKnwblbZoK2fr3JU=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.3", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1.1.1" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "shelljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", + "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "dev": true, + "requires": { + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "underscore.string": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.2.3.tgz", + "integrity": "sha1-gGmSYzZl1eX8tNsfs6hi62jp5to=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "dev": true, + "requires": { + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" + } + }, + "which": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } +} diff --git a/package.json b/package.json index e601e6a..fcf44a4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "0.4.2", + "version": "1.0.0", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { @@ -30,12 +30,12 @@ }, "homepage": "https://github.com/rzcoder/node-rsa", "devDependencies": { - "chai": "3.5.0", - "grunt": "1.0.1", - "grunt-contrib-jshint": "1.0.0", + "chai": "^4.1.2", + "grunt": "^1.0.2", + "grunt-contrib-jshint": "^1.1.0", "grunt-simple-mocha": "0.4.1", "jit-grunt": "0.10.0", - "lodash": "4.13.1" + "lodash": "^4.17.10" }, "dependencies": { "asn1": "0.2.3" diff --git a/src/NodeRSA.js b/src/NodeRSA.js index 26e1d51..6647f6a 100644 --- a/src/NodeRSA.js +++ b/src/NodeRSA.js @@ -23,9 +23,9 @@ if (typeof constants.RSA_NO_PADDING == "undefined") { module.exports = (function () { var SUPPORTED_HASH_ALGORITHMS = { - node10: ['md4', 'md5', 'ripemd160', 'sha', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'], - node: ['md4', 'md5', 'ripemd160', 'sha', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'], - iojs: ['md4', 'md5', 'ripemd160', 'sha', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'], + node10: ['md4', 'md5', 'ripemd160', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'], + node: ['md4', 'md5', 'ripemd160', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'], + iojs: ['md4', 'md5', 'ripemd160', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'], browser: ['md5', 'ripemd160', 'sha1', 'sha256', 'sha512'] }; diff --git a/src/schemes/oaep.js b/src/schemes/oaep.js index 2d3db6c..445ee4f 100644 --- a/src/schemes/oaep.js +++ b/src/schemes/oaep.js @@ -15,7 +15,6 @@ module.exports.digestLength = { md5: 16, ripemd160: 20, rmd160: 20, - sha: 20, sha1: 20, sha224: 28, sha256: 32, diff --git a/src/utils.js b/src/utils.js index 64bc205..7a1dd82 100644 --- a/src/utils.js +++ b/src/utils.js @@ -22,7 +22,6 @@ module.exports.linebrk = function (str, maxLen) { }; module.exports.detectEnvironment = function () { - if (typeof(window) !== 'undefined' && window && !(process && process.title === 'node')) { return 'browser'; } diff --git a/test/tests.js b/test/tests.js index 073d371..2149e6d 100644 --- a/test/tests.js +++ b/test/tests.js @@ -30,7 +30,7 @@ describe('NodeRSA', function () { ]; var signingSchemes = ['pkcs1', 'pss']; var signHashAlgorithms = { - 'node': ['MD4', 'MD5', 'RIPEMD160', 'SHA', 'SHA1', 'SHA224', 'SHA256', 'SHA384', 'SHA512'], + 'node': ['MD4', 'MD5', 'RIPEMD160', 'SHA1', 'SHA224', 'SHA256', 'SHA384', 'SHA512'], 'browser': ['MD5', 'RIPEMD160', 'SHA1', 'SHA256', 'SHA512'] }; From 2b8ff02c620ce8f97e21a2050c5809bc9e6eed61 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Mon, 14 May 2018 18:22:14 +0500 Subject: [PATCH 107/146] update readme --- README.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 890eec2..a17c555 100644 --- a/README.md +++ b/README.md @@ -12,13 +12,13 @@ Based on jsbn library from Tom Wu http://www-cs-students.stanford.edu/~tjw/jsbn/ ## Example ```javascript -var NodeRSA = require('node-rsa'); -var key = new NodeRSA({b: 512}); +const NodeRSA = require('node-rsa'); +const key = new NodeRSA({b: 512}); -var text = 'Hello RSA!'; -var encrypted = key.encrypt(text, 'base64'); +const text = 'Hello RSA!'; +const encrypted = key.encrypt(text, 'base64'); console.log('encrypted: ', encrypted); -var decrypted = key.decrypt(encrypted, 'utf8'); +const decrypted = key.decrypt(encrypted, 'utf8'); console.log('decrypted: ', decrypted); ``` @@ -43,9 +43,9 @@ This library developed and tested primary for Node.js, but it still can work in ### Create instance ```javascript -var NodeRSA = require('node-rsa'); +const NodeRSA = require('node-rsa'); -var key = new NodeRSA([keyData, [format]], [options]); +const key = new NodeRSA([keyData, [format]], [options]); ``` * keyData — `{string|buffer|object}` — parameters for generating key or the key in one of supported formats.
@@ -67,12 +67,12 @@ You can specify some options by second/third constructor argument, or over `key. #### Creating "empty" key ```javascript -var key = new NodeRSA(); +const key = new NodeRSA(); ``` #### Generate new 512bit-length key ```javascript -var key = new NodeRSA({b: 512}); +const key = new NodeRSA({b: 512}); ``` Also you can use next method: @@ -87,7 +87,7 @@ key.generateKeyPair([bits], [exp]); #### Load key from PEM string ```javascript -var key = new NodeRSA('-----BEGIN RSA PRIVATE KEY-----\n'+ +const key = new NodeRSA('-----BEGIN RSA PRIVATE KEY-----\n'+ 'MIIBOQIBAAJAVY6quuzCwyOWzymJ7C4zXjeV/232wt2ZgJZ1kHzjI73wnhQ3WQcL\n'+ 'DFCSoi2lPUW8/zspk0qWvPdtp6Jg5Lu7hwIDAQABAkBEws9mQahZ6r1mq2zEm3D/\n'+ 'VM9BpV//xtd6p/G+eRCYBT2qshGx42ucdgZCYJptFoW+HEx/jtzWe74yK6jGIkWJ\n'+ @@ -138,10 +138,10 @@ Output type — can be: **Code example** ```javascript -var keyData = '-----BEGIN PUBLIC KEY----- ... -----END PUBLIC KEY-----'; +const keyData = '-----BEGIN PUBLIC KEY----- ... -----END PUBLIC KEY-----'; key.importKey(keyData, 'pkcs8'); -var publicDer = key.exportKey('pkcs8-public-der'); -var privateDer = key.exportKey('pkcs1-der'); +const publicDer = key.exportKey('pkcs8-public-der'); +const privateDer = key.exportKey('pkcs1-der'); ``` ```javascript @@ -155,7 +155,7 @@ key.importKey({ dmq1: new Buffer('1a7370470e0f8a4095df40922a430fe498720e03e1f70d257c3ce34202249d21', 'hex'), coeff: new Buffer('00b399675e5e81506b729a777cc03026f0b2119853dfc5eb124610c0ab82999e45', 'hex') }, 'components'); -var publicComponents = key.exportKey('components-public'); +const publicComponents = key.exportKey('components-public'); console.log(publicComponents); /* @@ -239,10 +239,10 @@ Questions, comments, bug reports, and pull requests are all welcome. ### 1.0.0 * Using semver now 🎉 - * **Possible breaking change**: Drop support nodejs < 8.11.1 + * **Breaking change**: Drop support nodejs < 8.11.1 + * **Possible breaking change**: `new Buffer()` call as deprecated was replaced by `Buffer.from` & `Buffer.alloc`. * **Possible breaking change**: Drop support for hash scheme `sha` (was removed in node ~10). `sha1`, `sha256` and others still works. * **Possible breaking change**: Little change in environment detect algorithm. - ### 0.4.2 * `no padding` scheme will padded data with zeros on all environments. From 8db0f9310cc305065fb98b0e152b06386d47cea1 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Mon, 14 May 2018 18:25:51 +0500 Subject: [PATCH 108/146] update tests --- test/tests.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/test/tests.js b/test/tests.js index 2149e6d..4770e2d 100644 --- a/test/tests.js +++ b/test/tests.js @@ -52,7 +52,7 @@ describe('NodeRSA', function () { encoding: ['utf8', 'ascii'] }, 'buffer': { - data: new Buffer('ascii + юникод スラ ⑨'), + data: Buffer.from('ascii + юникод スラ ⑨'), encoding: 'buffer' }, 'json object': { @@ -324,14 +324,14 @@ describe('NodeRSA', function () { it('.importKey() from private components', function () { var key = new NodeRSA(); key.importKey({ - n: new Buffer(privateKeyComponents.n, 'base64'), + n: Buffer.from(privateKeyComponents.n, 'base64'), e: 65537, - d: new Buffer(privateKeyComponents.d, 'base64'), - p: new Buffer(privateKeyComponents.p, 'base64'), - q: new Buffer(privateKeyComponents.q, 'base64'), - dmp1: new Buffer(privateKeyComponents.dmp1, 'base64'), - dmq1: new Buffer(privateKeyComponents.dmq1, 'base64'), - coeff: new Buffer(privateKeyComponents.coeff, 'base64') + d: Buffer.from(privateKeyComponents.d, 'base64'), + p: Buffer.from(privateKeyComponents.p, 'base64'), + q: Buffer.from(privateKeyComponents.q, 'base64'), + dmp1: Buffer.from(privateKeyComponents.dmp1, 'base64'), + dmq1: Buffer.from(privateKeyComponents.dmq1, 'base64'), + coeff: Buffer.from(privateKeyComponents.coeff, 'base64') }, 'components'); assert(key.isPrivate()); assert.equal(key.exportKey('pkcs1-private'), privateKeyPKCS1); @@ -341,7 +341,7 @@ describe('NodeRSA', function () { it('.importKey() from public components', function () { var key = new NodeRSA(); key.importKey({ - n: new Buffer(publicKeyComponents.n, 'base64'), + n: Buffer.from(publicKeyComponents.n, 'base64'), e: 65537 }, 'components-public'); assert(key.isPublic(true)); From 73cb4c217ff945a0e9591d85c33bf67090b251d0 Mon Sep 17 00:00:00 2001 From: Maxime Thoonsen Date: Mon, 14 May 2018 17:50:34 +0300 Subject: [PATCH 109/146] add documentation to import public key from modulus and exponent --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index a17c555..c3ab061 100644 --- a/README.md +++ b/README.md @@ -165,7 +165,14 @@ console.log(publicComponents); */ ``` +If you want to only import the public key use `'components-public'` as an option: +```javascript +key.importKey({ + n: new Buffer('0086fa9ba066685845fc03833a9699c8baefb53cfbf19052a7f10f1eaa30488cec1ceb752bdff2df9fad6c64b3498956e7dbab4035b4823c99a44cc57088a23783', 'hex'), + e: 65537, +}, 'components-public'); +``` ### Properties From 8718e9bcd9c3a821eb2b6e6ba9b74e67b35689db Mon Sep 17 00:00:00 2001 From: rzcoder Date: Tue, 15 May 2018 01:12:28 +0500 Subject: [PATCH 110/146] Update README.md --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index c3ab061..cecda86 100644 --- a/README.md +++ b/README.md @@ -146,14 +146,14 @@ const privateDer = key.exportKey('pkcs1-der'); ```javascript key.importKey({ - n: new Buffer('0086fa9ba066685845fc03833a9699c8baefb53cfbf19052a7f10f1eaa30488cec1ceb752bdff2df9fad6c64b3498956e7dbab4035b4823c99a44cc57088a23783', 'hex'), + n: Buffer.from('0086fa9ba066685845fc03833a9699c8baefb53cfbf19052a7f10f1eaa30488cec1ceb752bdff2df9fad6c64b3498956e7dbab4035b4823c99a44cc57088a23783', 'hex'), e: 65537, - d: new Buffer('5d2f0dd982596ef781affb1cab73a77c46985c6da2aafc252cea3f4546e80f40c0e247d7d9467750ea1321cc5aa638871b3ed96d19dcc124916b0bcb296f35e1', 'hex'), - p: new Buffer('00c59419db615e56b9805cc45673a32d278917534804171edcf925ab1df203927f', 'hex'), - q: new Buffer('00aee3f86b66087abc069b8b1736e38ad6af624f7ea80e70b95f4ff2bf77cd90fd', 'hex'), - dmp1: new Buffer('008112f5a969fcb56f4e3a4c51a60dcdebec157ee4a7376b843487b53844e8ac85', 'hex'), - dmq1: new Buffer('1a7370470e0f8a4095df40922a430fe498720e03e1f70d257c3ce34202249d21', 'hex'), - coeff: new Buffer('00b399675e5e81506b729a777cc03026f0b2119853dfc5eb124610c0ab82999e45', 'hex') + d: Buffer.from('5d2f0dd982596ef781affb1cab73a77c46985c6da2aafc252cea3f4546e80f40c0e247d7d9467750ea1321cc5aa638871b3ed96d19dcc124916b0bcb296f35e1', 'hex'), + p: Buffer.from('00c59419db615e56b9805cc45673a32d278917534804171edcf925ab1df203927f', 'hex'), + q: Buffer.from('00aee3f86b66087abc069b8b1736e38ad6af624f7ea80e70b95f4ff2bf77cd90fd', 'hex'), + dmp1: Buffer.from('008112f5a969fcb56f4e3a4c51a60dcdebec157ee4a7376b843487b53844e8ac85', 'hex'), + dmq1: Buffer.from('1a7370470e0f8a4095df40922a430fe498720e03e1f70d257c3ce34202249d21', 'hex'), + coeff: Buffer.from('00b399675e5e81506b729a777cc03026f0b2119853dfc5eb124610c0ab82999e45', 'hex') }, 'components'); const publicComponents = key.exportKey('components-public'); console.log(publicComponents); @@ -169,7 +169,7 @@ If you want to only import the public key use `'components-public'` as an option ```javascript key.importKey({ - n: new Buffer('0086fa9ba066685845fc03833a9699c8baefb53cfbf19052a7f10f1eaa30488cec1ceb752bdff2df9fad6c64b3498956e7dbab4035b4823c99a44cc57088a23783', 'hex'), + n: Buffer.from('0086fa9ba066685845fc03833a9699c8baefb53cfbf19052a7f10f1eaa30488cec1ceb752bdff2df9fad6c64b3498956e7dbab4035b4823c99a44cc57088a23783', 'hex'), e: 65537, }, 'components-public'); ``` From 049fac8844e1bc3d545607a86e9f1f284ec4c549 Mon Sep 17 00:00:00 2001 From: teppeis Date: Wed, 16 May 2018 22:34:19 +0900 Subject: [PATCH 111/146] Support Node v6 --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index b6a7fd2..47c2053 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,8 @@ language: node_js node_js: - - '8.11.1' - - 'stable' + - '6' + - '8' + - 'stable' sudo: false @@ -10,4 +11,3 @@ before_install: - npm install -g grunt-cli install: - npm install - From 885c220993d652200a5c051d5a7adf9efeab73be Mon Sep 17 00:00:00 2001 From: Dhruv Gramopadhye Date: Tue, 31 Jul 2018 23:48:18 -0400 Subject: [PATCH 112/146] NodeRSA.importKey() now returns this Sometimes we find the need to daisy chain or nest functions, and I felt that returning "`this`" would allow that to happen. This would let people do stuff like `new NodeRSA().importKey(...)`, although `new NodeRSA(...)` would technically be advantageous --- src/NodeRSA.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/NodeRSA.js b/src/NodeRSA.js index 47b1855..bbd8d75 100644 --- a/src/NodeRSA.js +++ b/src/NodeRSA.js @@ -185,8 +185,10 @@ module.exports = (function () { if (!formats.detectAndImport(this.keyPair, keyData, format) && format === undefined) { throw Error("Key format must be specified"); } - + this.$cache = {}; + + return this; }; /** From a0240f5b9867b93152640dcd319dfd576b8b38b1 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Wed, 1 Aug 2018 16:45:08 +0500 Subject: [PATCH 113/146] bump version & update readme --- README.md | 3 +++ package.json | 2 +- src/NodeRSA.js | 8 +++----- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index a17c555..79f1b28 100644 --- a/README.md +++ b/README.md @@ -237,6 +237,9 @@ Questions, comments, bug reports, and pull requests are all welcome. ## Changelog +### 1.0.1 + * `importKey()` now returns this + ### 1.0.0 * Using semver now 🎉 * **Breaking change**: Drop support nodejs < 8.11.1 diff --git a/package.json b/package.json index fcf44a4..02e802e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "1.0.0", + "version": "1.0.1", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { diff --git a/src/NodeRSA.js b/src/NodeRSA.js index 47b1855..3b0fe88 100644 --- a/src/NodeRSA.js +++ b/src/NodeRSA.js @@ -1,10 +1,8 @@ /*! * RSA library for Node.js * - * Copyright (c) 2014 rzcoder - * All Rights Reserved. - * - * License BSD + * Author: rzcoder + * License MIT */ var constants = require('constants'); @@ -16,7 +14,7 @@ var utils = require('./utils'); var schemes = require('./schemes/schemes.js'); var formats = require('./formats/formats.js'); -if (typeof constants.RSA_NO_PADDING == "undefined") { +if (typeof constants.RSA_NO_PADDING === "undefined") { //patch for node v0.10.x, constants do not defined constants.RSA_NO_PADDING = 3; } From 763bee2408ab3439408bc943cc6680f4ad176fc3 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Wed, 1 Aug 2018 16:55:15 +0500 Subject: [PATCH 114/146] update tests --- test/tests.js | 127 ++++++++++++++++++++++++++++---------------------- 1 file changed, 71 insertions(+), 56 deletions(-) diff --git a/test/tests.js b/test/tests.js index 4770e2d..298adcb 100644 --- a/test/tests.js +++ b/test/tests.js @@ -65,6 +65,62 @@ describe('NodeRSA', function () { } }; + var privateKeyPKCS1 = '-----BEGIN RSA PRIVATE KEY-----\n' + + 'MIIFwgIBAAKCAUEAsE1edyfToZRv6cFOkB0tAJ5qJor4YF5CccJAL0fS/o1Yk10V\n' + + 'SXH4Xx4peSJgYQKkO0HqO1hAz6k9dFQB4U1CnWtRjtNEcIfycqrZrhu6you5syb6\n' + + 'ScV3Zu/9bm7/DyaLlx/gJhUPR1OxOzaqsEvlu7hbDhNLIYo1zKFb/aUBbD6+UcaG\n' + + 'xH2BfFNdzVAtVSVpc/s2Y3sboMN7rByUj7937iQlaMINvVjyasynYuzHNw6ZRP9J\n' + + 'P9fwxrCyaxnTPWxVl0qvVaQO2+TtFMtDXH2OVZtWWeLHAL8cildw0G+u2qVqTqIG\n' + + 'EwNyJlsAHykaPFAMW0xLueumrSlB+JUJPrRvvw4nBCd4GOrNSlPCE/xlk1Cb8JaI\n' + + 'CTLvDUcYc3ZqL3jqAueBhkpw2uCz8xVJeOA1KY4kQIIx8JEBsAYzgyP2iy0CAwEA\n' + + 'AQKCAUAjBcudShkdgRpWSmNr94/IDrAxpeu/YRo79QXBHriIftW4uIYRCAX6B0jf\n' + + '2ndg7iBn8Skxzs9ZMVqW8FVLR4jTMs2J3Og8npUIOG5zyuhpciZas4SHASY+GbCz\n' + + 'rnMWtGaIh/mENyzI05RimfKAgSNLDk1wV17Wc9lKJEfc9Fl7Al/WaOS+xdviMcFx\n' + + 'ltrajksLkjz0uDD917eKskbE45lULfGqeI0kYDadWp88pw6ikXJln2p3Y1PNQF3e\n' + + 'y2cN+Snzd0jx/c5fD9B1zxKYv5bUo+UnTzBxV81e9xCJfkdXv+6D5qDn1gGLdZZa\n' + + '5FxtZbRgVh/ZlqP9xYr72as/WFmIA20wRgHPgWvLyHsh0XThqZf2/O3R8KmFv8aT\n' + + '+kmc5is6sVItIIi7ltorVapTkJai3zz/VSMBBaL+ytFN9jVl4QKBoQDfL8TMeZXu\n' + + 'gBTN7yq6zZWN8+60MUaxz0/lKdzmo35z32rpVKdsYd922pmcsNYaoj/H9L3j/NP4\n' + + '9z+SHfYpWvTa7AvJfNlXYc3BRXIarpfnXsm65IzKzHaF9i2xdXxkfTEYIvOQDMLF\n' + + 'SiiObWJMV+QqUxb3luu3/CR3IcbgeTOpdiC/T/Zl/YYl17JqZTHmLFZPq7xewttg\n' + + 'zQorDRWIFDtlAoGhAMo4+uM9f4BpOHSmayhLhHArIGs4386BkXSeOLeQitaQJ/2c\n' + + 'zb459O87XoCAonZbq+dI7XRnBU3toQvEsZgrtGkOFXCZJMWAQxD5BQ5vEYT6c86h\n' + + 'uGpX6h3ODlJ6UGi+5CWyMQ1cFlBkfffFAarjSYTVlyj736sOeDuJWX133z5VQBQ8\n' + + '1xSH23kNF95vxB4I1fXG8WL11YZU7VEwSLC4aCkCgaAKRj+wDhTZ4umSRWVZLiep\n' + + 'XkZp4y7W9q095nx13abvnKRmU3BVq/fGl++kZ/ujRD7dbKXlPflgJ7m0d06ivr4w\n' + + '6dbtEqNKw4TeVd0X31u82f89bFIS7/Cw4BFgbwEn+x9sdgdyZTP+MxjE3cI9s3oc\n' + + 'fLC8+ySk1qWzGkn2gX3gWkDNrdexAEfRrClZfokaiIX8qvJEBoJk5WuHadXI6u2F\n' + + 'AoGgByidOQ4kRVd0OCzr/jEuLwpXy3Pn+Fd93rL7LwRe5dmUkNXMMr+6e/2OCt6C\n' + + '4c28+CMMxOIgvfF7kf8Uil6BtHZbK/E/6/3uYdtu4mPsKtjy4I25CYqzLvrsZt8N\n' + + 'maeoS+1S7zYjVBU6oFrJBFOndpxZDYpdEKEigHkMQfTMYliCPDUrJ/7nNhHQln8+\n' + + 'YhHOATVZtjcdp/O5svYSnK7qgQKBoDd3lFWrPatgxpF1JXMEFFbaIRdNxHkKA4YY\n' + + 'gMTM4MPgViunYX/yJ7SaX8jWnC231A9uVn4+kb+DvKjc+ZuTQvnIUK2u6LvIinVF\n' + + 'snDEA+BbXwehAtwdHDMDtqYFdx4hvCWQwBNn4p3J0OO2tbYVMtvM5aOEfRSYagfm\n' + + 'RywhDUAjW8U0RBnzlmXhQQ6B9bjqooS2MsRrJrS5CU682fb3hBo=\n' + + '-----END RSA PRIVATE KEY-----'; + + var privateKeyComponents = { + n: 'ALBNXncn06GUb+nBTpAdLQCeaiaK+GBeQnHCQC9H0v6NWJNdFUlx+F8eKXkiYGECpDtB6jtYQM+pPXRUAeFNQp1rUY7TRHCH8nKq2a4busqLubMm+knFd2bv/W5u/w8mi5cf4CYVD0dTsTs2qrBL5bu4Ww4TSyGKNcyhW/2lAWw+vlHGhsR9gXxTXc1QLVUlaXP7NmN7G6DDe6wclI+/d+4kJWjCDb1Y8mrMp2LsxzcOmUT/ST/X8MawsmsZ0z1sVZdKr1WkDtvk7RTLQ1x9jlWbVlnixwC/HIpXcNBvrtqlak6iBhMDciZbAB8pGjxQDFtMS7nrpq0pQfiVCT60b78OJwQneBjqzUpTwhP8ZZNQm/CWiAky7w1HGHN2ai946gLngYZKcNrgs/MVSXjgNSmOJECCMfCRAbAGM4Mj9ost', + e: 65537, + d: 'IwXLnUoZHYEaVkpja/ePyA6wMaXrv2EaO/UFwR64iH7VuLiGEQgF+gdI39p3YO4gZ/EpMc7PWTFalvBVS0eI0zLNidzoPJ6VCDhuc8roaXImWrOEhwEmPhmws65zFrRmiIf5hDcsyNOUYpnygIEjSw5NcFde1nPZSiRH3PRZewJf1mjkvsXb4jHBcZba2o5LC5I89Lgw/de3irJGxOOZVC3xqniNJGA2nVqfPKcOopFyZZ9qd2NTzUBd3stnDfkp83dI8f3OXw/Qdc8SmL+W1KPlJ08wcVfNXvcQiX5HV7/ug+ag59YBi3WWWuRcbWW0YFYf2Zaj/cWK+9mrP1hZiANtMEYBz4Fry8h7IdF04amX9vzt0fCphb/Gk/pJnOYrOrFSLSCIu5baK1WqU5CWot88/1UjAQWi/srRTfY1ZeE=', + p: 'AN8vxMx5le6AFM3vKrrNlY3z7rQxRrHPT+Up3OajfnPfaulUp2xh33bamZyw1hqiP8f0veP80/j3P5Id9ila9NrsC8l82VdhzcFFchqul+deybrkjMrMdoX2LbF1fGR9MRgi85AMwsVKKI5tYkxX5CpTFveW67f8JHchxuB5M6l2IL9P9mX9hiXXsmplMeYsVk+rvF7C22DNCisNFYgUO2U=', + q: 'AMo4+uM9f4BpOHSmayhLhHArIGs4386BkXSeOLeQitaQJ/2czb459O87XoCAonZbq+dI7XRnBU3toQvEsZgrtGkOFXCZJMWAQxD5BQ5vEYT6c86huGpX6h3ODlJ6UGi+5CWyMQ1cFlBkfffFAarjSYTVlyj736sOeDuJWX133z5VQBQ81xSH23kNF95vxB4I1fXG8WL11YZU7VEwSLC4aCk=', + dmp1: 'CkY/sA4U2eLpkkVlWS4nqV5GaeMu1vatPeZ8dd2m75ykZlNwVav3xpfvpGf7o0Q+3Wyl5T35YCe5tHdOor6+MOnW7RKjSsOE3lXdF99bvNn/PWxSEu/wsOARYG8BJ/sfbHYHcmUz/jMYxN3CPbN6HHywvPskpNalsxpJ9oF94FpAza3XsQBH0awpWX6JGoiF/KryRAaCZOVrh2nVyOrthQ==', + dmq1: 'ByidOQ4kRVd0OCzr/jEuLwpXy3Pn+Fd93rL7LwRe5dmUkNXMMr+6e/2OCt6C4c28+CMMxOIgvfF7kf8Uil6BtHZbK/E/6/3uYdtu4mPsKtjy4I25CYqzLvrsZt8NmaeoS+1S7zYjVBU6oFrJBFOndpxZDYpdEKEigHkMQfTMYliCPDUrJ/7nNhHQln8+YhHOATVZtjcdp/O5svYSnK7qgQ==', + coeff: 'N3eUVas9q2DGkXUlcwQUVtohF03EeQoDhhiAxMzgw+BWK6dhf/IntJpfyNacLbfUD25Wfj6Rv4O8qNz5m5NC+chQra7ou8iKdUWycMQD4FtfB6EC3B0cMwO2pgV3HiG8JZDAE2fincnQ47a1thUy28zlo4R9FJhqB+ZHLCENQCNbxTREGfOWZeFBDoH1uOqihLYyxGsmtLkJTrzZ9veEGg==' + }; + + var publicKeyPKCS8 = '-----BEGIN PUBLIC KEY-----\n' + + 'MIIBYjANBgkqhkiG9w0BAQEFAAOCAU8AMIIBSgKCAUEAsE1edyfToZRv6cFOkB0t\n' + + 'AJ5qJor4YF5CccJAL0fS/o1Yk10VSXH4Xx4peSJgYQKkO0HqO1hAz6k9dFQB4U1C\n' + + 'nWtRjtNEcIfycqrZrhu6you5syb6ScV3Zu/9bm7/DyaLlx/gJhUPR1OxOzaqsEvl\n' + + 'u7hbDhNLIYo1zKFb/aUBbD6+UcaGxH2BfFNdzVAtVSVpc/s2Y3sboMN7rByUj793\n' + + '7iQlaMINvVjyasynYuzHNw6ZRP9JP9fwxrCyaxnTPWxVl0qvVaQO2+TtFMtDXH2O\n' + + 'VZtWWeLHAL8cildw0G+u2qVqTqIGEwNyJlsAHykaPFAMW0xLueumrSlB+JUJPrRv\n' + + 'vw4nBCd4GOrNSlPCE/xlk1Cb8JaICTLvDUcYc3ZqL3jqAueBhkpw2uCz8xVJeOA1\n' + + 'KY4kQIIx8JEBsAYzgyP2iy0CAwEAAQ==\n' + + '-----END PUBLIC KEY-----'; + var generatedKeys = []; var privateNodeRSA = null; var publicNodeRSA = null; @@ -159,6 +215,21 @@ describe('NodeRSA', function () { }); }); + describe('Base methods', function () { + it('importKey() should throw exception if key data not specified', function () { + var key = new NodeRSA(null); + + assert.throw(function () { + key.importKey(); + }, Error, 'Empty key given'); + }); + + it('importKey() should return this', function () { + var key = new NodeRSA(null); + assert.equal(key.importKey(publicKeyPKCS8), key); + }); + }); + describe('Work with keys', function () { describe('Generating keys', function () { for (var size in keySizes) { @@ -177,62 +248,6 @@ describe('NodeRSA', function () { }); describe('Import/Export keys', function () { - var privateKeyPKCS1 = '-----BEGIN RSA PRIVATE KEY-----\n' + - 'MIIFwgIBAAKCAUEAsE1edyfToZRv6cFOkB0tAJ5qJor4YF5CccJAL0fS/o1Yk10V\n' + - 'SXH4Xx4peSJgYQKkO0HqO1hAz6k9dFQB4U1CnWtRjtNEcIfycqrZrhu6you5syb6\n' + - 'ScV3Zu/9bm7/DyaLlx/gJhUPR1OxOzaqsEvlu7hbDhNLIYo1zKFb/aUBbD6+UcaG\n' + - 'xH2BfFNdzVAtVSVpc/s2Y3sboMN7rByUj7937iQlaMINvVjyasynYuzHNw6ZRP9J\n' + - 'P9fwxrCyaxnTPWxVl0qvVaQO2+TtFMtDXH2OVZtWWeLHAL8cildw0G+u2qVqTqIG\n' + - 'EwNyJlsAHykaPFAMW0xLueumrSlB+JUJPrRvvw4nBCd4GOrNSlPCE/xlk1Cb8JaI\n' + - 'CTLvDUcYc3ZqL3jqAueBhkpw2uCz8xVJeOA1KY4kQIIx8JEBsAYzgyP2iy0CAwEA\n' + - 'AQKCAUAjBcudShkdgRpWSmNr94/IDrAxpeu/YRo79QXBHriIftW4uIYRCAX6B0jf\n' + - '2ndg7iBn8Skxzs9ZMVqW8FVLR4jTMs2J3Og8npUIOG5zyuhpciZas4SHASY+GbCz\n' + - 'rnMWtGaIh/mENyzI05RimfKAgSNLDk1wV17Wc9lKJEfc9Fl7Al/WaOS+xdviMcFx\n' + - 'ltrajksLkjz0uDD917eKskbE45lULfGqeI0kYDadWp88pw6ikXJln2p3Y1PNQF3e\n' + - 'y2cN+Snzd0jx/c5fD9B1zxKYv5bUo+UnTzBxV81e9xCJfkdXv+6D5qDn1gGLdZZa\n' + - '5FxtZbRgVh/ZlqP9xYr72as/WFmIA20wRgHPgWvLyHsh0XThqZf2/O3R8KmFv8aT\n' + - '+kmc5is6sVItIIi7ltorVapTkJai3zz/VSMBBaL+ytFN9jVl4QKBoQDfL8TMeZXu\n' + - 'gBTN7yq6zZWN8+60MUaxz0/lKdzmo35z32rpVKdsYd922pmcsNYaoj/H9L3j/NP4\n' + - '9z+SHfYpWvTa7AvJfNlXYc3BRXIarpfnXsm65IzKzHaF9i2xdXxkfTEYIvOQDMLF\n' + - 'SiiObWJMV+QqUxb3luu3/CR3IcbgeTOpdiC/T/Zl/YYl17JqZTHmLFZPq7xewttg\n' + - 'zQorDRWIFDtlAoGhAMo4+uM9f4BpOHSmayhLhHArIGs4386BkXSeOLeQitaQJ/2c\n' + - 'zb459O87XoCAonZbq+dI7XRnBU3toQvEsZgrtGkOFXCZJMWAQxD5BQ5vEYT6c86h\n' + - 'uGpX6h3ODlJ6UGi+5CWyMQ1cFlBkfffFAarjSYTVlyj736sOeDuJWX133z5VQBQ8\n' + - '1xSH23kNF95vxB4I1fXG8WL11YZU7VEwSLC4aCkCgaAKRj+wDhTZ4umSRWVZLiep\n' + - 'XkZp4y7W9q095nx13abvnKRmU3BVq/fGl++kZ/ujRD7dbKXlPflgJ7m0d06ivr4w\n' + - '6dbtEqNKw4TeVd0X31u82f89bFIS7/Cw4BFgbwEn+x9sdgdyZTP+MxjE3cI9s3oc\n' + - 'fLC8+ySk1qWzGkn2gX3gWkDNrdexAEfRrClZfokaiIX8qvJEBoJk5WuHadXI6u2F\n' + - 'AoGgByidOQ4kRVd0OCzr/jEuLwpXy3Pn+Fd93rL7LwRe5dmUkNXMMr+6e/2OCt6C\n' + - '4c28+CMMxOIgvfF7kf8Uil6BtHZbK/E/6/3uYdtu4mPsKtjy4I25CYqzLvrsZt8N\n' + - 'maeoS+1S7zYjVBU6oFrJBFOndpxZDYpdEKEigHkMQfTMYliCPDUrJ/7nNhHQln8+\n' + - 'YhHOATVZtjcdp/O5svYSnK7qgQKBoDd3lFWrPatgxpF1JXMEFFbaIRdNxHkKA4YY\n' + - 'gMTM4MPgViunYX/yJ7SaX8jWnC231A9uVn4+kb+DvKjc+ZuTQvnIUK2u6LvIinVF\n' + - 'snDEA+BbXwehAtwdHDMDtqYFdx4hvCWQwBNn4p3J0OO2tbYVMtvM5aOEfRSYagfm\n' + - 'RywhDUAjW8U0RBnzlmXhQQ6B9bjqooS2MsRrJrS5CU682fb3hBo=\n' + - '-----END RSA PRIVATE KEY-----'; - - var privateKeyComponents = { - n: 'ALBNXncn06GUb+nBTpAdLQCeaiaK+GBeQnHCQC9H0v6NWJNdFUlx+F8eKXkiYGECpDtB6jtYQM+pPXRUAeFNQp1rUY7TRHCH8nKq2a4busqLubMm+knFd2bv/W5u/w8mi5cf4CYVD0dTsTs2qrBL5bu4Ww4TSyGKNcyhW/2lAWw+vlHGhsR9gXxTXc1QLVUlaXP7NmN7G6DDe6wclI+/d+4kJWjCDb1Y8mrMp2LsxzcOmUT/ST/X8MawsmsZ0z1sVZdKr1WkDtvk7RTLQ1x9jlWbVlnixwC/HIpXcNBvrtqlak6iBhMDciZbAB8pGjxQDFtMS7nrpq0pQfiVCT60b78OJwQneBjqzUpTwhP8ZZNQm/CWiAky7w1HGHN2ai946gLngYZKcNrgs/MVSXjgNSmOJECCMfCRAbAGM4Mj9ost', - e: 65537, - d: 'IwXLnUoZHYEaVkpja/ePyA6wMaXrv2EaO/UFwR64iH7VuLiGEQgF+gdI39p3YO4gZ/EpMc7PWTFalvBVS0eI0zLNidzoPJ6VCDhuc8roaXImWrOEhwEmPhmws65zFrRmiIf5hDcsyNOUYpnygIEjSw5NcFde1nPZSiRH3PRZewJf1mjkvsXb4jHBcZba2o5LC5I89Lgw/de3irJGxOOZVC3xqniNJGA2nVqfPKcOopFyZZ9qd2NTzUBd3stnDfkp83dI8f3OXw/Qdc8SmL+W1KPlJ08wcVfNXvcQiX5HV7/ug+ag59YBi3WWWuRcbWW0YFYf2Zaj/cWK+9mrP1hZiANtMEYBz4Fry8h7IdF04amX9vzt0fCphb/Gk/pJnOYrOrFSLSCIu5baK1WqU5CWot88/1UjAQWi/srRTfY1ZeE=', - p: 'AN8vxMx5le6AFM3vKrrNlY3z7rQxRrHPT+Up3OajfnPfaulUp2xh33bamZyw1hqiP8f0veP80/j3P5Id9ila9NrsC8l82VdhzcFFchqul+deybrkjMrMdoX2LbF1fGR9MRgi85AMwsVKKI5tYkxX5CpTFveW67f8JHchxuB5M6l2IL9P9mX9hiXXsmplMeYsVk+rvF7C22DNCisNFYgUO2U=', - q: 'AMo4+uM9f4BpOHSmayhLhHArIGs4386BkXSeOLeQitaQJ/2czb459O87XoCAonZbq+dI7XRnBU3toQvEsZgrtGkOFXCZJMWAQxD5BQ5vEYT6c86huGpX6h3ODlJ6UGi+5CWyMQ1cFlBkfffFAarjSYTVlyj736sOeDuJWX133z5VQBQ81xSH23kNF95vxB4I1fXG8WL11YZU7VEwSLC4aCk=', - dmp1: 'CkY/sA4U2eLpkkVlWS4nqV5GaeMu1vatPeZ8dd2m75ykZlNwVav3xpfvpGf7o0Q+3Wyl5T35YCe5tHdOor6+MOnW7RKjSsOE3lXdF99bvNn/PWxSEu/wsOARYG8BJ/sfbHYHcmUz/jMYxN3CPbN6HHywvPskpNalsxpJ9oF94FpAza3XsQBH0awpWX6JGoiF/KryRAaCZOVrh2nVyOrthQ==', - dmq1: 'ByidOQ4kRVd0OCzr/jEuLwpXy3Pn+Fd93rL7LwRe5dmUkNXMMr+6e/2OCt6C4c28+CMMxOIgvfF7kf8Uil6BtHZbK/E/6/3uYdtu4mPsKtjy4I25CYqzLvrsZt8NmaeoS+1S7zYjVBU6oFrJBFOndpxZDYpdEKEigHkMQfTMYliCPDUrJ/7nNhHQln8+YhHOATVZtjcdp/O5svYSnK7qgQ==', - coeff: 'N3eUVas9q2DGkXUlcwQUVtohF03EeQoDhhiAxMzgw+BWK6dhf/IntJpfyNacLbfUD25Wfj6Rv4O8qNz5m5NC+chQra7ou8iKdUWycMQD4FtfB6EC3B0cMwO2pgV3HiG8JZDAE2fincnQ47a1thUy28zlo4R9FJhqB+ZHLCENQCNbxTREGfOWZeFBDoH1uOqihLYyxGsmtLkJTrzZ9veEGg==' - }; - - var publicKeyPKCS8 = '-----BEGIN PUBLIC KEY-----\n' + - 'MIIBYjANBgkqhkiG9w0BAQEFAAOCAU8AMIIBSgKCAUEAsE1edyfToZRv6cFOkB0t\n' + - 'AJ5qJor4YF5CccJAL0fS/o1Yk10VSXH4Xx4peSJgYQKkO0HqO1hAz6k9dFQB4U1C\n' + - 'nWtRjtNEcIfycqrZrhu6you5syb6ScV3Zu/9bm7/DyaLlx/gJhUPR1OxOzaqsEvl\n' + - 'u7hbDhNLIYo1zKFb/aUBbD6+UcaGxH2BfFNdzVAtVSVpc/s2Y3sboMN7rByUj793\n' + - '7iQlaMINvVjyasynYuzHNw6ZRP9JP9fwxrCyaxnTPWxVl0qvVaQO2+TtFMtDXH2O\n' + - 'VZtWWeLHAL8cildw0G+u2qVqTqIGEwNyJlsAHykaPFAMW0xLueumrSlB+JUJPrRv\n' + - 'vw4nBCd4GOrNSlPCE/xlk1Cb8JaICTLvDUcYc3ZqL3jqAueBhkpw2uCz8xVJeOA1\n' + - 'KY4kQIIx8JEBsAYzgyP2iy0CAwEAAQ==\n' + - '-----END PUBLIC KEY-----'; - var publicKeyComponents = { n: 'ALBNXncn06GUb+nBTpAdLQCeaiaK+GBeQnHCQC9H0v6NWJNdFUlx+F8eKXkiYGECpDtB6jtYQM+pPXRUAeFNQp1rUY7TRHCH8nKq2a4busqLubMm+knFd2bv/W5u/w8mi5cf4CYVD0dTsTs2qrBL5bu4Ww4TSyGKNcyhW/2lAWw+vlHGhsR9gXxTXc1QLVUlaXP7NmN7G6DDe6wclI+/d+4kJWjCDb1Y8mrMp2LsxzcOmUT/ST/X8MawsmsZ0z1sVZdKr1WkDtvk7RTLQ1x9jlWbVlnixwC/HIpXcNBvrtqlak6iBhMDciZbAB8pGjxQDFtMS7nrpq0pQfiVCT60b78OJwQneBjqzUpTwhP8ZZNQm/CWiAky7w1HGHN2ai946gLngYZKcNrgs/MVSXjgNSmOJECCMfCRAbAGM4Mj9ost', e: 65537, From a0dc3c62f1d6022a1b49002646d30c85f9a06fb6 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Wed, 1 Aug 2018 17:00:41 +0500 Subject: [PATCH 115/146] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 68f70a1..31db3f4 100644 --- a/README.md +++ b/README.md @@ -245,7 +245,7 @@ Questions, comments, bug reports, and pull requests are all welcome. ## Changelog ### 1.0.1 - * `importKey()` now returns this + * `importKey()` now returns `this` ### 1.0.0 * Using semver now 🎉 From 4fce44453452855033f1fab8c7afbaebfcd019d9 Mon Sep 17 00:00:00 2001 From: Gareth Sime Date: Thu, 20 Sep 2018 20:00:29 +1000 Subject: [PATCH 116/146] Make the pkcs1 format more accepting of cruft We should be able to deal with any random cruft outside of the BEGIN and END boundaries. --- src/formats/pkcs1.js | 35 +++++++++++++++++++++++++++++------ test/tests.js | 15 +++++++++++++++ 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/formats/pkcs1.js b/src/formats/pkcs1.js index d481810..c34a748 100644 --- a/src/formats/pkcs1.js +++ b/src/formats/pkcs1.js @@ -2,6 +2,30 @@ var ber = require('asn1').Ber; var _ = require('../utils')._; var utils = require('../utils'); +const PRIVATE_OPENING_BOUNDARY = '-----BEGIN RSA PRIVATE KEY-----'; +const PRIVATE_CLOSING_BOUNDARY = '-----END RSA PRIVATE KEY-----'; + +const PUBLIC_OPENING_BOUNDARY = '-----BEGIN RSA PUBLIC KEY-----'; +const PUBLIC_CLOSING_BOUNDARY = '-----END RSA PUBLIC KEY-----'; + +/** + * Strips everything around the opening and closing lines, including the lines + * themselves. + */ +function trimSurroundingText(data, opening, closing) { + let openingBoundaryIndex = data.indexOf(opening); + if (openingBoundaryIndex < 0) { + throw Error('Unsupported key format - Missing BEGIN line'); + } + + let closingBoundaryIndex = data.indexOf(closing, openingBoundaryIndex); + if (closingBoundaryIndex < 0) { + throw Error('Unsupported key format - Missing END line'); + } + + return data.substring(openingBoundaryIndex + opening.length, closingBoundaryIndex); +} + module.exports = { privateExport: function (key, options) { options = options || {}; @@ -46,8 +70,7 @@ module.exports = { } if (_.isString(data)) { - var pem = data.replace('-----BEGIN RSA PRIVATE KEY-----', '') - .replace('-----END RSA PRIVATE KEY-----', '') + let pem = trimSurroundingText(data, PRIVATE_OPENING_BOUNDARY, PRIVATE_CLOSING_BOUNDARY) .replace(/\s+|\n\r|\n|\r$/gm, ''); buffer = Buffer.from(pem, 'base64'); } else { @@ -103,8 +126,7 @@ module.exports = { } if (_.isString(data)) { - var pem = data.replace('-----BEGIN RSA PUBLIC KEY-----', '') - .replace('-----END RSA PUBLIC KEY-----', '') + var pem = trimSurroundingText(data, PUBLIC_OPENING_BOUNDARY, PUBLIC_CLOSING_BOUNDARY) .replace(/\s+|\n\r|\n|\r$/gm, ''); buffer = Buffer.from(pem, 'base64'); } @@ -128,12 +150,13 @@ module.exports = { * @param data */ autoImport: function (key, data) { - if (/^\s*-----BEGIN RSA PRIVATE KEY-----\s*(?=(([A-Za-z0-9+/=]+\s*)+))\1-----END RSA PRIVATE KEY-----\s*$/g.test(data)) { + // [\S\s]* matches zero or more of any character + if (/^[\S\s]*-----BEGIN RSA PRIVATE KEY-----\s*(?=(([A-Za-z0-9+/=]+\s*)+))\1-----END RSA PRIVATE KEY-----[\S\s]*$/g.test(data)) { module.exports.privateImport(key, data); return true; } - if (/^\s*-----BEGIN RSA PUBLIC KEY-----\s*(?=(([A-Za-z0-9+/=]+\s*)+))\1-----END RSA PUBLIC KEY-----\s*$/g.test(data)) { + if (/^[\S\s]*-----BEGIN RSA PUBLIC KEY-----\s*(?=(([A-Za-z0-9+/=]+\s*)+))\1-----END RSA PUBLIC KEY-----[\S\s]*$/g.test(data)) { module.exports.publicImport(key, data); return true; } diff --git a/test/tests.js b/test/tests.js index 298adcb..b54d535 100644 --- a/test/tests.js +++ b/test/tests.js @@ -336,6 +336,21 @@ describe('NodeRSA', function () { assert.equal(key.exportKey(), fileKeyPKCS1); }); + it('should gracefully handle data outside of encapsulation boundaries for private keys', function () { + let privateFileWithNoise = 'Lorem ipsum' + fs.readFileSync(keysFolder + 'private_pkcs1.pem') + 'dulce et decorum'; + let key = new NodeRSA(privateFileWithNoise); + assert.equal(key.exportKey(), fileKeyPKCS1); + }); + + it('should gracefully handle data outside of encapsulation boundaries for public keys', function () { + let publicFileWithNoise = 'Lorem ipsum' + fs.readFileSync(keysFolder + 'public_pkcs1.pem') + 'dulce et decorum'; + let publicNodeRSA = new NodeRSA(publicFileWithNoise); + assert.instanceOf(privateNodeRSA.keyPair, Object); + assert(publicNodeRSA.isPublic()); + assert(publicNodeRSA.isPublic(true)); + assert(!publicNodeRSA.isPrivate()); + }); + it('.importKey() from private components', function () { var key = new NodeRSA(); key.importKey({ From 5e4806cc17fad5053d386c3786980248a4744745 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Wed, 12 Dec 2018 15:27:44 +0500 Subject: [PATCH 117/146] Importing keys from PEM now is less dependent on non-key data in files for pkcs1 & pkcs8. --- README.md | 3 + package-lock.json | 2250 +++++++++++++++++++++++++++++++++--------- package.json | 13 +- src/formats/pkcs1.js | 26 +- src/formats/pkcs8.js | 19 +- src/utils.js | 20 +- test/tests.js | 19 +- 7 files changed, 1870 insertions(+), 480 deletions(-) diff --git a/README.md b/README.md index 31db3f4..619ec9c 100644 --- a/README.md +++ b/README.md @@ -244,6 +244,9 @@ Questions, comments, bug reports, and pull requests are all welcome. ## Changelog +### 1.0.2 + * Importing keys from PEM now is less dependent on non-key data in files. + ### 1.0.1 * `importKey()` now returns `this` diff --git a/package-lock.json b/package-lock.json index 96a9e7d..9f8880f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,26 +1,184 @@ { "name": "node-rsa", - "version": "1.0.0", + "version": "1.0.2", "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.0.tgz", + "integrity": "sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg==", + "dev": true, + "requires": { + "@babel/types": "^7.2.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", + "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-M74+GvK4hn1eejD9lZ7967qAwvqTZayQa3g10ag4s9uewgR7TKjeaT0YMyoq+gVfKYABiWZ4MQD701/t5e1Jhg==", + "dev": true + }, + "@babel/template": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", + "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.1.2", + "@babel/types": "^7.1.2" + } + }, + "@babel/traverse": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.6.tgz", + "integrity": "sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.1.6", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/parser": "^7.1.6", + "@babel/types": "^7.1.6", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" + }, + "dependencies": { + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", + "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } }, "argparse": { "version": "1.0.10", @@ -28,7 +186,15 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + } } }, "array-find-index": { @@ -38,9 +204,12 @@ "dev": true }, "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } }, "assertion-error": { "version": "1.1.0", @@ -50,7 +219,7 @@ }, "async": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, @@ -66,7 +235,7 @@ "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", "dev": true, "requires": { - "balanced-match": "0.4.2", + "balanced-match": "^0.4.1", "concat-map": "0.0.1" } }, @@ -90,39 +259,37 @@ }, "camelcase-keys": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" } }, "chai": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", - "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", "dev": true, "requires": { - "assertion-error": "1.1.0", - "check-error": "1.0.2", - "deep-eql": "3.0.1", - "get-func-name": "2.0.0", - "pathval": "1.1.0", - "type-detect": "4.0.8" + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" } }, "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "check-error": { @@ -138,7 +305,7 @@ "dev": true, "requires": { "exit": "0.1.2", - "glob": "7.1.2" + "glob": "^7.1.1" }, "dependencies": { "balanced-match": { @@ -153,22 +320,22 @@ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "minimatch": { @@ -177,7 +344,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } } } @@ -188,9 +355,24 @@ "integrity": "sha1-56qDAZF+9iGzXYo580jc3R234z4=", "dev": true }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, "colors": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "resolved": "http://registry.npmjs.org/colors/-/colors-1.1.2.tgz", "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", "dev": true }, @@ -200,7 +382,7 @@ "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", "dev": true, "requires": { - "graceful-readlink": "1.0.1" + "graceful-readlink": ">= 1.0.0" } }, "concat-map": { @@ -215,7 +397,7 @@ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "requires": { - "date-now": "0.1.4" + "date-now": "^0.1.4" } }, "core-util-is": { @@ -230,7 +412,7 @@ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "dev": true, "requires": { - "array-find-index": "1.0.2" + "array-find-index": "^1.0.1" } }, "date-now": { @@ -245,8 +427,8 @@ "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", "dev": true, "requires": { - "get-stdin": "4.0.1", - "meow": "3.7.0" + "get-stdin": "^4.0.1", + "meow": "^3.3.0" } }, "debug": { @@ -270,7 +452,7 @@ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { - "type-detect": "4.0.8" + "type-detect": "^4.0.0" } }, "diff": { @@ -285,28 +467,28 @@ "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", "dev": true, "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.1" + "domelementtype": "~1.1.1", + "entities": "~1.1.1" }, "dependencies": { "domelementtype": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", "dev": true }, "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", "dev": true } } }, "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", "dev": true }, "domhandler": { @@ -315,7 +497,7 @@ "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", "dev": true, "requires": { - "domelementtype": "1.3.0" + "domelementtype": "1" } }, "domutils": { @@ -324,23 +506,23 @@ "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "dev": true, "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" + "dom-serializer": "0", + "domelementtype": "1" } }, "entities": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/entities/-/entities-1.0.0.tgz", "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", "dev": true }, "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "escape-string-regexp": { @@ -355,9 +537,15 @@ "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", "dev": true }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, "eventemitter2": { "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "resolved": "http://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", "dev": true }, @@ -373,8 +561,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "findup-sync": { @@ -383,7 +571,7 @@ "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", "dev": true, "requires": { - "glob": "5.0.15" + "glob": "~5.0.0" }, "dependencies": { "glob": { @@ -392,11 +580,11 @@ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "dev": true, "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.3", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } } } @@ -431,18 +619,24 @@ "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.3", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, + "globals": { + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", + "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", + "dev": true + }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", "dev": true }, "graceful-readlink": { @@ -458,111 +652,96 @@ "dev": true }, "grunt": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.2.tgz", - "integrity": "sha1-TmpeaVtwRy/VME9fqeNCNoNqc7w=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.3.tgz", + "integrity": "sha512-/JzmZNPfKorlCrrmxWqQO4JVodO+DVd5XX4DkocL/1WlLlKVLE9+SdEIempOAxDhWPysLle6afvn/hg7Ck2k9g==", "dev": true, "requires": { - "coffeescript": "1.10.0", - "dateformat": "1.0.12", - "eventemitter2": "0.4.14", - "exit": "0.1.2", - "findup-sync": "0.3.0", - "glob": "7.0.6", - "grunt-cli": "1.2.0", - "grunt-known-options": "1.1.0", - "grunt-legacy-log": "1.0.2", - "grunt-legacy-util": "1.0.0", - "iconv-lite": "0.4.23", - "js-yaml": "3.5.5", - "minimatch": "3.0.3", - "nopt": "3.0.6", - "path-is-absolute": "1.0.1", - "rimraf": "2.2.8" + "coffeescript": "~1.10.0", + "dateformat": "~1.0.12", + "eventemitter2": "~0.4.13", + "exit": "~0.1.1", + "findup-sync": "~0.3.0", + "glob": "~7.0.0", + "grunt-cli": "~1.2.0", + "grunt-known-options": "~1.1.0", + "grunt-legacy-log": "~2.0.0", + "grunt-legacy-util": "~1.1.1", + "iconv-lite": "~0.4.13", + "js-yaml": "~3.5.2", + "minimatch": "~3.0.2", + "mkdirp": "~0.5.1", + "nopt": "~3.0.6", + "path-is-absolute": "~1.0.0", + "rimraf": "~2.6.2" }, "dependencies": { "grunt-cli": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", "dev": true, "requires": { - "findup-sync": "0.3.0", - "grunt-known-options": "1.1.0", - "nopt": "3.0.6", - "resolve": "1.1.7" + "findup-sync": "~0.3.0", + "grunt-known-options": "~1.1.0", + "nopt": "~3.0.6", + "resolve": "~1.1.0" } } } }, "grunt-contrib-jshint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-1.1.0.tgz", - "integrity": "sha1-Np2QmyWTxA6L55lAshNAhQx5Oaw=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-2.0.0.tgz", + "integrity": "sha512-4qR411I1bhvVrPkKBzCUcrWkTEtBuWioXi9ABWRXHoplRScg03jiMqLDpzS4pDhVsLOTx5F9l+0cnMc+Gd2MWg==", "dev": true, "requires": { - "chalk": "1.1.3", - "hooker": "0.2.3", - "jshint": "2.9.5" + "chalk": "^2.4.1", + "hooker": "^0.2.3", + "jshint": "~2.9.6" } }, "grunt-known-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz", - "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz", + "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==", "dev": true }, "grunt-legacy-log": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-1.0.2.tgz", - "integrity": "sha512-WdedTJ/6zCXnI/coaouzqvkI19uwqbcPkdsXiDRKJyB5rOUlOxnCnTVbpeUdEckKVir2uHF3rDBYppj2p6N3+g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz", + "integrity": "sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw==", "dev": true, "requires": { - "colors": "1.1.2", - "grunt-legacy-log-utils": "1.0.0", - "hooker": "0.2.3", - "lodash": "4.17.10" + "colors": "~1.1.2", + "grunt-legacy-log-utils": "~2.0.0", + "hooker": "~0.2.3", + "lodash": "~4.17.5" } }, "grunt-legacy-log-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-1.0.0.tgz", - "integrity": "sha1-p7ji0Ps1taUPSvmG/BEnSevJbz0=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz", + "integrity": "sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==", "dev": true, "requires": { - "chalk": "1.1.3", - "lodash": "4.3.0" - }, - "dependencies": { - "lodash": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", - "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", - "dev": true - } + "chalk": "~2.4.1", + "lodash": "~4.17.10" } }, "grunt-legacy-util": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.0.0.tgz", - "integrity": "sha1-OGqnjcbtUJhsKxiVcmWxtIq7m4Y=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz", + "integrity": "sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A==", "dev": true, "requires": { - "async": "1.5.2", - "exit": "0.1.2", - "getobject": "0.1.0", - "hooker": "0.2.3", - "lodash": "4.3.0", - "underscore.string": "3.2.3", - "which": "1.2.14" - }, - "dependencies": { - "lodash": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", - "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", - "dev": true - } + "async": "~1.5.2", + "exit": "~0.1.1", + "getobject": "~0.1.0", + "hooker": "~0.2.3", + "lodash": "~4.17.10", + "underscore.string": "~3.3.4", + "which": "~1.3.0" } }, "grunt-simple-mocha": { @@ -571,16 +750,7 @@ "integrity": "sha1-V5RJJJ6vCoGHj6cvPtq1FF1F/Xc=", "dev": true, "requires": { - "mocha": "3.1.2" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" + "mocha": "*" } }, "has-flag": { @@ -596,31 +766,31 @@ "dev": true }, "hosted-git-info": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", "dev": true }, "htmlparser2": { "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "resolved": "http://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", "dev": true, "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.3.0", - "domutils": "1.5.1", - "entities": "1.0.0", - "readable-stream": "1.1.14" + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" } }, "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": ">= 2.1.2 < 3" } }, "indent-string": { @@ -629,7 +799,7 @@ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "inflight": { @@ -638,8 +808,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -656,11 +826,11 @@ }, "is-builtin-module": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, "is-finite": { @@ -669,7 +839,7 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-utf8": { @@ -690,44 +860,69 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.0.0.tgz", + "integrity": "sha512-eQY9vN9elYjdgN9Iv6NS/00bptm02EBBk70lRMaVjeA6QYocQgenVrSgC28TJurdnZa80AGO3ASdFN+w/njGiQ==", + "dev": true, + "requires": { + "@babel/generator": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "istanbul-lib-coverage": "^2.0.1", + "semver": "^5.5.0" + } + }, "jit-grunt": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/jit-grunt/-/jit-grunt-0.10.0.tgz", "integrity": "sha1-AIw6f+Hpa9DYTiYOofoXg0V/ecI=", "dev": true }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, "js-yaml": { "version": "3.5.5", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz", "integrity": "sha1-A3fDgBfKvHMisNH7zSWkkWQfL74=", "dev": true, "requires": { - "argparse": "1.0.10", - "esprima": "2.7.3" + "argparse": "^1.0.2", + "esprima": "^2.6.0" } }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, "jshint": { - "version": "2.9.5", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.5.tgz", - "integrity": "sha1-HnJSkVzmgbQIJ+4UJIxG006apiw=", + "version": "2.9.7", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.7.tgz", + "integrity": "sha512-Q8XN38hGsVQhdlM+4gd1Xl7OB1VieSuCJf+fEJjpo59JH99bVJhXRXAh26qQ15wfdd1VPMuDWNeSWoNl53T4YA==", "dev": true, "requires": { - "cli": "1.0.1", - "console-browserify": "1.1.0", - "exit": "0.1.2", - "htmlparser2": "3.8.3", - "lodash": "3.7.0", - "minimatch": "3.0.3", - "shelljs": "0.3.0", - "strip-json-comments": "1.0.4" - }, - "dependencies": { - "lodash": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz", - "integrity": "sha1-Nni9irmVBXwHreg27S7wh9qBHUU=", - "dev": true - } + "cli": "~1.0.0", + "console-browserify": "1.1.x", + "exit": "0.1.x", + "htmlparser2": "3.8.x", + "lodash": "~4.17.10", + "minimatch": "~3.0.2", + "shelljs": "0.3.x", + "strip-json-comments": "1.0.x" } }, "json3": { @@ -738,21 +933,21 @@ }, "load-json-file": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", "dev": true }, "lodash._baseassign": { @@ -761,8 +956,8 @@ "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", "dev": true, "requires": { - "lodash._basecopy": "3.0.1", - "lodash.keys": "3.1.2" + "lodash._basecopy": "^3.0.0", + "lodash.keys": "^3.0.0" } }, "lodash._basecopy": { @@ -795,9 +990,9 @@ "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", "dev": true, "requires": { - "lodash._baseassign": "3.2.0", - "lodash._basecreate": "3.0.3", - "lodash._isiterateecall": "3.0.9" + "lodash._baseassign": "^3.0.0", + "lodash._basecreate": "^3.0.0", + "lodash._isiterateecall": "^3.0.0" } }, "lodash.isarguments": { @@ -818,9 +1013,9 @@ "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", "dev": true, "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" } }, "loud-rejection": { @@ -829,8 +1024,8 @@ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "dev": true, "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" } }, "map-obj": { @@ -841,20 +1036,20 @@ }, "meow": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" } }, "minimatch": { @@ -863,12 +1058,12 @@ "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", "dev": true, "requires": { - "brace-expansion": "1.1.6" + "brace-expansion": "^1.0.0" } }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -914,12 +1109,12 @@ "integrity": "sha1-tCAqaQmbu00pKnwblbZoK2fr3JU=", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.3", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "supports-color": { @@ -928,7 +1123,7 @@ "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -945,7 +1140,7 @@ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true, "requires": { - "abbrev": "1.1.1" + "abbrev": "1" } }, "normalize-package-data": { @@ -954,10 +1149,10 @@ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "2.6.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "number-is-nan": { @@ -966,153 +1161,1294 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.1" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" - } - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "nyc": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.1.0.tgz", + "integrity": "sha512-3GyY6TpQ58z9Frpv4GMExE1SV2tAgYqC7HSy2omEhNiCT3mhT9NyiOvIE8zkbuJVFzmvvNTnE4h/7/wQae7xLg==", "dev": true, "requires": { - "is-finite": "1.0.2" - } - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - }, - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "archy": "^1.0.0", + "arrify": "^1.0.1", + "caching-transform": "^2.0.0", + "convert-source-map": "^1.6.0", + "debug-log": "^1.0.1", + "find-cache-dir": "^2.0.0", + "find-up": "^3.0.0", + "foreground-child": "^1.5.6", + "glob": "^7.1.3", + "istanbul-lib-coverage": "^2.0.1", + "istanbul-lib-hook": "^2.0.1", + "istanbul-lib-instrument": "^3.0.0", + "istanbul-lib-report": "^2.0.2", + "istanbul-lib-source-maps": "^2.0.1", + "istanbul-reports": "^2.0.1", + "make-dir": "^1.3.0", + "merge-source-map": "^1.1.0", + "resolve-from": "^4.0.0", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "spawn-wrap": "^1.4.2", + "test-exclude": "^5.0.0", + "uuid": "^3.3.2", + "yargs": "11.1.0", + "yargs-parser": "^9.0.2" + }, + "dependencies": { + "align-text": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "amdefine": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "append-transform": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, + "archy": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "arrify": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "async": { + "version": "1.5.2", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "builtin-modules": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "caching-transform": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "make-dir": "^1.0.0", + "md5-hex": "^2.0.0", + "package-hash": "^2.0.0", + "write-file-atomic": "^2.0.0" + } + }, + "camelcase": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true + }, + "center-align": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "cliui": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "commondir": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cross-spawn": { + "version": "4.0.2", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "debug": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "debug-log": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "default-require-extensions": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + } + }, + "error-ex": { + "version": "1.3.2", + "bundled": true, + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es6-error": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "execa": { + "version": "0.7.0", + "bundled": true, + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "find-cache-dir": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "foreground-child": { + "version": "1.5.6", + "bundled": true, + "dev": true, + "requires": { + "cross-spawn": "^4", + "signal-exit": "^3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "handlebars": { + "version": "4.0.11", + "bundled": true, + "dev": true, + "requires": { + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "bundled": true, + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "bundled": true, + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "bundled": true, + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "istanbul-lib-coverage": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "istanbul-lib-hook": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-report": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.1", + "make-dir": "^1.3.0", + "supports-color": "^5.4.0" + } + }, + "istanbul-lib-source-maps": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^2.0.1", + "make-dir": "^1.3.0", + "rimraf": "^2.6.2", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "bundled": true, + "dev": true + } + } + }, + "istanbul-reports": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "handlebars": "^4.0.11" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "1.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "lcid": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash.flattendeep": { + "version": "4.4.0", + "bundled": true, + "dev": true + }, + "longest": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "lru-cache": { + "version": "4.1.3", + "bundled": true, + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "md5-hex": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "md5-o-matic": "^0.1.1" + } + }, + "md5-o-matic": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "mem": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "merge-source-map": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "bundled": true, + "dev": true + } + } + }, + "mimic-fn": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.10", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optimist": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "p-finally": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "p-limit": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "package-hash": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "lodash.flattendeep": "^4.4.0", + "md5-hex": "^2.0.0", + "release-zalgo": "^1.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-exists": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "path-key": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "path-type": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "pseudomap": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "release-zalgo": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, + "repeat-string": { + "version": "1.6.1", + "bundled": true, + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "right-align": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "source-map": { + "version": "0.5.7", + "bundled": true, + "dev": true, + "optional": true + }, + "spawn-wrap": { + "version": "1.4.2", + "bundled": true, + "dev": true, + "requires": { + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "which": "^1.3.0" + } + }, + "spdx-correct": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "test-exclude": { + "version": "5.0.0", + "bundled": true, + "dev": true, + "requires": { + "arrify": "^1.0.1", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^1.0.1" + } + }, + "uglify-js": { + "version": "2.8.29", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "yargs": { + "version": "3.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "uuid": { + "version": "3.3.2", + "bundled": true, + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "bundled": true, + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "window-size": { + "version": "0.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "wordwrap": { + "version": "0.0.3", + "bundled": true, + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "write-file-atomic": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "y18n": { + "version": "3.2.1", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "2.1.2", + "bundled": true, + "dev": true + }, + "yargs": { + "version": "11.1.0", + "bundled": true, + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" + }, + "dependencies": { + "cliui": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "yargs-parser": { + "version": "9.0.2", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "^4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "bundled": true, + "dev": true + } + } + } + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "resolve": { + "version": "1.1.7", + "resolved": "http://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", "dev": true }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", @@ -1121,7 +2457,7 @@ }, "shelljs": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", + "resolved": "http://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", "dev": true }, @@ -1131,20 +2467,26 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", "dev": true }, "spdx-expression-parse": { @@ -1153,44 +2495,35 @@ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz", + "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==", "dev": true }, "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", "dev": true }, "string_decoder": { "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, "strip-bom": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } }, "strip-indent": { @@ -1199,7 +2532,7 @@ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "dev": true, "requires": { - "get-stdin": "4.0.1" + "get-stdin": "^4.0.1" } }, "strip-json-comments": { @@ -1209,9 +2542,26 @@ "dev": true }, "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + } + } + }, + "to-fast-properties": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, "trim-newlines": { @@ -1220,6 +2570,12 @@ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", "dev": true }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -1227,28 +2583,38 @@ "dev": true }, "underscore.string": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.2.3.tgz", - "integrity": "sha1-gGmSYzZl1eX8tNsfs6hi62jp5to=", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", + "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==", + "dev": true, + "requires": { + "sprintf-js": "^1.0.3", + "util-deprecate": "^1.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "wrappy": { diff --git a/package.json b/package.json index 02e802e..82cfa16 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "1.0.1", + "version": "1.0.2", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { @@ -30,14 +30,15 @@ }, "homepage": "https://github.com/rzcoder/node-rsa", "devDependencies": { - "chai": "^4.1.2", - "grunt": "^1.0.2", - "grunt-contrib-jshint": "^1.1.0", + "chai": "^4.2.0", + "grunt": "^1.0.3", + "grunt-contrib-jshint": "^2.0.0", "grunt-simple-mocha": "0.4.1", "jit-grunt": "0.10.0", - "lodash": "^4.17.10" + "lodash": "^4.17.11", + "nyc": "^13.1.0" }, "dependencies": { - "asn1": "0.2.3" + "asn1": "^0.2.4" } } diff --git a/src/formats/pkcs1.js b/src/formats/pkcs1.js index c34a748..87f9aa0 100644 --- a/src/formats/pkcs1.js +++ b/src/formats/pkcs1.js @@ -8,24 +8,6 @@ const PRIVATE_CLOSING_BOUNDARY = '-----END RSA PRIVATE KEY-----'; const PUBLIC_OPENING_BOUNDARY = '-----BEGIN RSA PUBLIC KEY-----'; const PUBLIC_CLOSING_BOUNDARY = '-----END RSA PUBLIC KEY-----'; -/** - * Strips everything around the opening and closing lines, including the lines - * themselves. - */ -function trimSurroundingText(data, opening, closing) { - let openingBoundaryIndex = data.indexOf(opening); - if (openingBoundaryIndex < 0) { - throw Error('Unsupported key format - Missing BEGIN line'); - } - - let closingBoundaryIndex = data.indexOf(closing, openingBoundaryIndex); - if (closingBoundaryIndex < 0) { - throw Error('Unsupported key format - Missing END line'); - } - - return data.substring(openingBoundaryIndex + opening.length, closingBoundaryIndex); -} - module.exports = { privateExport: function (key, options) { options = options || {}; @@ -56,7 +38,7 @@ module.exports = { if (options.type === 'der') { return writer.buffer; } else { - return '-----BEGIN RSA PRIVATE KEY-----\n' + utils.linebrk(writer.buffer.toString('base64'), 64) + '\n-----END RSA PRIVATE KEY-----'; + return PRIVATE_OPENING_BOUNDARY + '\n' + utils.linebrk(writer.buffer.toString('base64'), 64) + '\n' + PRIVATE_CLOSING_BOUNDARY; } }, @@ -70,7 +52,7 @@ module.exports = { } if (_.isString(data)) { - let pem = trimSurroundingText(data, PRIVATE_OPENING_BOUNDARY, PRIVATE_CLOSING_BOUNDARY) + let pem = utils.trimSurroundingText(data, PRIVATE_OPENING_BOUNDARY, PRIVATE_CLOSING_BOUNDARY) .replace(/\s+|\n\r|\n|\r$/gm, ''); buffer = Buffer.from(pem, 'base64'); } else { @@ -112,7 +94,7 @@ module.exports = { if (options.type === 'der') { return bodyWriter.buffer; } else { - return '-----BEGIN RSA PUBLIC KEY-----\n' + utils.linebrk(bodyWriter.buffer.toString('base64'), 64) + '\n-----END RSA PUBLIC KEY-----'; + return PUBLIC_OPENING_BOUNDARY + '\n' + utils.linebrk(bodyWriter.buffer.toString('base64'), 64) + '\n' + PUBLIC_CLOSING_BOUNDARY; } }, @@ -126,7 +108,7 @@ module.exports = { } if (_.isString(data)) { - var pem = trimSurroundingText(data, PUBLIC_OPENING_BOUNDARY, PUBLIC_CLOSING_BOUNDARY) + var pem = utils.trimSurroundingText(data, PUBLIC_OPENING_BOUNDARY, PUBLIC_CLOSING_BOUNDARY) .replace(/\s+|\n\r|\n|\r$/gm, ''); buffer = Buffer.from(pem, 'base64'); } diff --git a/src/formats/pkcs8.js b/src/formats/pkcs8.js index 75a552d..3dd1a3c 100644 --- a/src/formats/pkcs8.js +++ b/src/formats/pkcs8.js @@ -3,6 +3,12 @@ var _ = require('../utils')._; var PUBLIC_RSA_OID = '1.2.840.113549.1.1.1'; var utils = require('../utils'); +const PRIVATE_OPENING_BOUNDARY = '-----BEGIN PRIVATE KEY-----'; +const PRIVATE_CLOSING_BOUNDARY = '-----END PRIVATE KEY-----'; + +const PUBLIC_OPENING_BOUNDARY = '-----BEGIN PUBLIC KEY-----'; +const PUBLIC_CLOSING_BOUNDARY = '-----END PUBLIC KEY-----'; + module.exports = { privateExport: function (key, options) { options = options || {}; @@ -43,7 +49,7 @@ module.exports = { if (options.type === 'der') { return writer.buffer; } else { - return '-----BEGIN PRIVATE KEY-----\n' + utils.linebrk(writer.buffer.toString('base64'), 64) + '\n-----END PRIVATE KEY-----'; + return PRIVATE_OPENING_BOUNDARY + '\n' + utils.linebrk(writer.buffer.toString('base64'), 64) + '\n' + PRIVATE_CLOSING_BOUNDARY; } }, @@ -57,7 +63,7 @@ module.exports = { } if (_.isString(data)) { - var pem = data.replace('-----BEGIN PRIVATE KEY-----', '') + var pem = utils.trimSurroundingText(data, PRIVATE_OPENING_BOUNDARY, PRIVATE_CLOSING_BOUNDARY) .replace('-----END PRIVATE KEY-----', '') .replace(/\s+|\n\r|\n|\r$/gm, ''); buffer = Buffer.from(pem, 'base64'); @@ -119,7 +125,7 @@ module.exports = { if (options.type === 'der') { return writer.buffer; } else { - return '-----BEGIN PUBLIC KEY-----\n' + utils.linebrk(writer.buffer.toString('base64'), 64) + '\n-----END PUBLIC KEY-----'; + return PUBLIC_OPENING_BOUNDARY + '\n' + utils.linebrk(writer.buffer.toString('base64'), 64) + '\n' + PUBLIC_CLOSING_BOUNDARY; } }, @@ -133,8 +139,7 @@ module.exports = { } if (_.isString(data)) { - var pem = data.replace('-----BEGIN PUBLIC KEY-----', '') - .replace('-----END PUBLIC KEY-----', '') + var pem = utils.trimSurroundingText(data, PUBLIC_OPENING_BOUNDARY, PUBLIC_CLOSING_BOUNDARY) .replace(/\s+|\n\r|\n|\r$/gm, ''); buffer = Buffer.from(pem, 'base64'); } @@ -167,12 +172,12 @@ module.exports = { * @param data */ autoImport: function (key, data) { - if (/^\s*-----BEGIN PRIVATE KEY-----\s*(?=(([A-Za-z0-9+/=]+\s*)+))\1-----END PRIVATE KEY-----\s*$/g.test(data)) { + if (/^[\S\s]*-----BEGIN PRIVATE KEY-----\s*(?=(([A-Za-z0-9+/=]+\s*)+))\1-----END PRIVATE KEY-----[\S\s]*$/g.test(data)) { module.exports.privateImport(key, data); return true; } - if (/^\s*-----BEGIN PUBLIC KEY-----\s*(?=(([A-Za-z0-9+/=]+\s*)+))\1-----END PUBLIC KEY-----\s*$/g.test(data)) { + if (/^[\S\s]*-----BEGIN PUBLIC KEY-----\s*(?=(([A-Za-z0-9+/=]+\s*)+))\1-----END PUBLIC KEY-----[\S\s]*$/g.test(data)) { module.exports.publicImport(key, data); return true; } diff --git a/src/utils.js b/src/utils.js index 7a1dd82..4e047da 100644 --- a/src/utils.js +++ b/src/utils.js @@ -84,4 +84,22 @@ module.exports._ = { return newObj; } -}; \ No newline at end of file +}; + +/** + * Strips everything around the opening and closing lines, including the lines + * themselves. + */ +module.exports.trimSurroundingText = function (data, opening, closing) { + let openingBoundaryIndex = data.indexOf(opening); + if (openingBoundaryIndex < 0) { + throw Error('Missing BEGIN line'); + } + + let closingBoundaryIndex = data.indexOf(closing, openingBoundaryIndex); + if (closingBoundaryIndex < 0) { + throw Error('Missing END line'); + } + + return data.substring(openingBoundaryIndex + opening.length, closingBoundaryIndex); +} \ No newline at end of file diff --git a/test/tests.js b/test/tests.js index b54d535..ecaa14a 100644 --- a/test/tests.js +++ b/test/tests.js @@ -336,13 +336,13 @@ describe('NodeRSA', function () { assert.equal(key.exportKey(), fileKeyPKCS1); }); - it('should gracefully handle data outside of encapsulation boundaries for private keys', function () { + it('should gracefully handle data outside of encapsulation boundaries for pkcs1 private keys', function () { let privateFileWithNoise = 'Lorem ipsum' + fs.readFileSync(keysFolder + 'private_pkcs1.pem') + 'dulce et decorum'; let key = new NodeRSA(privateFileWithNoise); assert.equal(key.exportKey(), fileKeyPKCS1); }); - it('should gracefully handle data outside of encapsulation boundaries for public keys', function () { + it('should gracefully handle data outside of encapsulation boundaries for pkcs1 public keys', function () { let publicFileWithNoise = 'Lorem ipsum' + fs.readFileSync(keysFolder + 'public_pkcs1.pem') + 'dulce et decorum'; let publicNodeRSA = new NodeRSA(publicFileWithNoise); assert.instanceOf(privateNodeRSA.keyPair, Object); @@ -351,6 +351,21 @@ describe('NodeRSA', function () { assert(!publicNodeRSA.isPrivate()); }); + it('should gracefully handle data outside of encapsulation boundaries for pkcs8 private keys', function () { + let privateFileWithNoise = 'Lorem ipsum' + fs.readFileSync(keysFolder + 'private_pkcs8.pem') + 'dulce et decorum'; + let key = new NodeRSA(privateFileWithNoise); + assert.equal(key.exportKey(), fileKeyPKCS1); + }); + + it('should gracefully handle data outside of encapsulation boundaries for pkcs8 public keys', function () { + let publicFileWithNoise = 'Lorem ipsum' + fs.readFileSync(keysFolder + 'public_pkcs8.pem') + 'dulce et decorum'; + let publicNodeRSA = new NodeRSA(publicFileWithNoise); + assert.instanceOf(privateNodeRSA.keyPair, Object); + assert(publicNodeRSA.isPublic()); + assert(publicNodeRSA.isPublic(true)); + assert(!publicNodeRSA.isPrivate()); + }); + it('.importKey() from private components', function () { var key = new NodeRSA(); key.importKey({ From 05f043f97f593cc83b2178d7ea751f4d5cbf6b6f Mon Sep 17 00:00:00 2001 From: Enver Cicak Date: Wed, 23 Jan 2019 16:33:08 +0100 Subject: [PATCH 118/146] Allow keys without BEGIN/END boundaries to be loaded --- src/utils.js | 13 ++++++++----- test/tests.js | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/utils.js b/src/utils.js index 4e047da..a9062f2 100644 --- a/src/utils.js +++ b/src/utils.js @@ -91,15 +91,18 @@ module.exports._ = { * themselves. */ module.exports.trimSurroundingText = function (data, opening, closing) { + let trimStartIndex = 0; + let trimEndIndex = data.length; + let openingBoundaryIndex = data.indexOf(opening); - if (openingBoundaryIndex < 0) { - throw Error('Missing BEGIN line'); + if (openingBoundaryIndex >= 0) { + trimStartIndex = openingBoundaryIndex + opening.length; } let closingBoundaryIndex = data.indexOf(closing, openingBoundaryIndex); - if (closingBoundaryIndex < 0) { - throw Error('Missing END line'); + if (closingBoundaryIndex >= 0) { + trimEndIndex = closingBoundaryIndex; } - return data.substring(openingBoundaryIndex + opening.length, closingBoundaryIndex); + return data.substring(trimStartIndex, trimEndIndex); } \ No newline at end of file diff --git a/test/tests.js b/test/tests.js index ecaa14a..ad67fa1 100644 --- a/test/tests.js +++ b/test/tests.js @@ -366,6 +366,40 @@ describe('NodeRSA', function () { assert(!publicNodeRSA.isPrivate()); }); + it('should handle data without begin/end encapsulation boundaries for pkcs1 private keys', function () { + let privateFile = fs.readFileSync(keysFolder + 'private_pkcs1.pem', "utf8"); + let privateFileNoBoundaries = privateFile.substring("-----BEGIN RSA PRIVATE KEY-----".length, privateFile.indexOf("-----END RSA PRIVATE KEY-----")); + let key = new NodeRSA(privateFileNoBoundaries, "pkcs1-private-pem"); + assert.equal(key.exportKey(), fileKeyPKCS1); + }); + + it('should handle data without begin/end encapsulation boundaries for pkcs1 public keys', function () { + let publicFile = fs.readFileSync(keysFolder + 'public_pkcs1.pem', "utf8"); + let publicFileNoBoundaries = publicFile.substring("-----BEGIN RSA PUBLIC KEY-----".length, publicFile.indexOf("-----END RSA PUBLIC KEY-----")); + let publicNodeRSA = new NodeRSA(publicFileNoBoundaries, "pkcs1-public-pem"); + assert.instanceOf(publicNodeRSA.keyPair, Object); + assert(publicNodeRSA.isPublic()); + assert(publicNodeRSA.isPublic(true)); + assert(!publicNodeRSA.isPrivate()); + }); + + it('should handle data without begin/end encapsulation boundaries for pkcs8 private keys', function () { + let privateFile = fs.readFileSync(keysFolder + 'private_pkcs8.pem', "utf8"); + let privateFileNoBoundaries = privateFile.substring('-----BEGIN PRIVATE KEY-----'.length, privateFile.indexOf('-----END PRIVATE KEY-----')); + let key = new NodeRSA(privateFileNoBoundaries, "pkcs8-private-pem"); + assert.equal(key.exportKey(), fileKeyPKCS1); + }); + + it('should handle data without begin/end encapsulation boundaries for pkcs8 public keys', function () { + let publicFile = fs.readFileSync(keysFolder + 'public_pkcs8.pem', "utf8"); + let publicFileNoBoundaries = publicFile.substring("-----BEGIN PUBLIC KEY-----".length, publicFile.indexOf("-----END PUBLIC KEY-----")); + let publicNodeRSA = new NodeRSA(publicFileNoBoundaries, "pkcs8-public-pem"); + assert.instanceOf(publicNodeRSA.keyPair, Object); + assert(publicNodeRSA.isPublic()); + assert(publicNodeRSA.isPublic(true)); + assert(!publicNodeRSA.isPrivate()); + }); + it('.importKey() from private components', function () { var key = new NodeRSA(); key.importKey({ From 7a9f0a4fd110e05234975207658826dda1337e79 Mon Sep 17 00:00:00 2001 From: Enver Cicak Date: Thu, 24 Jan 2019 08:35:07 +0100 Subject: [PATCH 119/146] Validate correct objects in tests --- test/tests.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/tests.js b/test/tests.js index ecaa14a..765612d 100644 --- a/test/tests.js +++ b/test/tests.js @@ -309,7 +309,7 @@ describe('NodeRSA', function () { it('should load public key from (not trimmed) PKCS8-PEM string', function () { publicNodeRSA = new NodeRSA(publicKeyPEMNotTrimmed); - assert.instanceOf(privateNodeRSA.keyPair, Object); + assert.instanceOf(publicNodeRSA.keyPair, Object); assert(publicNodeRSA.isPublic()); assert(publicNodeRSA.isPublic(true)); assert(!publicNodeRSA.isPrivate()); @@ -345,7 +345,7 @@ describe('NodeRSA', function () { it('should gracefully handle data outside of encapsulation boundaries for pkcs1 public keys', function () { let publicFileWithNoise = 'Lorem ipsum' + fs.readFileSync(keysFolder + 'public_pkcs1.pem') + 'dulce et decorum'; let publicNodeRSA = new NodeRSA(publicFileWithNoise); - assert.instanceOf(privateNodeRSA.keyPair, Object); + assert.instanceOf(publicNodeRSA.keyPair, Object); assert(publicNodeRSA.isPublic()); assert(publicNodeRSA.isPublic(true)); assert(!publicNodeRSA.isPrivate()); @@ -360,7 +360,7 @@ describe('NodeRSA', function () { it('should gracefully handle data outside of encapsulation boundaries for pkcs8 public keys', function () { let publicFileWithNoise = 'Lorem ipsum' + fs.readFileSync(keysFolder + 'public_pkcs8.pem') + 'dulce et decorum'; let publicNodeRSA = new NodeRSA(publicFileWithNoise); - assert.instanceOf(privateNodeRSA.keyPair, Object); + assert.instanceOf(publicNodeRSA.keyPair, Object); assert(publicNodeRSA.isPublic()); assert(publicNodeRSA.isPublic(true)); assert(!publicNodeRSA.isPrivate()); From 8fda92373f701e148cca1073c547c4b7226ed535 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Thu, 24 Jan 2019 13:19:12 +0500 Subject: [PATCH 120/146] es5 compatible version bump --- package.json | 2 +- src/utils.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 82cfa16..c0c9c35 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "1.0.2", + "version": "1.0.3", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { diff --git a/src/utils.js b/src/utils.js index a9062f2..2ed6313 100644 --- a/src/utils.js +++ b/src/utils.js @@ -91,15 +91,15 @@ module.exports._ = { * themselves. */ module.exports.trimSurroundingText = function (data, opening, closing) { - let trimStartIndex = 0; - let trimEndIndex = data.length; + var trimStartIndex = 0; + var trimEndIndex = data.length; - let openingBoundaryIndex = data.indexOf(opening); + var openingBoundaryIndex = data.indexOf(opening); if (openingBoundaryIndex >= 0) { trimStartIndex = openingBoundaryIndex + opening.length; } - let closingBoundaryIndex = data.indexOf(closing, openingBoundaryIndex); + var closingBoundaryIndex = data.indexOf(closing, openingBoundaryIndex); if (closingBoundaryIndex >= 0) { trimEndIndex = closingBoundaryIndex; } From 8c4b106b100e21c5a7667407a8081d4610036668 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Thu, 24 Jan 2019 15:08:19 +0500 Subject: [PATCH 121/146] add test cases --- test/tests.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/tests.js b/test/tests.js index 9d4ba89..6cc965a 100644 --- a/test/tests.js +++ b/test/tests.js @@ -253,8 +253,8 @@ describe('NodeRSA', function () { e: 65537, }; - var privateKeyPEMNotTrimmed = ' \n\n \n\n ' + privateKeyPKCS1 + '\n \n \n\n '; - var publicKeyPEMNotTrimmed = '\n\n\n\n ' + publicKeyPKCS8 + '\n \n\n\n '; + var privateKeyPEMNotTrimmed = 'random \n\n data \n\n ' + privateKeyPKCS1 + '\n \n \n\n random data '; + var publicKeyPEMNotTrimmed = '\n\n\n\nrandom \n\n data\n ' + publicKeyPKCS8 + '\n \n random data\n\n '; var fileKeyPKCS1 = '-----BEGIN RSA PRIVATE KEY-----\n' + 'MIICXAIBAAKBgQCCdY+EpDC/vPa335l751SBM8d5Lf4z4QZX4bc+DqTY9zVY/rmP\n' + From 89c46261b8265adf9abaa9966a20ce45e3324ca7 Mon Sep 17 00:00:00 2001 From: Andres Luque Date: Fri, 22 Feb 2019 17:31:02 -0500 Subject: [PATCH 122/146] fix: Change let - var for es5 compatible --- src/formats/pkcs1.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/formats/pkcs1.js b/src/formats/pkcs1.js index 87f9aa0..5fba246 100644 --- a/src/formats/pkcs1.js +++ b/src/formats/pkcs1.js @@ -52,7 +52,7 @@ module.exports = { } if (_.isString(data)) { - let pem = utils.trimSurroundingText(data, PRIVATE_OPENING_BOUNDARY, PRIVATE_CLOSING_BOUNDARY) + var pem = utils.trimSurroundingText(data, PRIVATE_OPENING_BOUNDARY, PRIVATE_CLOSING_BOUNDARY) .replace(/\s+|\n\r|\n|\r$/gm, ''); buffer = Buffer.from(pem, 'base64'); } else { From b4d0aa65051027d007550a1028b780e433e4ed4a Mon Sep 17 00:00:00 2001 From: rzcoder Date: Mon, 4 Mar 2019 13:46:43 +0500 Subject: [PATCH 123/146] version bump --- .gitignore | 3 ++- package.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index d7ad7b3..759ad8c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .DS_Store .idea .tmp -node_modules/ \ No newline at end of file +node_modules/ +.nyc_output \ No newline at end of file diff --git a/package.json b/package.json index c0c9c35..cd59a8e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "1.0.3", + "version": "1.0.4", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { From 9feef4ba84eac4d4a62eb208c8792e37d272aee0 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Mon, 4 Mar 2019 13:53:16 +0500 Subject: [PATCH 124/146] fix .npmignore version bump --- .npmignore | 6 +++++- package.json | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.npmignore b/.npmignore index 977af21..925efd3 100644 --- a/.npmignore +++ b/.npmignore @@ -1,2 +1,6 @@ test -.travis.yml \ No newline at end of file +.travis.yml +.nyc_output +.tmp +.idea +.DS_Store \ No newline at end of file diff --git a/package.json b/package.json index cd59a8e..7e8a05d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "1.0.4", + "version": "1.0.5", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { From fb8f507ca7f2634bbf29c3d5589b776927e9d738 Mon Sep 17 00:00:00 2001 From: honzap Date: Tue, 10 Sep 2019 13:47:19 +0200 Subject: [PATCH 125/146] fix: pkcs1 returned Buffer object when data were invalid. (found when data has been encrypted with different padding type than was encrypted. The library correctly returned data instead of throw error) --- .gitignore | 3 ++- package-lock.json | 2 +- src/schemes/pkcs1.js | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 759ad8c..9cf9541 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ .idea .tmp node_modules/ -.nyc_output \ No newline at end of file +.nyc_output +nbproject/ \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 9f8880f..ac0eb09 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "1.0.2", + "version": "1.0.5", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/schemes/pkcs1.js b/src/schemes/pkcs1.js index 1835c7e..86e55de 100644 --- a/src/schemes/pkcs1.js +++ b/src/schemes/pkcs1.js @@ -113,7 +113,7 @@ module.exports.makeScheme = function (key, options) { /* Type 1: zeros padding for private key decrypt */ if (options.type === 1) { - if (buffer[0] !== 0 && buffer[1] !== 1) { + if (buffer[0] !== 0 || buffer[1] !== 1) { return null; } i = 3; @@ -124,7 +124,7 @@ module.exports.makeScheme = function (key, options) { } } else { /* random padding for public key decrypt */ - if (buffer[0] !== 0 && buffer[1] !== 2) { + if (buffer[0] !== 0 || buffer[1] !== 2) { return null; } i = 3; From a18361054176bb6cfdec709b11103cff676bcda0 Mon Sep 17 00:00:00 2001 From: honzap Date: Tue, 10 Sep 2019 13:51:22 +0200 Subject: [PATCH 126/146] Revert "fix: pkcs1 returned Buffer object when data were invalid. (found when data has been encrypted with different padding type than was encrypted. The library correctly returned data instead of throw error)" This reverts commit fb8f507ca7f2634bbf29c3d5589b776927e9d738. --- .gitignore | 3 +-- package-lock.json | 2 +- src/schemes/pkcs1.js | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 9cf9541..759ad8c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,4 @@ .idea .tmp node_modules/ -.nyc_output -nbproject/ \ No newline at end of file +.nyc_output \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index ac0eb09..9f8880f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "1.0.5", + "version": "1.0.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/schemes/pkcs1.js b/src/schemes/pkcs1.js index 86e55de..1835c7e 100644 --- a/src/schemes/pkcs1.js +++ b/src/schemes/pkcs1.js @@ -113,7 +113,7 @@ module.exports.makeScheme = function (key, options) { /* Type 1: zeros padding for private key decrypt */ if (options.type === 1) { - if (buffer[0] !== 0 || buffer[1] !== 1) { + if (buffer[0] !== 0 && buffer[1] !== 1) { return null; } i = 3; @@ -124,7 +124,7 @@ module.exports.makeScheme = function (key, options) { } } else { /* random padding for public key decrypt */ - if (buffer[0] !== 0 || buffer[1] !== 2) { + if (buffer[0] !== 0 && buffer[1] !== 2) { return null; } i = 3; From 9314c6ea11e5da0cdb860919244761d5e60f3378 Mon Sep 17 00:00:00 2001 From: honzap Date: Tue, 10 Sep 2019 13:52:34 +0200 Subject: [PATCH 127/146] fix: pkcs1 returned Buffer object when data were invalid. (found when data has been encrypted with different padding type than was encrypted. The library correctly returned data instead of throw error) --- .gitignore | 3 ++- src/schemes/pkcs1.js | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 759ad8c..9cf9541 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ .idea .tmp node_modules/ -.nyc_output \ No newline at end of file +.nyc_output +nbproject/ \ No newline at end of file diff --git a/src/schemes/pkcs1.js b/src/schemes/pkcs1.js index 1835c7e..86e55de 100644 --- a/src/schemes/pkcs1.js +++ b/src/schemes/pkcs1.js @@ -113,7 +113,7 @@ module.exports.makeScheme = function (key, options) { /* Type 1: zeros padding for private key decrypt */ if (options.type === 1) { - if (buffer[0] !== 0 && buffer[1] !== 1) { + if (buffer[0] !== 0 || buffer[1] !== 1) { return null; } i = 3; @@ -124,7 +124,7 @@ module.exports.makeScheme = function (key, options) { } } else { /* random padding for public key decrypt */ - if (buffer[0] !== 0 && buffer[1] !== 2) { + if (buffer[0] !== 0 || buffer[1] !== 2) { return null; } i = 3; From 9e2010524b1a46f0997b7ec102c5e6654503c836 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Thu, 19 Sep 2019 13:41:59 +0500 Subject: [PATCH 128/146] version bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7e8a05d..b2915d3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "1.0.5", + "version": "1.0.6", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { From cae867af4960bfe25c25f88f9dde2eacdb2a74b3 Mon Sep 17 00:00:00 2001 From: nanov Date: Wed, 30 Oct 2019 17:31:02 +0200 Subject: [PATCH 129/146] fix: get32IntFromBuffer to handle arbitary sizes --- src/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.js b/src/utils.js index 2ed6313..eac573f 100644 --- a/src/utils.js +++ b/src/utils.js @@ -40,7 +40,7 @@ module.exports.get32IntFromBuffer = function (buffer, offset) { var size = 0; if ((size = buffer.length - offset) > 0) { if (size >= 4) { - return buffer.readUInt32BE(offset); + return buffer.readUIntBE(offset, size); } else { var res = 0; for (var i = offset + size, d = 0; i > offset; i--, d += 2) { From 14dcb987a2ce53c637c608629e201fec7e1b6020 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Mon, 25 Nov 2019 16:15:55 +0500 Subject: [PATCH 130/146] version bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b2915d3..db9da0d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "1.0.6", + "version": "1.0.7", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { From d6e4e979394ca57f38a5b50dc18f86a5c10bd51a Mon Sep 17 00:00:00 2001 From: Martin Huschenbett Date: Fri, 20 Mar 2020 23:45:50 +0100 Subject: [PATCH 131/146] Always return a boolean from NodeRSA.isPrivate Currently, the `NodeRSA.isPrivate` method returns the `d` component of the key when the key is indeed a private key. Obviously, this result is truthy and hence does the job. However, I would classify it as a security risk since the name `isPrivate` raises the expectation that the result is a boolean and hence can safely be sent over the wire. This might leak the most private part of the key though, which would most likely be a disaster. --- src/libs/rsa.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/rsa.js b/src/libs/rsa.js index 6f47b9d..158f745 100644 --- a/src/libs/rsa.js +++ b/src/libs/rsa.js @@ -272,7 +272,7 @@ module.exports.Key = (function () { * Check if key pair contains private key */ RSAKey.prototype.isPrivate = function () { - return this.n && this.e && this.d || false; + return this.n && this.e && this.d && true || false; }; /** From 045f62533b5eb157bd0c747b8a9e28ce84b1152f Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sat, 28 Mar 2020 15:31:21 +0500 Subject: [PATCH 132/146] version bump --- package-lock.json | 2660 ++++++++++++++++++++++----------------------- package.json | 10 +- 2 files changed, 1319 insertions(+), 1351 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9f8880f..ca94c3b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,176 +1,332 @@ { "name": "node-rsa", - "version": "1.0.2", + "version": "1.0.8", "lockfileVersion": 1, "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "dev": true, "requires": { - "@babel/highlight": "^7.0.0" + "@babel/highlight": "^7.8.3" + } + }, + "@babel/core": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", + "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.0", + "@babel/parser": "^7.9.0", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@babel/generator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.0.tgz", - "integrity": "sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg==", + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", + "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", "dev": true, "requires": { - "@babel/types": "^7.2.0", + "@babel/types": "^7.9.0", "jsesc": "^2.5.1", - "lodash": "^4.17.10", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" + "lodash": "^4.17.13", + "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-imports": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-transforms": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", + "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.9.0", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-replace-supers": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", + "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/helper-simple-access": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", + "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-split-export-declaration": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", - "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", + "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", + "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0" } }, "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", "dev": true, "requires": { + "@babel/helper-validator-identifier": "^7.9.0", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "@babel/parser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.0.tgz", - "integrity": "sha512-M74+GvK4hn1eejD9lZ7967qAwvqTZayQa3g10ag4s9uewgR7TKjeaT0YMyoq+gVfKYABiWZ4MQD701/t5e1Jhg==", + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", "dev": true }, "@babel/template": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", - "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.1.2", - "@babel/types": "^7.1.2" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" } }, "@babel/traverse": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.6.tgz", - "integrity": "sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", + "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.1.6", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.0.0", - "@babel/parser": "^7.1.6", - "@babel/types": "^7.1.6", + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.0", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.10" + "lodash": "^4.17.13" }, "dependencies": { "debug": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", - "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } }, "@babel/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", - "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", "dev": true, "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.10", + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } }, + "@istanbuljs/load-nyc-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", + "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "dependencies": { + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + } + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -180,6 +336,21 @@ "color-convert": "^1.9.0" } }, + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "requires": { + "default-require-extensions": "^3.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -191,7 +362,7 @@ "dependencies": { "sprintf-js": { "version": "1.0.3", - "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true } @@ -219,7 +390,7 @@ }, "async": { "version": "1.5.2", - "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, @@ -245,11 +416,17 @@ "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", "dev": true }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "requires": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + } }, "camelcase": { "version": "2.1.1", @@ -259,7 +436,7 @@ }, "camelcase-keys": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { @@ -282,9 +459,9 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -298,6 +475,12 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, "cli": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", @@ -325,9 +508,9 @@ } }, "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -349,6 +532,17 @@ } } }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, "coffeescript": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.10.0.tgz", @@ -372,7 +566,7 @@ }, "colors": { "version": "1.1.2", - "resolved": "http://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", "dev": true }, @@ -385,6 +579,12 @@ "graceful-readlink": ">= 1.0.0" } }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -400,12 +600,43 @@ "date-now": "^0.1.4" } }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -455,6 +686,23 @@ "type-detect": "^4.0.0" } }, + "default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + } + } + }, "diff": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", @@ -462,25 +710,25 @@ "dev": true }, "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "dev": true, "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" + "domelementtype": "^2.0.1", + "entities": "^2.0.0" }, "dependencies": { "domelementtype": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", "dev": true }, "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", "dev": true } } @@ -510,9 +758,15 @@ "domelementtype": "1" } }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "entities": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", "dev": true }, @@ -525,6 +779,12 @@ "is-arrayish": "^0.2.1" } }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -532,20 +792,14 @@ "dev": true }, "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "eventemitter2": { "version": "0.4.14", - "resolved": "http://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", "dev": true }, @@ -555,6 +809,17 @@ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, "find-up": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", @@ -589,12 +854,40 @@ } } }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "fromentries": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.0.tgz", + "integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==", + "dev": true + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, "get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", @@ -628,15 +921,15 @@ } }, "globals": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", - "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "dev": true }, "graceful-readlink": { @@ -652,9 +945,9 @@ "dev": true }, "grunt": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.3.tgz", - "integrity": "sha512-/JzmZNPfKorlCrrmxWqQO4JVodO+DVd5XX4DkocL/1WlLlKVLE9+SdEIempOAxDhWPysLle6afvn/hg7Ck2k9g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.1.0.tgz", + "integrity": "sha512-+NGod0grmviZ7Nzdi9am7vuRS/h76PcWDsV635mEXF0PEQMUV6Kb+OjTdsVxbi0PZmfQOjCMKb3w8CVZcqsn1g==", "dev": true, "requires": { "coffeescript": "~1.10.0", @@ -668,9 +961,9 @@ "grunt-legacy-log": "~2.0.0", "grunt-legacy-util": "~1.1.1", "iconv-lite": "~0.4.13", - "js-yaml": "~3.5.2", + "js-yaml": "~3.13.1", "minimatch": "~3.0.2", - "mkdirp": "~0.5.1", + "mkdirp": "~1.0.3", "nopt": "~3.0.6", "path-is-absolute": "~1.0.0", "rimraf": "~2.6.2" @@ -678,7 +971,7 @@ "dependencies": { "grunt-cli": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", "dev": true, "requires": { @@ -687,18 +980,30 @@ "nopt": "~3.0.6", "resolve": "~1.1.0" } + }, + "mkdirp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", + "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true } } }, "grunt-contrib-jshint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-2.0.0.tgz", - "integrity": "sha512-4qR411I1bhvVrPkKBzCUcrWkTEtBuWioXi9ABWRXHoplRScg03jiMqLDpzS4pDhVsLOTx5F9l+0cnMc+Gd2MWg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-2.1.0.tgz", + "integrity": "sha512-65S2/C/6RfjY/umTxfwXXn+wVvaYmykHkHSsW6Q6rhkbv3oudTEgqnFFZvWzWCoHUb+3GMZLbP3oSrNyvshmIQ==", "dev": true, "requires": { - "chalk": "^2.4.1", + "chalk": "^2.4.2", "hooker": "^0.2.3", - "jshint": "~2.9.6" + "jshint": "~2.10.2" } }, "grunt-known-options": { @@ -759,6 +1064,16 @@ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", "dev": true }, + "hasha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz", + "integrity": "sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + } + }, "hooker": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", @@ -766,14 +1081,20 @@ "dev": true }, "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, "htmlparser2": { "version": "3.8.3", - "resolved": "http://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", "dev": true, "requires": { @@ -793,6 +1114,12 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, "indent-string": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", @@ -824,23 +1151,29 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true }, "is-utf8": { "version": "0.2.1", @@ -848,6 +1181,12 @@ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -861,46 +1200,200 @@ "dev": true }, "istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", "dev": true }, - "istanbul-lib-instrument": { + "istanbul-lib-hook": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.0.0.tgz", - "integrity": "sha512-eQY9vN9elYjdgN9Iv6NS/00bptm02EBBk70lRMaVjeA6QYocQgenVrSgC28TJurdnZa80AGO3ASdFN+w/njGiQ==", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, "requires": { - "@babel/generator": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "istanbul-lib-coverage": "^2.0.1", - "semver": "^5.5.0" + "append-transform": "^2.0.0" } }, - "jit-grunt": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/jit-grunt/-/jit-grunt-0.10.0.tgz", - "integrity": "sha1-AIw6f+Hpa9DYTiYOofoXg0V/ecI=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz", - "integrity": "sha1-A3fDgBfKvHMisNH7zSWkkWQfL74=", + "istanbul-lib-instrument": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", + "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", "dev": true, "requires": { - "argparse": "^1.0.2", - "esprima": "^2.6.0" + "@babel/core": "^7.7.5", + "@babel/parser": "^7.7.5", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-Vm9xwCiQ8t2cNNnckyeAV0UdxKpcQUz4nMxsBvIu8n2kmPSiyb5uaF/8LpmKr+yqL/MdOXaX2Nmdo4Qyxium9Q==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jit-grunt": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/jit-grunt/-/jit-grunt-0.10.0.tgz", + "integrity": "sha1-AIw6f+Hpa9DYTiYOofoXg0V/ecI=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "jsesc": { @@ -910,16 +1403,16 @@ "dev": true }, "jshint": { - "version": "2.9.7", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.7.tgz", - "integrity": "sha512-Q8XN38hGsVQhdlM+4gd1Xl7OB1VieSuCJf+fEJjpo59JH99bVJhXRXAh26qQ15wfdd1VPMuDWNeSWoNl53T4YA==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.10.3.tgz", + "integrity": "sha512-d8AoXcNNYzmm7cdmulQ3dQApbrPYArtVBO6n4xOICe4QsXGNHCAKDcFORzqP52LhK61KX0VhY39yYzCsNq+bxQ==", "dev": true, "requires": { "cli": "~1.0.0", "console-browserify": "1.1.x", "exit": "0.1.x", "htmlparser2": "3.8.x", - "lodash": "~4.17.10", + "lodash": "~4.17.11", "minimatch": "~3.0.2", "shelljs": "0.3.x", "strip-json-comments": "1.0.x" @@ -931,9 +1424,18 @@ "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", "dev": true }, + "json5": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", + "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, "load-json-file": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { @@ -944,10 +1446,19 @@ "strip-bom": "^2.0.0" } }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "lodash._baseassign": { @@ -995,6 +1506,12 @@ "lodash._isiterateecall": "^3.0.0" } }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, "lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", @@ -1028,6 +1545,23 @@ "signal-exit": "^3.0.0" } }, + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", @@ -1036,7 +1570,7 @@ }, "meow": { "version": "3.7.0", - "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { @@ -1062,9 +1596,9 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "mkdirp": { @@ -1134,6 +1668,15 @@ "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true }, + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "requires": { + "process-on-spawn": "^1.0.0" + } + }, "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", @@ -1144,306 +1687,83 @@ } }, "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", + "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, "nyc": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.1.0.tgz", - "integrity": "sha512-3GyY6TpQ58z9Frpv4GMExE1SV2tAgYqC7HSy2omEhNiCT3mhT9NyiOvIE8zkbuJVFzmvvNTnE4h/7/wQae7xLg==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "arrify": "^1.0.1", - "caching-transform": "^2.0.0", - "convert-source-map": "^1.6.0", - "debug-log": "^1.0.1", - "find-cache-dir": "^2.0.0", - "find-up": "^3.0.0", - "foreground-child": "^1.5.6", - "glob": "^7.1.3", - "istanbul-lib-coverage": "^2.0.1", - "istanbul-lib-hook": "^2.0.1", - "istanbul-lib-instrument": "^3.0.0", - "istanbul-lib-report": "^2.0.2", - "istanbul-lib-source-maps": "^2.0.1", - "istanbul-reports": "^2.0.1", - "make-dir": "^1.3.0", - "merge-source-map": "^1.1.0", - "resolve-from": "^4.0.0", - "rimraf": "^2.6.2", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.0.tgz", + "integrity": "sha512-qcLBlNCKMDVuKb7d1fpxjPR8sHeMVX0CHarXAVzrVWoFrigCkYR8xcrjfXSPi5HXM7EU78L6ywO7w1c5rZNCNg==", + "dev": true, + "requires": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.0", + "js-yaml": "^3.13.1", + "make-dir": "^3.0.0", + "node-preload": "^0.2.0", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", "signal-exit": "^3.0.2", - "spawn-wrap": "^1.4.2", - "test-exclude": "^5.0.0", - "uuid": "^3.3.2", - "yargs": "11.1.0", - "yargs-parser": "^9.0.2" + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "uuid": "^3.3.3", + "yargs": "^15.0.2" }, "dependencies": { - "align-text": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - } - }, - "amdefine": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "append-transform": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, - "archy": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "arrify": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "async": { - "version": "1.5.2", - "bundled": true, - "dev": true - }, "balanced-match": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "brace-expansion": { "version": "1.1.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "builtin-modules": { - "version": "1.1.1", - "bundled": true, - "dev": true - }, - "caching-transform": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "make-dir": "^1.0.0", - "md5-hex": "^2.0.0", - "package-hash": "^2.0.0", - "write-file-atomic": "^2.0.0" - } - }, - "camelcase": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true - }, - "center-align": { - "version": "0.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, - "cliui": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "commondir": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "convert-source-map": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cross-spawn": { - "version": "4.0.2", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "debug": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "debug-log": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "default-require-extensions": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "strip-bom": "^3.0.0" - } - }, - "error-ex": { - "version": "1.3.2", - "bundled": true, - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es6-error": { - "version": "4.1.1", - "bundled": true, - "dev": true - }, - "execa": { - "version": "0.7.0", - "bundled": true, - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } - }, - "find-cache-dir": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^3.0.0" - } - }, "find-up": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "foreground-child": { - "version": "1.5.6", - "bundled": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "bundled": true, - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, "glob": { - "version": "7.1.3", - "bundled": true, + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -1454,848 +1774,28 @@ "path-is-absolute": "^1.0.0" } }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "handlebars": { - "version": "4.0.11", - "bundled": true, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "async": "^1.4.0", - "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "bundled": true, - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "hosted-git-info": { - "version": "2.7.1", - "bundled": true, - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true, - "dev": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "bundled": true, - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "bundled": true, - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "isexe": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "istanbul-lib-coverage": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "istanbul-lib-hook": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, - "istanbul-lib-report": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.1", - "make-dir": "^1.3.0", - "supports-color": "^5.4.0" - } - }, - "istanbul-lib-source-maps": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^2.0.1", - "make-dir": "^1.3.0", - "rimraf": "^2.6.2", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true - } - } - }, - "istanbul-reports": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "handlebars": "^4.0.11" - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "bundled": true, - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "1.0.4", - "bundled": true, - "dev": true, - "optional": true - }, - "lcid": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash.flattendeep": { - "version": "4.4.0", - "bundled": true, - "dev": true - }, - "longest": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "lru-cache": { - "version": "4.1.3", - "bundled": true, - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "md5-hex": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "md5-o-matic": "^0.1.1" - } - }, - "md5-o-matic": { - "version": "0.1.1", - "bundled": true, - "dev": true - }, - "mem": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "merge-source-map": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true - } - } - }, - "mimic-fn": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.10", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - } - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "normalize-package-data": { - "version": "2.4.0", - "bundled": true, - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optimist": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "os-locale": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "p-finally": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "p-limit": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "package-hash": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "lodash.flattendeep": "^4.4.0", - "md5-hex": "^2.0.0", - "release-zalgo": "^1.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "brace-expansion": "^1.1.7" } }, "path-exists": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "path-key": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "path-type": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "pseudomap": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "release-zalgo": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "repeat-string": { - "version": "1.6.1", - "bundled": true, - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "resolve-from": { "version": "4.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, - "right-align": { - "version": "0.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.1" - } - }, "rimraf": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "requires": { - "glob": "^7.0.5" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.5.0", - "bundled": true, - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { "version": "3.0.2", - "bundled": true, - "dev": true - }, - "source-map": { - "version": "0.5.7", - "bundled": true, - "dev": true, - "optional": true - }, - "spawn-wrap": { - "version": "1.4.2", - "bundled": true, - "dev": true, - "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - } - }, - "spdx-correct": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "bundled": true, - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "string-width": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { - "has-flag": "^3.0.0" - } - }, - "test-exclude": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "arrify": "^1.0.1", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^1.0.1" - } - }, - "uglify-js": { - "version": "2.8.29", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "yargs": { - "version": "3.10.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "uuid": { - "version": "3.3.2", - "bundled": true, - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "bundled": true, - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "window-size": { - "version": "0.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "wordwrap": { - "version": "0.0.3", - "bundled": true, - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "write-file-atomic": { - "version": "2.3.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "y18n": { - "version": "3.2.1", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "2.1.2", - "bundled": true, - "dev": true - }, - "yargs": { - "version": "11.1.0", - "bundled": true, - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - }, - "dependencies": { - "cliui": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "bundled": true, - "dev": true - } - } - }, - "yargs-parser": { - "version": "9.0.2", - "bundled": true, - "dev": true, - "requires": { - "camelcase": "^4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "bundled": true, - "dev": true - } + "glob": "^7.1.3" } } } @@ -2315,6 +1815,51 @@ "wrappy": "1" } }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -2339,6 +1884,18 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, "path-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", @@ -2358,7 +1915,7 @@ }, "pify": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, @@ -2368,13 +1925,49 @@ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", "dev": true }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } + } + }, + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", "dev": true, "requires": { - "pinkie": "^2.0.0" + "fromentries": "^1.2.0" } }, "read-pkg": { @@ -2400,7 +1993,7 @@ }, "readable-stream": { "version": "1.1.14", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { @@ -2420,6 +2013,15 @@ "strip-indent": "^1.0.1" } }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, "repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", @@ -2429,42 +2031,131 @@ "is-finite": "^1.0.0" } }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, "resolve": { - "version": "1.1.7", - "resolved": "http://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "shelljs": { "version": "0.3.0", - "resolved": "http://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", "dev": true }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, "source-map": { @@ -2473,6 +2164,79 @@ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "requires": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", @@ -2500,9 +2264,9 @@ } }, "spdx-license-ids": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz", - "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, "sprintf-js": { @@ -2511,12 +2275,32 @@ "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", "dev": true }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, "string_decoder": { "version": "0.10.31", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, "strip-bom": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", @@ -2558,6 +2342,58 @@ } } }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -2570,18 +2406,27 @@ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", "dev": true }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, "underscore.string": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", @@ -2598,6 +2443,12 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -2617,11 +2468,128 @@ "isexe": "^2.0.0" } }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } + } + }, + "yargs-parser": { + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", + "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } } } } diff --git a/package.json b/package.json index db9da0d..5cfc3a0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "1.0.7", + "version": "1.0.8", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { @@ -31,12 +31,12 @@ "homepage": "https://github.com/rzcoder/node-rsa", "devDependencies": { "chai": "^4.2.0", - "grunt": "^1.0.3", - "grunt-contrib-jshint": "^2.0.0", + "grunt": "^1.1.0", + "grunt-contrib-jshint": "^2.1.0", "grunt-simple-mocha": "0.4.1", "jit-grunt": "0.10.0", - "lodash": "^4.17.11", - "nyc": "^13.1.0" + "lodash": "^4.17.15", + "nyc": "^15.0.0" }, "dependencies": { "asn1": "^0.2.4" From a59ab2dff716e57c4723f9c9bb54a09713e7f35f Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sat, 28 Mar 2020 15:32:38 +0500 Subject: [PATCH 133/146] update dependencies --- package-lock.json | 854 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 706 insertions(+), 148 deletions(-) diff --git a/package-lock.json b/package-lock.json index ca94c3b..b4d4444 100644 --- a/package-lock.json +++ b/package-lock.json @@ -321,6 +321,12 @@ } } }, + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -336,6 +342,16 @@ "color-convert": "^1.9.0" } }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, "append-transform": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", @@ -362,7 +378,7 @@ "dependencies": { "sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true } @@ -395,25 +411,40 @@ "dev": true }, "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", "dev": true }, "brace-expansion": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", - "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "balanced-match": "^0.4.1", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, "caching-transform": { @@ -475,6 +506,22 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + } + }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -570,15 +617,6 @@ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", "dev": true }, - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -663,12 +701,12 @@ } }, "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "0.7.1" + "ms": "^2.1.1" } }, "decamelize": { @@ -703,10 +741,19 @@ } } }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, "diff": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", - "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, "dom-serializer": { @@ -779,6 +826,36 @@ "is-arrayish": "^0.2.1" } }, + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, "es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", @@ -809,6 +886,15 @@ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "find-cache-dir": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", @@ -854,6 +940,15 @@ } } }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + } + }, "foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -876,6 +971,19 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, "gensync": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", @@ -920,6 +1028,15 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -932,16 +1049,10 @@ "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "dev": true }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, "grunt": { @@ -1058,10 +1169,25 @@ "mocha": "*" } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, "hasha": { @@ -1074,6 +1200,12 @@ "type-fest": "^0.8.0" } }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, "hooker": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", @@ -1151,6 +1283,39 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, "is-finite": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", @@ -1163,12 +1328,45 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -1418,12 +1616,6 @@ "strip-json-comments": "1.0.x" } }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, "json5": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", @@ -1461,78 +1653,19 @@ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basecreate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", - "dev": true, - "requires": { - "lodash._baseassign": "^3.0.0", - "lodash._basecreate": "^3.0.0", - "lodash._isiterateecall": "^3.0.0" - } - }, "lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", "dev": true, "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" + "chalk": "^2.4.2" } }, "loud-rejection": { @@ -1602,72 +1735,230 @@ "dev": true }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", "dev": true, "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } + "minimist": "^1.2.5" } }, "mocha": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.1.2.tgz", - "integrity": "sha1-Ufk7Qyv34bF1/8Iog8zQvjLbprU=", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.1.tgz", + "integrity": "sha512-3qQsu3ijNS3GkWcccT5Zw0hf/rWvu1fTN9sPvEd81hlwsr30GX2GcDSSoBxo24IR8FelmrAydGC6/1J5QQP4WA==", "dev": true, "requires": { - "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "2.2.0", - "diff": "1.4.0", + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "chokidar": "3.3.0", + "debug": "3.2.6", + "diff": "3.5.0", "escape-string-regexp": "1.0.5", - "glob": "7.0.5", - "growl": "1.9.2", - "json3": "3.3.2", - "lodash.create": "3.1.1", - "mkdirp": "0.5.1", - "supports-color": "3.1.2" + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.3", + "ms": "2.1.1", + "node-environment-flags": "1.0.6", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, "glob": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", - "integrity": "sha1-tCAqaQmbu00pKnwblbZoK2fr3JU=", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.2", + "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { - "has-flag": "^1.0.0" + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } }, "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, + "node-environment-flags": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + } + }, "node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -1698,6 +1989,12 @@ "validate-npm-package-license": "^3.0.1" } }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, "nyc": { "version": "15.0.0", "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.0.tgz", @@ -1736,13 +2033,13 @@ "dependencies": { "balanced-match": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "resolved": false, "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "resolved": false, "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { @@ -1776,7 +2073,7 @@ }, "minimatch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "resolved": false, "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { @@ -1806,6 +2103,40 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1913,6 +2244,12 @@ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -2003,6 +2340,15 @@ "string_decoder": "~0.10.x" } }, + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", @@ -2286,6 +2632,26 @@ "strip-ansi": "^6.0.0" } }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", @@ -2400,6 +2766,15 @@ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", @@ -2474,6 +2849,48 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -2590,6 +3007,147 @@ "dev": true } } + }, + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } } } } From ec6ccf02fa42aa933893848a4a8aa7eb5ebada88 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Sat, 28 Mar 2020 22:19:19 +0500 Subject: [PATCH 134/146] Update .travis.yml remove node 6 from tests --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 47c2053..2164c7c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,5 @@ language: node_js node_js: - - '6' - '8' - 'stable' From c52f8075353206760ceb8d9519b68866d117d91c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Jul 2020 04:30:57 +0000 Subject: [PATCH 135/146] Bump lodash from 4.17.15 to 4.17.19 Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.19. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.19) Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index b4d4444..50cbf4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -378,7 +378,7 @@ "dependencies": { "sprintf-js": { "version": "1.0.3", - "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true } @@ -1648,9 +1648,9 @@ } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", "dev": true }, "lodash.flattendeep": { From 73512af3185d6e802780480db0b0a4b6e67bdf81 Mon Sep 17 00:00:00 2001 From: ondralukes Date: Tue, 21 Jul 2020 09:54:24 +0200 Subject: [PATCH 136/146] Importing OpenSSH private key --- src/formats/formats.js | 1 + src/formats/openssh.js | 123 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 src/formats/openssh.js diff --git a/src/formats/formats.js b/src/formats/formats.js index 4db1fc6..e1fc3fb 100644 --- a/src/formats/formats.js +++ b/src/formats/formats.js @@ -31,6 +31,7 @@ module.exports = { pkcs1: require('./pkcs1'), pkcs8: require('./pkcs8'), components: require('./components'), + openssh: require('./openssh'), isPrivateExport: function (format) { return module.exports[format] && typeof module.exports[format].privateExport === 'function'; diff --git a/src/formats/openssh.js b/src/formats/openssh.js new file mode 100644 index 0000000..bc66375 --- /dev/null +++ b/src/formats/openssh.js @@ -0,0 +1,123 @@ +var _ = require('../utils')._; +var utils = require('../utils'); +var BigInteger = require('../libs/jsbn'); + +const PRIVATE_OPENING_BOUNDARY = '-----BEGIN OPENSSH PRIVATE KEY-----'; +const PRIVATE_CLOSING_BOUNDARY = '-----END OPENSSH PRIVATE KEY-----'; + +module.exports = { + privateExport: function (key, options) { + throw Error('Not implemented yet.'); + }, + + privateImport: function (key, data, options) { + options = options || {}; + var buffer; + + if (options.type !== 'der') { + if (Buffer.isBuffer(data)) { + data = data.toString('utf8'); + } + + if (_.isString(data)) { + var pem = utils.trimSurroundingText(data, PRIVATE_OPENING_BOUNDARY, PRIVATE_CLOSING_BOUNDARY) + .replace(/\s+|\n\r|\n|\r$/gm, ''); + buffer = Buffer.from(pem, 'base64'); + } else { + throw Error('Unsupported key format'); + } + } else if (Buffer.isBuffer(data)) { + buffer = data; + } else { + throw Error('Unsupported key format'); + } + + const reader = {buf:buffer, off:0}; + + if(buffer.slice(0,14).toString('ascii') !== 'openssh-key-v1') + throw 'Invalid file format.'; + + reader.off += 15; + + //ciphername + if(readOpenSSHKeyString(reader).toString('ascii') !== 'none') + throw Error('Unsupported key type'); + //kdfname + if(readOpenSSHKeyString(reader).toString('ascii') !== 'none') + throw Error('Unsupported key type'); + //kdf + if(readOpenSSHKeyString(reader).toString('ascii') !== '') + throw Error('Unsupported key type'); + //keynum + reader.off += 4; + + //sshpublengtn + reader.off += 4; + + //keytype + if(readOpenSSHKeyString(reader).toString('ascii') !== 'ssh-rsa') + throw Error('Unsupported key type'); + readOpenSSHKeyString(reader); + readOpenSSHKeyString(reader); + + reader.off += 12; + if(readOpenSSHKeyString(reader).toString('ascii') !== 'ssh-rsa') + throw Error('Unsupported key type'); + + const n = readOpenSSHKeyString(reader); + const e = readOpenSSHKeyString(reader); + const d = readOpenSSHKeyString(reader); + const coeff = readOpenSSHKeyString(reader); + const p = readOpenSSHKeyString(reader); + const q = readOpenSSHKeyString(reader); + + //Calculate missing values + const dint = new BigInteger(d); + const qint = new BigInteger(q); + const pint = new BigInteger(p); + const dp = dint.mod(pint.subtract(BigInteger.ONE)); + const dq = dint.mod(qint.subtract(BigInteger.ONE)); + + key.setPrivate( + n, // modulus + e, // publicExponent + d, // privateExponent + p, // prime1 + q, // prime2 + dp.toBuffer(), // exponent1 -- d mod (p1) + dq.toBuffer(), // exponent2 -- d mod (q-1) + coeff // coefficient -- (inverse of q) mod p + ); + }, + + publicExport: function (key, options) { + throw Error('Not implemented yet.'); + }, + + publicImport: function (key, data, options) { + throw Error('Not implemented yet.'); + }, + + /** + * Trying autodetect and import key + * @param key + * @param data + */ + autoImport: function (key, data) { + // [\S\s]* matches zero or more of any character + if (/^[\S\s]*-----BEGIN OPENSSH PRIVATE KEY-----\s*(?=(([A-Za-z0-9+/=]+\s*)+))\1-----END OPENSSH PRIVATE KEY-----[\S\s]*$/g.test(data)) { + module.exports.privateImport(key, data); + return true; + } + + return false; + } +}; + +function readOpenSSHKeyString(reader) { + const len = reader.buf.readInt32BE(reader.off); + reader.off += 4; + const res = reader.buf.slice(reader.off, reader.off + len); + reader.off += len; + return res; +} \ No newline at end of file From c3e79f76a86253166aebe4c1ce1219bd262f922b Mon Sep 17 00:00:00 2001 From: ondralukes Date: Tue, 21 Jul 2020 10:08:15 +0200 Subject: [PATCH 137/146] Importing OpenSSH public key --- src/formats/openssh.js | 43 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/formats/openssh.js b/src/formats/openssh.js index bc66375..1dceb45 100644 --- a/src/formats/openssh.js +++ b/src/formats/openssh.js @@ -95,7 +95,43 @@ module.exports = { }, publicImport: function (key, data, options) { - throw Error('Not implemented yet.'); + options = options || {}; + var buffer; + + if (options.type !== 'der') { + if (Buffer.isBuffer(data)) { + data = data.toString('utf8'); + } + + if (_.isString(data)) { + if(data.substring(0, 8) !== 'ssh-rsa ') + throw Error('Unsupported key format'); + var pem = data.substring(8, data.indexOf(' ', 8)) + .replace(/\s+|\n\r|\n|\r$/gm, ''); + buffer = Buffer.from(pem, 'base64'); + } else { + throw Error('Unsupported key format'); + } + } else if (Buffer.isBuffer(data)) { + buffer = data; + } else { + throw Error('Unsupported key format'); + } + + const reader = {buf:buffer, off:0}; + + const type = readOpenSSHKeyString(reader).toString('ascii'); + + if(type !== 'ssh-rsa') + throw Error('Invalid key type'); + + const e = readOpenSSHKeyString(reader); + const n = readOpenSSHKeyString(reader); + + key.setPublic( + n, + e + ); }, /** @@ -110,6 +146,11 @@ module.exports = { return true; } + if (/^[\S\s]*ssh-rsa \s*(?=(([A-Za-z0-9+/=]+\s*)+))\1[\S\s]*$/g.test(data)) { + module.exports.publicImport(key, data); + return true; + } + return false; } }; From ea68a7fcf34649d5a62210a9f58308b7f0e9f7cd Mon Sep 17 00:00:00 2001 From: ondralukes Date: Tue, 21 Jul 2020 12:43:42 +0200 Subject: [PATCH 138/146] Exporting OpenSSH public key --- src/formats/openssh.js | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/formats/openssh.js b/src/formats/openssh.js index 1dceb45..b9308d1 100644 --- a/src/formats/openssh.js +++ b/src/formats/openssh.js @@ -51,7 +51,7 @@ module.exports = { //keynum reader.off += 4; - //sshpublengtn + //sshpublength reader.off += 4; //keytype @@ -88,10 +88,29 @@ module.exports = { dq.toBuffer(), // exponent2 -- d mod (q-1) coeff // coefficient -- (inverse of q) mod p ); + + key.sshcomment = readOpenSSHKeyString(reader).toString('ascii'); }, publicExport: function (key, options) { - throw Error('Not implemented yet.'); + let ebuf = Buffer.alloc(4) + ebuf.writeUInt32BE(key.e, 0); + //Slice leading zeroes + while(ebuf[0] === 0) ebuf = ebuf.slice(1); + const nbuf = key.n.toBuffer(); + const buf = Buffer.alloc( + ebuf.byteLength + 4 + + nbuf.byteLength + 4 + + 'ssh-rsa'.length + 4 + ); + + const writer = {buf: buf, off: 0}; + writeOpenSSHKeyString(writer, Buffer.from('ssh-rsa')); + writeOpenSSHKeyString(writer, ebuf); + writeOpenSSHKeyString(writer, nbuf); + + let comment = key.sshcomment || ''; + return 'ssh-rsa ' + buf.toString('base64') + ' ' + comment; }, publicImport: function (key, data, options) { @@ -161,4 +180,10 @@ function readOpenSSHKeyString(reader) { const res = reader.buf.slice(reader.off, reader.off + len); reader.off += len; return res; +} + +function writeOpenSSHKeyString(writer, data) { + writer.buf.writeInt32BE(data.byteLength, writer.off); + writer.off += 4; + writer.off += data.copy(writer.buf, writer.off); } \ No newline at end of file From c0db00d30d37491441a359eeeb46a4014f57143a Mon Sep 17 00:00:00 2001 From: ondralukes Date: Tue, 21 Jul 2020 13:50:25 +0200 Subject: [PATCH 139/146] Exporting OpenSSH private key --- src/formats/openssh.js | 97 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 95 insertions(+), 2 deletions(-) diff --git a/src/formats/openssh.js b/src/formats/openssh.js index b9308d1..ddf648b 100644 --- a/src/formats/openssh.js +++ b/src/formats/openssh.js @@ -7,7 +7,95 @@ const PRIVATE_CLOSING_BOUNDARY = '-----END OPENSSH PRIVATE KEY-----'; module.exports = { privateExport: function (key, options) { - throw Error('Not implemented yet.'); + const nbuf = key.n.toBuffer(); + + let ebuf = Buffer.alloc(4) + ebuf.writeUInt32BE(key.e, 0); + //Slice leading zeroes + while(ebuf[0] === 0) ebuf = ebuf.slice(1); + + const dbuf = key.d.toBuffer(); + const coeffbuf = key.coeff.toBuffer(); + const pbuf = key.p.toBuffer(); + const qbuf = key.q.toBuffer(); + let commentbuf; + if(typeof key.sshcomment !== 'undefined'){ + commentbuf = Buffer.from(key.sshcomment); + } else { + commentbuf = Buffer.from([]); + } + + const pubkeyLength = + 11 + // 32bit length, 'ssh-rsa' + 4 + ebuf.byteLength + + 4 + nbuf.byteLength; + + const privateKeyLength = + 8 + //64bit unused checksum + 11 + // 32bit length, 'ssh-rsa' + 4 + nbuf.byteLength + + 4 + ebuf.byteLength + + 4 + dbuf.byteLength + + 4 + coeffbuf.byteLength + + 4 + pbuf.byteLength + + 4 + qbuf.byteLength + + 4 + commentbuf.byteLength; + + let length = + 15 + //openssh-key-v1,0x00, + 16 + // 2*(32bit length, 'none') + 4 + // 32bit length, empty string + 4 + // 32bit number of keys + 4 + // 32bit pubkey length + pubkeyLength + + 4 + //32bit private+checksum+comment+padding length + privateKeyLength; + + const paddingLength = Math.ceil(privateKeyLength / 8)*8 - privateKeyLength; + length += paddingLength; + + const buf = Buffer.alloc(length); + const writer = {buf:buf, off: 0}; + buf.write('openssh-key-v1', 'utf8'); + buf.writeUInt8(0, 14); + writer.off += 15; + + writeOpenSSHKeyString(writer, Buffer.from('none')); + writeOpenSSHKeyString(writer, Buffer.from('none')); + writeOpenSSHKeyString(writer, Buffer.from('')); + + writer.off = writer.buf.writeUInt32BE(1, writer.off); + writer.off = writer.buf.writeUInt32BE(pubkeyLength, writer.off); + + writeOpenSSHKeyString(writer, Buffer.from('ssh-rsa')); + writeOpenSSHKeyString(writer, ebuf); + writeOpenSSHKeyString(writer, nbuf); + + writer.off = writer.buf.writeUInt32BE( + length - 47 - pubkeyLength, + writer.off + ); + writer.off += 8; + + writeOpenSSHKeyString(writer, Buffer.from('ssh-rsa')); + writeOpenSSHKeyString(writer, nbuf); + writeOpenSSHKeyString(writer, ebuf); + writeOpenSSHKeyString(writer, dbuf); + writeOpenSSHKeyString(writer, coeffbuf); + writeOpenSSHKeyString(writer, pbuf); + writeOpenSSHKeyString(writer, qbuf); + writeOpenSSHKeyString(writer, commentbuf); + + let pad = 0x01; + while(writer.off < length){ + writer.off = writer.buf.writeUInt8(pad++, writer.off); + } + + if(options.type === 'der'){ + return writer.buf + } else { + return PRIVATE_OPENING_BOUNDARY + '\n' + utils.linebrk(buf.toString('base64'), 70) + '\n' + PRIVATE_CLOSING_BOUNDARY; + } }, privateImport: function (key, data, options) { @@ -110,7 +198,12 @@ module.exports = { writeOpenSSHKeyString(writer, nbuf); let comment = key.sshcomment || ''; - return 'ssh-rsa ' + buf.toString('base64') + ' ' + comment; + + if(options.type === 'der'){ + return writer.buf + } else { + return 'ssh-rsa ' + buf.toString('base64') + ' ' + comment; + } }, publicImport: function (key, data, options) { From f62726c72c33c617ef88f7537a5cb6ab345a5e27 Mon Sep 17 00:00:00 2001 From: ondralukes Date: Tue, 21 Jul 2020 14:07:46 +0200 Subject: [PATCH 140/146] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 619ec9c..5065b14 100644 --- a/README.md +++ b/README.md @@ -118,6 +118,7 @@ Scheme — NodeRSA supports multiple format schemes for import/export keys: * `'pkcs1'` — public key starts from `'-----BEGIN RSA PUBLIC KEY-----'` header and private key starts from `'-----BEGIN RSA PRIVATE KEY-----'` header * `'pkcs8'` — public key starts from `'-----BEGIN PUBLIC KEY-----'` header and private key starts from `'-----BEGIN PRIVATE KEY-----'` header + * `'openssl'` — public key starts from `'ssh-rsa'` header and private key starts from `'-----BEGIN OPENSSH PRIVATE KEY-----'` header * `'components'` — use it for import/export key from/to raw components (see example below). For private key, importing data should contain all private key components, for public key: only public exponent (`e`) and modulus (`n`). All components (except `e`) should be Buffer, `e` could be Buffer or just normal Number. Key type — can be `'private'` or `'public'`. Default `'private'`
From d92a4d5929ae1f3b7051892a270d69748751ae46 Mon Sep 17 00:00:00 2001 From: ondralukes Date: Tue, 21 Jul 2020 22:01:41 +0200 Subject: [PATCH 141/146] Tests and bug fixes --- src/formats/openssh.js | 18 ++++++++++++++---- test/keys/id_rsa | 16 ++++++++++++++++ test/keys/id_rsa.pub | 1 + test/keys/id_rsa_comment | 16 ++++++++++++++++ test/keys/id_rsa_comment.pub | 1 + test/tests.js | 35 ++++++++++++++++++++++++++++++++++- 6 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 test/keys/id_rsa create mode 100644 test/keys/id_rsa.pub create mode 100644 test/keys/id_rsa_comment create mode 100644 test/keys/id_rsa_comment.pub diff --git a/src/formats/openssh.js b/src/formats/openssh.js index ddf648b..0d936af 100644 --- a/src/formats/openssh.js +++ b/src/formats/openssh.js @@ -94,7 +94,7 @@ module.exports = { if(options.type === 'der'){ return writer.buf } else { - return PRIVATE_OPENING_BOUNDARY + '\n' + utils.linebrk(buf.toString('base64'), 70) + '\n' + PRIVATE_CLOSING_BOUNDARY; + return PRIVATE_OPENING_BOUNDARY + '\n' + utils.linebrk(buf.toString('base64'), 70) + '\n' + PRIVATE_CLOSING_BOUNDARY + '\n'; } }, @@ -202,7 +202,7 @@ module.exports = { if(options.type === 'der'){ return writer.buf } else { - return 'ssh-rsa ' + buf.toString('base64') + ' ' + comment; + return 'ssh-rsa ' + buf.toString('base64') + ' ' + comment + '\n'; } }, @@ -218,7 +218,17 @@ module.exports = { if (_.isString(data)) { if(data.substring(0, 8) !== 'ssh-rsa ') throw Error('Unsupported key format'); - var pem = data.substring(8, data.indexOf(' ', 8)) + let pemEnd = data.indexOf(' ', 8); + + //Handle keys with no comment + if(pemEnd === -1){ + pemEnd = data.length; + } else { + key.sshcomment = data.substring(pemEnd + 1) + .replace(/\s+|\n\r|\n|\r$/gm, ''); + } + + const pem = data.substring(8, pemEnd) .replace(/\s+|\n\r|\n|\r$/gm, ''); buffer = Buffer.from(pem, 'base64'); } else { @@ -235,7 +245,7 @@ module.exports = { const type = readOpenSSHKeyString(reader).toString('ascii'); if(type !== 'ssh-rsa') - throw Error('Invalid key type'); + throw Error('Invalid key type: '+ type); const e = readOpenSSHKeyString(reader); const n = readOpenSSHKeyString(reader); diff --git a/test/keys/id_rsa b/test/keys/id_rsa new file mode 100644 index 0000000..a4c54fe --- /dev/null +++ b/test/keys/id_rsa @@ -0,0 +1,16 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAlwAAAAdzc2gtcn +NhAAAAAwEAAQAAAIEAgnWPhKQwv7z2t9+Ze+dUgTPHeS3+M+EGV+G3Pg6k2Pc1WP65jxm0 +5ArnipyCgKbjhjFyTmgsDR/cFH7Tbe09H6BMI5deriAvJuIcEo4zS+UyqjFXsksr9OKAbo +nb++rucjYiwuCfOZW5lt1gMmJEwm5v1SWQFzSbqgpuwFVpkDEAAAH4AAAAAAAAAAAAAAAH +c3NoLXJzYQAAAIEAgnWPhKQwv7z2t9+Ze+dUgTPHeS3+M+EGV+G3Pg6k2Pc1WP65jxm05A +rnipyCgKbjhjFyTmgsDR/cFH7Tbe09H6BMI5deriAvJuIcEo4zS+UyqjFXsksr9OKAbonb +++rucjYiwuCfOZW5lt1gMmJEwm5v1SWQFzSbqgpuwFVpkDEAAAADAQABAAAAgBGEd6D36x +PT680E2Tcp+M7ghQhghKGytYdXZ6ONk9UOXLt2eLQeX4u/axfRrDRaNHLwcMjWdBPPE14t +KXa5RFupnT4EBXdwhcazoCrfQBqTrSNc81Tm9VHXcsKv5lgT8hE8BCs6u5QtpwHDFK9K5R +a6w5lE9nWnx3rlpxTGf9WBAAAAQANIyhoJ33ughNzbCIknkMPKtgvLOUARnbya/bkfRexL +icyYzXPNuqZDY8JZQHlshN8cCcZcYjGPYYscd2LKB6oAAABBAMK1+2wf3+mtuC5DgXaU5a +wvP3pqLH+OcjwWEGa6QqZ8sxeMJlhi/4OyvxMiX+KuIapxKAaQEcegZ7WeYtRngQcAAABB +AKuGHAfE/QyyGFHmkviUVsCzno1Ov62HYMQSGhp9ptC3af8+5SzO4G9B+QJfuzzmo5AHZw +3JQQ4csaiJxzuFbwcAAAAAAQID +-----END OPENSSH PRIVATE KEY----- diff --git a/test/keys/id_rsa.pub b/test/keys/id_rsa.pub new file mode 100644 index 0000000..4d3a940 --- /dev/null +++ b/test/keys/id_rsa.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCCdY+EpDC/vPa335l751SBM8d5Lf4z4QZX4bc+DqTY9zVY/rmPGbTkCueKnIKApuOGMXJOaCwNH9wUftNt7T0foEwjl16uIC8m4hwSjjNL5TKqMVeySyv04oBuidv76u5yNiLC4J85lbmW3WAyYkTCbm/VJZAXNJuqCm7AVWmQMQ== diff --git a/test/keys/id_rsa_comment b/test/keys/id_rsa_comment new file mode 100644 index 0000000..bfcd940 --- /dev/null +++ b/test/keys/id_rsa_comment @@ -0,0 +1,16 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAlwAAAAdzc2gtcn +NhAAAAAwEAAQAAAIEAs3U7i0VIEqz3K8gh67sVeM10KPoL+MmQGR9wTI0XVMb5hVzDwfTf +kbMSgE2oeQQJ1A+z/m1dPANEQsKmB+4+WyexnofCTVkyaRhC4GqbWPv4J332X1MeTYs01D +UMJZI/fAT9Cvq8LSDuRW02M6f+b2rAEtqHD+fxyekaBmxyjLcAAAIIAAAAAAAAAAAAAAAH +c3NoLXJzYQAAAIEAs3U7i0VIEqz3K8gh67sVeM10KPoL+MmQGR9wTI0XVMb5hVzDwfTfkb +MSgE2oeQQJ1A+z/m1dPANEQsKmB+4+WyexnofCTVkyaRhC4GqbWPv4J332X1MeTYs01DUM +JZI/fAT9Cvq8LSDuRW02M6f+b2rAEtqHD+fxyekaBmxyjLcAAAADAQABAAAAgH63VOgub4 +ngYFel5W3SmILIcDFO/o0ZpopWzLEBH2xZY29r5T5bblIvI+086K0q0NXQkMQi7SanF9gc +IaiP7a65Tx7lKSrAmrsnSCrZ3k+dE/+MsqGwhlDA+cxf7Ti11xSBcilcp+/KpSIEaUM8W2 +GWcCSRl9gY6A8rfl7bsxpBAAAAQBIPInX4FCtwwASCJVb45eMVx3+HWnMIzCW6cCn24scY +mXw4AaO/ykDpcMtyDRv8T6id7fkR+XKqZ6lKP+HxaC4AAABBANhJFHqKlpbN0PTfqjyyBM +ZWzKyzHEjwPvUcrPIrSsuQNGz/+Ync0zte0nQXMBYSQxIiSJ32fvwVdcE/hv9rWa8AAABB +ANRpALkbvpU4pjNYfWX/74eu9cbUDhHbu74cJq0mmU3jd4Uv4X7wUijkG4lVfsrdpXzJRv +aMkt1MrDSzj7kMp3kAAAAQb25kcmFAb25kcmFsdWtlcwECAw== +-----END OPENSSH PRIVATE KEY----- diff --git a/test/keys/id_rsa_comment.pub b/test/keys/id_rsa_comment.pub new file mode 100644 index 0000000..2896448 --- /dev/null +++ b/test/keys/id_rsa_comment.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCzdTuLRUgSrPcryCHruxV4zXQo+gv4yZAZH3BMjRdUxvmFXMPB9N+RsxKATah5BAnUD7P+bV08A0RCwqYH7j5bJ7Geh8JNWTJpGELgaptY+/gnffZfUx5NizTUNQwlkj98BP0K+rwtIO5FbTYzp/5vasAS2ocP5/HJ6RoGbHKMtw== ondra@ondralukes diff --git a/test/tests.js b/test/tests.js index 6cc965a..6966ed9 100644 --- a/test/tests.js +++ b/test/tests.js @@ -294,7 +294,10 @@ describe('NodeRSA', function () { 'pkcs8-private': {public: false, der: false, file: 'private_pkcs8.pem'}, 'pkcs8-der': {public: false, der: true, file: 'private_pkcs8.der'}, 'pkcs1-public': {public: true, der: false, file: 'public_pkcs1.pem'}, - 'pkcs8-public': {public: true, der: false, file: 'public_pkcs8.pem'} + 'pkcs8-public': {public: true, der: false, file: 'public_pkcs8.pem'}, + + 'openssh-public': {public: true, der: false, file: 'id_rsa.pub'}, + 'openssh-private': {public: false, der: false, file: 'id_rsa'} }; describe('Good cases', function () { @@ -483,6 +486,36 @@ describe('NodeRSA', function () { })(format); } }); + + describe('OpenSSH keys', function () { + /* + * Warning! + * OpenSSH private key contains unused 64bit value, this value is set by ssh-keygen, + * but it's not used. NodeRSA does NOT store this value, so importing and exporting key sets this value to 0. + * This value is 0 in test files, so the tests pass. + */ + it('key export should preserve key data including comment', function(){ + const opensshPrivateKey = fs.readFileSync(keysFolder + 'id_rsa_comment').toString(); + const opensshPublicKey = fs.readFileSync(keysFolder + 'id_rsa_comment.pub').toString(); + const opensshPriv = new NodeRSA(opensshPrivateKey); + const opensshPub = new NodeRSA(opensshPublicKey); + + assert.equal( + opensshPriv.exportKey('openssh-private'), + opensshPrivateKey + ); + + assert.equal( + opensshPriv.exportKey('openssh-public'), + opensshPublicKey + ); + + assert.equal( + opensshPub.exportKey('openssh-public'), + opensshPublicKey + ); + }); + }) }); describe('Bad cases', function () { From 694af285e03e100acd9ddaf0b37763141a62b370 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Wed, 22 Jul 2020 15:25:32 +0500 Subject: [PATCH 142/146] update readme & version bump --- README.md | 3 ++ package.json | 2 +- src/formats/openssh.js | 118 ++++++++++++++++++++--------------------- 3 files changed, 63 insertions(+), 60 deletions(-) diff --git a/README.md b/README.md index 5065b14..41d6e43 100644 --- a/README.md +++ b/README.md @@ -245,6 +245,9 @@ Questions, comments, bug reports, and pull requests are all welcome. ## Changelog +### 1.1.0 + * Added OpenSSH key format support. + ### 1.0.2 * Importing keys from PEM now is less dependent on non-key data in files. diff --git a/package.json b/package.json index 5cfc3a0..e35a9a3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "1.0.8", + "version": "1.1.0", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { diff --git a/src/formats/openssh.js b/src/formats/openssh.js index 0d936af..60aa146 100644 --- a/src/formats/openssh.js +++ b/src/formats/openssh.js @@ -1,9 +1,9 @@ -var _ = require('../utils')._; -var utils = require('../utils'); -var BigInteger = require('../libs/jsbn'); +var _ = require("../utils")._; +var utils = require("../utils"); +var BigInteger = require("../libs/jsbn"); -const PRIVATE_OPENING_BOUNDARY = '-----BEGIN OPENSSH PRIVATE KEY-----'; -const PRIVATE_CLOSING_BOUNDARY = '-----END OPENSSH PRIVATE KEY-----'; +const PRIVATE_OPENING_BOUNDARY = "-----BEGIN OPENSSH PRIVATE KEY-----"; +const PRIVATE_CLOSING_BOUNDARY = "-----END OPENSSH PRIVATE KEY-----"; module.exports = { privateExport: function (key, options) { @@ -12,14 +12,14 @@ module.exports = { let ebuf = Buffer.alloc(4) ebuf.writeUInt32BE(key.e, 0); //Slice leading zeroes - while(ebuf[0] === 0) ebuf = ebuf.slice(1); + while (ebuf[0] === 0) ebuf = ebuf.slice(1); const dbuf = key.d.toBuffer(); const coeffbuf = key.coeff.toBuffer(); const pbuf = key.p.toBuffer(); const qbuf = key.q.toBuffer(); let commentbuf; - if(typeof key.sshcomment !== 'undefined'){ + if (typeof key.sshcomment !== "undefined") { commentbuf = Buffer.from(key.sshcomment); } else { commentbuf = Buffer.from([]); @@ -51,23 +51,23 @@ module.exports = { 4 + //32bit private+checksum+comment+padding length privateKeyLength; - const paddingLength = Math.ceil(privateKeyLength / 8)*8 - privateKeyLength; + const paddingLength = Math.ceil(privateKeyLength / 8) * 8 - privateKeyLength; length += paddingLength; const buf = Buffer.alloc(length); - const writer = {buf:buf, off: 0}; - buf.write('openssh-key-v1', 'utf8'); + const writer = {buf: buf, off: 0}; + buf.write("openssh-key-v1", "utf8"); buf.writeUInt8(0, 14); writer.off += 15; - writeOpenSSHKeyString(writer, Buffer.from('none')); - writeOpenSSHKeyString(writer, Buffer.from('none')); - writeOpenSSHKeyString(writer, Buffer.from('')); + writeOpenSSHKeyString(writer, Buffer.from("none")); + writeOpenSSHKeyString(writer, Buffer.from("none")); + writeOpenSSHKeyString(writer, Buffer.from("")); writer.off = writer.buf.writeUInt32BE(1, writer.off); writer.off = writer.buf.writeUInt32BE(pubkeyLength, writer.off); - writeOpenSSHKeyString(writer, Buffer.from('ssh-rsa')); + writeOpenSSHKeyString(writer, Buffer.from("ssh-rsa")); writeOpenSSHKeyString(writer, ebuf); writeOpenSSHKeyString(writer, nbuf); @@ -77,7 +77,7 @@ module.exports = { ); writer.off += 8; - writeOpenSSHKeyString(writer, Buffer.from('ssh-rsa')); + writeOpenSSHKeyString(writer, Buffer.from("ssh-rsa")); writeOpenSSHKeyString(writer, nbuf); writeOpenSSHKeyString(writer, ebuf); writeOpenSSHKeyString(writer, dbuf); @@ -87,14 +87,14 @@ module.exports = { writeOpenSSHKeyString(writer, commentbuf); let pad = 0x01; - while(writer.off < length){ + while (writer.off < length) { writer.off = writer.buf.writeUInt8(pad++, writer.off); } - if(options.type === 'der'){ + if (options.type === "der") { return writer.buf } else { - return PRIVATE_OPENING_BOUNDARY + '\n' + utils.linebrk(buf.toString('base64'), 70) + '\n' + PRIVATE_CLOSING_BOUNDARY + '\n'; + return PRIVATE_OPENING_BOUNDARY + "\n" + utils.linebrk(buf.toString("base64"), 70) + "\n" + PRIVATE_CLOSING_BOUNDARY + "\n"; } }, @@ -102,40 +102,40 @@ module.exports = { options = options || {}; var buffer; - if (options.type !== 'der') { + if (options.type !== "der") { if (Buffer.isBuffer(data)) { - data = data.toString('utf8'); + data = data.toString("utf8"); } if (_.isString(data)) { var pem = utils.trimSurroundingText(data, PRIVATE_OPENING_BOUNDARY, PRIVATE_CLOSING_BOUNDARY) - .replace(/\s+|\n\r|\n|\r$/gm, ''); - buffer = Buffer.from(pem, 'base64'); + .replace(/\s+|\n\r|\n|\r$/gm, ""); + buffer = Buffer.from(pem, "base64"); } else { - throw Error('Unsupported key format'); + throw Error("Unsupported key format"); } } else if (Buffer.isBuffer(data)) { buffer = data; } else { - throw Error('Unsupported key format'); + throw Error("Unsupported key format"); } - const reader = {buf:buffer, off:0}; + const reader = {buf: buffer, off: 0}; - if(buffer.slice(0,14).toString('ascii') !== 'openssh-key-v1') - throw 'Invalid file format.'; + if (buffer.slice(0, 14).toString("ascii") !== "openssh-key-v1") + throw "Invalid file format."; reader.off += 15; //ciphername - if(readOpenSSHKeyString(reader).toString('ascii') !== 'none') - throw Error('Unsupported key type'); + if (readOpenSSHKeyString(reader).toString("ascii") !== "none") + throw Error("Unsupported key type"); //kdfname - if(readOpenSSHKeyString(reader).toString('ascii') !== 'none') - throw Error('Unsupported key type'); + if (readOpenSSHKeyString(reader).toString("ascii") !== "none") + throw Error("Unsupported key type"); //kdf - if(readOpenSSHKeyString(reader).toString('ascii') !== '') - throw Error('Unsupported key type'); + if (readOpenSSHKeyString(reader).toString("ascii") !== "") + throw Error("Unsupported key type"); //keynum reader.off += 4; @@ -143,14 +143,14 @@ module.exports = { reader.off += 4; //keytype - if(readOpenSSHKeyString(reader).toString('ascii') !== 'ssh-rsa') - throw Error('Unsupported key type'); + if (readOpenSSHKeyString(reader).toString("ascii") !== "ssh-rsa") + throw Error("Unsupported key type"); readOpenSSHKeyString(reader); readOpenSSHKeyString(reader); reader.off += 12; - if(readOpenSSHKeyString(reader).toString('ascii') !== 'ssh-rsa') - throw Error('Unsupported key type'); + if (readOpenSSHKeyString(reader).toString("ascii") !== "ssh-rsa") + throw Error("Unsupported key type"); const n = readOpenSSHKeyString(reader); const e = readOpenSSHKeyString(reader); @@ -177,32 +177,32 @@ module.exports = { coeff // coefficient -- (inverse of q) mod p ); - key.sshcomment = readOpenSSHKeyString(reader).toString('ascii'); + key.sshcomment = readOpenSSHKeyString(reader).toString("ascii"); }, publicExport: function (key, options) { let ebuf = Buffer.alloc(4) ebuf.writeUInt32BE(key.e, 0); //Slice leading zeroes - while(ebuf[0] === 0) ebuf = ebuf.slice(1); + while (ebuf[0] === 0) ebuf = ebuf.slice(1); const nbuf = key.n.toBuffer(); const buf = Buffer.alloc( ebuf.byteLength + 4 + nbuf.byteLength + 4 + - 'ssh-rsa'.length + 4 + "ssh-rsa".length + 4 ); const writer = {buf: buf, off: 0}; - writeOpenSSHKeyString(writer, Buffer.from('ssh-rsa')); + writeOpenSSHKeyString(writer, Buffer.from("ssh-rsa")); writeOpenSSHKeyString(writer, ebuf); writeOpenSSHKeyString(writer, nbuf); - let comment = key.sshcomment || ''; + let comment = key.sshcomment || ""; - if(options.type === 'der'){ + if (options.type === "der") { return writer.buf } else { - return 'ssh-rsa ' + buf.toString('base64') + ' ' + comment + '\n'; + return "ssh-rsa " + buf.toString("base64") + " " + comment + "\n"; } }, @@ -210,42 +210,42 @@ module.exports = { options = options || {}; var buffer; - if (options.type !== 'der') { + if (options.type !== "der") { if (Buffer.isBuffer(data)) { - data = data.toString('utf8'); + data = data.toString("utf8"); } if (_.isString(data)) { - if(data.substring(0, 8) !== 'ssh-rsa ') - throw Error('Unsupported key format'); - let pemEnd = data.indexOf(' ', 8); + if (data.substring(0, 8) !== "ssh-rsa ") + throw Error("Unsupported key format"); + let pemEnd = data.indexOf(" ", 8); //Handle keys with no comment - if(pemEnd === -1){ + if (pemEnd === -1) { pemEnd = data.length; } else { key.sshcomment = data.substring(pemEnd + 1) - .replace(/\s+|\n\r|\n|\r$/gm, ''); + .replace(/\s+|\n\r|\n|\r$/gm, ""); } const pem = data.substring(8, pemEnd) - .replace(/\s+|\n\r|\n|\r$/gm, ''); - buffer = Buffer.from(pem, 'base64'); + .replace(/\s+|\n\r|\n|\r$/gm, ""); + buffer = Buffer.from(pem, "base64"); } else { - throw Error('Unsupported key format'); + throw Error("Unsupported key format"); } } else if (Buffer.isBuffer(data)) { buffer = data; } else { - throw Error('Unsupported key format'); + throw Error("Unsupported key format"); } - const reader = {buf:buffer, off:0}; + const reader = {buf: buffer, off: 0}; - const type = readOpenSSHKeyString(reader).toString('ascii'); + const type = readOpenSSHKeyString(reader).toString("ascii"); - if(type !== 'ssh-rsa') - throw Error('Invalid key type: '+ type); + if (type !== "ssh-rsa") + throw Error("Invalid key type: " + type); const e = readOpenSSHKeyString(reader); const n = readOpenSSHKeyString(reader); From b7c743d5cd4d35e462b533ba6a3c78eb24dd2589 Mon Sep 17 00:00:00 2001 From: rzcoder Date: Wed, 22 Jul 2020 15:39:58 +0500 Subject: [PATCH 143/146] readme fix & version bump --- README.md | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 41d6e43..bb666d2 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,7 @@ Scheme — NodeRSA supports multiple format schemes for import/export keys: * `'pkcs1'` — public key starts from `'-----BEGIN RSA PUBLIC KEY-----'` header and private key starts from `'-----BEGIN RSA PRIVATE KEY-----'` header * `'pkcs8'` — public key starts from `'-----BEGIN PUBLIC KEY-----'` header and private key starts from `'-----BEGIN PRIVATE KEY-----'` header - * `'openssl'` — public key starts from `'ssh-rsa'` header and private key starts from `'-----BEGIN OPENSSH PRIVATE KEY-----'` header + * `'openssh'` — public key starts from `'ssh-rsa'` header and private key starts from `'-----BEGIN OPENSSH PRIVATE KEY-----'` header * `'components'` — use it for import/export key from/to raw components (see example below). For private key, importing data should contain all private key components, for public key: only public exponent (`e`) and modulus (`n`). All components (except `e`) should be Buffer, `e` could be Buffer or just normal Number. Key type — can be `'private'` or `'public'`. Default `'private'`
diff --git a/package.json b/package.json index e35a9a3..6ee65ef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "1.1.0", + "version": "1.1.1", "description": "Node.js RSA library", "main": "src/NodeRSA.js", "scripts": { From f5eb09cf9d033e317b703da56eb78a3d52315432 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 31 Mar 2021 18:55:42 +0000 Subject: [PATCH 144/146] Bump y18n from 4.0.0 to 4.0.1 Bumps [y18n](https://github.com/yargs/y18n) from 4.0.0 to 4.0.1. - [Release notes](https://github.com/yargs/y18n/releases) - [Changelog](https://github.com/yargs/y18n/blob/master/CHANGELOG.md) - [Commits](https://github.com/yargs/y18n/commits) Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 50cbf4a..2da6cdc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "1.0.8", + "version": "1.1.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2948,9 +2948,9 @@ } }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", "dev": true }, "yargs": { From 68d0f85ff70654b0a24bbd7b7ec94572f92cf13a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 May 2021 03:08:31 +0000 Subject: [PATCH 145/146] Bump grunt from 1.1.0 to 1.3.0 Bumps [grunt](https://github.com/gruntjs/grunt) from 1.1.0 to 1.3.0. - [Release notes](https://github.com/gruntjs/grunt/releases) - [Changelog](https://github.com/gruntjs/grunt/blob/main/CHANGELOG) - [Commits](https://github.com/gruntjs/grunt/compare/v1.1.0...v1.3.0) Signed-off-by: dependabot[bot] --- package-lock.json | 1915 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 1523 insertions(+), 392 deletions(-) diff --git a/package-lock.json b/package-lock.json index 50cbf4a..3a58521 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "1.0.8", + "version": "1.1.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -384,10 +384,40 @@ } } }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, "asn1": { @@ -404,10 +434,22 @@ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, "balanced-match": { @@ -416,6 +458,61 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, "binary-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", @@ -447,6 +544,23 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, "caching-transform": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", @@ -459,22 +573,6 @@ "write-file-atomic": "^3.0.0" } }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - } - }, "chai": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", @@ -522,6 +620,29 @@ "readdirp": "~3.2.0" } }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -590,11 +711,15 @@ "wrap-ansi": "^6.2.0" } }, - "coffeescript": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.10.0.tgz", - "integrity": "sha1-56qDAZF+9iGzXYo580jc3R234z4=", - "dev": true + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } }, "color-convert": { "version": "1.9.3", @@ -623,6 +748,12 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -647,6 +778,12 @@ "safe-buffer": "~5.1.1" } }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -675,15 +812,6 @@ } } }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -691,14 +819,10 @@ "dev": true }, "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" - } + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true }, "debug": { "version": "3.2.6", @@ -715,6 +839,12 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, "deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", @@ -750,6 +880,53 @@ "object-keys": "^1.0.12" } }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", @@ -817,15 +994,6 @@ "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", "dev": true }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, "es-abstract": { "version": "1.17.5", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", @@ -886,6 +1054,157 @@ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -906,16 +1225,6 @@ "pkg-dir": "^4.1.0" } }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, "findup-sync": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", @@ -940,6 +1249,25 @@ } } }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true + }, "flat": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", @@ -949,6 +1277,21 @@ "is-buffer": "~2.0.3" } }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, "foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -959,6 +1302,15 @@ "signal-exit": "^3.0.2" } }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, "fromentries": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.0.tgz", @@ -1002,30 +1354,41 @@ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, "getobject": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", - "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.0.tgz", + "integrity": "sha512-tbUz6AKKKr2YiMB+fLWIgq5ZeBOobop9YMMAU9dC54/ot2ksMXt3DOFyBuhZw6ptcVszEykgByK20j7W9jHFag==", "dev": true }, "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.2", + "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, "glob-parent": { @@ -1037,6 +1400,30 @@ "is-glob": "^4.0.1" } }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -1056,57 +1443,81 @@ "dev": true }, "grunt": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.1.0.tgz", - "integrity": "sha512-+NGod0grmviZ7Nzdi9am7vuRS/h76PcWDsV635mEXF0PEQMUV6Kb+OjTdsVxbi0PZmfQOjCMKb3w8CVZcqsn1g==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.3.0.tgz", + "integrity": "sha512-6ILlMXv11/4cxuhSMfSU+SfvbxrPuqZrAtLN64+tZpQ3DAKfSQPQHRbTjSbdtxfyQhGZPtN0bDZJ/LdCM5WXXA==", "dev": true, "requires": { - "coffeescript": "~1.10.0", - "dateformat": "~1.0.12", + "dateformat": "~3.0.3", "eventemitter2": "~0.4.13", - "exit": "~0.1.1", + "exit": "~0.1.2", "findup-sync": "~0.3.0", - "glob": "~7.0.0", - "grunt-cli": "~1.2.0", + "glob": "~7.1.6", + "grunt-cli": "~1.3.2", "grunt-known-options": "~1.1.0", - "grunt-legacy-log": "~2.0.0", - "grunt-legacy-util": "~1.1.1", + "grunt-legacy-log": "~3.0.0", + "grunt-legacy-util": "~2.0.0", "iconv-lite": "~0.4.13", - "js-yaml": "~3.13.1", - "minimatch": "~3.0.2", - "mkdirp": "~1.0.3", + "js-yaml": "~3.14.0", + "minimatch": "~3.0.4", + "mkdirp": "~1.0.4", "nopt": "~3.0.6", - "path-is-absolute": "~1.0.0", - "rimraf": "~2.6.2" + "rimraf": "~3.0.2" }, "dependencies": { "grunt-cli": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", - "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.3.2.tgz", + "integrity": "sha512-8OHDiZZkcptxVXtMfDxJvmN7MVJNE8L/yIcPb4HB7TlyFD1kDvjHrb62uhySsU14wJx9ORMnTuhRMQ40lH/orQ==", "dev": true, "requires": { - "findup-sync": "~0.3.0", "grunt-known-options": "~1.1.0", - "nopt": "~3.0.6", - "resolve": "~1.1.0" + "interpret": "~1.1.0", + "liftoff": "~2.5.0", + "nopt": "~4.0.1", + "v8flags": "~3.1.1" + }, + "dependencies": { + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + } } }, - "mkdirp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", - "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==", - "dev": true + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } - }, - "grunt-contrib-jshint": { + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, + "grunt-contrib-jshint": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-2.1.0.tgz", "integrity": "sha512-65S2/C/6RfjY/umTxfwXXn+wVvaYmykHkHSsW6Q6rhkbv3oudTEgqnFFZvWzWCoHUb+3GMZLbP3oSrNyvshmIQ==", @@ -1124,40 +1535,108 @@ "dev": true }, "grunt-legacy-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz", - "integrity": "sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", + "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", "dev": true, "requires": { "colors": "~1.1.2", - "grunt-legacy-log-utils": "~2.0.0", + "grunt-legacy-log-utils": "~2.1.0", "hooker": "~0.2.3", - "lodash": "~4.17.5" + "lodash": "~4.17.19" } }, "grunt-legacy-log-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz", - "integrity": "sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", + "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", "dev": true, "requires": { - "chalk": "~2.4.1", - "lodash": "~4.17.10" + "chalk": "~4.1.0", + "lodash": "~4.17.19" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "grunt-legacy-util": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz", - "integrity": "sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", + "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", "dev": true, "requires": { - "async": "~1.5.2", - "exit": "~0.1.1", - "getobject": "~0.1.0", + "async": "~3.2.0", + "exit": "~0.1.2", + "getobject": "~1.0.0", "hooker": "~0.2.3", - "lodash": "~4.17.10", - "underscore.string": "~3.3.4", - "which": "~1.3.0" + "lodash": "~4.17.21", + "underscore.string": "~3.3.5", + "which": "~2.0.2" + }, + "dependencies": { + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "grunt-simple-mocha": { @@ -1190,6 +1669,64 @@ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "hasha": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz", @@ -1206,18 +1743,21 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, "hooker": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", "dev": true }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -1252,15 +1792,6 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -1277,12 +1808,54 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", "dev": true }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -1304,24 +1877,69 @@ "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", "dev": true }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "is-date-object": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", "dev": true }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true - }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -1343,6 +1961,15 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, "is-regex": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", @@ -1352,6 +1979,15 @@ "has": "^1.0.3" } }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, "is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", @@ -1373,11 +2009,14 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } }, "is-windows": { "version": "1.0.2", @@ -1397,6 +2036,12 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, "istanbul-lib-coverage": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", @@ -1625,17 +2270,49 @@ "minimist": "^1.2.5" } }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "liftoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", + "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", + "dev": true, + "requires": { + "extend": "^3.0.0", + "findup-sync": "^2.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + }, + "dependencies": { + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } } }, "locate-path": { @@ -1668,16 +2345,6 @@ "chalk": "^2.4.2" } }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, "make-dir": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", @@ -1695,28 +2362,139 @@ } } }, - "map-obj": { + "make-iterator": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } } }, "minimatch": { @@ -1734,6 +2512,27 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, "mkdirp": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", @@ -1949,6 +2748,25 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, "node-environment-flags": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", @@ -1977,18 +2795,6 @@ "abbrev": "1" } }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -2097,11 +2903,42 @@ } } }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } }, "object-inspect": { "version": "1.7.0", @@ -2115,6 +2952,15 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, "object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", @@ -2127,6 +2973,18 @@ "object-keys": "^1.0.11" } }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, "object.getownpropertydescriptors": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", @@ -2137,6 +2995,25 @@ "es-abstract": "^1.17.0-next.1" } }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2146,6 +3023,28 @@ "wrappy": "1" } }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, "p-limit": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", @@ -2191,23 +3090,28 @@ "release-zalgo": "^1.0.0" } }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", "dev": true, "requires": { - "error-ex": "^1.2.0" + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" } }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true }, "path-is-absolute": { "version": "1.0.1", @@ -2227,17 +3131,21 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "path-root-regex": "^0.1.0" } }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, "pathval": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", @@ -2250,27 +3158,6 @@ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -2298,6 +3185,12 @@ } } }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, "process-on-spawn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", @@ -2307,27 +3200,6 @@ "fromentries": "^1.2.0" } }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, "readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", @@ -2349,14 +3221,23 @@ "picomatch": "^2.0.4" } }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, "release-zalgo": { @@ -2368,14 +3249,17 @@ "es6-error": "^4.0.1" } }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true }, "require-directory": { "version": "2.1.1", @@ -2398,60 +3282,41 @@ "path-parse": "^1.0.6" } }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } } }, "safe-buffer": { @@ -2460,6 +3325,15 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -2477,6 +3351,29 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2504,12 +3401,159 @@ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, "spawn-wrap": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", @@ -2583,44 +3627,42 @@ } } }, - "spdx-correct": { + "split-string": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "extend-shallow": "^3.0.0" } }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, "sprintf-js": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", "dev": true }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -2667,24 +3709,6 @@ "ansi-regex": "^5.0.0" } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - }, "strip-json-comments": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", @@ -2766,6 +3790,44 @@ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -2775,12 +3837,6 @@ "is-number": "^7.0.0" } }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -2802,6 +3858,12 @@ "is-typedarray": "^1.0.0" } }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, "underscore.string": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", @@ -2812,6 +3874,76 @@ "util-deprecate": "^1.0.2" } }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -2824,14 +3956,13 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "v8flags": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", + "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", "dev": true, "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "homedir-polyfill": "^1.0.1" } }, "which": { From 02bfeef7d0d1f6ea20b47103e263d4fa1936549f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 May 2021 04:08:24 +0000 Subject: [PATCH 146/146] Bump lodash from 4.17.19 to 4.17.21 Bumps [lodash](https://github.com/lodash/lodash) from 4.17.19 to 4.17.21. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.19...4.17.21) Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 50cbf4a..f70d6c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "node-rsa", - "version": "1.0.8", + "version": "1.1.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1648,9 +1648,9 @@ } }, "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "lodash.flattendeep": {