balmet.com

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

random_bytes_libsodium_legacy.php (2894B)


      1 <?php
      2 /**
      3  * Random_* Compatibility Library 
      4  * for using the new PHP 7 random_* API in PHP 5 projects
      5  * 
      6  * The MIT License (MIT)
      7  *
      8  * Copyright (c) 2015 - 2017 Paragon Initiative Enterprises
      9  * 
     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
     12  * in the Software without restriction, including without limitation the rights
     13  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     14  * copies of the Software, and to permit persons to whom the Software is
     15  * furnished to do so, subject to the following conditions:
     16  * 
     17  * The above copyright notice and this permission notice shall be included in
     18  * all copies or substantial portions of the Software.
     19  * 
     20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     21  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     22  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     23  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     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
     26  * SOFTWARE.
     27  */
     28 
     29 if (!is_callable('random_bytes')) {
     30     /**
     31      * If the libsodium PHP extension is loaded, we'll use it above any other
     32      * solution.
     33      *
     34      * libsodium-php project:
     35      * @ref https://github.com/jedisct1/libsodium-php
     36      *
     37      * @param int $bytes
     38      *
     39      * @throws Exception
     40      *
     41      * @return string
     42      */
     43     function random_bytes($bytes)
     44     {
     45         try {
     46             $bytes = RandomCompat_intval($bytes);
     47         } catch (TypeError $ex) {
     48             throw new TypeError(
     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'
     90         );
     91     }
     92 }