1 <?php |
1 <?php |
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 - 2017 Paragon Initiative Enterprises |
8 * Copyright (c) 2015 - 2018 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 |
14 * copies of the Software, and to permit persons to whom the Software is |
14 * copies of the Software, and to permit persons to whom the Software is |
15 * furnished to do so, subject to the following conditions: |
15 * furnished to do so, subject to the following conditions: |
16 * |
16 * |
17 * The above copyright notice and this permission notice shall be included in |
17 * The above copyright notice and this permission notice shall be included in |
18 * all copies or substantial portions of the Software. |
18 * all copies or substantial portions of the Software. |
19 * |
19 * |
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
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, |
21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
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 |
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, |
24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
52 throw new Error( |
53 throw new Error( |
53 'Length must be greater than 0' |
54 'Length must be greater than 0' |
54 ); |
55 ); |
55 } |
56 } |
56 |
57 |
|
58 /** @var string $buf */ |
57 $buf = ''; |
59 $buf = ''; |
58 if (!class_exists('COM')) { |
60 if (!class_exists('COM')) { |
59 throw new Error( |
61 throw new Error( |
60 'COM does not exist' |
62 'COM does not exist' |
61 ); |
63 ); |
62 } |
64 } |
|
65 /** @var COM $util */ |
63 $util = new COM('CAPICOM.Utilities.1'); |
66 $util = new COM('CAPICOM.Utilities.1'); |
64 $execCount = 0; |
67 $execCount = 0; |
65 |
68 |
66 /** |
69 /** |
67 * Let's not let it loop forever. If we run N times and fail to |
70 * 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. |
71 * get N bytes of random data, then CAPICOM has failed us. |
69 */ |
72 */ |
70 do { |
73 do { |
71 $buf .= base64_decode($util->GetRandom($bytes, 0)); |
74 $buf .= base64_decode((string) $util->GetRandom($bytes, 0)); |
72 if (RandomCompat_strlen($buf) >= $bytes) { |
75 if (RandomCompat_strlen($buf) >= $bytes) { |
73 /** |
76 /** |
74 * Return our random entropy buffer here: |
77 * Return our random entropy buffer here: |
75 */ |
78 */ |
76 return RandomCompat_substr($buf, 0, $bytes); |
79 return (string) RandomCompat_substr($buf, 0, $bytes); |
77 } |
80 } |
78 ++$execCount; |
81 ++$execCount; |
79 } while ($execCount < $bytes); |
82 } while ($execCount < $bytes); |
80 |
83 |
81 /** |
84 /** |