summaryrefslogtreecommitdiff
path: root/frontend
Unidiff
Diffstat (limited to 'frontend') (more/less context) (ignore whitespace changes)
-rw-r--r--frontend/beta/js/Clipperz/Crypto/PRNG.js4
-rw-r--r--frontend/delta/js/Clipperz/Crypto/PRNG.js4
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/PRNG.js4
3 files changed, 6 insertions, 6 deletions
diff --git a/frontend/beta/js/Clipperz/Crypto/PRNG.js b/frontend/beta/js/Clipperz/Crypto/PRNG.js
index 92966d0..6fdeca4 100644
--- a/frontend/beta/js/Clipperz/Crypto/PRNG.js
+++ b/frontend/beta/js/Clipperz/Crypto/PRNG.js
@@ -127,387 +127,387 @@ Clipperz.Crypto.PRNG.RandomnessSource.prototype = MochiKit.Base.update(null, {
127 127
128 'setSourceId': function(aValue) { 128 'setSourceId': function(aValue) {
129 this._sourceId = aValue; 129 this._sourceId = aValue;
130 }, 130 },
131 131
132 //------------------------------------------------------------------------- 132 //-------------------------------------------------------------------------
133 133
134 'nextPoolIndex': function() { 134 'nextPoolIndex': function() {
135 return this._nextPoolIndex; 135 return this._nextPoolIndex;
136 }, 136 },
137 137
138 'incrementNextPoolIndex': function() { 138 'incrementNextPoolIndex': function() {
139 this._nextPoolIndex = ((this._nextPoolIndex + 1) % this.generator().numberOfEntropyAccumulators()); 139 this._nextPoolIndex = ((this._nextPoolIndex + 1) % this.generator().numberOfEntropyAccumulators());
140 }, 140 },
141 141
142 //------------------------------------------------------------------------- 142 //-------------------------------------------------------------------------
143 143
144 'updateGeneratorWithValue': function(aRandomValue) { 144 'updateGeneratorWithValue': function(aRandomValue) {
145 if (this.generator() != null) { 145 if (this.generator() != null) {
146 this.generator().addRandomByte(this.sourceId(), this.nextPoolIndex(), aRandomValue); 146 this.generator().addRandomByte(this.sourceId(), this.nextPoolIndex(), aRandomValue);
147 this.incrementNextPoolIndex(); 147 this.incrementNextPoolIndex();
148 } 148 }
149 }, 149 },
150 150
151 //------------------------------------------------------------------------- 151 //-------------------------------------------------------------------------
152 __syntaxFix__: "syntax fix" 152 __syntaxFix__: "syntax fix"
153}); 153});
154 154
155//############################################################################# 155//#############################################################################
156 156
157Clipperz.Crypto.PRNG.TimeRandomnessSource = function(args) { 157Clipperz.Crypto.PRNG.TimeRandomnessSource = function(args) {
158 args = args || {}; 158 args = args || {};
159 //MochiKit.Base.bindMethods(this); 159 //MochiKit.Base.bindMethods(this);
160 160
161 this._intervalTime = args.intervalTime || 1000; 161 this._intervalTime = args.intervalTime || 1000;
162 162
163 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args); 163 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args);
164 164
165 this.collectEntropy(); 165 this.collectEntropy();
166 return this; 166 return this;
167} 167}
168 168
169Clipperz.Crypto.PRNG.TimeRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, { 169Clipperz.Crypto.PRNG.TimeRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, {
170 170
171 'intervalTime': function() { 171 'intervalTime': function() {
172 return this._intervalTime; 172 return this._intervalTime;
173 }, 173 },
174 174
175 //------------------------------------------------------------------------- 175 //-------------------------------------------------------------------------
176 176
177 'collectEntropy': function() { 177 'collectEntropy': function() {
178 varnow; 178 varnow;
179 varentropyByte; 179 varentropyByte;
180 var intervalTime; 180 var intervalTime;
181 now = new Date(); 181 now = new Date();
182 entropyByte = (now.getTime() & 0xff); 182 entropyByte = (now.getTime() & 0xff);
183 183
184 intervalTime = this.intervalTime(); 184 intervalTime = this.intervalTime();
185 if (this.boostMode() == true) { 185 if (this.boostMode() == true) {
186 intervalTime = intervalTime / 9; 186 intervalTime = intervalTime / 9;
187 } 187 }
188 188
189 this.updateGeneratorWithValue(entropyByte); 189 this.updateGeneratorWithValue(entropyByte);
190 setTimeout(this.collectEntropy, intervalTime); 190 setTimeout(this.collectEntropy, intervalTime);
191 }, 191 },
192 192
193 //------------------------------------------------------------------------- 193 //-------------------------------------------------------------------------
194 194
195 'numberOfRandomBits': function() { 195 'numberOfRandomBits': function() {
196 return 5; 196 return 5;
197 }, 197 },
198 198
199 //------------------------------------------------------------------------- 199 //-------------------------------------------------------------------------
200 __syntaxFix__: "syntax fix" 200 __syntaxFix__: "syntax fix"
201}); 201});
202 202
203//***************************************************************************** 203//*****************************************************************************
204 204
205Clipperz.Crypto.PRNG.MouseRandomnessSource = function(args) { 205Clipperz.Crypto.PRNG.MouseRandomnessSource = function(args) {
206 args = args || {}; 206 args = args || {};
207 207
208 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args); 208 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args);
209 209
210 this._numberOfBitsToCollectAtEachEvent = 4; 210 this._numberOfBitsToCollectAtEachEvent = 4;
211 this._randomBitsCollector = 0; 211 this._randomBitsCollector = 0;
212 this._numberOfRandomBitsCollected = 0; 212 this._numberOfRandomBitsCollected = 0;
213 213
214 MochiKit.Signal.connect(document, 'onmousemove', this, 'collectEntropy'); 214 MochiKit.Signal.connect(document, 'onmousemove', this, 'collectEntropy');
215 215
216 return this; 216 return this;
217} 217}
218 218
219Clipperz.Crypto.PRNG.MouseRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, { 219Clipperz.Crypto.PRNG.MouseRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, {
220 220
221 //------------------------------------------------------------------------- 221 //-------------------------------------------------------------------------
222 222
223 'numberOfBitsToCollectAtEachEvent': function() { 223 'numberOfBitsToCollectAtEachEvent': function() {
224 return this._numberOfBitsToCollectAtEachEvent; 224 return this._numberOfBitsToCollectAtEachEvent;
225 }, 225 },
226 226
227 //------------------------------------------------------------------------- 227 //-------------------------------------------------------------------------
228 228
229 'randomBitsCollector': function() { 229 'randomBitsCollector': function() {
230 return this._randomBitsCollector; 230 return this._randomBitsCollector;
231 }, 231 },
232 232
233 'setRandomBitsCollector': function(aValue) { 233 'setRandomBitsCollector': function(aValue) {
234 this._randomBitsCollector = aValue; 234 this._randomBitsCollector = aValue;
235 }, 235 },
236 236
237 'appendRandomBitsToRandomBitsCollector': function(aValue) { 237 'appendRandomBitsToRandomBitsCollector': function(aValue) {
238 var collectedBits; 238 var collectedBits;
239 var numberOfRandomBitsCollected; 239 var numberOfRandomBitsCollected;
240 240
241 numberOfRandomBitsCollected = this.numberOfRandomBitsCollected(); 241 numberOfRandomBitsCollected = this.numberOfRandomBitsCollected();
242 collectedBits = this.randomBitsCollector() | (aValue << numberOfRandomBitsCollected); 242 collectedBits = this.randomBitsCollector() | (aValue << numberOfRandomBitsCollected);
243 this.setRandomBitsCollector(collectedBits); 243 this.setRandomBitsCollector(collectedBits);
244 numberOfRandomBitsCollected += this.numberOfBitsToCollectAtEachEvent(); 244 numberOfRandomBitsCollected += this.numberOfBitsToCollectAtEachEvent();
245 245
246 if (numberOfRandomBitsCollected == 8) { 246 if (numberOfRandomBitsCollected == 8) {
247 this.updateGeneratorWithValue(collectedBits); 247 this.updateGeneratorWithValue(collectedBits);
248 numberOfRandomBitsCollected = 0; 248 numberOfRandomBitsCollected = 0;
249 this.setRandomBitsCollector(0); 249 this.setRandomBitsCollector(0);
250 } 250 }
251 251
252 this.setNumberOfRandomBitsCollected(numberOfRandomBitsCollected) 252 this.setNumberOfRandomBitsCollected(numberOfRandomBitsCollected)
253 }, 253 },
254 254
255 //------------------------------------------------------------------------- 255 //-------------------------------------------------------------------------
256 256
257 'numberOfRandomBitsCollected': function() { 257 'numberOfRandomBitsCollected': function() {
258 return this._numberOfRandomBitsCollected; 258 return this._numberOfRandomBitsCollected;
259 }, 259 },
260 260
261 'setNumberOfRandomBitsCollected': function(aValue) { 261 'setNumberOfRandomBitsCollected': function(aValue) {
262 this._numberOfRandomBitsCollected = aValue; 262 this._numberOfRandomBitsCollected = aValue;
263 }, 263 },
264 264
265 //------------------------------------------------------------------------- 265 //-------------------------------------------------------------------------
266 266
267 'collectEntropy': function(anEvent) { 267 'collectEntropy': function(anEvent) {
268 var mouseLocation; 268 var mouseLocation;
269 var randomBit; 269 var randomBit;
270 var mask; 270 var mask;
271 271
272 mask = 0xffffffff >>> (32 - this.numberOfBitsToCollectAtEachEvent()); 272 mask = 0xffffffff >>> (32 - this.numberOfBitsToCollectAtEachEvent());
273 273
274 mouseLocation = anEvent.mouse().client; 274 mouseLocation = anEvent.mouse().client;
275 randomBit = ((mouseLocation.x ^ mouseLocation.y) & mask); 275 randomBit = ((mouseLocation.x ^ mouseLocation.y) & mask);
276 this.appendRandomBitsToRandomBitsCollector(randomBit) 276 this.appendRandomBitsToRandomBitsCollector(randomBit)
277 }, 277 },
278 278
279 //------------------------------------------------------------------------- 279 //-------------------------------------------------------------------------
280 280
281 'numberOfRandomBits': function() { 281 'numberOfRandomBits': function() {
282 return 1; 282 return 1;
283 }, 283 },
284 284
285 //------------------------------------------------------------------------- 285 //-------------------------------------------------------------------------
286 __syntaxFix__: "syntax fix" 286 __syntaxFix__: "syntax fix"
287}); 287});
288 288
289//***************************************************************************** 289//*****************************************************************************
290 290
291Clipperz.Crypto.PRNG.CryptoRandomRandomnessSource = function(args) { 291Clipperz.Crypto.PRNG.CryptoRandomRandomnessSource = function(args) {
292 args = args || {}; 292 args = args || {};
293 293
294 this._intervalTime = args.intervalTime || 1000; 294 this._intervalTime = args.intervalTime || 1000;
295 this._browserCrypto = args.browserCrypto; 295 this._browserCrypto = args.browserCrypto;
296 296
297 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args); 297 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args);
298 298
299 this.collectEntropy(); 299 this.collectEntropy();
300 return this; 300 return this;
301} 301}
302 302
303Clipperz.Crypto.PRNG.CryptoRandomRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, { 303Clipperz.Crypto.PRNG.CryptoRandomRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, {
304 304
305 'intervalTime': function() { 305 'intervalTime': function() {
306 return this._intervalTime; 306 return this._intervalTime;
307 }, 307 },
308 308
309 'browserCrypto': function () { 309 'browserCrypto': function () {
310 return this._browserCrypto; 310 return this._browserCrypto;
311 }, 311 },
312 312
313 //------------------------------------------------------------------------- 313 //-------------------------------------------------------------------------
314 314
315 'collectEntropy': function() { 315 'collectEntropy': function() {
316 varbytesToCollect; 316 varbytesToCollect;
317 317
318 if (this.boostMode() == true) { 318 if (this.boostMode() == true) {
319 bytesToCollect = 8; 319 bytesToCollect = 64;
320 } else { 320 } else {
321 bytesToCollect = 32; 321 bytesToCollect = 8;
322 } 322 }
323 323
324 var randomValuesArray = new Uint8Array(bytesToCollect); 324 var randomValuesArray = new Uint8Array(bytesToCollect);
325 this.browserCrypto().getRandomValues(randomValuesArray); 325 this.browserCrypto().getRandomValues(randomValuesArray);
326 for (var i = 0; i < randomValuesArray.length; i++) { 326 for (var i = 0; i < randomValuesArray.length; i++) {
327 this.updateGeneratorWithValue(randomValuesArray[i]); 327 this.updateGeneratorWithValue(randomValuesArray[i]);
328 } 328 }
329 329
330 setTimeout(this.collectEntropy, this.intervalTime()); 330 setTimeout(this.collectEntropy, this.intervalTime());
331 }, 331 },
332 332
333 //------------------------------------------------------------------------- 333 //-------------------------------------------------------------------------
334 __syntaxFix__: "syntax fix" 334 __syntaxFix__: "syntax fix"
335}); 335});
336 336
337//############################################################################# 337//#############################################################################
338 338
339Clipperz.Crypto.PRNG.Fortuna = function(args) { 339Clipperz.Crypto.PRNG.Fortuna = function(args) {
340 vari,c; 340 vari,c;
341 341
342 args = args || {}; 342 args = args || {};
343 343
344 this._key = args.seed || null; 344 this._key = args.seed || null;
345 if (this._key == null) { 345 if (this._key == null) {
346 this._counter = 0; 346 this._counter = 0;
347 this._key = new Clipperz.ByteArray(); 347 this._key = new Clipperz.ByteArray();
348 } else { 348 } else {
349 this._counter = 1; 349 this._counter = 1;
350 } 350 }
351 351
352 this._aesKey = null; 352 this._aesKey = null;
353 353
354 this._firstPoolReseedLevel = args.firstPoolReseedLevel || 32 || 64; 354 this._firstPoolReseedLevel = args.firstPoolReseedLevel || 32 || 64;
355 this._numberOfEntropyAccumulators = args.numberOfEntropyAccumulators || 32; 355 this._numberOfEntropyAccumulators = args.numberOfEntropyAccumulators || 32;
356 356
357 this._accumulators = []; 357 this._accumulators = [];
358 c = this.numberOfEntropyAccumulators(); 358 c = this.numberOfEntropyAccumulators();
359 for (i=0; i<c; i++) { 359 for (i=0; i<c; i++) {
360 this._accumulators.push(new Clipperz.Crypto.PRNG.EntropyAccumulator()); 360 this._accumulators.push(new Clipperz.Crypto.PRNG.EntropyAccumulator());
361 } 361 }
362 362
363 this._randomnessSources = []; 363 this._randomnessSources = [];
364 this._reseedCounter = 0; 364 this._reseedCounter = 0;
365 365
366 return this; 366 return this;
367} 367}
368 368
369Clipperz.Crypto.PRNG.Fortuna.prototype = MochiKit.Base.update(null, { 369Clipperz.Crypto.PRNG.Fortuna.prototype = MochiKit.Base.update(null, {
370 370
371 'toString': function() { 371 'toString': function() {
372 return "Clipperz.Crypto.PRNG.Fortuna"; 372 return "Clipperz.Crypto.PRNG.Fortuna";
373 }, 373 },
374 374
375 //------------------------------------------------------------------------- 375 //-------------------------------------------------------------------------
376 376
377 'key': function() { 377 'key': function() {
378 return this._key; 378 return this._key;
379 }, 379 },
380 380
381 'setKey': function(aValue) { 381 'setKey': function(aValue) {
382 this._key = aValue; 382 this._key = aValue;
383 this._aesKey = null; 383 this._aesKey = null;
384 }, 384 },
385 385
386 'aesKey': function() { 386 'aesKey': function() {
387 if (this._aesKey == null) { 387 if (this._aesKey == null) {
388 this._aesKey = new Clipperz.Crypto.AES.Key({key:this.key()}); 388 this._aesKey = new Clipperz.Crypto.AES.Key({key:this.key()});
389 } 389 }
390 390
391 return this._aesKey; 391 return this._aesKey;
392 }, 392 },
393 393
394 'accumulators': function() { 394 'accumulators': function() {
395 return this._accumulators; 395 return this._accumulators;
396 }, 396 },
397 397
398 'firstPoolReseedLevel': function() { 398 'firstPoolReseedLevel': function() {
399 return this._firstPoolReseedLevel; 399 return this._firstPoolReseedLevel;
400 }, 400 },
401 401
402 //------------------------------------------------------------------------- 402 //-------------------------------------------------------------------------
403 403
404 'reseedCounter': function() { 404 'reseedCounter': function() {
405 return this._reseedCounter; 405 return this._reseedCounter;
406 }, 406 },
407 407
408 'incrementReseedCounter': function() { 408 'incrementReseedCounter': function() {
409 this._reseedCounter = this._reseedCounter +1; 409 this._reseedCounter = this._reseedCounter +1;
410 }, 410 },
411 411
412 //------------------------------------------------------------------------- 412 //-------------------------------------------------------------------------
413 413
414 'reseed': function() { 414 'reseed': function() {
415 varnewKeySeed; 415 varnewKeySeed;
416 var reseedCounter; 416 var reseedCounter;
417 varreseedCounterMask; 417 varreseedCounterMask;
418 var i, c; 418 var i, c;
419 419
420 newKeySeed = this.key(); 420 newKeySeed = this.key();
421 this.incrementReseedCounter(); 421 this.incrementReseedCounter();
422 reseedCounter = this.reseedCounter(); 422 reseedCounter = this.reseedCounter();
423 423
424 c = this.numberOfEntropyAccumulators(); 424 c = this.numberOfEntropyAccumulators();
425 reseedCounterMask = 0xffffffff >>> (32 - c); 425 reseedCounterMask = 0xffffffff >>> (32 - c);
426 for (i=0; i<c; i++) { 426 for (i=0; i<c; i++) {
427 if ((i == 0) || ((reseedCounter & (reseedCounterMask >>> (c - i))) == 0)) { 427 if ((i == 0) || ((reseedCounter & (reseedCounterMask >>> (c - i))) == 0)) {
428 newKeySeed.appendBlock(this.accumulators()[i].stack()); 428 newKeySeed.appendBlock(this.accumulators()[i].stack());
429 this.accumulators()[i].resetStack(); 429 this.accumulators()[i].resetStack();
430 } 430 }
431 } 431 }
432 432
433 if (reseedCounter == 1) { 433 if (reseedCounter == 1) {
434 c = this.randomnessSources().length; 434 c = this.randomnessSources().length;
435 for (i=0; i<c; i++) { 435 for (i=0; i<c; i++) {
436 this.randomnessSources()[i].setBoostMode(false); 436 this.randomnessSources()[i].setBoostMode(false);
437 } 437 }
438 } 438 }
439 439
440 this.setKey(Clipperz.Crypto.SHA.sha_d256(newKeySeed)); 440 this.setKey(Clipperz.Crypto.SHA.sha_d256(newKeySeed));
441 if (reseedCounter == 1) { 441 if (reseedCounter == 1) {
442MochiKit.Logging.logDebug("### PRNG.readyToGenerateRandomBytes"); 442MochiKit.Logging.logDebug("### PRNG.readyToGenerateRandomBytes");
443 MochiKit.Signal.signal(this, 'readyToGenerateRandomBytes'); 443 MochiKit.Signal.signal(this, 'readyToGenerateRandomBytes');
444 } 444 }
445 MochiKit.Signal.signal(this, 'reseeded'); 445 MochiKit.Signal.signal(this, 'reseeded');
446 }, 446 },
447 447
448 //------------------------------------------------------------------------- 448 //-------------------------------------------------------------------------
449 449
450 'isReadyToGenerateRandomValues': function() { 450 'isReadyToGenerateRandomValues': function() {
451 return this.reseedCounter() != 0; 451 return this.reseedCounter() != 0;
452 }, 452 },
453 453
454 //------------------------------------------------------------------------- 454 //-------------------------------------------------------------------------
455 455
456 'entropyLevel': function() { 456 'entropyLevel': function() {
457 return this.accumulators()[0].stack().length() + (this.reseedCounter() * this.firstPoolReseedLevel()); 457 return this.accumulators()[0].stack().length() + (this.reseedCounter() * this.firstPoolReseedLevel());
458 }, 458 },
459 459
460 //------------------------------------------------------------------------- 460 //-------------------------------------------------------------------------
461 461
462 'counter': function() { 462 'counter': function() {
463 return this._counter; 463 return this._counter;
464 }, 464 },
465 465
466 'incrementCounter': function() { 466 'incrementCounter': function() {
467 this._counter += 1; 467 this._counter += 1;
468 }, 468 },
469 469
470 'counterBlock': function() { 470 'counterBlock': function() {
471 var result; 471 var result;
472 472
473 result = new Clipperz.ByteArray().appendWords(this.counter(), 0, 0, 0); 473 result = new Clipperz.ByteArray().appendWords(this.counter(), 0, 0, 0);
474 474
475 return result; 475 return result;
476 }, 476 },
477 477
478 //------------------------------------------------------------------------- 478 //-------------------------------------------------------------------------
479 479
480 'getRandomBlock': function() { 480 'getRandomBlock': function() {
481 var result; 481 var result;
482 482
483 result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(this.aesKey(), this.counterBlock().arrayValues())); 483 result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(this.aesKey(), this.counterBlock().arrayValues()));
484 this.incrementCounter(); 484 this.incrementCounter();
485 485
486 return result; 486 return result;
487 }, 487 },
488 488
489 //------------------------------------------------------------------------- 489 //-------------------------------------------------------------------------
490 490
491 'getRandomBytes': function(aSize) { 491 'getRandomBytes': function(aSize) {
492 var result; 492 var result;
493 493
494 if (this.isReadyToGenerateRandomValues()) { 494 if (this.isReadyToGenerateRandomValues()) {
495 var i,c; 495 var i,c;
496 var newKey; 496 var newKey;
497 497
498 result = new Clipperz.ByteArray(); 498 result = new Clipperz.ByteArray();
499 499
500 c = Math.ceil(aSize / (128 / 8)); 500 c = Math.ceil(aSize / (128 / 8));
501 for (i=0; i<c; i++) { 501 for (i=0; i<c; i++) {
502 result.appendBlock(this.getRandomBlock()); 502 result.appendBlock(this.getRandomBlock());
503 } 503 }
504 504
505 if (result.length() != aSize) { 505 if (result.length() != aSize) {
506 result = result.split(0, aSize); 506 result = result.split(0, aSize);
507 } 507 }
508 508
509 newKey = this.getRandomBlock().appendBlock(this.getRandomBlock()); 509 newKey = this.getRandomBlock().appendBlock(this.getRandomBlock());
510 this.setKey(newKey); 510 this.setKey(newKey);
511 } else { 511 } else {
512MochiKit.Logging.logWarning("Fortuna generator has not enough entropy, yet!"); 512MochiKit.Logging.logWarning("Fortuna generator has not enough entropy, yet!");
513 throw Clipperz.Crypto.PRNG.exception.NotEnoughEntropy; 513 throw Clipperz.Crypto.PRNG.exception.NotEnoughEntropy;
diff --git a/frontend/delta/js/Clipperz/Crypto/PRNG.js b/frontend/delta/js/Clipperz/Crypto/PRNG.js
index 7885429..80d972f 100644
--- a/frontend/delta/js/Clipperz/Crypto/PRNG.js
+++ b/frontend/delta/js/Clipperz/Crypto/PRNG.js
@@ -129,387 +129,387 @@ Clipperz.Crypto.PRNG.RandomnessSource.prototype = MochiKit.Base.update(null, {
129 129
130 'setSourceId': function(aValue) { 130 'setSourceId': function(aValue) {
131 this._sourceId = aValue; 131 this._sourceId = aValue;
132 }, 132 },
133 133
134 //------------------------------------------------------------------------- 134 //-------------------------------------------------------------------------
135 135
136 'nextPoolIndex': function() { 136 'nextPoolIndex': function() {
137 return this._nextPoolIndex; 137 return this._nextPoolIndex;
138 }, 138 },
139 139
140 'incrementNextPoolIndex': function() { 140 'incrementNextPoolIndex': function() {
141 this._nextPoolIndex = ((this._nextPoolIndex + 1) % this.generator().numberOfEntropyAccumulators()); 141 this._nextPoolIndex = ((this._nextPoolIndex + 1) % this.generator().numberOfEntropyAccumulators());
142 }, 142 },
143 143
144 //------------------------------------------------------------------------- 144 //-------------------------------------------------------------------------
145 145
146 'updateGeneratorWithValue': function(aRandomValue) { 146 'updateGeneratorWithValue': function(aRandomValue) {
147 if (this.generator() != null) { 147 if (this.generator() != null) {
148 this.generator().addRandomByte(this.sourceId(), this.nextPoolIndex(), aRandomValue); 148 this.generator().addRandomByte(this.sourceId(), this.nextPoolIndex(), aRandomValue);
149 this.incrementNextPoolIndex(); 149 this.incrementNextPoolIndex();
150 } 150 }
151 }, 151 },
152 152
153 //------------------------------------------------------------------------- 153 //-------------------------------------------------------------------------
154 __syntaxFix__: "syntax fix" 154 __syntaxFix__: "syntax fix"
155}); 155});
156 156
157//############################################################################# 157//#############################################################################
158 158
159Clipperz.Crypto.PRNG.TimeRandomnessSource = function(args) { 159Clipperz.Crypto.PRNG.TimeRandomnessSource = function(args) {
160 args = args || {}; 160 args = args || {};
161 //MochiKit.Base.bindMethods(this); 161 //MochiKit.Base.bindMethods(this);
162 162
163 this._intervalTime = args.intervalTime || 1000; 163 this._intervalTime = args.intervalTime || 1000;
164 164
165 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args); 165 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args);
166 166
167 this.collectEntropy(); 167 this.collectEntropy();
168 return this; 168 return this;
169} 169}
170 170
171Clipperz.Crypto.PRNG.TimeRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, { 171Clipperz.Crypto.PRNG.TimeRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, {
172 172
173 'intervalTime': function() { 173 'intervalTime': function() {
174 return this._intervalTime; 174 return this._intervalTime;
175 }, 175 },
176 176
177 //------------------------------------------------------------------------- 177 //-------------------------------------------------------------------------
178 178
179 'collectEntropy': function() { 179 'collectEntropy': function() {
180 varnow; 180 varnow;
181 varentropyByte; 181 varentropyByte;
182 var intervalTime; 182 var intervalTime;
183 now = new Date(); 183 now = new Date();
184 entropyByte = (now.getTime() & 0xff); 184 entropyByte = (now.getTime() & 0xff);
185 185
186 intervalTime = this.intervalTime(); 186 intervalTime = this.intervalTime();
187 if (this.boostMode() == true) { 187 if (this.boostMode() == true) {
188 intervalTime = intervalTime / 9; 188 intervalTime = intervalTime / 9;
189 } 189 }
190 190
191 this.updateGeneratorWithValue(entropyByte); 191 this.updateGeneratorWithValue(entropyByte);
192 setTimeout(this.collectEntropy, intervalTime); 192 setTimeout(this.collectEntropy, intervalTime);
193 }, 193 },
194 194
195 //------------------------------------------------------------------------- 195 //-------------------------------------------------------------------------
196 196
197 'numberOfRandomBits': function() { 197 'numberOfRandomBits': function() {
198 return 5; 198 return 5;
199 }, 199 },
200 200
201 //------------------------------------------------------------------------- 201 //-------------------------------------------------------------------------
202 __syntaxFix__: "syntax fix" 202 __syntaxFix__: "syntax fix"
203}); 203});
204 204
205//***************************************************************************** 205//*****************************************************************************
206 206
207Clipperz.Crypto.PRNG.MouseRandomnessSource = function(args) { 207Clipperz.Crypto.PRNG.MouseRandomnessSource = function(args) {
208 args = args || {}; 208 args = args || {};
209 209
210 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args); 210 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args);
211 211
212 this._numberOfBitsToCollectAtEachEvent = 4; 212 this._numberOfBitsToCollectAtEachEvent = 4;
213 this._randomBitsCollector = 0; 213 this._randomBitsCollector = 0;
214 this._numberOfRandomBitsCollected = 0; 214 this._numberOfRandomBitsCollected = 0;
215 215
216 MochiKit.Signal.connect(document, 'onmousemove', this, 'collectEntropy'); 216 MochiKit.Signal.connect(document, 'onmousemove', this, 'collectEntropy');
217 217
218 return this; 218 return this;
219} 219}
220 220
221Clipperz.Crypto.PRNG.MouseRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, { 221Clipperz.Crypto.PRNG.MouseRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, {
222 222
223 //------------------------------------------------------------------------- 223 //-------------------------------------------------------------------------
224 224
225 'numberOfBitsToCollectAtEachEvent': function() { 225 'numberOfBitsToCollectAtEachEvent': function() {
226 return this._numberOfBitsToCollectAtEachEvent; 226 return this._numberOfBitsToCollectAtEachEvent;
227 }, 227 },
228 228
229 //------------------------------------------------------------------------- 229 //-------------------------------------------------------------------------
230 230
231 'randomBitsCollector': function() { 231 'randomBitsCollector': function() {
232 return this._randomBitsCollector; 232 return this._randomBitsCollector;
233 }, 233 },
234 234
235 'setRandomBitsCollector': function(aValue) { 235 'setRandomBitsCollector': function(aValue) {
236 this._randomBitsCollector = aValue; 236 this._randomBitsCollector = aValue;
237 }, 237 },
238 238
239 'appendRandomBitsToRandomBitsCollector': function(aValue) { 239 'appendRandomBitsToRandomBitsCollector': function(aValue) {
240 var collectedBits; 240 var collectedBits;
241 var numberOfRandomBitsCollected; 241 var numberOfRandomBitsCollected;
242 242
243 numberOfRandomBitsCollected = this.numberOfRandomBitsCollected(); 243 numberOfRandomBitsCollected = this.numberOfRandomBitsCollected();
244 collectedBits = this.randomBitsCollector() | (aValue << numberOfRandomBitsCollected); 244 collectedBits = this.randomBitsCollector() | (aValue << numberOfRandomBitsCollected);
245 this.setRandomBitsCollector(collectedBits); 245 this.setRandomBitsCollector(collectedBits);
246 numberOfRandomBitsCollected += this.numberOfBitsToCollectAtEachEvent(); 246 numberOfRandomBitsCollected += this.numberOfBitsToCollectAtEachEvent();
247 247
248 if (numberOfRandomBitsCollected == 8) { 248 if (numberOfRandomBitsCollected == 8) {
249 this.updateGeneratorWithValue(collectedBits); 249 this.updateGeneratorWithValue(collectedBits);
250 numberOfRandomBitsCollected = 0; 250 numberOfRandomBitsCollected = 0;
251 this.setRandomBitsCollector(0); 251 this.setRandomBitsCollector(0);
252 } 252 }
253 253
254 this.setNumberOfRandomBitsCollected(numberOfRandomBitsCollected) 254 this.setNumberOfRandomBitsCollected(numberOfRandomBitsCollected)
255 }, 255 },
256 256
257 //------------------------------------------------------------------------- 257 //-------------------------------------------------------------------------
258 258
259 'numberOfRandomBitsCollected': function() { 259 'numberOfRandomBitsCollected': function() {
260 return this._numberOfRandomBitsCollected; 260 return this._numberOfRandomBitsCollected;
261 }, 261 },
262 262
263 'setNumberOfRandomBitsCollected': function(aValue) { 263 'setNumberOfRandomBitsCollected': function(aValue) {
264 this._numberOfRandomBitsCollected = aValue; 264 this._numberOfRandomBitsCollected = aValue;
265 }, 265 },
266 266
267 //------------------------------------------------------------------------- 267 //-------------------------------------------------------------------------
268 268
269 'collectEntropy': function(anEvent) { 269 'collectEntropy': function(anEvent) {
270 var mouseLocation; 270 var mouseLocation;
271 var randomBit; 271 var randomBit;
272 var mask; 272 var mask;
273 273
274 mask = 0xffffffff >>> (32 - this.numberOfBitsToCollectAtEachEvent()); 274 mask = 0xffffffff >>> (32 - this.numberOfBitsToCollectAtEachEvent());
275 275
276 mouseLocation = anEvent.mouse().client; 276 mouseLocation = anEvent.mouse().client;
277 randomBit = ((mouseLocation.x ^ mouseLocation.y) & mask); 277 randomBit = ((mouseLocation.x ^ mouseLocation.y) & mask);
278 this.appendRandomBitsToRandomBitsCollector(randomBit) 278 this.appendRandomBitsToRandomBitsCollector(randomBit)
279 }, 279 },
280 280
281 //------------------------------------------------------------------------- 281 //-------------------------------------------------------------------------
282 282
283 'numberOfRandomBits': function() { 283 'numberOfRandomBits': function() {
284 return 1; 284 return 1;
285 }, 285 },
286 286
287 //------------------------------------------------------------------------- 287 //-------------------------------------------------------------------------
288 __syntaxFix__: "syntax fix" 288 __syntaxFix__: "syntax fix"
289}); 289});
290 290
291//***************************************************************************** 291//*****************************************************************************
292 292
293Clipperz.Crypto.PRNG.CryptoRandomRandomnessSource = function(args) { 293Clipperz.Crypto.PRNG.CryptoRandomRandomnessSource = function(args) {
294 args = args || {}; 294 args = args || {};
295 295
296 this._intervalTime = args.intervalTime || 1000; 296 this._intervalTime = args.intervalTime || 1000;
297 this._browserCrypto = args.browserCrypto; 297 this._browserCrypto = args.browserCrypto;
298 298
299 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args); 299 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args);
300 300
301 this.collectEntropy(); 301 this.collectEntropy();
302 return this; 302 return this;
303} 303}
304 304
305Clipperz.Crypto.PRNG.CryptoRandomRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, { 305Clipperz.Crypto.PRNG.CryptoRandomRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, {
306 306
307 'intervalTime': function() { 307 'intervalTime': function() {
308 return this._intervalTime; 308 return this._intervalTime;
309 }, 309 },
310 310
311 'browserCrypto': function () { 311 'browserCrypto': function () {
312 return this._browserCrypto; 312 return this._browserCrypto;
313 }, 313 },
314 314
315 //------------------------------------------------------------------------- 315 //-------------------------------------------------------------------------
316 316
317 'collectEntropy': function() { 317 'collectEntropy': function() {
318 varbytesToCollect; 318 varbytesToCollect;
319 319
320 if (this.boostMode() == true) { 320 if (this.boostMode() == true) {
321 bytesToCollect = 8; 321 bytesToCollect = 64;
322 } else { 322 } else {
323 bytesToCollect = 32; 323 bytesToCollect = 8;
324 } 324 }
325 325
326 var randomValuesArray = new Uint8Array(bytesToCollect); 326 var randomValuesArray = new Uint8Array(bytesToCollect);
327 this.browserCrypto().getRandomValues(randomValuesArray); 327 this.browserCrypto().getRandomValues(randomValuesArray);
328 for (var i = 0; i < randomValuesArray.length; i++) { 328 for (var i = 0; i < randomValuesArray.length; i++) {
329 this.updateGeneratorWithValue(randomValuesArray[i]); 329 this.updateGeneratorWithValue(randomValuesArray[i]);
330 } 330 }
331 331
332 setTimeout(this.collectEntropy, this.intervalTime()); 332 setTimeout(this.collectEntropy, this.intervalTime());
333 }, 333 },
334 334
335 //------------------------------------------------------------------------- 335 //-------------------------------------------------------------------------
336 __syntaxFix__: "syntax fix" 336 __syntaxFix__: "syntax fix"
337}); 337});
338 338
339//############################################################################# 339//#############################################################################
340 340
341Clipperz.Crypto.PRNG.Fortuna = function(args) { 341Clipperz.Crypto.PRNG.Fortuna = function(args) {
342 vari,c; 342 vari,c;
343 343
344 args = args || {}; 344 args = args || {};
345 345
346 this._key = args.seed || null; 346 this._key = args.seed || null;
347 if (this._key == null) { 347 if (this._key == null) {
348 this._counter = 0; 348 this._counter = 0;
349 this._key = new Clipperz.ByteArray(); 349 this._key = new Clipperz.ByteArray();
350 } else { 350 } else {
351 this._counter = 1; 351 this._counter = 1;
352 } 352 }
353 353
354 this._aesKey = null; 354 this._aesKey = null;
355 355
356 this._firstPoolReseedLevel = args.firstPoolReseedLevel || 32 || 64; 356 this._firstPoolReseedLevel = args.firstPoolReseedLevel || 32 || 64;
357 this._numberOfEntropyAccumulators = args.numberOfEntropyAccumulators || 32; 357 this._numberOfEntropyAccumulators = args.numberOfEntropyAccumulators || 32;
358 358
359 this._accumulators = []; 359 this._accumulators = [];
360 c = this.numberOfEntropyAccumulators(); 360 c = this.numberOfEntropyAccumulators();
361 for (i=0; i<c; i++) { 361 for (i=0; i<c; i++) {
362 this._accumulators.push(new Clipperz.Crypto.PRNG.EntropyAccumulator()); 362 this._accumulators.push(new Clipperz.Crypto.PRNG.EntropyAccumulator());
363 } 363 }
364 364
365 this._randomnessSources = []; 365 this._randomnessSources = [];
366 this._reseedCounter = 0; 366 this._reseedCounter = 0;
367 367
368 return this; 368 return this;
369} 369}
370 370
371Clipperz.Crypto.PRNG.Fortuna.prototype = MochiKit.Base.update(null, { 371Clipperz.Crypto.PRNG.Fortuna.prototype = MochiKit.Base.update(null, {
372 372
373 'toString': function() { 373 'toString': function() {
374 return "Clipperz.Crypto.PRNG.Fortuna"; 374 return "Clipperz.Crypto.PRNG.Fortuna";
375 }, 375 },
376 376
377 //------------------------------------------------------------------------- 377 //-------------------------------------------------------------------------
378 378
379 'key': function() { 379 'key': function() {
380 return this._key; 380 return this._key;
381 }, 381 },
382 382
383 'setKey': function(aValue) { 383 'setKey': function(aValue) {
384 this._key = aValue; 384 this._key = aValue;
385 this._aesKey = null; 385 this._aesKey = null;
386 }, 386 },
387 387
388 'aesKey': function() { 388 'aesKey': function() {
389 if (this._aesKey == null) { 389 if (this._aesKey == null) {
390 this._aesKey = new Clipperz.Crypto.AES.Key({key:this.key()}); 390 this._aesKey = new Clipperz.Crypto.AES.Key({key:this.key()});
391 } 391 }
392 392
393 return this._aesKey; 393 return this._aesKey;
394 }, 394 },
395 395
396 'accumulators': function() { 396 'accumulators': function() {
397 return this._accumulators; 397 return this._accumulators;
398 }, 398 },
399 399
400 'firstPoolReseedLevel': function() { 400 'firstPoolReseedLevel': function() {
401 return this._firstPoolReseedLevel; 401 return this._firstPoolReseedLevel;
402 }, 402 },
403 403
404 //------------------------------------------------------------------------- 404 //-------------------------------------------------------------------------
405 405
406 'reseedCounter': function() { 406 'reseedCounter': function() {
407 return this._reseedCounter; 407 return this._reseedCounter;
408 }, 408 },
409 409
410 'incrementReseedCounter': function() { 410 'incrementReseedCounter': function() {
411 this._reseedCounter = this._reseedCounter +1; 411 this._reseedCounter = this._reseedCounter +1;
412 }, 412 },
413 413
414 //------------------------------------------------------------------------- 414 //-------------------------------------------------------------------------
415 415
416 'reseed': function() { 416 'reseed': function() {
417 varnewKeySeed; 417 varnewKeySeed;
418 var reseedCounter; 418 var reseedCounter;
419 varreseedCounterMask; 419 varreseedCounterMask;
420 var i, c; 420 var i, c;
421 421
422 newKeySeed = this.key(); 422 newKeySeed = this.key();
423 this.incrementReseedCounter(); 423 this.incrementReseedCounter();
424 reseedCounter = this.reseedCounter(); 424 reseedCounter = this.reseedCounter();
425 425
426 c = this.numberOfEntropyAccumulators(); 426 c = this.numberOfEntropyAccumulators();
427 reseedCounterMask = 0xffffffff >>> (32 - c); 427 reseedCounterMask = 0xffffffff >>> (32 - c);
428 for (i=0; i<c; i++) { 428 for (i=0; i<c; i++) {
429 if ((i == 0) || ((reseedCounter & (reseedCounterMask >>> (c - i))) == 0)) { 429 if ((i == 0) || ((reseedCounter & (reseedCounterMask >>> (c - i))) == 0)) {
430 newKeySeed.appendBlock(this.accumulators()[i].stack()); 430 newKeySeed.appendBlock(this.accumulators()[i].stack());
431 this.accumulators()[i].resetStack(); 431 this.accumulators()[i].resetStack();
432 } 432 }
433 } 433 }
434 434
435 if (reseedCounter == 1) { 435 if (reseedCounter == 1) {
436 c = this.randomnessSources().length; 436 c = this.randomnessSources().length;
437 for (i=0; i<c; i++) { 437 for (i=0; i<c; i++) {
438 this.randomnessSources()[i].setBoostMode(false); 438 this.randomnessSources()[i].setBoostMode(false);
439 } 439 }
440 } 440 }
441 441
442 this.setKey(Clipperz.Crypto.SHA.sha_d256(newKeySeed)); 442 this.setKey(Clipperz.Crypto.SHA.sha_d256(newKeySeed));
443 if (reseedCounter == 1) { 443 if (reseedCounter == 1) {
444Clipperz.log("### PRNG.readyToGenerateRandomBytes"); 444Clipperz.log("### PRNG.readyToGenerateRandomBytes");
445 MochiKit.Signal.signal(this, 'readyToGenerateRandomBytes'); 445 MochiKit.Signal.signal(this, 'readyToGenerateRandomBytes');
446 } 446 }
447 MochiKit.Signal.signal(this, 'reseeded'); 447 MochiKit.Signal.signal(this, 'reseeded');
448 }, 448 },
449 449
450 //------------------------------------------------------------------------- 450 //-------------------------------------------------------------------------
451 451
452 'isReadyToGenerateRandomValues': function() { 452 'isReadyToGenerateRandomValues': function() {
453 return this.reseedCounter() != 0; 453 return this.reseedCounter() != 0;
454 }, 454 },
455 455
456 //------------------------------------------------------------------------- 456 //-------------------------------------------------------------------------
457 457
458 'entropyLevel': function() { 458 'entropyLevel': function() {
459 return this.accumulators()[0].stack().length() + (this.reseedCounter() * this.firstPoolReseedLevel()); 459 return this.accumulators()[0].stack().length() + (this.reseedCounter() * this.firstPoolReseedLevel());
460 }, 460 },
461 461
462 //------------------------------------------------------------------------- 462 //-------------------------------------------------------------------------
463 463
464 'counter': function() { 464 'counter': function() {
465 return this._counter; 465 return this._counter;
466 }, 466 },
467 467
468 'incrementCounter': function() { 468 'incrementCounter': function() {
469 this._counter += 1; 469 this._counter += 1;
470 }, 470 },
471 471
472 'counterBlock': function() { 472 'counterBlock': function() {
473 var result; 473 var result;
474 474
475 result = new Clipperz.ByteArray().appendWords(this.counter(), 0, 0, 0); 475 result = new Clipperz.ByteArray().appendWords(this.counter(), 0, 0, 0);
476 476
477 return result; 477 return result;
478 }, 478 },
479 479
480 //------------------------------------------------------------------------- 480 //-------------------------------------------------------------------------
481 481
482 'getRandomBlock': function() { 482 'getRandomBlock': function() {
483 var result; 483 var result;
484 484
485 result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(this.aesKey(), this.counterBlock().arrayValues())); 485 result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(this.aesKey(), this.counterBlock().arrayValues()));
486 this.incrementCounter(); 486 this.incrementCounter();
487 487
488 return result; 488 return result;
489 }, 489 },
490 490
491 //------------------------------------------------------------------------- 491 //-------------------------------------------------------------------------
492 492
493 'getRandomBytes': function(aSize) { 493 'getRandomBytes': function(aSize) {
494 var result; 494 var result;
495 495
496 if (this.isReadyToGenerateRandomValues()) { 496 if (this.isReadyToGenerateRandomValues()) {
497 var i,c; 497 var i,c;
498 var newKey; 498 var newKey;
499 499
500 result = new Clipperz.ByteArray(); 500 result = new Clipperz.ByteArray();
501 501
502 c = Math.ceil(aSize / (128 / 8)); 502 c = Math.ceil(aSize / (128 / 8));
503 for (i=0; i<c; i++) { 503 for (i=0; i<c; i++) {
504 result.appendBlock(this.getRandomBlock()); 504 result.appendBlock(this.getRandomBlock());
505 } 505 }
506 506
507 if (result.length() != aSize) { 507 if (result.length() != aSize) {
508 result = result.split(0, aSize); 508 result = result.split(0, aSize);
509 } 509 }
510 510
511 newKey = this.getRandomBlock().appendBlock(this.getRandomBlock()); 511 newKey = this.getRandomBlock().appendBlock(this.getRandomBlock());
512 this.setKey(newKey); 512 this.setKey(newKey);
513 } else { 513 } else {
514Clipperz.logWarning("Fortuna generator has not enough entropy, yet!"); 514Clipperz.logWarning("Fortuna generator has not enough entropy, yet!");
515 throw Clipperz.Crypto.PRNG.exception.NotEnoughEntropy; 515 throw Clipperz.Crypto.PRNG.exception.NotEnoughEntropy;
diff --git a/frontend/gamma/js/Clipperz/Crypto/PRNG.js b/frontend/gamma/js/Clipperz/Crypto/PRNG.js
index 7885429..80d972f 100644
--- a/frontend/gamma/js/Clipperz/Crypto/PRNG.js
+++ b/frontend/gamma/js/Clipperz/Crypto/PRNG.js
@@ -129,387 +129,387 @@ Clipperz.Crypto.PRNG.RandomnessSource.prototype = MochiKit.Base.update(null, {
129 129
130 'setSourceId': function(aValue) { 130 'setSourceId': function(aValue) {
131 this._sourceId = aValue; 131 this._sourceId = aValue;
132 }, 132 },
133 133
134 //------------------------------------------------------------------------- 134 //-------------------------------------------------------------------------
135 135
136 'nextPoolIndex': function() { 136 'nextPoolIndex': function() {
137 return this._nextPoolIndex; 137 return this._nextPoolIndex;
138 }, 138 },
139 139
140 'incrementNextPoolIndex': function() { 140 'incrementNextPoolIndex': function() {
141 this._nextPoolIndex = ((this._nextPoolIndex + 1) % this.generator().numberOfEntropyAccumulators()); 141 this._nextPoolIndex = ((this._nextPoolIndex + 1) % this.generator().numberOfEntropyAccumulators());
142 }, 142 },
143 143
144 //------------------------------------------------------------------------- 144 //-------------------------------------------------------------------------
145 145
146 'updateGeneratorWithValue': function(aRandomValue) { 146 'updateGeneratorWithValue': function(aRandomValue) {
147 if (this.generator() != null) { 147 if (this.generator() != null) {
148 this.generator().addRandomByte(this.sourceId(), this.nextPoolIndex(), aRandomValue); 148 this.generator().addRandomByte(this.sourceId(), this.nextPoolIndex(), aRandomValue);
149 this.incrementNextPoolIndex(); 149 this.incrementNextPoolIndex();
150 } 150 }
151 }, 151 },
152 152
153 //------------------------------------------------------------------------- 153 //-------------------------------------------------------------------------
154 __syntaxFix__: "syntax fix" 154 __syntaxFix__: "syntax fix"
155}); 155});
156 156
157//############################################################################# 157//#############################################################################
158 158
159Clipperz.Crypto.PRNG.TimeRandomnessSource = function(args) { 159Clipperz.Crypto.PRNG.TimeRandomnessSource = function(args) {
160 args = args || {}; 160 args = args || {};
161 //MochiKit.Base.bindMethods(this); 161 //MochiKit.Base.bindMethods(this);
162 162
163 this._intervalTime = args.intervalTime || 1000; 163 this._intervalTime = args.intervalTime || 1000;
164 164
165 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args); 165 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args);
166 166
167 this.collectEntropy(); 167 this.collectEntropy();
168 return this; 168 return this;
169} 169}
170 170
171Clipperz.Crypto.PRNG.TimeRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, { 171Clipperz.Crypto.PRNG.TimeRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, {
172 172
173 'intervalTime': function() { 173 'intervalTime': function() {
174 return this._intervalTime; 174 return this._intervalTime;
175 }, 175 },
176 176
177 //------------------------------------------------------------------------- 177 //-------------------------------------------------------------------------
178 178
179 'collectEntropy': function() { 179 'collectEntropy': function() {
180 varnow; 180 varnow;
181 varentropyByte; 181 varentropyByte;
182 var intervalTime; 182 var intervalTime;
183 now = new Date(); 183 now = new Date();
184 entropyByte = (now.getTime() & 0xff); 184 entropyByte = (now.getTime() & 0xff);
185 185
186 intervalTime = this.intervalTime(); 186 intervalTime = this.intervalTime();
187 if (this.boostMode() == true) { 187 if (this.boostMode() == true) {
188 intervalTime = intervalTime / 9; 188 intervalTime = intervalTime / 9;
189 } 189 }
190 190
191 this.updateGeneratorWithValue(entropyByte); 191 this.updateGeneratorWithValue(entropyByte);
192 setTimeout(this.collectEntropy, intervalTime); 192 setTimeout(this.collectEntropy, intervalTime);
193 }, 193 },
194 194
195 //------------------------------------------------------------------------- 195 //-------------------------------------------------------------------------
196 196
197 'numberOfRandomBits': function() { 197 'numberOfRandomBits': function() {
198 return 5; 198 return 5;
199 }, 199 },
200 200
201 //------------------------------------------------------------------------- 201 //-------------------------------------------------------------------------
202 __syntaxFix__: "syntax fix" 202 __syntaxFix__: "syntax fix"
203}); 203});
204 204
205//***************************************************************************** 205//*****************************************************************************
206 206
207Clipperz.Crypto.PRNG.MouseRandomnessSource = function(args) { 207Clipperz.Crypto.PRNG.MouseRandomnessSource = function(args) {
208 args = args || {}; 208 args = args || {};
209 209
210 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args); 210 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args);
211 211
212 this._numberOfBitsToCollectAtEachEvent = 4; 212 this._numberOfBitsToCollectAtEachEvent = 4;
213 this._randomBitsCollector = 0; 213 this._randomBitsCollector = 0;
214 this._numberOfRandomBitsCollected = 0; 214 this._numberOfRandomBitsCollected = 0;
215 215
216 MochiKit.Signal.connect(document, 'onmousemove', this, 'collectEntropy'); 216 MochiKit.Signal.connect(document, 'onmousemove', this, 'collectEntropy');
217 217
218 return this; 218 return this;
219} 219}
220 220
221Clipperz.Crypto.PRNG.MouseRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, { 221Clipperz.Crypto.PRNG.MouseRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, {
222 222
223 //------------------------------------------------------------------------- 223 //-------------------------------------------------------------------------
224 224
225 'numberOfBitsToCollectAtEachEvent': function() { 225 'numberOfBitsToCollectAtEachEvent': function() {
226 return this._numberOfBitsToCollectAtEachEvent; 226 return this._numberOfBitsToCollectAtEachEvent;
227 }, 227 },
228 228
229 //------------------------------------------------------------------------- 229 //-------------------------------------------------------------------------
230 230
231 'randomBitsCollector': function() { 231 'randomBitsCollector': function() {
232 return this._randomBitsCollector; 232 return this._randomBitsCollector;
233 }, 233 },
234 234
235 'setRandomBitsCollector': function(aValue) { 235 'setRandomBitsCollector': function(aValue) {
236 this._randomBitsCollector = aValue; 236 this._randomBitsCollector = aValue;
237 }, 237 },
238 238
239 'appendRandomBitsToRandomBitsCollector': function(aValue) { 239 'appendRandomBitsToRandomBitsCollector': function(aValue) {
240 var collectedBits; 240 var collectedBits;
241 var numberOfRandomBitsCollected; 241 var numberOfRandomBitsCollected;
242 242
243 numberOfRandomBitsCollected = this.numberOfRandomBitsCollected(); 243 numberOfRandomBitsCollected = this.numberOfRandomBitsCollected();
244 collectedBits = this.randomBitsCollector() | (aValue << numberOfRandomBitsCollected); 244 collectedBits = this.randomBitsCollector() | (aValue << numberOfRandomBitsCollected);
245 this.setRandomBitsCollector(collectedBits); 245 this.setRandomBitsCollector(collectedBits);
246 numberOfRandomBitsCollected += this.numberOfBitsToCollectAtEachEvent(); 246 numberOfRandomBitsCollected += this.numberOfBitsToCollectAtEachEvent();
247 247
248 if (numberOfRandomBitsCollected == 8) { 248 if (numberOfRandomBitsCollected == 8) {
249 this.updateGeneratorWithValue(collectedBits); 249 this.updateGeneratorWithValue(collectedBits);
250 numberOfRandomBitsCollected = 0; 250 numberOfRandomBitsCollected = 0;
251 this.setRandomBitsCollector(0); 251 this.setRandomBitsCollector(0);
252 } 252 }
253 253
254 this.setNumberOfRandomBitsCollected(numberOfRandomBitsCollected) 254 this.setNumberOfRandomBitsCollected(numberOfRandomBitsCollected)
255 }, 255 },
256 256
257 //------------------------------------------------------------------------- 257 //-------------------------------------------------------------------------
258 258
259 'numberOfRandomBitsCollected': function() { 259 'numberOfRandomBitsCollected': function() {
260 return this._numberOfRandomBitsCollected; 260 return this._numberOfRandomBitsCollected;
261 }, 261 },
262 262
263 'setNumberOfRandomBitsCollected': function(aValue) { 263 'setNumberOfRandomBitsCollected': function(aValue) {
264 this._numberOfRandomBitsCollected = aValue; 264 this._numberOfRandomBitsCollected = aValue;
265 }, 265 },
266 266
267 //------------------------------------------------------------------------- 267 //-------------------------------------------------------------------------
268 268
269 'collectEntropy': function(anEvent) { 269 'collectEntropy': function(anEvent) {
270 var mouseLocation; 270 var mouseLocation;
271 var randomBit; 271 var randomBit;
272 var mask; 272 var mask;
273 273
274 mask = 0xffffffff >>> (32 - this.numberOfBitsToCollectAtEachEvent()); 274 mask = 0xffffffff >>> (32 - this.numberOfBitsToCollectAtEachEvent());
275 275
276 mouseLocation = anEvent.mouse().client; 276 mouseLocation = anEvent.mouse().client;
277 randomBit = ((mouseLocation.x ^ mouseLocation.y) & mask); 277 randomBit = ((mouseLocation.x ^ mouseLocation.y) & mask);
278 this.appendRandomBitsToRandomBitsCollector(randomBit) 278 this.appendRandomBitsToRandomBitsCollector(randomBit)
279 }, 279 },
280 280
281 //------------------------------------------------------------------------- 281 //-------------------------------------------------------------------------
282 282
283 'numberOfRandomBits': function() { 283 'numberOfRandomBits': function() {
284 return 1; 284 return 1;
285 }, 285 },
286 286
287 //------------------------------------------------------------------------- 287 //-------------------------------------------------------------------------
288 __syntaxFix__: "syntax fix" 288 __syntaxFix__: "syntax fix"
289}); 289});
290 290
291//***************************************************************************** 291//*****************************************************************************
292 292
293Clipperz.Crypto.PRNG.CryptoRandomRandomnessSource = function(args) { 293Clipperz.Crypto.PRNG.CryptoRandomRandomnessSource = function(args) {
294 args = args || {}; 294 args = args || {};
295 295
296 this._intervalTime = args.intervalTime || 1000; 296 this._intervalTime = args.intervalTime || 1000;
297 this._browserCrypto = args.browserCrypto; 297 this._browserCrypto = args.browserCrypto;
298 298
299 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args); 299 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args);
300 300
301 this.collectEntropy(); 301 this.collectEntropy();
302 return this; 302 return this;
303} 303}
304 304
305Clipperz.Crypto.PRNG.CryptoRandomRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, { 305Clipperz.Crypto.PRNG.CryptoRandomRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, {
306 306
307 'intervalTime': function() { 307 'intervalTime': function() {
308 return this._intervalTime; 308 return this._intervalTime;
309 }, 309 },
310 310
311 'browserCrypto': function () { 311 'browserCrypto': function () {
312 return this._browserCrypto; 312 return this._browserCrypto;
313 }, 313 },
314 314
315 //------------------------------------------------------------------------- 315 //-------------------------------------------------------------------------
316 316
317 'collectEntropy': function() { 317 'collectEntropy': function() {
318 varbytesToCollect; 318 varbytesToCollect;
319 319
320 if (this.boostMode() == true) { 320 if (this.boostMode() == true) {
321 bytesToCollect = 8; 321 bytesToCollect = 64;
322 } else { 322 } else {
323 bytesToCollect = 32; 323 bytesToCollect = 8;
324 } 324 }
325 325
326 var randomValuesArray = new Uint8Array(bytesToCollect); 326 var randomValuesArray = new Uint8Array(bytesToCollect);
327 this.browserCrypto().getRandomValues(randomValuesArray); 327 this.browserCrypto().getRandomValues(randomValuesArray);
328 for (var i = 0; i < randomValuesArray.length; i++) { 328 for (var i = 0; i < randomValuesArray.length; i++) {
329 this.updateGeneratorWithValue(randomValuesArray[i]); 329 this.updateGeneratorWithValue(randomValuesArray[i]);
330 } 330 }
331 331
332 setTimeout(this.collectEntropy, this.intervalTime()); 332 setTimeout(this.collectEntropy, this.intervalTime());
333 }, 333 },
334 334
335 //------------------------------------------------------------------------- 335 //-------------------------------------------------------------------------
336 __syntaxFix__: "syntax fix" 336 __syntaxFix__: "syntax fix"
337}); 337});
338 338
339//############################################################################# 339//#############################################################################
340 340
341Clipperz.Crypto.PRNG.Fortuna = function(args) { 341Clipperz.Crypto.PRNG.Fortuna = function(args) {
342 vari,c; 342 vari,c;
343 343
344 args = args || {}; 344 args = args || {};
345 345
346 this._key = args.seed || null; 346 this._key = args.seed || null;
347 if (this._key == null) { 347 if (this._key == null) {
348 this._counter = 0; 348 this._counter = 0;
349 this._key = new Clipperz.ByteArray(); 349 this._key = new Clipperz.ByteArray();
350 } else { 350 } else {
351 this._counter = 1; 351 this._counter = 1;
352 } 352 }
353 353
354 this._aesKey = null; 354 this._aesKey = null;
355 355
356 this._firstPoolReseedLevel = args.firstPoolReseedLevel || 32 || 64; 356 this._firstPoolReseedLevel = args.firstPoolReseedLevel || 32 || 64;
357 this._numberOfEntropyAccumulators = args.numberOfEntropyAccumulators || 32; 357 this._numberOfEntropyAccumulators = args.numberOfEntropyAccumulators || 32;
358 358
359 this._accumulators = []; 359 this._accumulators = [];
360 c = this.numberOfEntropyAccumulators(); 360 c = this.numberOfEntropyAccumulators();
361 for (i=0; i<c; i++) { 361 for (i=0; i<c; i++) {
362 this._accumulators.push(new Clipperz.Crypto.PRNG.EntropyAccumulator()); 362 this._accumulators.push(new Clipperz.Crypto.PRNG.EntropyAccumulator());
363 } 363 }
364 364
365 this._randomnessSources = []; 365 this._randomnessSources = [];
366 this._reseedCounter = 0; 366 this._reseedCounter = 0;
367 367
368 return this; 368 return this;
369} 369}
370 370
371Clipperz.Crypto.PRNG.Fortuna.prototype = MochiKit.Base.update(null, { 371Clipperz.Crypto.PRNG.Fortuna.prototype = MochiKit.Base.update(null, {
372 372
373 'toString': function() { 373 'toString': function() {
374 return "Clipperz.Crypto.PRNG.Fortuna"; 374 return "Clipperz.Crypto.PRNG.Fortuna";
375 }, 375 },
376 376
377 //------------------------------------------------------------------------- 377 //-------------------------------------------------------------------------
378 378
379 'key': function() { 379 'key': function() {
380 return this._key; 380 return this._key;
381 }, 381 },
382 382
383 'setKey': function(aValue) { 383 'setKey': function(aValue) {
384 this._key = aValue; 384 this._key = aValue;
385 this._aesKey = null; 385 this._aesKey = null;
386 }, 386 },
387 387
388 'aesKey': function() { 388 'aesKey': function() {
389 if (this._aesKey == null) { 389 if (this._aesKey == null) {
390 this._aesKey = new Clipperz.Crypto.AES.Key({key:this.key()}); 390 this._aesKey = new Clipperz.Crypto.AES.Key({key:this.key()});
391 } 391 }
392 392
393 return this._aesKey; 393 return this._aesKey;
394 }, 394 },
395 395
396 'accumulators': function() { 396 'accumulators': function() {
397 return this._accumulators; 397 return this._accumulators;
398 }, 398 },
399 399
400 'firstPoolReseedLevel': function() { 400 'firstPoolReseedLevel': function() {
401 return this._firstPoolReseedLevel; 401 return this._firstPoolReseedLevel;
402 }, 402 },
403 403
404 //------------------------------------------------------------------------- 404 //-------------------------------------------------------------------------
405 405
406 'reseedCounter': function() { 406 'reseedCounter': function() {
407 return this._reseedCounter; 407 return this._reseedCounter;
408 }, 408 },
409 409
410 'incrementReseedCounter': function() { 410 'incrementReseedCounter': function() {
411 this._reseedCounter = this._reseedCounter +1; 411 this._reseedCounter = this._reseedCounter +1;
412 }, 412 },
413 413
414 //------------------------------------------------------------------------- 414 //-------------------------------------------------------------------------
415 415
416 'reseed': function() { 416 'reseed': function() {
417 varnewKeySeed; 417 varnewKeySeed;
418 var reseedCounter; 418 var reseedCounter;
419 varreseedCounterMask; 419 varreseedCounterMask;
420 var i, c; 420 var i, c;
421 421
422 newKeySeed = this.key(); 422 newKeySeed = this.key();
423 this.incrementReseedCounter(); 423 this.incrementReseedCounter();
424 reseedCounter = this.reseedCounter(); 424 reseedCounter = this.reseedCounter();
425 425
426 c = this.numberOfEntropyAccumulators(); 426 c = this.numberOfEntropyAccumulators();
427 reseedCounterMask = 0xffffffff >>> (32 - c); 427 reseedCounterMask = 0xffffffff >>> (32 - c);
428 for (i=0; i<c; i++) { 428 for (i=0; i<c; i++) {
429 if ((i == 0) || ((reseedCounter & (reseedCounterMask >>> (c - i))) == 0)) { 429 if ((i == 0) || ((reseedCounter & (reseedCounterMask >>> (c - i))) == 0)) {
430 newKeySeed.appendBlock(this.accumulators()[i].stack()); 430 newKeySeed.appendBlock(this.accumulators()[i].stack());
431 this.accumulators()[i].resetStack(); 431 this.accumulators()[i].resetStack();
432 } 432 }
433 } 433 }
434 434
435 if (reseedCounter == 1) { 435 if (reseedCounter == 1) {
436 c = this.randomnessSources().length; 436 c = this.randomnessSources().length;
437 for (i=0; i<c; i++) { 437 for (i=0; i<c; i++) {
438 this.randomnessSources()[i].setBoostMode(false); 438 this.randomnessSources()[i].setBoostMode(false);
439 } 439 }
440 } 440 }
441 441
442 this.setKey(Clipperz.Crypto.SHA.sha_d256(newKeySeed)); 442 this.setKey(Clipperz.Crypto.SHA.sha_d256(newKeySeed));
443 if (reseedCounter == 1) { 443 if (reseedCounter == 1) {
444Clipperz.log("### PRNG.readyToGenerateRandomBytes"); 444Clipperz.log("### PRNG.readyToGenerateRandomBytes");
445 MochiKit.Signal.signal(this, 'readyToGenerateRandomBytes'); 445 MochiKit.Signal.signal(this, 'readyToGenerateRandomBytes');
446 } 446 }
447 MochiKit.Signal.signal(this, 'reseeded'); 447 MochiKit.Signal.signal(this, 'reseeded');
448 }, 448 },
449 449
450 //------------------------------------------------------------------------- 450 //-------------------------------------------------------------------------
451 451
452 'isReadyToGenerateRandomValues': function() { 452 'isReadyToGenerateRandomValues': function() {
453 return this.reseedCounter() != 0; 453 return this.reseedCounter() != 0;
454 }, 454 },
455 455
456 //------------------------------------------------------------------------- 456 //-------------------------------------------------------------------------
457 457
458 'entropyLevel': function() { 458 'entropyLevel': function() {
459 return this.accumulators()[0].stack().length() + (this.reseedCounter() * this.firstPoolReseedLevel()); 459 return this.accumulators()[0].stack().length() + (this.reseedCounter() * this.firstPoolReseedLevel());
460 }, 460 },
461 461
462 //------------------------------------------------------------------------- 462 //-------------------------------------------------------------------------
463 463
464 'counter': function() { 464 'counter': function() {
465 return this._counter; 465 return this._counter;
466 }, 466 },
467 467
468 'incrementCounter': function() { 468 'incrementCounter': function() {
469 this._counter += 1; 469 this._counter += 1;
470 }, 470 },
471 471
472 'counterBlock': function() { 472 'counterBlock': function() {
473 var result; 473 var result;
474 474
475 result = new Clipperz.ByteArray().appendWords(this.counter(), 0, 0, 0); 475 result = new Clipperz.ByteArray().appendWords(this.counter(), 0, 0, 0);
476 476
477 return result; 477 return result;
478 }, 478 },
479 479
480 //------------------------------------------------------------------------- 480 //-------------------------------------------------------------------------
481 481
482 'getRandomBlock': function() { 482 'getRandomBlock': function() {
483 var result; 483 var result;
484 484
485 result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(this.aesKey(), this.counterBlock().arrayValues())); 485 result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(this.aesKey(), this.counterBlock().arrayValues()));
486 this.incrementCounter(); 486 this.incrementCounter();
487 487
488 return result; 488 return result;
489 }, 489 },
490 490
491 //------------------------------------------------------------------------- 491 //-------------------------------------------------------------------------
492 492
493 'getRandomBytes': function(aSize) { 493 'getRandomBytes': function(aSize) {
494 var result; 494 var result;
495 495
496 if (this.isReadyToGenerateRandomValues()) { 496 if (this.isReadyToGenerateRandomValues()) {
497 var i,c; 497 var i,c;
498 var newKey; 498 var newKey;
499 499
500 result = new Clipperz.ByteArray(); 500 result = new Clipperz.ByteArray();
501 501
502 c = Math.ceil(aSize / (128 / 8)); 502 c = Math.ceil(aSize / (128 / 8));
503 for (i=0; i<c; i++) { 503 for (i=0; i<c; i++) {
504 result.appendBlock(this.getRandomBlock()); 504 result.appendBlock(this.getRandomBlock());
505 } 505 }
506 506
507 if (result.length() != aSize) { 507 if (result.length() != aSize) {
508 result = result.split(0, aSize); 508 result = result.split(0, aSize);
509 } 509 }
510 510
511 newKey = this.getRandomBlock().appendBlock(this.getRandomBlock()); 511 newKey = this.getRandomBlock().appendBlock(this.getRandomBlock());
512 this.setKey(newKey); 512 this.setKey(newKey);
513 } else { 513 } else {
514Clipperz.logWarning("Fortuna generator has not enough entropy, yet!"); 514Clipperz.logWarning("Fortuna generator has not enough entropy, yet!");
515 throw Clipperz.Crypto.PRNG.exception.NotEnoughEntropy; 515 throw Clipperz.Crypto.PRNG.exception.NotEnoughEntropy;