ru-se.com

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

random_bytes_com_dotnet.php (2903B)


      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      * Windows with PHP < 5.3.0 will not have the function
     32      * openssl_random_pseudo_bytes() available, so let's use
     33      * CAPICOM to work around this deficiency.
     34      *
     35      * @param int $bytes
     36      *
     37      * @throws Exception
     38      *
     39      * @return string
     40      */
     41     function random_bytes($bytes)
     42     {
     43         try {
     44             $bytes = RandomCompat_intval($bytes);
     45         } catch (TypeError $ex) {
     46             throw new TypeError(
     47                 'random_bytes(): $bytes must be an integer'
     48             );
     49         }
     50 
     51         if ($bytes < 1) {
     52             throw new Error(
     53                 'Length must be greater than 0'
     54             );
     55         }
     56 
     57         $buf = '';
     58         if (!class_exists('COM')) {
     59             throw new Error(
     60                 'COM does not exist'
     61             );
     62         }
     63         $util = new COM('CAPICOM.Utilities.1');
     64         $execCount = 0;
     65 
     66         /**
     67          * Let's not let it loop forever. If we run N times and fail to
     68          * get N bytes of random data, then CAPICOM has failed us.
     69          */
     70         do {
     71             $buf .= base64_decode($util->GetRandom($bytes, 0));
     72             if (RandomCompat_strlen($buf) >= $bytes) {
     73                 /**
     74                  * Return our random entropy buffer here:
     75                  */
     76                 return RandomCompat_substr($buf, 0, $bytes);
     77             }
     78             ++$execCount;
     79         } while ($execCount < $bytes);
     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     }
     88 }