summaryrefslogtreecommitdiff
path: root/frontend/beta
authorGiulio Cesare Solaroli <giulio.cesare@clipperz.com>2014-06-21 08:50:00 (UTC)
committer Giulio Cesare Solaroli <giulio.cesare@clipperz.com>2014-06-21 09:20:16 (UTC)
commit6dd16d9359e3a4dc306802588b09acd43947a606 (patch) (unidiff)
treef3ab7778e037e42cb47c810f9d435d40de5adf15 /frontend/beta
parenta6852c93138f3c4596fb4df8bce5b7d19ef50478 (diff)
downloadclipperz-6dd16d9359e3a4dc306802588b09acd43947a606.zip
clipperz-6dd16d9359e3a4dc306802588b09acd43947a606.tar.gz
clipperz-6dd16d9359e3a4dc306802588b09acd43947a606.tar.bz2
Inproved PRNG configuration
Diffstat (limited to 'frontend/beta') (more/less context) (ignore whitespace changes)
-rw-r--r--frontend/beta/js/Clipperz/Crypto/PRNG.js4
1 files changed, 2 insertions, 2 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
@@ -1,805 +1,805 @@
1/* 1/*
2 2
3Copyright 2008-2013 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz, the online password manager. 5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please 6For further information about its features and functionalities please
7refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
8 8
9* Clipperz is free software: you can redistribute it and/or modify it 9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published 10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or 11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version. 12 (at your option) any later version.
13 13
14* Clipperz is distributed in the hope that it will be useful, but 14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of 15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
18 18
19* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/. 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21 21
22*/ 22*/
23 23
24try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { 24try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!"; 25 throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!";
26} 26}
27 27
28try { if (typeof(Clipperz.Crypto.SHA) == 'undefined') { throw ""; }} catch (e) { 28try { if (typeof(Clipperz.Crypto.SHA) == 'undefined') { throw ""; }} catch (e) {
29 throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.SHA!"; 29 throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.SHA!";
30} 30}
31 31
32try { if (typeof(Clipperz.Crypto.AES) == 'undefined') { throw ""; }} catch (e) { 32try { if (typeof(Clipperz.Crypto.AES) == 'undefined') { throw ""; }} catch (e) {
33 throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.AES!"; 33 throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.AES!";
34} 34}
35 35
36if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { Clipperz.Crypto.PRNG = {}; } 36if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { Clipperz.Crypto.PRNG = {}; }
37 37
38//############################################################################# 38//#############################################################################
39 39
40Clipperz.Crypto.PRNG.EntropyAccumulator = function(args) { 40Clipperz.Crypto.PRNG.EntropyAccumulator = function(args) {
41 args = args || {}; 41 args = args || {};
42 //MochiKit.Base.bindMethods(this); 42 //MochiKit.Base.bindMethods(this);
43 43
44 this._stack = new Clipperz.ByteArray(); 44 this._stack = new Clipperz.ByteArray();
45 this._maxStackLengthBeforeHashing = args.maxStackLengthBeforeHashing || 256; 45 this._maxStackLengthBeforeHashing = args.maxStackLengthBeforeHashing || 256;
46 return this; 46 return this;
47} 47}
48 48
49Clipperz.Crypto.PRNG.EntropyAccumulator.prototype = MochiKit.Base.update(null, { 49Clipperz.Crypto.PRNG.EntropyAccumulator.prototype = MochiKit.Base.update(null, {
50 50
51 'toString': function() { 51 'toString': function() {
52 return "Clipperz.Crypto.PRNG.EntropyAccumulator"; 52 return "Clipperz.Crypto.PRNG.EntropyAccumulator";
53 }, 53 },
54 54
55 //------------------------------------------------------------------------- 55 //-------------------------------------------------------------------------
56 56
57 'stack': function() { 57 'stack': function() {
58 return this._stack; 58 return this._stack;
59 }, 59 },
60 60
61 'setStack': function(aValue) { 61 'setStack': function(aValue) {
62 this._stack = aValue; 62 this._stack = aValue;
63 }, 63 },
64 64
65 'resetStack': function() { 65 'resetStack': function() {
66 this.stack().reset(); 66 this.stack().reset();
67 }, 67 },
68 68
69 'maxStackLengthBeforeHashing': function() { 69 'maxStackLengthBeforeHashing': function() {
70 return this._maxStackLengthBeforeHashing; 70 return this._maxStackLengthBeforeHashing;
71 }, 71 },
72 72
73 //------------------------------------------------------------------------- 73 //-------------------------------------------------------------------------
74 74
75 'addRandomByte': function(aValue) { 75 'addRandomByte': function(aValue) {
76 this.stack().appendByte(aValue); 76 this.stack().appendByte(aValue);
77 77
78 if (this.stack().length() > this.maxStackLengthBeforeHashing()) { 78 if (this.stack().length() > this.maxStackLengthBeforeHashing()) {
79 this.setStack(Clipperz.Crypto.SHA.sha_d256(this.stack())); 79 this.setStack(Clipperz.Crypto.SHA.sha_d256(this.stack()));
80 } 80 }
81 }, 81 },
82 82
83 //------------------------------------------------------------------------- 83 //-------------------------------------------------------------------------
84 __syntaxFix__: "syntax fix" 84 __syntaxFix__: "syntax fix"
85}); 85});
86 86
87//############################################################################# 87//#############################################################################
88 88
89Clipperz.Crypto.PRNG.RandomnessSource = function(args) { 89Clipperz.Crypto.PRNG.RandomnessSource = function(args) {
90 args = args || {}; 90 args = args || {};
91 MochiKit.Base.bindMethods(this); 91 MochiKit.Base.bindMethods(this);
92 92
93 this._generator = args.generator || null; 93 this._generator = args.generator || null;
94 this._sourceId = args.sourceId || null; 94 this._sourceId = args.sourceId || null;
95 this._boostMode = args.boostMode || false; 95 this._boostMode = args.boostMode || false;
96 96
97 this._nextPoolIndex = 0; 97 this._nextPoolIndex = 0;
98 98
99 return this; 99 return this;
100} 100}
101 101
102Clipperz.Crypto.PRNG.RandomnessSource.prototype = MochiKit.Base.update(null, { 102Clipperz.Crypto.PRNG.RandomnessSource.prototype = MochiKit.Base.update(null, {
103 103
104 'generator': function() { 104 'generator': function() {
105 return this._generator; 105 return this._generator;
106 }, 106 },
107 107
108 'setGenerator': function(aValue) { 108 'setGenerator': function(aValue) {
109 this._generator = aValue; 109 this._generator = aValue;
110 }, 110 },
111 111
112 //------------------------------------------------------------------------- 112 //-------------------------------------------------------------------------
113 113
114 'boostMode': function() { 114 'boostMode': function() {
115 return this._boostMode; 115 return this._boostMode;
116 }, 116 },
117 117
118 'setBoostMode': function(aValue) { 118 'setBoostMode': function(aValue) {
119 this._boostMode = aValue; 119 this._boostMode = aValue;
120 }, 120 },
121 121
122 //------------------------------------------------------------------------- 122 //-------------------------------------------------------------------------
123 123
124 'sourceId': function() { 124 'sourceId': function() {
125 return this._sourceId; 125 return this._sourceId;
126 }, 126 },
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;
514 } 514 }
515 515
516 return result; 516 return result;
517 }, 517 },
518 518
519 //------------------------------------------------------------------------- 519 //-------------------------------------------------------------------------
520 520
521 'addRandomByte': function(aSourceId, aPoolId, aRandomValue) { 521 'addRandomByte': function(aSourceId, aPoolId, aRandomValue) {
522 varselectedAccumulator; 522 varselectedAccumulator;
523 523
524 selectedAccumulator = this.accumulators()[aPoolId]; 524 selectedAccumulator = this.accumulators()[aPoolId];
525 selectedAccumulator.addRandomByte(aRandomValue); 525 selectedAccumulator.addRandomByte(aRandomValue);
526 526
527 if (aPoolId == 0) { 527 if (aPoolId == 0) {
528 MochiKit.Signal.signal(this, 'addedRandomByte') 528 MochiKit.Signal.signal(this, 'addedRandomByte')
529 if (selectedAccumulator.stack().length() > this.firstPoolReseedLevel()) { 529 if (selectedAccumulator.stack().length() > this.firstPoolReseedLevel()) {
530 this.reseed(); 530 this.reseed();
531 } 531 }
532 } 532 }
533 }, 533 },
534 534
535 //------------------------------------------------------------------------- 535 //-------------------------------------------------------------------------
536 536
537 'numberOfEntropyAccumulators': function() { 537 'numberOfEntropyAccumulators': function() {
538 return this._numberOfEntropyAccumulators; 538 return this._numberOfEntropyAccumulators;
539 }, 539 },
540 540
541 //------------------------------------------------------------------------- 541 //-------------------------------------------------------------------------
542 542
543 'randomnessSources': function() { 543 'randomnessSources': function() {
544 return this._randomnessSources; 544 return this._randomnessSources;
545 }, 545 },
546 546
547 'addRandomnessSource': function(aRandomnessSource) { 547 'addRandomnessSource': function(aRandomnessSource) {
548 aRandomnessSource.setGenerator(this); 548 aRandomnessSource.setGenerator(this);
549 aRandomnessSource.setSourceId(this.randomnessSources().length); 549 aRandomnessSource.setSourceId(this.randomnessSources().length);
550 this.randomnessSources().push(aRandomnessSource); 550 this.randomnessSources().push(aRandomnessSource);
551 551
552 if (this.isReadyToGenerateRandomValues() == false) { 552 if (this.isReadyToGenerateRandomValues() == false) {
553 aRandomnessSource.setBoostMode(true); 553 aRandomnessSource.setBoostMode(true);
554 } 554 }
555 }, 555 },
556 556
557 //------------------------------------------------------------------------- 557 //-------------------------------------------------------------------------
558 558
559 'deferredEntropyCollection': function(aValue) { 559 'deferredEntropyCollection': function(aValue) {
560 var result; 560 var result;
561 561
562 562
563 if (this.isReadyToGenerateRandomValues()) { 563 if (this.isReadyToGenerateRandomValues()) {
564 result = aValue; 564 result = aValue;
565 } else { 565 } else {
566 var deferredResult; 566 var deferredResult;
567 567
568 Clipperz.NotificationCenter.notify(this, 'updatedProgressState', 'collectingEntropy', true); 568 Clipperz.NotificationCenter.notify(this, 'updatedProgressState', 'collectingEntropy', true);
569 569
570 deferredResult = new MochiKit.Async.Deferred(); 570 deferredResult = new MochiKit.Async.Deferred();
571 deferredResult.addCallback(MochiKit.Base.partial(MochiKit.Async.succeed, aValue)); 571 deferredResult.addCallback(MochiKit.Base.partial(MochiKit.Async.succeed, aValue));
572 MochiKit.Signal.connect(this, 572 MochiKit.Signal.connect(this,
573 'readyToGenerateRandomBytes', 573 'readyToGenerateRandomBytes',
574 deferredResult, 574 deferredResult,
575 'callback'); 575 'callback');
576 576
577 result = deferredResult; 577 result = deferredResult;
578 } 578 }
579 579
580 return result; 580 return result;
581 }, 581 },
582 582
583 //------------------------------------------------------------------------- 583 //-------------------------------------------------------------------------
584 584
585 'fastEntropyAccumulationForTestingPurpose': function() { 585 'fastEntropyAccumulationForTestingPurpose': function() {
586 while (! this.isReadyToGenerateRandomValues()) { 586 while (! this.isReadyToGenerateRandomValues()) {
587 this.addRandomByte(Math.floor(Math.random() * 32), Math.floor(Math.random() * 32), Math.floor(Math.random() * 256)); 587 this.addRandomByte(Math.floor(Math.random() * 32), Math.floor(Math.random() * 32), Math.floor(Math.random() * 256));
588 } 588 }
589 }, 589 },
590 590
591 //------------------------------------------------------------------------- 591 //-------------------------------------------------------------------------
592/* 592/*
593 'dump': function(appendToDoc) { 593 'dump': function(appendToDoc) {
594 var tbl; 594 var tbl;
595 var i,c; 595 var i,c;
596 596
597 tbl = document.createElement("table"); 597 tbl = document.createElement("table");
598 tbl.border = 0; 598 tbl.border = 0;
599 with (tbl.style) { 599 with (tbl.style) {
600 border = "1px solid lightgrey"; 600 border = "1px solid lightgrey";
601 fontFamily = 'Helvetica, Arial, sans-serif'; 601 fontFamily = 'Helvetica, Arial, sans-serif';
602 fontSize = '8pt'; 602 fontSize = '8pt';
603 //borderCollapse = "collapse"; 603 //borderCollapse = "collapse";
604 } 604 }
605 var hdr = tbl.createTHead(); 605 var hdr = tbl.createTHead();
606 var hdrtr = hdr.insertRow(0); 606 var hdrtr = hdr.insertRow(0);
607 // document.createElement("tr"); 607 // document.createElement("tr");
608 { 608 {
609 var ntd; 609 var ntd;
610 610
611 ntd = hdrtr.insertCell(0); 611 ntd = hdrtr.insertCell(0);
612 ntd.style.borderBottom = "1px solid lightgrey"; 612 ntd.style.borderBottom = "1px solid lightgrey";
613 ntd.style.borderRight = "1px solid lightgrey"; 613 ntd.style.borderRight = "1px solid lightgrey";
614 ntd.appendChild(document.createTextNode("#")); 614 ntd.appendChild(document.createTextNode("#"));
615 615
616 ntd = hdrtr.insertCell(1); 616 ntd = hdrtr.insertCell(1);
617 ntd.style.borderBottom = "1px solid lightgrey"; 617 ntd.style.borderBottom = "1px solid lightgrey";
618 ntd.style.borderRight = "1px solid lightgrey"; 618 ntd.style.borderRight = "1px solid lightgrey";
619 ntd.appendChild(document.createTextNode("s")); 619 ntd.appendChild(document.createTextNode("s"));
620 620
621 ntd = hdrtr.insertCell(2); 621 ntd = hdrtr.insertCell(2);
622 ntd.colSpan = this.firstPoolReseedLevel(); 622 ntd.colSpan = this.firstPoolReseedLevel();
623 ntd.style.borderBottom = "1px solid lightgrey"; 623 ntd.style.borderBottom = "1px solid lightgrey";
624 ntd.style.borderRight = "1px solid lightgrey"; 624 ntd.style.borderRight = "1px solid lightgrey";
625 ntd.appendChild(document.createTextNode("base values")); 625 ntd.appendChild(document.createTextNode("base values"));
626 626
627 ntd = hdrtr.insertCell(3); 627 ntd = hdrtr.insertCell(3);
628 ntd.colSpan = 20; 628 ntd.colSpan = 20;
629 ntd.style.borderBottom = "1px solid lightgrey"; 629 ntd.style.borderBottom = "1px solid lightgrey";
630 ntd.appendChild(document.createTextNode("extra values")); 630 ntd.appendChild(document.createTextNode("extra values"));
631 631
632 } 632 }
633 633
634 c = this.accumulators().length; 634 c = this.accumulators().length;
635 for (i=0; i<c ; i++) { 635 for (i=0; i<c ; i++) {
636 varcurrentAccumulator; 636 varcurrentAccumulator;
637 var bdytr; 637 var bdytr;
638 var bdytd; 638 var bdytd;
639 var ii, cc; 639 var ii, cc;
640 640
641 currentAccumulator = this.accumulators()[i] 641 currentAccumulator = this.accumulators()[i]
642 642
643 bdytr = tbl.insertRow(true); 643 bdytr = tbl.insertRow(true);
644 644
645 bdytd = bdytr.insertCell(0); 645 bdytd = bdytr.insertCell(0);
646 bdytd.style.borderRight = "1px solid lightgrey"; 646 bdytd.style.borderRight = "1px solid lightgrey";
647 bdytd.style.color = "lightgrey"; 647 bdytd.style.color = "lightgrey";
648 bdytd.appendChild(document.createTextNode("" + i)); 648 bdytd.appendChild(document.createTextNode("" + i));
649 649
650 bdytd = bdytr.insertCell(1); 650 bdytd = bdytr.insertCell(1);
651 bdytd.style.borderRight = "1px solid lightgrey"; 651 bdytd.style.borderRight = "1px solid lightgrey";
652 bdytd.style.color = "gray"; 652 bdytd.style.color = "gray";
653 bdytd.appendChild(document.createTextNode("" + currentAccumulator.stack().length())); 653 bdytd.appendChild(document.createTextNode("" + currentAccumulator.stack().length()));
654 654
655 655
656 cc = Math.max(currentAccumulator.stack().length(), this.firstPoolReseedLevel()); 656 cc = Math.max(currentAccumulator.stack().length(), this.firstPoolReseedLevel());
657 for (ii=0; ii<cc; ii++) { 657 for (ii=0; ii<cc; ii++) {
658 var cellText; 658 var cellText;
659 659
660 bdytd = bdytr.insertCell(ii + 2); 660 bdytd = bdytr.insertCell(ii + 2);
661 661
662 if (ii < currentAccumulator.stack().length()) { 662 if (ii < currentAccumulator.stack().length()) {
663 cellText = Clipperz.ByteArray.byteToHex(currentAccumulator.stack().byteAtIndex(ii)); 663 cellText = Clipperz.ByteArray.byteToHex(currentAccumulator.stack().byteAtIndex(ii));
664 } else { 664 } else {
665 cellText = "_"; 665 cellText = "_";
666 } 666 }
667 667
668 if (ii == (this.firstPoolReseedLevel() - 1)) { 668 if (ii == (this.firstPoolReseedLevel() - 1)) {
669 bdytd.style.borderRight = "1px solid lightgrey"; 669 bdytd.style.borderRight = "1px solid lightgrey";
670 } 670 }
671 671
672 bdytd.appendChild(document.createTextNode(cellText)); 672 bdytd.appendChild(document.createTextNode(cellText));
673 } 673 }
674 674
675 } 675 }
676 676
677 677
678 if (appendToDoc) { 678 if (appendToDoc) {
679 var ne = document.createElement("div"); 679 var ne = document.createElement("div");
680 ne.id = "entropyGeneratorStatus"; 680 ne.id = "entropyGeneratorStatus";
681 with (ne.style) { 681 with (ne.style) {
682 fontFamily = "Courier New, monospace"; 682 fontFamily = "Courier New, monospace";
683 fontSize = "12px"; 683 fontSize = "12px";
684 lineHeight = "16px"; 684 lineHeight = "16px";
685 borderTop = "1px solid black"; 685 borderTop = "1px solid black";
686 padding = "10px"; 686 padding = "10px";
687 } 687 }
688 if (document.getElementById(ne.id)) { 688 if (document.getElementById(ne.id)) {
689 MochiKit.DOM.swapDOM(ne.id, ne); 689 MochiKit.DOM.swapDOM(ne.id, ne);
690 } else { 690 } else {
691 document.body.appendChild(ne); 691 document.body.appendChild(ne);
692 } 692 }
693 ne.appendChild(tbl); 693 ne.appendChild(tbl);
694 } 694 }
695 695
696 return tbl; 696 return tbl;
697 }, 697 },
698*/ 698*/
699 //----------------------------------------------------------------------------- 699 //-----------------------------------------------------------------------------
700 __syntaxFix__: "syntax fix" 700 __syntaxFix__: "syntax fix"
701}); 701});
702 702
703//############################################################################# 703//#############################################################################
704 704
705Clipperz.Crypto.PRNG.Random = function(args) { 705Clipperz.Crypto.PRNG.Random = function(args) {
706 args = args || {}; 706 args = args || {};
707 //MochiKit.Base.bindMethods(this); 707 //MochiKit.Base.bindMethods(this);
708 708
709 return this; 709 return this;
710} 710}
711 711
712Clipperz.Crypto.PRNG.Random.prototype = MochiKit.Base.update(null, { 712Clipperz.Crypto.PRNG.Random.prototype = MochiKit.Base.update(null, {
713 713
714 'toString': function() { 714 'toString': function() {
715 return "Clipperz.Crypto.PRNG.Random"; 715 return "Clipperz.Crypto.PRNG.Random";
716 }, 716 },
717 717
718 //------------------------------------------------------------------------- 718 //-------------------------------------------------------------------------
719 719
720 'getRandomBytes': function(aSize) { 720 'getRandomBytes': function(aSize) {
721//Clipperz.Profile.start("Clipperz.Crypto.PRNG.Random.getRandomBytes"); 721//Clipperz.Profile.start("Clipperz.Crypto.PRNG.Random.getRandomBytes");
722 varresult; 722 varresult;
723 var i,c; 723 var i,c;
724 724
725 result = new Clipperz.ByteArray() 725 result = new Clipperz.ByteArray()
726 c = aSize || 1; 726 c = aSize || 1;
727 for (i=0; i<c; i++) { 727 for (i=0; i<c; i++) {
728 result.appendByte((Math.random()*255) & 0xff); 728 result.appendByte((Math.random()*255) & 0xff);
729 } 729 }
730 730
731//Clipperz.Profile.stop("Clipperz.Crypto.PRNG.Random.getRandomBytes"); 731//Clipperz.Profile.stop("Clipperz.Crypto.PRNG.Random.getRandomBytes");
732 return result; 732 return result;
733 }, 733 },
734 734
735 //------------------------------------------------------------------------- 735 //-------------------------------------------------------------------------
736 __syntaxFix__: "syntax fix" 736 __syntaxFix__: "syntax fix"
737}); 737});
738 738
739//############################################################################# 739//#############################################################################
740 740
741_clipperz_crypt_prng_defaultPRNG = null; 741_clipperz_crypt_prng_defaultPRNG = null;
742 742
743Clipperz.Crypto.PRNG.defaultRandomGenerator = function() { 743Clipperz.Crypto.PRNG.defaultRandomGenerator = function() {
744 if (_clipperz_crypt_prng_defaultPRNG == null) { 744 if (_clipperz_crypt_prng_defaultPRNG == null) {
745 _clipperz_crypt_prng_defaultPRNG = new Clipperz.Crypto.PRNG.Fortuna(); 745 _clipperz_crypt_prng_defaultPRNG = new Clipperz.Crypto.PRNG.Fortuna();
746 746
747 //............................................................. 747 //.............................................................
748 // 748 //
749 // TimeRandomnessSource 749 // TimeRandomnessSource
750 // 750 //
751 //............................................................. 751 //.............................................................
752 { 752 {
753 var newRandomnessSource; 753 var newRandomnessSource;
754 754
755 newRandomnessSource = new Clipperz.Crypto.PRNG.TimeRandomnessSource({intervalTime:111}); 755 newRandomnessSource = new Clipperz.Crypto.PRNG.TimeRandomnessSource({intervalTime:111});
756 _clipperz_crypt_prng_defaultPRNG.addRandomnessSource(newRandomnessSource); 756 _clipperz_crypt_prng_defaultPRNG.addRandomnessSource(newRandomnessSource);
757 } 757 }
758 758
759 //............................................................. 759 //.............................................................
760 // 760 //
761 // MouseRandomnessSource 761 // MouseRandomnessSource
762 // 762 //
763 //............................................................. 763 //.............................................................
764 { 764 {
765 varnewRandomnessSource; 765 varnewRandomnessSource;
766 766
767 newRandomnessSource = new Clipperz.Crypto.PRNG.MouseRandomnessSource(); 767 newRandomnessSource = new Clipperz.Crypto.PRNG.MouseRandomnessSource();
768 _clipperz_crypt_prng_defaultPRNG.addRandomnessSource(newRandomnessSource); 768 _clipperz_crypt_prng_defaultPRNG.addRandomnessSource(newRandomnessSource);
769 } 769 }
770 770
771 //............................................................. 771 //.............................................................
772 // 772 //
773 // CryptoRandomRandomnessSource 773 // CryptoRandomRandomnessSource
774 // 774 //
775 //............................................................. 775 //.............................................................
776 { 776 {
777 varnewRandomnessSource; 777 varnewRandomnessSource;
778 varbrowserCrypto; 778 varbrowserCrypto;
779 779
780 if (window.crypto && window.crypto.getRandomValues) { 780 if (window.crypto && window.crypto.getRandomValues) {
781 browserCrypto = window.crypto; 781 browserCrypto = window.crypto;
782 } else if (window.msCrypto && window.msCrypto.getRandomValues) { 782 } else if (window.msCrypto && window.msCrypto.getRandomValues) {
783 browserCrypto = window.msCrypto; 783 browserCrypto = window.msCrypto;
784 } else { 784 } else {
785 browserCrypto = null; 785 browserCrypto = null;
786 } 786 }
787 787
788 if (browserCrypto != null) { 788 if (browserCrypto != null) {
789 newRandomnessSource = new Clipperz.Crypto.PRNG.CryptoRandomRandomnessSource({'browserCrypto':browserCrypto}); 789 newRandomnessSource = new Clipperz.Crypto.PRNG.CryptoRandomRandomnessSource({'browserCrypto':browserCrypto});
790 _clipperz_crypt_prng_defaultPRNG.addRandomnessSource(newRandomnessSource); 790 _clipperz_crypt_prng_defaultPRNG.addRandomnessSource(newRandomnessSource);
791 } 791 }
792 } 792 }
793 } 793 }
794 794
795 return _clipperz_crypt_prng_defaultPRNG; 795 return _clipperz_crypt_prng_defaultPRNG;
796}; 796};
797 797
798//############################################################################# 798//#############################################################################
799 799
800Clipperz.Crypto.PRNG.exception = { 800Clipperz.Crypto.PRNG.exception = {
801 NotEnoughEntropy: new MochiKit.Base.NamedError("Clipperz.Crypto.PRNG.exception.NotEnoughEntropy") 801 NotEnoughEntropy: new MochiKit.Base.NamedError("Clipperz.Crypto.PRNG.exception.NotEnoughEntropy")
802}; 802};
803 803
804 804
805MochiKit.DOM.addLoadEvent(Clipperz.Crypto.PRNG.defaultRandomGenerator); 805MochiKit.DOM.addLoadEvent(Clipperz.Crypto.PRNG.defaultRandomGenerator);