Просмотр исходного кода

sjcl.random.addEntropy():
* Fixed bug: when data is a number, it is now added to this._pools
* Fixed bug: throws an exception when data is an object but not an array of numbers
* Removed unused variable "ty"

sjcl.random._loadTimeCollector():
* Fixed bug: now passes a number into sjcl.random.addEntropy() instead of an object

unknown 14 лет назад
Родитель
Сommit
8bf8bbbf3c
1 измененных файлов с 30 добавлено и 17 удалено
  1. 30 17
      core/random.js

+ 30 - 17
core/random.js

@@ -79,10 +79,10 @@ sjcl.random = {
     source = source || "user";
   
     var id,
-      i, ty = 0, tmp,
+      i, tmp,
       t = (new Date()).valueOf(),
       robin = this._robins[source],
-      oldReady = this.isReady();
+      oldReady = this.isReady(), err = 0;
       
     id = this._collectorIds[source];
     if (id === undefined) { id = this._collectorIds[source] = this._collectorIdNext ++; }
@@ -93,23 +93,35 @@ sjcl.random = {
     switch(typeof(data)) {
       
     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;
       
     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;
       
     case "string":
@@ -125,8 +137,10 @@ sjcl.random = {
       break;
       
     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 */
@@ -342,8 +356,7 @@ sjcl.random = {
   },
   
   _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) {