|
@@ -79,10 +79,10 @@ sjcl.random = {
|
|
|
source = source || "user";
|
|
source = source || "user";
|
|
|
|
|
|
|
|
var id,
|
|
var id,
|
|
|
- i, ty = 0, tmp,
|
|
|
|
|
|
|
+ i, tmp,
|
|
|
t = (new Date()).valueOf(),
|
|
t = (new Date()).valueOf(),
|
|
|
robin = this._robins[source],
|
|
robin = this._robins[source],
|
|
|
- oldReady = this.isReady();
|
|
|
|
|
|
|
+ oldReady = this.isReady(), err = 0;
|
|
|
|
|
|
|
|
id = this._collectorIds[source];
|
|
id = this._collectorIds[source];
|
|
|
if (id === undefined) { id = this._collectorIds[source] = this._collectorIdNext ++; }
|
|
if (id === undefined) { id = this._collectorIds[source] = this._collectorIdNext ++; }
|
|
@@ -93,23 +93,35 @@ sjcl.random = {
|
|
|
switch(typeof(data)) {
|
|
switch(typeof(data)) {
|
|
|
|
|
|
|
|
case "number":
|
|
case "number":
|
|
|
- data=[data];
|
|
|
|
|
- ty=1;
|
|
|
|
|
|
|
+ if (estimatedEntropy === undefined) {
|
|
|
|
|
+ estimatedEntropy = 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ this._pools[robin].update([id,this._eventId++,1,estimatedEntropy,t,1,data|0]);
|
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
case "object":
|
|
case "object":
|
|
|
- if (estimatedEntropy === undefined) {
|
|
|
|
|
- /* horrible entropy estimator */
|
|
|
|
|
- estimatedEntropy = 0;
|
|
|
|
|
- for (i=0; i<data.length; i++) {
|
|
|
|
|
- tmp= data[i];
|
|
|
|
|
- while (tmp>0) {
|
|
|
|
|
- estimatedEntropy++;
|
|
|
|
|
- tmp = tmp >>> 1;
|
|
|
|
|
|
|
+ if (Object.prototype.toString.call(data) !== "[object Array]") {
|
|
|
|
|
+ err = 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ for (i=0; i<data.length && !err; i++) {
|
|
|
|
|
+ if (typeof(data[i]) != "number") {
|
|
|
|
|
+ err = 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!err) {
|
|
|
|
|
+ if (estimatedEntropy === undefined) {
|
|
|
|
|
+ /* horrible entropy estimator */
|
|
|
|
|
+ estimatedEntropy = 0;
|
|
|
|
|
+ for (i=0; i<data.length; i++) {
|
|
|
|
|
+ tmp= data[i];
|
|
|
|
|
+ while (tmp>0) {
|
|
|
|
|
+ estimatedEntropy++;
|
|
|
|
|
+ tmp = tmp >>> 1;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ this._pools[robin].update([id,this._eventId++,2,estimatedEntropy,t,data.length].concat(data));
|
|
|
}
|
|
}
|
|
|
- this._pools[robin].update([id,this._eventId++,ty||2,estimatedEntropy,t,data.length].concat(data));
|
|
|
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
case "string":
|
|
case "string":
|
|
@@ -125,8 +137,10 @@ sjcl.random = {
|
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
default:
|
|
|
-
|
|
|
|
|
- throw new sjcl.exception.bug("random: addEntropy only supports number, array or string");
|
|
|
|
|
|
|
+ err=1;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (err) {
|
|
|
|
|
+ throw new sjcl.exception.bug("random: addEntropy only supports number, array of numbers or string");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* record the new strength */
|
|
/* record the new strength */
|
|
@@ -342,8 +356,7 @@ sjcl.random = {
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
_loadTimeCollector: function (ev) {
|
|
_loadTimeCollector: function (ev) {
|
|
|
- var d = new Date();
|
|
|
|
|
- sjcl.random.addEntropy(d, 2, "loadtime");
|
|
|
|
|
|
|
+ sjcl.random.addEntropy((new Date()).valueOf(), 2, "loadtime");
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
_fireEvent: function (name, arg) {
|
|
_fireEvent: function (name, arg) {
|