forked from adamelders/trinity-projects
-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathcompat_random.php
More file actions
99 lines (94 loc) · 3.03 KB
/
compat_random.php
File metadata and controls
99 lines (94 loc) · 3.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
<?php
function bytelen($str) {
if (defined('MB_OVERLOAD_STRING') && (ini_get('mbstring.func_overload') & MB_OVERLOAD_STRING) && extension_loaded('mbstring')) {
return mb_strlen($str, '8bit');
} else {
return strlen($str);
}
}
if (!is_callable('random_bytes')) {
if (is_callable('openssl_random_pseudo_bytes')) {
function random_bytes($b) {
$rand = openssl_random_pseudo_bytes($b);
return ($rand !== false && bytelen($rand) == $b) ? $rand : null;
}
} else if (is_callable('mcrypt_create_iv')) {
if (DIRECTORY_SEPARATOR === '/') {
function random_bytes($b) {
$rand = mcrypt_create_iv($b, MCRYPT_DEV_URANDOM);
return ($rand !== false && bytelen($rand) == $b) ? $rand : null;
}
} else {
function random_bytes($b) {
$rand = mcrypt_create_iv($b);
return ($rand !== false && bytelen($rand) == $b) ? $rand : null;
}
}
} else if (DIRECTORY_SEPARATOR === '/') {
$stat = @stat('/dev/urandom');
if ($stat !== false && ($stat['mode'] & 0170000) === 020000) {
function random_bytes($b) {
$rand = @file_get_contents('/dev/urandom', false, null, 0, $b);
return ($rand !== false && bytelen($rand) == $b) ? $rand : null;
}
}
} else if (class_exists('\\COM')) {
try {
$util = new COM('CAPICOM.Utilities.1');
$method = array($util, 'GetRandom');
if (is_callable($method)) {
function random_bytes($b) {
$util = new \COM('CAPICOM.Utilities.1');
$rand = base64_decode($util->GetRandom($b,0));
$rand = ($rand !== false) ? str_pad($rand, $b, chr(0)) : false;
return ($rand !== false && bytelen($rand) == $b) ? $rand : null;
}
}
} catch (Exception $e) { }
}
if (!is_callable('random_bytes')) {
if (is_callable('gmp_random_bits')) {
function random_bytes($b) {
$rand = '';
for ($i = 1; $i <= $b; $i++) {
$rand .= chr(gmp_intval(gmp_random_bits(8)));
}
return ($rand !== false && bytelen($rand) == $b) ? $rand : null;
}
} else if (is_callable('mt_rand')) {
function random_bytes($b) {
$rand = '';
for ($i = 1; $i <= $b; $i++) {
$rand .= chr(mt_rand(0,255));
}
return ($rand !== false && bytelen($rand) == $b) ? $rand : null;
}
} else {
function random_bytes($b) {
$rand = '';
for ($i = 1; $i <= $b; $i++) {
$rand .= chr(rand(0,255));
}
return ($rand !== false && bytelen($rand) == $b) ? $rand : null;
}
}
}
}
if (!is_callable('random_int')) {
if (is_callable('gmp_random_range')) {
function random_int($min, $max) {
return gmp_intval(gmp_random_range($min, $max));
}
} elseif (is_callable('mt_rand')) {
function random_int($min, $max) {
mt_srand(random_bytes(3));
return mt_rand($min, $max);
}
} elseif (is_callable('rand')) {
function random_int($min, $max) {
srand(random_bytes(3));
return rand($min, $max);
}
}
}
?>