BCMath
9 months ago
GMP
9 months ago
PHP
9 months ago
.htaccess
9 months ago
BCMath.php
9 months ago
Engine.php
9 months ago
GMP.php
9 months ago
OpenSSL.php
9 months ago
PHP.php
9 months ago
PHP32.php
9 months ago
PHP64.php
9 months ago
index.html
9 months ago
web.config
9 months ago
OpenSSL.php
66 lines
| 1 | <?php |
| 2 | |
| 3 | /** |
| 4 | * OpenSSL Modular Exponentiation Engine |
| 5 | * |
| 6 | * PHP version 5 and 7 |
| 7 | * |
| 8 | * @author Jim Wigginton <terrafrost@php.net> |
| 9 | * @copyright 2017 Jim Wigginton |
| 10 | * @license http://www.opensource.org/licenses/mit-license.html MIT License |
| 11 | * @link http://pear.php.net/package/Math_BigInteger |
| 12 | */ |
| 13 | |
| 14 | declare(strict_types=1); |
| 15 | |
| 16 | namespace phpseclib3\Math\BigInteger\Engines; |
| 17 | |
| 18 | use phpseclib3\Crypt\RSA\Formats\Keys\PKCS8; |
| 19 | use phpseclib3\Exception\OutOfRangeException; |
| 20 | use phpseclib3\Exception\UnexpectedValueException; |
| 21 | use phpseclib3\Math\BigInteger; |
| 22 | |
| 23 | /** |
| 24 | * OpenSSL Modular Exponentiation Engine |
| 25 | * |
| 26 | * @author Jim Wigginton <terrafrost@php.net> |
| 27 | */ |
| 28 | abstract class OpenSSL |
| 29 | { |
| 30 | /** |
| 31 | * Test for engine validity |
| 32 | */ |
| 33 | public static function isValidEngine(): bool |
| 34 | { |
| 35 | return extension_loaded('openssl') && static::class != __CLASS__; |
| 36 | } |
| 37 | |
| 38 | /** |
| 39 | * Performs modular exponentiation. |
| 40 | */ |
| 41 | public static function powModHelper(Engine $x, Engine $e, Engine $n): Engine |
| 42 | { |
| 43 | if ($n->getLengthInBytes() < 31 || $n->getLengthInBytes() > 16384) { |
| 44 | throw new OutOfRangeException('Only modulo between 31 and 16384 bits are accepted'); |
| 45 | } |
| 46 | |
| 47 | $key = PKCS8::savePublicKey( |
| 48 | new BigInteger($n), |
| 49 | new BigInteger($e) |
| 50 | ); |
| 51 | |
| 52 | $plaintext = str_pad($x->toBytes(), $n->getLengthInBytes(), "\0", STR_PAD_LEFT); |
| 53 | |
| 54 | // this is easily prone to failure. if the modulo is a multiple of 2 or 3 or whatever it |
| 55 | // won't work and you'll get a "failure: error:0906D06C:PEM routines:PEM_read_bio:no start line" |
| 56 | // error. i suppose, for even numbers, we could do what PHP\Montgomery.php does, but then what |
| 57 | // about odd numbers divisible by 3, by 5, etc? |
| 58 | if (!openssl_public_encrypt($plaintext, $result, $key, OPENSSL_NO_PADDING)) { |
| 59 | throw new UnexpectedValueException(openssl_error_string()); |
| 60 | } |
| 61 | |
| 62 | $class = $x::class; |
| 63 | return new $class($result, 256); |
| 64 | } |
| 65 | } |
| 66 |