2016-04-20 09:56:34 -07:00
< ? php
/**
2019-01-24 08:00:03 +00:00
* Random_ * Compatibility Library
2016-04-20 09:56:34 -07:00
* for using the new PHP 7 random_ * API in PHP 5 projects
2019-01-24 08:00:03 +00:00
*
2016-04-20 09:56:34 -07:00
* The MIT License ( MIT )
2017-04-13 15:53:35 +01:00
*
2018-11-23 12:29:20 +00:00
* Copyright ( c ) 2015 - 2018 Paragon Initiative Enterprises
2019-01-24 08:00:03 +00:00
*
2016-04-20 09:56:34 -07:00
* Permission is hereby granted , free of charge , to any person obtaining a copy
* of this software and associated documentation files ( the " Software " ), to deal
* in the Software without restriction , including without limitation the rights
* to use , copy , modify , merge , publish , distribute , sublicense , and / or sell
* copies of the Software , and to permit persons to whom the Software is
* furnished to do so , subject to the following conditions :
2019-01-24 08:00:03 +00:00
*
2016-04-20 09:56:34 -07:00
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software .
2019-01-24 08:00:03 +00:00
*
2016-04-20 09:56:34 -07:00
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
* LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM ,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE .
*/
2017-04-13 15:53:35 +01:00
if ( ! is_callable ( 'random_bytes' )) {
2016-04-20 09:56:34 -07:00
/**
2017-04-13 15:53:35 +01:00
* If the libsodium PHP extension is loaded , we ' ll use it above any other
* solution .
*
* libsodium - php project :
* @ ref https :// github . com / jedisct1 / libsodium - php
*
* @ param int $bytes
*
* @ throws Exception
*
* @ return string
2016-04-20 09:56:34 -07:00
*/
2017-04-13 15:53:35 +01:00
function random_bytes ( $bytes )
{
try {
2018-11-23 12:29:20 +00:00
/** @var int $bytes */
2017-04-13 15:53:35 +01:00
$bytes = RandomCompat_intval ( $bytes );
} catch ( TypeError $ex ) {
throw new TypeError (
'random_bytes(): $bytes must be an integer'
);
2016-04-20 09:56:34 -07:00
}
2017-04-13 15:53:35 +01:00
if ( $bytes < 1 ) {
throw new Error (
'Length must be greater than 0'
);
2016-04-20 09:56:34 -07:00
}
2017-04-13 15:53:35 +01:00
/**
* \Sodium\randombytes_buf () doesn ' t allow more than 2147483647 bytes to be
* generated in one invocation .
*/
2018-11-23 12:29:20 +00:00
/** @var string|bool $buf */
2017-04-13 15:53:35 +01:00
if ( $bytes > 2147483647 ) {
$buf = '' ;
for ( $i = 0 ; $i < $bytes ; $i += 1073741824 ) {
$n = ( $bytes - $i ) > 1073741824
? 1073741824
: $bytes - $i ;
$buf .= \Sodium\randombytes_buf ( $n );
}
} else {
2018-11-23 12:29:20 +00:00
/** @var string|bool $buf */
2017-04-13 15:53:35 +01:00
$buf = \Sodium\randombytes_buf ( $bytes );
}
2018-11-23 12:29:20 +00:00
if ( is_string ( $buf )) {
2017-04-13 15:53:35 +01:00
if ( RandomCompat_strlen ( $buf ) === $bytes ) {
return $buf ;
}
}
/**
* If we reach here , PHP has failed us .
*/
throw new Exception (
'Could not gather sufficient random data'
);
}
2016-04-20 09:56:34 -07:00
}