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