Failed Conditions
Push — master ( e416ac...258147 )
by Florent
01:22
created

RSAKey::toPublic()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 12
rs 9.8666
c 0
b 0
f 0
cc 3
nc 3
nop 1
1
<?php
2
3
/*
4
 * The MIT License (MIT)
5
 *
6
 * Copyright (c) 2014-2018 Spomky-Labs
7
 *
8
 * This software may be modified and distributed under the terms
9
 * of the MIT license.  See the LICENSE file for details.
10
 */
11
12
namespace Jose\KeyConverter;
13
14
use Assert\Assertion;
15
use Base64Url\Base64Url;
16
use FG\ASN1\Universal\BitString;
17
use FG\ASN1\Universal\Integer;
18
use FG\ASN1\Universal\NullObject;
19
use FG\ASN1\Universal\ObjectIdentifier;
20
use FG\ASN1\Universal\OctetString;
21
use FG\ASN1\Universal\Sequence;
22
use Jose\Object\JWKInterface;
23
use Jose\Util\BigInteger;
24
25
final class RSAKey extends Sequence
26
{
27
    /**
28
     * @var array
29
     */
30
    private $values = [];
31
32
    /**
33
     * @var \Jose\Util\BigInteger
34
     */
35
    private $modulus;
36
37
    /**
38
     * @var int
39
     */
40
    private $modulus_length;
41
42
    /**
43
     * @var \Jose\Util\BigInteger
44
     */
45
    private $public_exponent;
46
47
    /**
48
     * @var \Jose\Util\BigInteger|null
49
     */
50
    private $private_exponent = null;
51
52
    /**
53
     * @var \Jose\Util\BigInteger[]
54
     */
55
    private $primes = [];
56
57
    /**
58
     * @var \Jose\Util\BigInteger[]
59
     */
60
    private $exponents = [];
61
62
    /**
63
     * @var \Jose\Util\BigInteger|null
64
     */
65
    private $coefficient = null;
66
67
    /**
68
     * @param \Jose\Object\JWKInterface|string|array $data
69
     */
70
    public function __construct($data)
71
    {
72
        parent::__construct();
73
74
        if ($data instanceof JWKInterface) {
75
            $this->loadJWK($data->getAll());
76
        } elseif (is_array($data)) {
77
            $this->loadJWK($data);
78
        } elseif (is_string($data)) {
79
            $this->loadPEM($data);
80
        } else {
81
            throw new \InvalidArgumentException('Unsupported input');
82
        }
83
84
        $this->populateBigIntegers();
85
    }
86
87
    /**
88
     * @return bool
89
     */
90
    public function isPublic()
91
    {
92
        return !$this->isPrivate();
93
    }
94
95
    /**
96
     * @return bool
97
     */
98
    public function isPrivate()
99
    {
100
        return array_key_exists('d', $this->values);
101
    }
102
103
    /**
104
     * @return \Jose\Util\BigInteger
105
     */
106
    public function getModulus()
107
    {
108
        return $this->modulus;
109
    }
110
111
    /**
112
     * @return int
113
     */
114
    public function getModulusLength()
115
    {
116
        return $this->modulus_length;
117
    }
118
119
    /**
120
     * @return \Jose\Util\BigInteger
121
     */
122
    public function getExponent()
123
    {
124
        $d = $this->getPrivateExponent();
125
        if (null !== $d) {
126
            return $d;
127
        }
128
129
        return $this->getPublicExponent();
130
    }
131
132
    /**
133
     * @return \Jose\Util\BigInteger
134
     */
135
    public function getPublicExponent()
136
    {
137
        return $this->public_exponent;
138
    }
139
140
    /**
141
     * @return \Jose\Util\BigInteger
142
     */
143
    public function getPrivateExponent()
144
    {
145
        return $this->private_exponent;
146
    }
147
148
    /**
149
     * @return \Jose\Util\BigInteger[]
150
     */
151
    public function getPrimes()
152
    {
153
        return $this->primes;
154
    }
155
156
    /**
157
     * @return \Jose\Util\BigInteger[]
158
     */
159
    public function getExponents()
160
    {
161
        return $this->exponents;
162
    }
163
164
    /**
165
     * @return \Jose\Util\BigInteger|null
166
     */
167
    public function getCoefficient()
168
    {
169
        return $this->coefficient;
170
    }
171
172
    /**
173
     * @param \Jose\KeyConverter\RSAKey $private
174
     *
175
     * @return \Jose\KeyConverter\RSAKey
176
     */
177
    public static function toPublic(self $private)
178
    {
179
        $data = $private->toArray();
180
        $keys = ['p', 'd', 'q', 'dp', 'dq', 'qi'];
181
        foreach ($keys as $key) {
182
            if (array_key_exists($key, $data)) {
183
                unset($data[$key]);
184
            }
185
        }
186
187
        return new self($data);
188
    }
189
190
    public function __toString()
191
    {
192
        return $this->toPEM();
193
    }
194
195
    /**
196
     * @return array
197
     */
198
    public function toArray()
199
    {
200
        return $this->values;
201
    }
202
203
    /**
204
     * @return string
205
     */
206
    public function toDER()
207
    {
208
        return $this->getBinary();
209
    }
210
211
    /**
212
     * @return string
213
     */
214
    public function toPEM()
215
    {
216
        $result = '-----BEGIN '.($this->isPrivate() ? 'RSA PRIVATE' : 'PUBLIC').' KEY-----'.PHP_EOL;
217
        $result .= chunk_split(base64_encode($this->getBinary()), 64, PHP_EOL);
218
        $result .= '-----END '.($this->isPrivate() ? 'RSA PRIVATE' : 'PUBLIC').' KEY-----'.PHP_EOL;
219
220
        return $result;
221
    }
222
223
    /**
224
     * @param string $data
225
     *
226
     * @throws \Exception
227
     * @throws \FG\ASN1\Exception\ParserException
228
     *
229
     * @return array
230
     */
231
    private function loadPEM($data)
232
    {
233
        $res = openssl_pkey_get_private($data);
234
        if (false === $res) {
235
            $res = openssl_pkey_get_public($data);
236
        }
237
        Assertion::false(false === $res, 'Unable to load the key');
238
239
        $details = openssl_pkey_get_details($res);
240
        Assertion::keyExists($details, 'rsa', 'Unable to load the key');
241
242
        $this->values['kty'] = 'RSA';
243
        $keys = [
244
            'n' => 'n',
245
            'e' => 'e',
246
            'd' => 'd',
247
            'p' => 'p',
248
            'q' => 'q',
249
            'dp' => 'dmp1',
250
            'dq' => 'dmq1',
251
            'qi' => 'iqmp',
252
        ];
253
        foreach ($details['rsa'] as $key => $value) {
254
            if (in_array($key, $keys)) {
255
                $value = Base64Url::encode($value);
256
                $this->values[array_search($key, $keys)] = $value;
257
            }
258
        }
259
    }
260
261
    /**
262
     * @param array $jwk
263
     */
264
    private function loadJWK(array $jwk)
265
    {
266
        Assertion::keyExists($jwk, 'kty', 'The key parameter "kty" is missing.');
267
        Assertion::eq($jwk['kty'], 'RSA', 'The JWK is not a RSA key');
268
269
        $this->values = $jwk;
270
        if (array_key_exists('d', $jwk)) {
271
            $this->populateCRT();
272
            $this->initPrivateKey();
273
        } else {
274
            $this->initPublicKey();
275
        }
276
    }
277
278
    /**
279
     * This method adds Chinese Remainder Theorem (CRT) parameters if primes 'p' and 'q' are available.
280
     */
281
    private function populateCRT()
282
    {
283
        if (!array_key_exists('p', $this->values) && !array_key_exists('q', $this->values)) {
284
            $d = BigInteger::createFromBinaryString(Base64Url::decode($this->values['d']));
285
            $e = BigInteger::createFromBinaryString(Base64Url::decode($this->values['e']));
286
            $n = BigInteger::createFromBinaryString(Base64Url::decode($this->values['n']));
287
288
            list($p, $q) = $this->findPrimeFactors($d, $e, $n);
289
            $this->values['p'] = Base64Url::encode($p->toBytes());
290
            $this->values['q'] = Base64Url::encode($q->toBytes());
291
        }
292
293
        if (array_key_exists('dp', $this->values) && array_key_exists('dq', $this->values) && array_key_exists('qi', $this->values)) {
294
            return;
295
        }
296
297
        $one = BigInteger::createFromDecimal(1);
298
        $d = BigInteger::createFromBinaryString(Base64Url::decode($this->values['d']));
299
        $p = BigInteger::createFromBinaryString(Base64Url::decode($this->values['p']));
300
        $q = BigInteger::createFromBinaryString(Base64Url::decode($this->values['q']));
301
302
        $this->values['dp'] = Base64Url::encode($d->mod($p->subtract($one))->toBytes());
0 ignored issues
show
Documentation introduced by
$one is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
Documentation introduced by
$p->subtract($one) is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
303
        $this->values['dq'] = Base64Url::encode($d->mod($q->subtract($one))->toBytes());
0 ignored issues
show
Documentation introduced by
$one is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
Documentation introduced by
$q->subtract($one) is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
304
        $this->values['qi'] = Base64Url::encode($q->modInverse($p)->toBytes());
0 ignored issues
show
Documentation introduced by
$p is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
305
    }
306
307
    /**
308
     * @throws \Exception
309
     */
310
    private function initPublicKey()
311
    {
312
        $oid_sequence = new Sequence();
313
        $oid_sequence->addChild(new ObjectIdentifier('1.2.840.113549.1.1.1'));
314
        $oid_sequence->addChild(new NullObject());
315
        $this->addChild($oid_sequence);
316
317
        $n = new Integer($this->fromBase64ToInteger($this->values['n']));
318
        $e = new Integer($this->fromBase64ToInteger($this->values['e']));
319
320
        $key_sequence = new Sequence();
321
        $key_sequence->addChild($n);
322
        $key_sequence->addChild($e);
323
        $key_bit_string = new BitString(bin2hex($key_sequence->getBinary()));
324
        $this->addChild($key_bit_string);
325
    }
326
327
    private function initPrivateKey()
328
    {
329
        $this->addChild(new Integer(0));
330
331
        $oid_sequence = new Sequence();
332
        $oid_sequence->addChild(new ObjectIdentifier('1.2.840.113549.1.1.1'));
333
        $oid_sequence->addChild(new NullObject());
334
        $this->addChild($oid_sequence);
335
336
        $v = new Integer(0);
337
        $n = new Integer($this->fromBase64ToInteger($this->values['n']));
338
        $e = new Integer($this->fromBase64ToInteger($this->values['e']));
339
        $d = new Integer($this->fromBase64ToInteger($this->values['d']));
340
        $p = new Integer($this->fromBase64ToInteger($this->values['p']));
341
        $q = new Integer($this->fromBase64ToInteger($this->values['q']));
342
        $dp = array_key_exists('dp', $this->values) ? new Integer($this->fromBase64ToInteger($this->values['dp'])) : new Integer(0);
343
        $dq = array_key_exists('dq', $this->values) ? new Integer($this->fromBase64ToInteger($this->values['dq'])) : new Integer(0);
344
        $qi = array_key_exists('qi', $this->values) ? new Integer($this->fromBase64ToInteger($this->values['qi'])) : new Integer(0);
345
346
        $key_sequence = new Sequence();
347
        $key_sequence->addChild($v);
348
        $key_sequence->addChild($n);
349
        $key_sequence->addChild($e);
350
        $key_sequence->addChild($d);
351
        $key_sequence->addChild($p);
352
        $key_sequence->addChild($q);
353
        $key_sequence->addChild($dp);
354
        $key_sequence->addChild($dq);
355
        $key_sequence->addChild($qi);
356
        $key_octet_string = new OctetString(bin2hex($key_sequence->getBinary()));
357
        $this->addChild($key_octet_string);
358
    }
359
360
    /**
361
     * @param string $value
362
     *
363
     * @return string
364
     */
365
    private function fromBase64ToInteger($value)
366
    {
367
        return gmp_strval(gmp_init(current(unpack('H*', Base64Url::decode($value))), 16), 10);
368
    }
369
370
    private function populateBigIntegers()
371
    {
372
        $this->modulus = $this->convertBase64StringToBigInteger($this->values['n']);
373
        $this->modulus_length = mb_strlen($this->getModulus()->toBytes(), '8bit');
374
        $this->public_exponent = $this->convertBase64StringToBigInteger($this->values['e']);
375
376
        if (true === $this->isPrivate()) {
377
            $this->private_exponent = $this->convertBase64StringToBigInteger($this->values['d']);
378
379
            if (array_key_exists('p', $this->values) && array_key_exists('q', $this->values)) {
380
                $this->primes = [
381
                    $this->convertBase64StringToBigInteger($this->values['p']),
382
                    $this->convertBase64StringToBigInteger($this->values['q']),
383
                ];
384
                $this->exponents = [
385
                    $this->convertBase64StringToBigInteger($this->values['dp']),
386
                    $this->convertBase64StringToBigInteger($this->values['dq']),
387
                ];
388
                $this->coefficient = $this->convertBase64StringToBigInteger($this->values['qi']);
389
            }
390
        }
391
    }
392
393
    /**
394
     * @param string $value
395
     *
396
     * @return \Jose\Util\BigInteger
397
     */
398
    private function convertBase64StringToBigInteger($value)
399
    {
400
        return BigInteger::createFromBinaryString(Base64Url::decode($value));
401
    }
402
403
    /**
404
     * @param BigInteger $d
405
     * @param BigInteger $e
406
     * @param BigInteger $n
407
     *
408
     * @return array
409
     */
410
    private function findPrimeFactors(BigInteger $d, BigInteger $e, BigInteger $n)
411
    {
412
        $zero = BigInteger::createFromDecimal(0);
413
        $one = BigInteger::createFromDecimal(1);
414
        $two = BigInteger::createFromDecimal(2);
415
416
        $k = $d->multiply($e)->subtract($one);
0 ignored issues
show
Documentation introduced by
$e is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
Documentation introduced by
$one is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
417
418
        if ($k->isEven()) {
419
            $r = $k;
420
            $t = $zero;
421
422
            do {
423
                $r = $r->divide($two);
0 ignored issues
show
Documentation introduced by
$two is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
424
                $t = $t->add($one);
0 ignored issues
show
Documentation introduced by
$one is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
425
            } while ($r->isEven());
426
427
            $found = false;
428
            $y = null;
429
430
            for ($i = 1; $i <= 100; ++$i) {
431
                $g = BigInteger::random($n->subtract($one));
0 ignored issues
show
Documentation introduced by
$one is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
Documentation introduced by
$n->subtract($one) is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
432
                $y = $g->modPow($r, $n);
0 ignored issues
show
Documentation introduced by
$r is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
Documentation introduced by
$n is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
433
434
                if ($y->equals($one) || $y->equals($n->subtract($one))) {
0 ignored issues
show
Documentation introduced by
$one is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
Documentation introduced by
$n->subtract($one) is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
435
                    continue;
436
                }
437
438
                for ($j = $one; $j->lowerThan($t->subtract($one)); $j = $j->add($one)) {
0 ignored issues
show
Documentation introduced by
$one is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
Documentation introduced by
$t->subtract($one) is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
439
                    $x = $y->modPow($two, $n);
0 ignored issues
show
Documentation introduced by
$two is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
Documentation introduced by
$n is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
440
441
                    if ($x->equals($one)) {
0 ignored issues
show
Documentation introduced by
$one is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
442
                        $found = true;
443
444
                        break;
445
                    }
446
447
                    if ($x->equals($n->subtract($one))) {
0 ignored issues
show
Documentation introduced by
$one is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
Documentation introduced by
$n->subtract($one) is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
448
                        continue;
449
                    }
450
451
                    $y = $x;
452
                }
453
454
                $x = $y->modPow($two, $n);
0 ignored issues
show
Documentation introduced by
$two is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
Documentation introduced by
$n is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
455
                if ($x->equals($one)) {
0 ignored issues
show
Documentation introduced by
$one is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
456
                    $found = true;
457
458
                    break;
459
                }
460
            }
461
462
            if (true === $found) {
463
                $p = $y->subtract($one)->gcd($n);
0 ignored issues
show
Documentation introduced by
$one is of type object<Jose\Util\BigInteger>, but the function expects a object<self>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
464
                $q = $n->divide($p);
465
466
                return [$p, $q];
467
            }
468
        }
469
470
        throw new \InvalidArgumentException('Unable to find prime factors.');
471
    }
472
}
473