wp/wp-includes/random_compat/random_bytes_libsodium_legacy.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' ) ):
    29 if (!is_callable('random_bytes')) {
    30 /**
    30     /**
    31  * If the libsodium PHP extension is loaded, we'll use it above any other
    31      * If the libsodium PHP extension is loaded, we'll use it above any other
    32  * solution.
    32      * solution.
    33  *
    33      *
    34  * libsodium-php project:
    34      * libsodium-php project:
    35  * @ref https://github.com/jedisct1/libsodium-php
    35      * @ref https://github.com/jedisct1/libsodium-php
    36  *
    36      *
    37  * @param int $bytes
    37      * @param int $bytes
    38  *
    38      *
    39  * @throws Exception
    39      * @throws Exception
    40  *
    40      *
    41  * @return string
    41      * @return string
    42  */
    42      */
    43 function random_bytes($bytes)
    43     function random_bytes($bytes)
    44 {
    44     {
    45     try {
    45         try {
    46         $bytes = RandomCompat_intval($bytes);
    46             $bytes = RandomCompat_intval($bytes);
    47     } catch (TypeError $ex) {
    47         } catch (TypeError $ex) {
    48         throw new TypeError(
    48             throw new TypeError(
    49             'random_bytes(): $bytes must be an integer'
    49                 'random_bytes(): $bytes must be an integer'
       
    50             );
       
    51         }
       
    52 
       
    53         if ($bytes < 1) {
       
    54             throw new Error(
       
    55                 'Length must be greater than 0'
       
    56             );
       
    57         }
       
    58 
       
    59         /**
       
    60          * @var string
       
    61          */
       
    62         $buf = '';
       
    63 
       
    64         /**
       
    65          * \Sodium\randombytes_buf() doesn't allow more than 2147483647 bytes to be
       
    66          * generated in one invocation.
       
    67          */
       
    68         if ($bytes > 2147483647) {
       
    69             for ($i = 0; $i < $bytes; $i += 1073741824) {
       
    70                 $n = ($bytes - $i) > 1073741824
       
    71                     ? 1073741824
       
    72                     : $bytes - $i;
       
    73                 $buf .= Sodium::randombytes_buf((int) $n);
       
    74             }
       
    75         } else {
       
    76             $buf .= Sodium::randombytes_buf((int) $bytes);
       
    77         }
       
    78 
       
    79         if (is_string($buf)) {
       
    80             if (RandomCompat_strlen($buf) === $bytes) {
       
    81                 return $buf;
       
    82             }
       
    83         }
       
    84 
       
    85         /**
       
    86          * If we reach here, PHP has failed us.
       
    87          */
       
    88         throw new Exception(
       
    89             'Could not gather sufficient random data'
    50         );
    90         );
    51     }
    91     }
    52 
       
    53     if ($bytes < 1) {
       
    54         throw new Error(
       
    55             'Length must be greater than 0'
       
    56         );
       
    57     }
       
    58 
       
    59     /**
       
    60      * \Sodium\randombytes_buf() doesn't allow more than 2147483647 bytes to be
       
    61      * generated in one invocation.
       
    62      */
       
    63     if ($bytes > 2147483647) {
       
    64         $buf = '';
       
    65         for ($i = 0; $i < $bytes; $i += 1073741824) {
       
    66             $n = ($bytes - $i) > 1073741824
       
    67                 ? 1073741824
       
    68                 : $bytes - $i;
       
    69             $buf .= Sodium::randombytes_buf($n);
       
    70         }
       
    71     } else {
       
    72         $buf = Sodium::randombytes_buf($bytes);
       
    73     }
       
    74 
       
    75     if ($buf !== false) {
       
    76         if (RandomCompat_strlen($buf) === $bytes) {
       
    77             return $buf;
       
    78         }
       
    79     }
       
    80 
       
    81     /**
       
    82      * If we reach here, PHP has failed us.
       
    83      */
       
    84     throw new Exception(
       
    85         'Could not gather sufficient random data'
       
    86     );
       
    87 }
    92 }
    88 endif;