Skip to content

Commit 92f62f9

Browse files
committed
added iv size parameter
1 parent c1c916b commit 92f62f9

8 files changed

+45
-6
lines changed

.gitignore

+4
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,7 @@ typings/
5757
# dotenv environment variables file
5858
.env
5959

60+
# IDE files
61+
.idea
62+
*.iml
63+

lib/constants.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ module.exports = {
44
AES_STANDARD: 'AES-CBC',
55
RSA_STANDARD: 'RSA-OAEP',
66
DEFAULT_MESSAGE_DIGEST: 'sha256',
7-
DEFAULT_AES_KEY_SIZE: 256
7+
DEFAULT_AES_KEY_SIZE: 256,
8+
DEFAULT_AES_IV_SIZE: 32
89
};

lib/crypt.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ var pki = forge.pki,
2222
var _require = require('./constants'),
2323
DEFAULT_MESSAGE_DIGEST = _require.DEFAULT_MESSAGE_DIGEST,
2424
DEFAULT_AES_KEY_SIZE = _require.DEFAULT_AES_KEY_SIZE,
25+
DEFAULT_AES_IV_SIZE = _require.DEFAULT_AES_IV_SIZE,
2526
AES_STANDARD = _require.AES_STANDARD,
2627
RSA_STANDARD = _require.RSA_STANDARD;
2728

@@ -36,6 +37,7 @@ function () {
3637
this.options = _objectSpread({
3738
md: DEFAULT_MESSAGE_DIGEST,
3839
aesKeySize: DEFAULT_AES_KEY_SIZE,
40+
aesIvSize: DEFAULT_AES_IV_SIZE,
3941
aesStandard: AES_STANDARD,
4042
rsaStandard: RSA_STANDARD,
4143
entropy: undefined
@@ -206,7 +208,7 @@ function () {
206208
return typeof key === 'string' ? pki.publicKeyFromPem(key) : key;
207209
}); // Generate random keys
208210

209-
var iv = forge.random.getBytesSync(32);
211+
var iv = forge.random.getBytesSync(this.options.aesIvSize);
210212
var key = forge.random.getBytesSync(this.options.aesKeySize / 8); // Encrypt random key with all of the public keys
211213

212214
var encryptedKeys = {};

src/constants.js

+1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ module.exports = {
55
RSA_STANDARD: 'RSA-OAEP',
66
DEFAULT_MESSAGE_DIGEST: 'sha256',
77
DEFAULT_AES_KEY_SIZE: 256,
8+
DEFAULT_AES_IV_SIZE: 32
89
};

src/crypt.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ const { pki, rsa } = forge;
55
const {
66
DEFAULT_MESSAGE_DIGEST,
77
DEFAULT_AES_KEY_SIZE,
8+
DEFAULT_AES_IV_SIZE,
89
AES_STANDARD,
910
RSA_STANDARD,
1011
} = require('./constants');
1112

1213
type CryptProps = {
1314
md: string,
1415
aesKeySize: number,
16+
aesIvSize: number,
1517
entropy?: string | number,
1618
aesStandard: string,
1719
rsaStandard: string,
@@ -24,6 +26,7 @@ class Crypt {
2426
this.options = {
2527
md: DEFAULT_MESSAGE_DIGEST,
2628
aesKeySize: DEFAULT_AES_KEY_SIZE,
29+
aesIvSize: DEFAULT_AES_IV_SIZE,
2730
aesStandard: AES_STANDARD,
2831
rsaStandard: RSA_STANDARD,
2932
entropy: undefined,
@@ -198,7 +201,7 @@ class Crypt {
198201
): Array<Object>);
199202

200203
// Generate random keys
201-
const iv = forge.random.getBytesSync(32);
204+
const iv = forge.random.getBytesSync(this.options.aesIvSize);
202205
const key = forge.random.getBytesSync(this.options.aesKeySize / 8);
203206

204207
// Encrypt random key with all of the public keys

test/test.js

+25
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,31 @@ describe('Crypt', function() {
321321
});
322322
});
323323
});
324+
325+
it('should encrypt with a default IV size of 32', function() {
326+
var message = 'Hello world!';
327+
328+
var encrypted = crypt.encrypt(publicKey, message);
329+
var iv = Buffer.from(JSON.parse(encrypted).iv, 'base64');
330+
331+
assert.equal(iv.length, 32);
332+
})
333+
334+
it('should encrypt with custom IV size', function () {
335+
var crypt = new Crypt({
336+
aesIvSize: 16
337+
});
338+
339+
var message = 'Hello world!';
340+
341+
var encrypted = crypt.encrypt(publicKey, message);
342+
var decrypted = crypt.decrypt(privateKey, encrypted).message;
343+
var iv = Buffer.from(JSON.parse(encrypted).iv, 'base64');
344+
345+
assert.equal(iv.length, 16);
346+
assert.notEqual(encrypted, message);
347+
assert.equal(decrypted, message);
348+
});
324349
});
325350

326351
describe('Helpers', function() {

web/hybrid-crypto.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ module.exports = {
55
AES_STANDARD: 'AES-CBC',
66
RSA_STANDARD: 'RSA-OAEP',
77
DEFAULT_MESSAGE_DIGEST: 'sha256',
8-
DEFAULT_AES_KEY_SIZE: 256
8+
DEFAULT_AES_KEY_SIZE: 256,
9+
DEFAULT_AES_IV_SIZE: 32
910
};
1011
},{}],2:[function(require,module,exports){
1112
"use strict";
@@ -32,6 +33,7 @@ var pki = forge.pki,
3233
var _require = require('./constants'),
3334
DEFAULT_MESSAGE_DIGEST = _require.DEFAULT_MESSAGE_DIGEST,
3435
DEFAULT_AES_KEY_SIZE = _require.DEFAULT_AES_KEY_SIZE,
36+
DEFAULT_AES_IV_SIZE = _require.DEFAULT_AES_IV_SIZE,
3537
AES_STANDARD = _require.AES_STANDARD,
3638
RSA_STANDARD = _require.RSA_STANDARD;
3739

@@ -46,6 +48,7 @@ function () {
4648
this.options = _objectSpread({
4749
md: DEFAULT_MESSAGE_DIGEST,
4850
aesKeySize: DEFAULT_AES_KEY_SIZE,
51+
aesIvSize: DEFAULT_AES_IV_SIZE,
4952
aesStandard: AES_STANDARD,
5053
rsaStandard: RSA_STANDARD,
5154
entropy: undefined
@@ -216,7 +219,7 @@ function () {
216219
return typeof key === 'string' ? pki.publicKeyFromPem(key) : key;
217220
}); // Generate random keys
218221

219-
var iv = forge.random.getBytesSync(32);
222+
var iv = forge.random.getBytesSync(this.options.aesIvSize);
220223
var key = forge.random.getBytesSync(this.options.aesKeySize / 8); // Encrypt random key with all of the public keys
221224

222225
var encryptedKeys = {};

web/hybrid-crypto.min.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)