wp/wp-includes/random_compat/random_bytes_mcrypt.php
changeset 9 177826044cd9
parent 7 cf61fcea0001
child 19 3d72ae0968f4
equal deleted inserted replaced
8:c7c34916027a 9:177826044cd9
     2 /**
     2 /**
     3  * Random_* Compatibility Library 
     3  * Random_* Compatibility Library 
     4  * for using the new PHP 7 random_* API in PHP 5 projects
     4  * for using the new PHP 7 random_* API in PHP 5 projects
     5  * 
     5  * 
     6  * The MIT License (MIT)
     6  * The MIT License (MIT)
     7  * 
     7  *
     8  * Copyright (c) 2015 Paragon Initiative Enterprises
     8  * Copyright (c) 2015 - 2017 Paragon Initiative Enterprises
     9  * 
     9  * 
    10  * Permission is hereby granted, free of charge, to any person obtaining a copy
    10  * Permission is hereby granted, free of charge, to any person obtaining a copy
    11  * of this software and associated documentation files (the "Software"), to deal
    11  * of this software and associated documentation files (the "Software"), to deal
    12  * in the Software without restriction, including without limitation the rights
    12  * in the Software without restriction, including without limitation the rights
    13  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    13  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    24  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    24  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    25  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    25  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    26  * SOFTWARE.
    26  * SOFTWARE.
    27  */
    27  */
    28 
    28 
       
    29 if (!is_callable('random_bytes')) {
       
    30     /**
       
    31      * Powered by ext/mcrypt (and thankfully NOT libmcrypt)
       
    32      *
       
    33      * @ref https://bugs.php.net/bug.php?id=55169
       
    34      * @ref https://github.com/php/php-src/blob/c568ffe5171d942161fc8dda066bce844bdef676/ext/mcrypt/mcrypt.c#L1321-L1386
       
    35      *
       
    36      * @param int $bytes
       
    37      *
       
    38      * @throws Exception
       
    39      *
       
    40      * @return string
       
    41      */
       
    42     function random_bytes($bytes)
       
    43     {
       
    44         try {
       
    45             $bytes = RandomCompat_intval($bytes);
       
    46         } catch (TypeError $ex) {
       
    47             throw new TypeError(
       
    48                 'random_bytes(): $bytes must be an integer'
       
    49             );
       
    50         }
    29 
    51 
    30 if ( ! is_callable( 'random_bytes' ) ):
    52         if ($bytes < 1) {
    31 /**
    53             throw new Error(
    32  * Powered by ext/mcrypt (and thankfully NOT libmcrypt)
    54                 'Length must be greater than 0'
    33  * 
    55             );
    34  * @ref https://bugs.php.net/bug.php?id=55169
    56         }
    35  * @ref https://github.com/php/php-src/blob/c568ffe5171d942161fc8dda066bce844bdef676/ext/mcrypt/mcrypt.c#L1321-L1386
    57 
    36  * 
    58         $buf = @mcrypt_create_iv($bytes, MCRYPT_DEV_URANDOM);
    37  * @param int $bytes
    59         if (
    38  * 
    60             $buf !== false
    39  * @throws Exception
    61             &&
    40  * 
    62             RandomCompat_strlen($buf) === $bytes
    41  * @return string
    63         ) {
    42  */
    64             /**
    43 function random_bytes($bytes)
    65              * Return our random entropy buffer here:
    44 {
    66              */
    45     try {
    67             return $buf;
    46         $bytes = RandomCompat_intval($bytes);
    68         }
    47     } catch (TypeError $ex) {
    69 
    48         throw new TypeError(
    70         /**
    49             'random_bytes(): $bytes must be an integer'
    71          * If we reach here, PHP has failed us.
       
    72          */
       
    73         throw new Exception(
       
    74             'Could not gather sufficient random data'
    50         );
    75         );
    51     }
    76     }
    52 
       
    53     if ($bytes < 1) {
       
    54         throw new Error(
       
    55             'Length must be greater than 0'
       
    56         );
       
    57     }
       
    58 
       
    59     $buf = @mcrypt_create_iv($bytes, MCRYPT_DEV_URANDOM);
       
    60     if (
       
    61         $buf !== false
       
    62         &&
       
    63         RandomCompat_strlen($buf) === $bytes
       
    64     ) {
       
    65         /**
       
    66          * Return our random entropy buffer here:
       
    67          */
       
    68         return $buf;
       
    69     }
       
    70 
       
    71     /**
       
    72      * If we reach here, PHP has failed us.
       
    73      */
       
    74     throw new Exception(
       
    75         'Could not gather sufficient random data'
       
    76     );
       
    77 }
    77 }
    78 endif;