summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNils Kenneweg <nk@ovt.me>2014-09-12 16:15:50 +0200
committerNils Kenneweg <nk@ovt.me>2014-09-12 16:15:50 +0200
commit5fc9779fc6106575e61e59717965a4d89770625d (patch)
tree7fb2c3c05f3472650daad1a1cd33edc89526c84e
parent85384c14b26ea4431bcffc4405faeddb7700a302 (diff)
downloadsjcl-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.js27
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];