Skip to content

Commit 150d88d

Browse files
author
Julian Kwieciński
committed
Fix 3DES encryption with 64- and 128-bit keys
1 parent 8e6d15b commit 150d88d

File tree

2 files changed

+45
-3
lines changed

2 files changed

+45
-3
lines changed

src/tripledes.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -712,11 +712,20 @@
712712
// Shortcuts
713713
var key = this._key;
714714
var keyWords = key.words;
715+
// Make sure the key length is valid (64, 128 or >= 192 bit)
716+
if (keyWords.length !== 2 && keyWords.length !== 4 && keyWords.length < 6) {
717+
throw new Error('Invalid key length - 3DES requires the key length to be 64, 128, 192 or >192.');
718+
}
719+
720+
// Extend the key according to the keying options defined in 3DES standard
721+
var key1 = keyWords.slice(0, 2);
722+
var key2 = keyWords.length < 4 ? keyWords.slice(0, 2) : keyWords.slice(2, 4);
723+
var key3 = keyWords.length < 6 ? keyWords.slice(0, 2) : keyWords.slice(4, 6);
715724

716725
// Create DES instances
717-
this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(0, 2)));
718-
this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(2, 4)));
719-
this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(4, 6)));
726+
this._des1 = DES.createEncryptor(WordArray.create(key1));
727+
this._des2 = DES.createEncryptor(WordArray.create(key2));
728+
this._des3 = DES.createEncryptor(WordArray.create(key3));
720729
},
721730

722731
encryptBlock: function (M, offset) {

test/tripledes-test.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,39 @@ YUI.add('algo-tripledes-test', function (Y) {
6262
Y.Assert.areEqual(expectedIv, iv.toString());
6363
},
6464

65+
test64BitKey: function() {
66+
var message = C.enc.Hex.parse('00112233445566778899aabbccddeeff');
67+
var key = C.enc.Hex.parse('0011223344556677');
68+
var extendedKey = C.enc.Hex.parse('001122334455667700112233445566770011223344556677')
69+
70+
var output1 = C.TripleDES.encrypt(message, key, { mode: C.mode.ECB }).toString();
71+
var output2 = C.TripleDES.encrypt(message, extendedKey, { mode: C.mode.ECB }).toString();
72+
73+
Y.Assert.areEqual(output1, output2);
74+
},
75+
76+
test128BitKey: function() {
77+
var message = C.enc.Hex.parse('00112233445566778899aabbccddeeff');
78+
var key = C.enc.Hex.parse('00112233445566778899aabbccddeeff');
79+
var extendedKey = C.enc.Hex.parse('00112233445566778899aabbccddeeff0011223344556677')
80+
81+
var output1 = C.TripleDES.encrypt(message, key, { mode: C.mode.ECB }).toString();
82+
var output2 = C.TripleDES.encrypt(message, extendedKey, { mode: C.mode.ECB }).toString();
83+
84+
Y.Assert.areEqual(output1, output2);
85+
},
86+
87+
test256BitKey: function() {
88+
var message = C.enc.Hex.parse('00112233445566778899aabbccddeeff');
89+
var key = C.enc.Hex.parse('00112233445566778899aabbccddeeff0112233445566778899aabbccddeeff0');
90+
var truncatedKey = C.enc.Hex.parse('00112233445566778899aabbccddeeff0112233445566778')
91+
92+
var output1 = C.TripleDES.encrypt(message, key, { mode: C.mode.ECB }).toString();
93+
var output2 = C.TripleDES.encrypt(message, truncatedKey, { mode: C.mode.ECB }).toString();
94+
95+
Y.Assert.areEqual(output1, output2);
96+
},
97+
6598
testHelper: function () {
6699
// Save original random method
67100
var random = C.lib.WordArray.random;

0 commit comments

Comments
 (0)