rfc:improve_predictable_prng_random

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revisionBoth sides next revision
rfc:improve_predictable_prng_random [2017/02/03 04:34] – Fix function signature yohgakirfc:improve_predictable_prng_random [2017/02/03 05:22] – Add reseed logic yohgaki
Line 105: Line 105:
     public function getBytes(int $length); // Raw bytes     public function getBytes(int $length); // Raw bytes
     public function getString(int $length, int $bits = 6); // String [0-9a-zA-Z,-]+     public function getString(int $length, int $bits = 6); // String [0-9a-zA-Z,-]+
-    public function seed($seed = NULL); // No use with CS RNG, return TRUE always+    public function seed($seed = NULL); // No use with CS RNG, raise exception
-    public function getState(); // Return string representation PRNG state. No use with CS RNG, return NULL+    public function getState(); // Return string representation PRNG state. No use with CS RNG, raise exception
-    public function setState(string $state); // Set PRNG state. No use with CS RNG, return TRUE always+    public function setState(string $state); // Set PRNG state. No use with CS RNG, raise exception
-    public function getCount(); // No use with CS RNG, return 0 always+    public function getCount(); // No use with CS RNG, raise exception
-    public function getReseedCycle(); // No use with CS RNG, return 0 always+    public function getReseedCycle(); // No use with CS RNG, raise exception
-    public function setReseedCycle(int $count); // No use with CS RNG, return TRUE always.+    public function setReseedCycle(int $count); // No use with CS RNG, raise exception.
 } }
  
Line 130: Line 130:
     public function __construct($seed = NULL) {     public function __construct($seed = NULL) {
       $this->seed($seed);       $this->seed($seed);
 +    }
 +
 +    private reseed() {
 +      $this->count++;
 +      if ($this->reseed && !($this->count % $this->reseed)) {
 +        $this->seed();
 +      }
     }     }
          
     public function getInt($min = NULL, $max = NULL) {     public function getInt($min = NULL, $max = NULL) {
       assert($min <= $max);       assert($min <= $max);
 +      $this->reseed();
       if ($min && $max) {       if ($min && $max) {
         return mt_rand($min, $max);         return mt_rand($min, $max);
Line 149: Line 157:
          
     public function getBytes(int $length) {     public function getBytes(int $length) {
-      // Return raw random bytes +      // Return raw random bytes. 3 out of 4 bytes are used not to disclose full PRNG state
     }     }
          
Line 163: Line 171:
         // Update state by user seed         // Update state by user seed
         mt_srand($seed);         mt_srand($seed);
 +        $this->reseed = 0;
       } else {       } else {
         // Seed by system generated random value         // Seed by system generated random value
rfc/improve_predictable_prng_random.txt · Last modified: 2018/03/01 23:13 by carusogabriel