Completed
Push — master ( ffcfa4...425dec )
by Anthony
16:03 queued 13:20
created

OpenSSL   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 69
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 2

Importance

Changes 4
Bugs 0 Features 2
Metric Value
wmc 9
c 4
b 0
f 2
lcom 0
cbo 2
dl 0
loc 69
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
B getStrength() 0 30 6
A isSupported() 0 3 1
A generate() 0 12 2
1
<?php
2
/**
3
 * The OpenSSL Random Number Source
4
 *
5
 * This uses the OS's secure generator to generate high strength numbers
6
 *
7
 * PHP version 5.3
8
 *
9
 * @category   PHPCryptLib
10
 * @package    Random
11
 * @subpackage Source
12
 * @author     Anthony Ferrara <[email protected]>
13
 * @copyright  2011 The Authors
14
 * @license    http://www.opensource.org/licenses/mit-license.html  MIT License
15
 * @version    Build @@version@@
16
 */
17
18
namespace RandomLib\Source;
19
20
use SecurityLib\Strength;
21
22
/**
23
 * The OpenSSL Random Number Source
24
 *
25
 * This uses the OS's secure generator to generate high strength numbers
26
 *
27
 * @category   PHPCryptLib
28
 * @package    Random
29
 * @subpackage Source
30
 * @author     Anthony Ferrara <[email protected]>
31
 * @codeCoverageIgnore
32
 */
33
class OpenSSL extends \RandomLib\AbstractSource {
34
35
    /**
36
     * Return an instance of Strength indicating the strength of the source
37
     *
38
     * @return \SecurityLib\Strength An instance of one of the strength classes
39
     */
40
    public static function getStrength() {
41
        /**
42
         * Prior to PHP 5.6.12 (see https://bugs.php.net/bug.php?id=70014) the "openssl_random_pseudo_bytes"
43
         * was using "RAND_pseudo_bytes" (predictable) instead of "RAND_bytes" (unpredictable).
44
         * Release notes: http://php.net/ChangeLog-5.php#5.6.12
45
         */
46
        if (PHP_VERSION_ID >= 50612) {
47
            return new Strength(Strength::HIGH);
48
        }
49
        
50
        /**
51
         * Prior to PHP 5.5.28 (see https://bugs.php.net/bug.php?id=70014) the "openssl_random_pseudo_bytes"
52
         * was using "RAND_pseudo_bytes" (predictable) instead of "RAND_bytes" (unpredictable).
53
         * Release notes: http://php.net/ChangeLog-5.php#5.5.28
54
         */
55
        if (PHP_VERSION_ID >= 50528 && PHP_VERSION_ID < 50600) {
56
            return new Strength(Strength::HIGH);
57
        }
58
        
59
        /**
60
         * Prior to PHP 5.4.44 (see https://bugs.php.net/bug.php?id=70014) the "openssl_random_pseudo_bytes"
61
         * was using "RAND_pseudo_bytes" (predictable) instead of "RAND_bytes" (unpredictable).
62
         * Release notes: http://php.net/ChangeLog-5.php#5.4.44
63
         */
64
        if (PHP_VERSION_ID >= 50444 && PHP_VERSION_ID < 50500) {
65
            return new Strength(Strength::HIGH);
66
        }
67
        
68
        return new Strength(Strength::MEDIUM);
69
    }
70
71
    /**
72
     * If the source is currently available.
73
     * Reasons might be because the library is not installed
74
     *
75
     * @return boolean
76
     */
77
    public static function isSupported() {
78
        return function_exists('openssl_random_pseudo_bytes');
79
    }
80
81
    /**
82
     * Generate a random string of the specified size
83
     *
84
     * @param int $size The size of the requested random string
85
     *
86
     * @return string A string of the requested size
87
     */
88
    public function generate($size) {
89
        if ($size < 1) {
90
            return str_repeat(chr(0), $size);
91
        }
92
        /**
93
         * Note, normally we would check the return of of $crypto_strong to
94
         * ensure that we generated a good random string.  However, since we're
95
         * using this as one part of many sources a low strength random number
96
         * shouldn't be much of an issue.
97
         */
98
        return openssl_random_pseudo_bytes($size);
99
    }
100
101
}
102