Comparing version 0.2.21 to 0.2.22
@@ -19,3 +19,3 @@ module.exports = function (grunt) { | ||
options: { | ||
reporter: 'List' | ||
reporter: 'list' | ||
}, | ||
@@ -22,0 +22,0 @@ all: {src: ['test/**/*.js']} |
{ | ||
"name": "node-rsa", | ||
"version": "0.2.21", | ||
"version": "0.2.22", | ||
"description": "Node.js RSA library", | ||
@@ -5,0 +5,0 @@ "main": "src/NodeRSA.js", |
@@ -12,3 +12,2 @@ # Node-RSA | ||
## Example | ||
@@ -27,3 +26,2 @@ | ||
## Installing | ||
@@ -192,3 +190,3 @@ | ||
> *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) | ||
@@ -217,2 +215,5 @@ ### Signing/Verifying | ||
### 0.2.22 | ||
* `encryptPrivate` and `decryptPublic` now using only pkcs1 (type 1) padding. | ||
### 0.2.20 | ||
@@ -222,3 +223,2 @@ * Added `.encryptPrivate()` and `.decryptPublic()` methods. | ||
* 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. | ||
@@ -300,1 +300,3 @@ ### 0.2.10 | ||
and disclaimer. | ||
[![Build Status](https://travis-ci.org/rzcoder/node-rsa.svg?branch=master)](https://travis-ci.org/rzcoder/node-rsa) |
@@ -5,20 +5,17 @@ var crypto = require('crypto'); | ||
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({ | ||
@@ -32,16 +29,13 @@ key: options.rsaUtils.exportKey('public'), | ||
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({ | ||
@@ -48,0 +42,0 @@ key: options.rsaUtils.exportKey('private'), |
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); | ||
var m, c; | ||
if (usePrivate) { | ||
m = new BigInteger(pkcs1Scheme.encPad(buffer, {type: 1})); | ||
c = keyPair.$doPrivate(m); | ||
} else { | ||
m = new BigInteger(keyPair.encryptionScheme.encPad(buffer)); | ||
c = keyPair.$doPublic(m); | ||
} | ||
return c.toBuffer(keyPair.encryptedDataLength); | ||
@@ -12,7 +21,13 @@ }, | ||
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)); | ||
var m, c = new BigInteger(buffer); | ||
if (usePublic) { | ||
m = keyPair.$doPublic(c); | ||
return pkcs1Scheme.encUnPad(m.toBuffer(keyPair.encryptedDataLength), {type: 1}); | ||
} else { | ||
m = keyPair.$doPrivate(c); | ||
return keyPair.encryptionScheme.encUnPad(m.toBuffer(keyPair.encryptedDataLength)); | ||
} | ||
} | ||
}; | ||
}; |
@@ -5,3 +5,3 @@ var crypto = require('crypto'); | ||
module.exports = function (keyPair, options) { | ||
var jsEngine = require('./js.js')(keyPair); | ||
var jsEngine = require('./js.js')(keyPair, options); | ||
@@ -8,0 +8,0 @@ return { |
@@ -42,7 +42,9 @@ /** | ||
* 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 || {}; | ||
var filled; | ||
if (buffer.length > this.key.maxMessageLength) { | ||
@@ -52,19 +54,24 @@ 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) { | ||
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 { | ||
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; | ||
}; | ||
@@ -78,28 +85,32 @@ | ||
*/ | ||
Scheme.prototype.encUnPad = function (buffer) { | ||
//var buffer = buffer.toByteArray(); | ||
Scheme.prototype.encUnPad = function (buffer, options) { | ||
options = options || {}; | ||
var i = 0; | ||
while (i < buffer.length && buffer[i] === 0) { | ||
++i; | ||
} | ||
if (buffer.length - i != this.key.encryptedDataLength - 1 || buffer[i] != 2) { | ||
if (buffer.length < 4) { | ||
return null; | ||
} | ||
++i; | ||
while (buffer[i] !== 0) { | ||
if (++i >= buffer.length) { | ||
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; | ||
} | ||
} | ||
} | ||
var c = 0; | ||
var res = new Buffer(buffer.length - i - 1); | ||
while (++i < buffer.length) { | ||
res[c++] = buffer[i] & 255; | ||
} | ||
return res; | ||
return buffer.slice(i + 1, buffer.length); | ||
}; | ||
@@ -106,0 +117,0 @@ |
@@ -10,3 +10,3 @@ /** | ||
describe("NodeRSA", function(){ | ||
describe("NodeRSA", function () { | ||
var keySizes = [ | ||
@@ -51,7 +51,7 @@ {b: 512, e: 3}, | ||
"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" | ||
@@ -65,3 +65,3 @@ } | ||
describe("Setup options", function(){ | ||
describe("Setup options", function () { | ||
it("should use browser environment", function () { | ||
@@ -147,3 +147,3 @@ assert.equal((new NodeRSA(null, {environment: 'browser'})).$options.environment, 'browser'); | ||
assert.throw(function(){ | ||
assert.throw(function () { | ||
key.setOptions({ | ||
@@ -157,4 +157,4 @@ environment: 'browser', | ||
describe("Work with keys", function() { | ||
describe("Generating keys", function() { | ||
describe("Work with keys", function () { | ||
describe("Generating keys", function () { | ||
for (var size in keySizes) { | ||
@@ -174,46 +174,46 @@ (function (size) { | ||
describe("Imprt/Export keys", function(){ | ||
var privateKeyPKCS1 = "-----BEGIN RSA PRIVATE KEY-----\n"+ | ||
"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\n"+ | ||
describe("Imprt/Export keys", function () { | ||
var privateKeyPKCS1 = "-----BEGIN RSA PRIVATE KEY-----\n" + | ||
"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\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-----"; | ||
@@ -224,16 +224,16 @@ | ||
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-----"; | ||
@@ -309,4 +309,4 @@ var keysFolder = __dirname + '/keys/'; | ||
for(var format in keys_formats) { | ||
(function(format) { | ||
for (var format in keys_formats) { | ||
(function (format) { | ||
var options = keys_formats[format]; | ||
@@ -341,12 +341,20 @@ | ||
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"); | ||
}); | ||
@@ -392,27 +400,3 @@ }); | ||
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); | ||
} | ||
}); | ||
@@ -443,2 +427,31 @@ | ||
} | ||
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]); | ||
@@ -448,121 +461,129 @@ } | ||
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]; | ||
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("`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("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]; | ||
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', | ||
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("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]; | ||
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("`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("`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); | ||
}); | ||
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); | ||
} | ||
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); | ||
} | ||
for (var i in dataBundle) { | ||
(function (i) { | ||
var key1 = null; | ||
var key2 = null; | ||
var suit = dataBundle[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' | ||
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); | ||
}); | ||
key2 = new NodeRSA(key, { | ||
environment: 'node', | ||
encryptionScheme: 'pkcs1' | ||
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])); | ||
} | ||
}); | ||
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); | ||
} | ||
})(i); | ||
} | ||
}); | ||
}); | ||
@@ -582,3 +603,3 @@ }); | ||
(function (env) { | ||
describe("Good cases" + (envs.length > 1 ? " in " + env + " environment" : ""), function () { | ||
describe("Good cases " + (envs.length > 1 ? " in " + env + " environment" : ""), function () { | ||
var signed = {}; | ||
@@ -601,3 +622,3 @@ var key = null; | ||
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]); | ||
@@ -618,3 +639,3 @@ } | ||
var signed = key.sign('data'); | ||
if(!key.verify('data', signed)) { | ||
if (!key.verify('data', signed)) { | ||
key.verify('data', signed); | ||
@@ -621,0 +642,0 @@ } |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
168223
30
3732
297