Subversion Repositories oidplus

Rev

Rev 846 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
827 daniel-mar 1
<?php
2
 
3
/**
4
 * Raw RSA Key Handler
5
 *
6
 * PHP version 5
7
 *
8
 * An array containing two \phpseclib3\Math\BigInteger objects.
9
 *
10
 * The exponent can be indexed with any of the following:
11
 *
12
 * 0, e, exponent, publicExponent
13
 *
14
 * The modulus can be indexed with any of the following:
15
 *
16
 * 1, n, modulo, modulus
17
 *
874 daniel-mar 18
 * @category  Crypt
19
 * @package   RSA
827 daniel-mar 20
 * @author    Jim Wigginton <terrafrost@php.net>
21
 * @copyright 2015 Jim Wigginton
22
 * @license   http://www.opensource.org/licenses/mit-license.html  MIT License
23
 * @link      http://phpseclib.sourceforge.net
24
 */
25
 
26
namespace phpseclib3\Crypt\RSA\Formats\Keys;
27
 
28
use phpseclib3\Math\BigInteger;
29
 
30
/**
31
 * Raw RSA Key Handler
32
 *
874 daniel-mar 33
 * @package RSA
827 daniel-mar 34
 * @author  Jim Wigginton <terrafrost@php.net>
874 daniel-mar 35
 * @access  public
827 daniel-mar 36
 */
37
abstract class Raw
38
{
39
    /**
40
     * Break a public or private key down into its constituent components
41
     *
874 daniel-mar 42
     * @access public
827 daniel-mar 43
     * @param string $key
44
     * @param string $password optional
45
     * @return array
46
     */
47
    public static function load($key, $password = '')
48
    {
49
        if (!is_array($key)) {
50
            throw new \UnexpectedValueException('Key should be a array - not a ' . gettype($key));
51
        }
52
 
53
        $key = array_change_key_case($key, CASE_LOWER);
54
 
55
        $components = ['isPublicKey' => false];
56
 
57
        foreach (['e', 'exponent', 'publicexponent', 0, 'privateexponent', 'd'] as $index) {
58
            if (isset($key[$index])) {
59
                $components['publicExponent'] = $key[$index];
60
                break;
61
            }
62
        }
63
 
64
        foreach (['n', 'modulo', 'modulus', 1] as $index) {
65
            if (isset($key[$index])) {
66
                $components['modulus'] = $key[$index];
67
                break;
68
            }
69
        }
70
 
71
        if (!isset($components['publicExponent']) || !isset($components['modulus'])) {
72
            throw new \UnexpectedValueException('Modulus / exponent not present');
73
        }
74
 
75
        if (isset($key['primes'])) {
76
            $components['primes'] = $key['primes'];
77
        } elseif (isset($key['p']) && isset($key['q'])) {
78
            $indices = [
79
                ['p', 'q'],
80
                ['prime1', 'prime2']
81
            ];
82
            foreach ($indices as $index) {
83
                list($i0, $i1) = $index;
84
                if (isset($key[$i0]) && isset($key[$i1])) {
85
                    $components['primes'] = [1 => $key[$i0], $key[$i1]];
86
                }
87
            }
88
        }
89
 
90
        if (isset($key['exponents'])) {
91
            $components['exponents'] = $key['exponents'];
92
        } else {
93
            $indices = [
94
                ['dp', 'dq'],
95
                ['exponent1', 'exponent2']
96
            ];
97
            foreach ($indices as $index) {
98
                list($i0, $i1) = $index;
99
                if (isset($key[$i0]) && isset($key[$i1])) {
100
                    $components['exponents'] = [1 => $key[$i0], $key[$i1]];
101
                }
102
            }
103
        }
104
 
105
        if (isset($key['coefficients'])) {
106
            $components['coefficients'] = $key['coefficients'];
107
        } else {
108
            foreach (['inverseq', 'q\'', 'coefficient'] as $index) {
109
                if (isset($key[$index])) {
110
                    $components['coefficients'] = [2 => $key[$index]];
111
                }
112
            }
113
        }
114
 
115
        if (!isset($components['primes'])) {
116
            $components['isPublicKey'] = true;
117
            return $components;
118
        }
119
 
120
        if (!isset($components['exponents'])) {
121
            $one = new BigInteger(1);
122
            $temp = $components['primes'][1]->subtract($one);
123
            $exponents = [1 => $components['publicExponent']->modInverse($temp)];
124
            $temp = $components['primes'][2]->subtract($one);
125
            $exponents[] = $components['publicExponent']->modInverse($temp);
126
            $components['exponents'] = $exponents;
127
        }
128
 
129
        if (!isset($components['coefficients'])) {
130
            $components['coefficients'] = [2 => $components['primes'][2]->modInverse($components['primes'][1])];
131
        }
132
 
133
        foreach (['privateexponent', 'd'] as $index) {
134
            if (isset($key[$index])) {
135
                $components['privateExponent'] = $key[$index];
136
                break;
137
            }
138
        }
139
 
140
        return $components;
141
    }
142
 
143
    /**
144
     * Convert a private key to the appropriate format.
145
     *
874 daniel-mar 146
     * @access public
827 daniel-mar 147
     * @param \phpseclib3\Math\BigInteger $n
148
     * @param \phpseclib3\Math\BigInteger $e
149
     * @param \phpseclib3\Math\BigInteger $d
150
     * @param array $primes
151
     * @param array $exponents
152
     * @param array $coefficients
153
     * @param string $password optional
154
     * @param array $options optional
155
     * @return array
156
     */
157
    public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '', array $options = [])
158
    {
159
        if (!empty($password) && is_string($password)) {
160
            throw new UnsupportedFormatException('Raw private keys do not support encryption');
161
        }
162
 
163
        return [
164
            'e' => clone $e,
165
            'n' => clone $n,
166
            'd' => clone $d,
167
            'primes' => array_map(function ($var) {
168
                return clone $var;
169
            }, $primes),
170
            'exponents' => array_map(function ($var) {
171
                return clone $var;
172
            }, $exponents),
173
            'coefficients' => array_map(function ($var) {
174
                return clone $var;
175
            }, $coefficients)
176
        ];
177
    }
178
 
179
    /**
180
     * Convert a public key to the appropriate format
181
     *
874 daniel-mar 182
     * @access public
827 daniel-mar 183
     * @param \phpseclib3\Math\BigInteger $n
184
     * @param \phpseclib3\Math\BigInteger $e
185
     * @return array
186
     */
187
    public static function savePublicKey(BigInteger $n, BigInteger $e)
188
    {
189
        return ['e' => clone $e, 'n' => clone $n];
190
    }
191
}