author | Giulio Cesare Solaroli <giulio.cesare@clipperz.com> | 2013-04-19 15:09:28 (UTC) |
---|---|---|
committer | Giulio Cesare Solaroli <giulio.cesare@clipperz.com> | 2013-04-19 15:09:28 (UTC) |
commit | 074e70457c90344b3c1cb236105638d692a0066b (patch) (side-by-side diff) | |
tree | c5ffabd3eaf74cbeb69974beacdb5a5f8c235adc /frontend/gamma/js/Clipperz/PM/Crypto.js | |
parent | 48c9280c9a255f2a85ad5729830df884e64a9c5d (diff) | |
download | clipperz-074e70457c90344b3c1cb236105638d692a0066b.zip clipperz-074e70457c90344b3c1cb236105638d692a0066b.tar.gz clipperz-074e70457c90344b3c1cb236105638d692a0066b.tar.bz2 |
Fixed an issue on the AES-CTR block mode
The previous version of the CTR encoding was incrementing the counter in a weird way, mixing up data from the previous block.
The current fix can correctly decrypt data encoded with AES-CTR using other libraries/languages (currently tested only with Python).
Diffstat (limited to 'frontend/gamma/js/Clipperz/PM/Crypto.js') (more/less context) (ignore whitespace changes)
-rw-r--r-- | frontend/gamma/js/Clipperz/PM/Crypto.js | 106 |
1 files changed, 72 insertions, 34 deletions
diff --git a/frontend/gamma/js/Clipperz/PM/Crypto.js b/frontend/gamma/js/Clipperz/PM/Crypto.js index cd10e33..7edf17f 100644 --- a/frontend/gamma/js/Clipperz/PM/Crypto.js +++ b/frontend/gamma/js/Clipperz/PM/Crypto.js @@ -51,25 +51,25 @@ MochiKit.Base.update(Clipperz.PM.Crypto, { '0.2': Clipperz.PM.Connection.SRP['1.1'] //Clipperz.Crypto.SRP.versions['1.1'].Connection }, 'fallbackVersions': { 'current': '0.1', '0.2': '0.1', '0.1': null } }, */ //------------------------------------------------------------------------- 'encryptingFunctions': { - 'currentVersion': '0.3', + 'currentVersion': '0.4', 'versions': { //##################################################################### '0.1': { 'encrypt': function(aKey, aValue) { return Clipperz.Crypto.Base.encryptUsingSecretKey(aKey, Clipperz.Base.serializeJSON(aValue)); }, 'deferredEncrypt': function(aKey, aValue) { var deferredResult; @@ -311,125 +311,163 @@ MochiKit.Base.update(Clipperz.PM.Crypto, { key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); value = new Clipperz.ByteArray().appendBase64String(aValue); deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value); deferredResult.addCallback(MochiKit.Async.wait, 0.1); deferredResult.addCallback(function(aResult) { return aResult.asString(); }); deferredResult.addCallback(MochiKit.Async.wait, 0.1); deferredResult.addCallback(Clipperz.Base.evalJSON); deferredResult.addErrback(function(anError) { +console.log("PIPPO_1", anError) Clipperz.logError("Error while decrypting data [4]"); throw Clipperz.Crypto.Base.exception.CorruptedMessage; }) } else { deferredResult.addCallback(function() { return null; }); } deferredResult.callback(); return deferredResult; }, 'hash': Clipperz.Crypto.SHA.sha_d256, 'deriveKey': function(aStringValue) { var byteData; var result; byteData = new Clipperz.ByteArray(aStringValue); result = Clipperz.Crypto.SHA.sha_d256(byteData); return result; } - }, //##################################################################### -/* + '0.4': { 'encrypt': function(aKey, aValue, aNonce) { var result; var key, value; var data; var dataToEncrypt; var encryptedData; -//Clipperz.logDebug(">>> [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt"); key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); -//Clipperz.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 1"); value = Clipperz.Base.serializeJSON(aValue); -//Clipperz.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 2"); -/ * -//Clipperz.logDebug("--> encrypt.fullSize: " + value.length); - value = value.replace(/":{"label":"/g, '":{l:"'); - value = value.replace(/":{"key":"/g, '":{k:"'); - value = value.replace(/":{"notes":"/g, '":{n:"'); - value = value.replace(/":{"record":"/g, '":{r:"'); - value = value.replace(/", "label":"/g, '",l:"'); - value = value.replace(/", "favicon":"/g, '",f:"'); -//Clipperz.logDebug("<-- encrypt.compressed: " + value.length); -* / data = new Clipperz.ByteArray(value); -//Clipperz.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 3"); - encryptedData = Clipperz.Crypto.AES.encrypt(key, data, aNonce); -//Clipperz.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 4"); + encryptedData = Clipperz.Crypto.AES_2.encrypt(key, data, aNonce); result = encryptedData.toBase64String(); -//Clipperz.logDebug("<<< [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt"); return result; }, + + 'deferredEncrypt': function(aKey, aValue, aNonce) { + var deferredResult; + var key, value; + var data; + var dataToEncrypt; + var encryptedData; + + key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); + value = Clipperz.Base.serializeJSON(aValue); + data = new Clipperz.ByteArray(value); + + deferredResult = new Clipperz.Async.Deferred("Crypto[0.4].deferredEncrypt") + deferredResult.addCallback(Clipperz.Crypto.AES_2.deferredEncrypt, key, data, aNonce); + deferredResult.addCallback(function(aResult) { + return aResult.toBase64String(); + }) + deferredResult.callback(); + + return deferredResult; + }, 'decrypt': function(aKey, aValue) { var result; if (aValue != null) { var key, value; var decryptedData; key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); value = new Clipperz.ByteArray().appendBase64String(aValue); - decryptedData = Clipperz.Crypto.AES.decrypt(key, value); + decryptedData = Clipperz.Crypto.AES_2.decrypt(key, value); value = decryptedData.asString(); -/ * - value = value.replace(/":{l:"/g, '":{"label":"'); - value = value.replace(/":{k:"/g, '":{"key":"'); - value = value.replace(/":{n:"/g, '":{"notes":"'); - value = value.replace(/":{r:"/g, '":{"record":"'); - value = value.replace(/",l:"/g, '", "label":"'); - value = value.replace(/",f:"/g, '", "favicon":"'); -* / try { result = Clipperz.Base.evalJSON(value); } catch (exception) { - Clipperz.logError("Error while decrypting data"); + console.log("PIPPO_2", anError) + Clipperz.logError("Error while decrypting data [4]"); throw Clipperz.Crypto.Base.exception.CorruptedMessage; } - - } else { result = null; } return result; }, - 'hash': Clipperz.Crypto.SHA.sha_d256 + 'deferredDecrypt': function(aKey, aValue) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("Crypto[0.4].deferredDecrypt", {trace: false}); + + if (aValue != null) { + var key, value; + + key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); + value = new Clipperz.ByteArray().appendBase64String(aValue); + + deferredResult.addCallback(Clipperz.Crypto.AES_2.deferredDecrypt, key, value); + deferredResult.addCallback(MochiKit.Async.wait, 0.1); + deferredResult.addCallback(function(aResult) { + return aResult.asString(); + }); + deferredResult.addCallback(MochiKit.Async.wait, 0.1); + deferredResult.addCallback(Clipperz.Base.evalJSON); + deferredResult.addErrback(function(anError) { + Clipperz.logError("Error while decrypting data [4]"); + throw Clipperz.Crypto.Base.exception.CorruptedMessage; + }) + } else { + deferredResult.addCallback(function() { + return null; + }); + } + deferredResult.callback(); + + return deferredResult; + }, + + 'hash': Clipperz.Crypto.SHA.sha_d256, + + 'deriveKey': function(aStringValue) { + var byteData; + var result; + + byteData = new Clipperz.ByteArray(aStringValue); + result = Clipperz.Crypto.SHA.sha_d256(byteData); + + return result; + } }, -*/ + //##################################################################### __syntaxFix__: "syntax fix" } }, //------------------------------------------------------------------------- 'encrypt': function(aKey, aValue, aVersion) { return Clipperz.PM.Crypto.encryptingFunctions.versions[aVersion].encrypt(aKey, aValue); }, 'deferredEncrypt': function(someParameters) { |