diff options
author | Nils Kenneweg <nk@ovt.me> | 2014-09-12 16:15:50 +0200 |
---|---|---|
committer | Nils Kenneweg <nk@ovt.me> | 2014-09-12 16:15:50 +0200 |
commit | 5fc9779fc6106575e61e59717965a4d89770625d (patch) | |
tree | 7fb2c3c05f3472650daad1a1cd33edc89526c84e | |
parent | 85384c14b26ea4431bcffc4405faeddb7700a302 (diff) | |
download | sjcl-origin/feature/progress.zip sjcl-origin/feature/progress.tar.gz sjcl-origin/feature/progress.tar.bz2 |
progress listener added.origin/feature/progress
-rw-r--r-- | core/ccm.js | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/core/ccm.js b/core/ccm.js index 273f0b0..48309be 100644 --- a/core/ccm.js +++ b/core/ccm.js @@ -15,6 +15,27 @@ sjcl.mode.ccm = { */ name: "ccm", + _progressListeners: [], + + listenProgress: function (cb) { + sjcl.mode.ccm._progressListeners.push(cb); + }, + + unListenProgress: function (cb) { + var index = sjcl.mode.ccm._progressListeners.indexOf(cb); + if (index > -1) { + sjcl.mode.ccm._progressListeners.splice(index, 1); + } + }, + + _callProgressListener: function (val) { + var p = sjcl.mode.ccm._progressListeners.slice(), i; + + for (i = 0; i < p.length; i += 1) { + p[i](val); + } + }, + /** Encrypt in CCM mode. * @static * @param {Object} prf The pseudorandom function. It must have a block size of 16 bytes. @@ -161,7 +182,7 @@ sjcl.mode.ccm = { * @private */ _ctrMode: function(prf, data, iv, tag, tlen, L) { - var enc, i, w=sjcl.bitArray, xor = w._xor4, ctr, l = data.length, bl=w.bitLength(data); + var enc, i, w=sjcl.bitArray, xor = w._xor4, ctr, l = data.length, bl=w.bitLength(data), n = l/50, p = n; // start the ctr ctr = w.concat([w.partial(8,L-1)],iv).concat([0,0,0]).slice(0,4); @@ -173,6 +194,10 @@ sjcl.mode.ccm = { if (!l) { return {tag:tag, data:[]}; } for (i=0; i<l; i+=4) { + if (i > n) { + sjcl.mode.ccm._callProgressListener(i/l); + n += p; + } ctr[3]++; enc = prf.encrypt(ctr); data[i] ^= enc[0]; |