public function testBias() { $this->markTestSkipped('This test can fail randomly; only enable it when needed.'); // Populate: $buffer = array_fill(0, 10, 0); // Perform the experiment: for ($i = 0; $i < 5000; ++$i) { // Increase a random index by 1 $j = \Resonantcore\Lib\Secure::random(0, 9); ++$buffer[$j]; } var_dump($buffer); // Analyze the results: for ($i = 0; $i < 10; ++$i) { // If any of these are 0, then our RNG is failing us $this->assertNotEquals($buffer[$i], 0); } }
/** * Generate, store, and return the index and token * * @return array [string, string] */ protected static function generateToken() { $index = \base64_encode(Resonant\Secure::random_bytes(18)); $token = \base64_encode(Resonant\Secure::random_bytes(32)); $_SESSION[self::SESSION_INDEX][$index] = ['created' => \intval(\date('YmdHis')), 'uri' => isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $_SERVER['SCRIPT_NAME'], 'token' => $token]; self::recycleTokens(); return [$index, $token]; }
echo "\n## random(\$min, \$max)\n"; $charset = array_merge(range('a', 'z'), range('2', '7')); $buffer = ''; for ($i = 0; $i < 16; ++$i) { // Get a random index $n = \Resonantcore\Lib\Secure::random(0, 31); // Append a random character from $charset to buffer $buffer .= $charset[$n]; } echo $buffer . "\n"; unset($buffer); /* Secure::random_bytes($num) */ echo "\n## random_bytes(\$num)\n"; echo base64_encode(\Resonantcore\Lib\Secure::random_bytes(32)) . "\n"; /* Secure::noHTML($str) */ echo "\n## noHTML(\$str)\n"; $buffer = \Resonantcore\Lib\Secure::noHTML('<br />'); if ($buffer === '<br />') { echo "No HTML succeeded!\n"; } unset($buffer); /* Secure::file_valid($file, $jail_dir) */ echo "\n## file_valid(\$file, \$jail_dir)\n"; $buffer = \Resonantcore\Lib\Secure::file_valid($_SERVER['PHP_SELF'], BASE); var_dump($buffer); unset($buffer); /* Secure::random_positive_int() */ echo "\n## random_positive_int()\n"; $buffer = \Resonantcore\Lib\Secure::random_positive_int(); var_dump($buffer); unset($buffer);