Skip to content

Commit c8a2312

Browse files
authored
Merge pull request #379 from Alanscut/dev
feat: custom KDF hasher
2 parents 0229694 + 09ee2ab commit c8a2312

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed

src/cipher-core.js

+9-4
Original file line numberDiff line numberDiff line change
@@ -765,14 +765,19 @@ CryptoJS.lib.Cipher || (function (undefined) {
765765
* var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);
766766
* var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');
767767
*/
768-
execute: function (password, keySize, ivSize, salt) {
768+
execute: function (password, keySize, ivSize, salt, hasher) {
769769
// Generate random salt
770770
if (!salt) {
771771
salt = WordArray.random(64/8);
772772
}
773773

774774
// Derive key and IV
775-
var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);
775+
if (!hasher) {
776+
var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);
777+
} else {
778+
var key = EvpKDF.create({ keySize: keySize + ivSize, hasher: hasher }).compute(password, salt);
779+
}
780+
776781

777782
// Separate key and IV
778783
var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);
@@ -819,7 +824,7 @@ CryptoJS.lib.Cipher || (function (undefined) {
819824
cfg = this.cfg.extend(cfg);
820825

821826
// Derive key and other params
822-
var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, cfg.salt);
827+
var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, cfg.salt, cfg.hasher);
823828

824829
// Add IV to config
825830
cfg.iv = derivedParams.iv;
@@ -858,7 +863,7 @@ CryptoJS.lib.Cipher || (function (undefined) {
858863
ciphertext = this._parse(ciphertext, cfg.format);
859864

860865
// Derive key and other params
861-
var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt);
866+
var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt, cfg.hasher);
862867

863868
// Add IV to config
864869
cfg.iv = derivedParams.iv;

test/config-test.js

+25
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,31 @@ YUI.add('config-test', function (Y) {
2121
var encryptedB = C.AES.encrypt('Test', 'Pass', { salt: this.data.saltB });
2222
Y.Assert.areEqual('Test', C.AES.decrypt(encryptedA, 'Pass').toString(C.enc.Utf8));
2323
Y.Assert.areEqual('Test', C.AES.decrypt(encryptedB, 'Pass').toString(C.enc.Utf8));
24+
},
25+
26+
testCustomKDFHasher: function () {
27+
//SHA1
28+
let encryptedSHA1 = C.AES.encrypt('Test', 'Pass', { salt: this.data.saltA, hasher: C.algo.SHA1}).toString();
29+
Y.Assert.areEqual('Test', C.AES.decrypt(encryptedSHA1, 'Pass', { hasher: C.algo.SHA1}).toString(C.enc.Utf8));
30+
31+
//SHA256
32+
let encryptedSHA256 = C.AES.encrypt('Test', 'Pass', { salt: this.data.saltA, hasher: C.algo.SHA256}).toString();
33+
Y.Assert.areEqual('Test', C.AES.decrypt(encryptedSHA256, 'Pass', { hasher: C.algo.SHA256}).toString(C.enc.Utf8));
34+
35+
//SHA512
36+
let encryptedSHA512 = C.AES.encrypt('Test', 'Pass', { salt: this.data.saltA, hasher: C.algo.SHA512}).toString();
37+
Y.Assert.areEqual('Test', C.AES.decrypt(encryptedSHA512, 'Pass', { hasher: C.algo.SHA512}).toString(C.enc.Utf8));
38+
39+
//Default: MD5
40+
let encryptedDefault = C.AES.encrypt('Test', 'Pass', { salt: this.data.saltA }).toString();
41+
let encryptedMD5 = C.AES.encrypt('Test', 'Pass', { salt: this.data.saltA, hasher: C.algo.MD5}).toString();
42+
Y.Assert.areEqual('Test', C.AES.decrypt(encryptedMD5, 'Pass', { hasher: C.algo.MD5}).toString(C.enc.Utf8));
43+
Y.Assert.areEqual(encryptedDefault, encryptedMD5);
44+
45+
//Different KDFHasher
46+
Y.Assert.areNotEqual(encryptedDefault, encryptedSHA1);
47+
Y.Assert.areNotEqual(encryptedDefault, encryptedSHA256);
48+
Y.Assert.areNotEqual(encryptedDefault, encryptedSHA512);
2449
}
2550
}));
2651
}, '$Rev$');

0 commit comments

Comments
 (0)