GetRandom() * 5. openssl_random_pseudo_bytes() (absolute last resort) * * See ERRATA.md for our reasoning behind this particular order */ if (extension_loaded('libsodium')) { // See random_bytes_libsodium.php require_once $__DIR__.'/random_bytes_libsodium.php'; } if ( !function_exists('random_bytes') && DIRECTORY_SEPARATOR === '/' && @is_readable('/dev/urandom') ) { // DIRECTORY_SEPARATOR === '/' on Unix-like OSes -- this is a fast // way to exclude Windows. // // Error suppression on is_readable() in case of an open_basedir or // safe_mode failure. All we care about is whether or not we can // read it at this point. If the PHP environment is going to panic // over trying to see if the file can be read in the first place, // that is not helpful to us here. // See random_bytes_dev_urandom.php require_once $__DIR__.'/random_bytes_dev_urandom.php'; } if ( !function_exists('random_bytes') && PHP_VERSION_ID >= 50307 && extension_loaded('mcrypt') ) { // See random_bytes_mcrypt.php require_once $__DIR__.'/random_bytes_mcrypt.php'; } if ( !function_exists('random_bytes') && extension_loaded('com_dotnet') && class_exists('COM') ) { try { $RandomCompatCOMtest = new COM('CAPICOM.Utilities.1'); if (method_exists($RandomCompatCOMtest, 'GetRandom')) { // See random_bytes_com_dotnet.php require_once $__DIR__.'/random_bytes_com_dotnet.php'; } } catch (com_exception $e) { // Don't try to use it. } unset($RandomCompatCOMtest); } if ( !function_exists('random_bytes') && extension_loaded('openssl') && PHP_VERSION_ID >= 50300 ) { // See random_bytes_openssl.php require_once $__DIR__.'/random_bytes_openssl.php'; } if (!function_exists('random_bytes')) { /** * We don't have any more options, so let's throw an exception right now * and hope the developer won't let it fail silently. */ function random_bytes() { throw new Exception( 'There is no suitable CSPRNG installed on your system' ); } } } if (!function_exists('random_int')) { require_once $__DIR__.'/random_int.php'; } unset($__DIR__); }