PluginProbe ʕ •ᴥ•ʔ
JetBackup – Backup, Restore & Migrate / trunk
JetBackup – Backup, Restore & Migrate vtrunk
3.1.22.4 3.1.22.3 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.8.1 1.4.9 1.5.0 1.5.1 1.5.1.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6.0 1.6.10 1.6.11 1.6.12 1.6.13 1.6.15 1.6.5.1 1.6.8.8 1.6.9 1.6.9.1 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7.5 2.0.8.7 2.0.9.11 2.0.9.14 2.0.9.15 2.0.9.6 2.0.9.7 2.0.9.9 3.1.10.7 3.1.11.1 3.1.12.3 3.1.13.4 3.1.14.17 3.1.15.4 3.1.16.1 3.1.17.5 3.1.18.10 3.1.18.8 3.1.18.9 3.1.19.8 3.1.20.3 3.1.21.3 3.1.7.9 3.1.9.2 trunk 1.1.90 1.1.91 1.2.0 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.6 1.3.7 1.3.8 1.3.9 1.4.0 1.4.1 1.4.2
backup / src / JetBackup / 3rdparty / phpseclib3 / Crypt / EC / Formats / Keys / PuTTY.php
backup / src / JetBackup / 3rdparty / phpseclib3 / Crypt / EC / Formats / Keys Last commit date
.htaccess 1 year ago Common.php 1 year ago JWK.php 1 year ago MontgomeryPrivate.php 1 year ago MontgomeryPublic.php 1 year ago OpenSSH.php 1 year ago PKCS1.php 1 year ago PKCS8.php 1 year ago PuTTY.php 1 year ago XML.php 1 year ago index.html 1 year ago libsodium.php 1 year ago web.config 1 year ago
PuTTY.php
136 lines
1 <?php
2
3 /**
4 * PuTTY Formatted EC Key Handler
5 *
6 * PHP version 5
7 *
8 * @author Jim Wigginton <terrafrost@php.net>
9 * @copyright 2015 Jim Wigginton
10 * @license http://www.opensource.org/licenses/mit-license.html MIT License
11 * @link http://phpseclib.sourceforge.net
12 */
13
14 declare(strict_types=1);
15
16 namespace phpseclib3\Crypt\EC\Formats\Keys;
17
18 use phpseclib3\Common\Functions\Strings;
19 use phpseclib3\Crypt\Common\Formats\Keys\PuTTY as Progenitor;
20 use phpseclib3\Crypt\EC\BaseCurves\Base as BaseCurve;
21 use phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards as TwistedEdwardsCurve;
22 use phpseclib3\Exception\RuntimeException;
23 use phpseclib3\Math\BigInteger;
24 use phpseclib3\Math\Common\FiniteField;
25 use phpseclib3\Math\Common\FiniteField\Integer;
26
27 /**
28 * PuTTY Formatted EC Key Handler
29 *
30 * @author Jim Wigginton <terrafrost@php.net>
31 */
32 abstract class PuTTY extends Progenitor
33 {
34 use Common;
35
36 /**
37 * Public Handler
38 *
39 * @var string
40 */
41 public const PUBLIC_HANDLER = 'phpseclib3\Crypt\EC\Formats\Keys\OpenSSH';
42
43 /**
44 * Supported Key Types
45 *
46 * @var array
47 */
48 protected static $types = [
49 'ecdsa-sha2-nistp256',
50 'ecdsa-sha2-nistp384',
51 'ecdsa-sha2-nistp521',
52 'ssh-ed25519',
53 ];
54
55 /**
56 * Break a public or private key down into its constituent components
57 *
58 * @param string|array $key
59 * @param string|false $password
60 * @return array|false
61 */
62 public static function load($key, $password)
63 {
64 $components = parent::load($key, $password);
65 if (!isset($components['private'])) {
66 return $components;
67 }
68
69 $private = $components['private'];
70
71 $temp = Strings::base64_encode(Strings::packSSH2('s', $components['type']) . $components['public']);
72 $components = OpenSSH::load($components['type'] . ' ' . $temp . ' ' . $components['comment']);
73
74 if ($components['curve'] instanceof TwistedEdwardsCurve) {
75 if (Strings::shift($private, 4) != "\0\0\0\x20") {
76 throw new RuntimeException('Length of ssh-ed25519 key should be 32');
77 }
78 $arr = $components['curve']->extractSecret($private);
79 $components['dA'] = $arr['dA'];
80 $components['secret'] = $arr['secret'];
81 } else {
82 [$components['dA']] = Strings::unpackSSH2('i', $private);
83 $components['curve']->rangeCheck($components['dA']);
84 }
85
86 return $components;
87 }
88
89 /**
90 * Convert a private key to the appropriate format.
91 *
92 * @param Integer[] $publicKey
93 */
94 public static function savePrivateKey(BigInteger $privateKey, BaseCurve $curve, array $publicKey, ?string $secret = null, ?string $password = null, array $options = []): string
95 {
96 self::initialize_static_variables();
97
98 $public = explode(' ', OpenSSH::savePublicKey($curve, $publicKey));
99 $name = $public[0];
100 $public = Strings::base64_decode($public[1]);
101 [, $length] = unpack('N', Strings::shift($public, 4));
102 Strings::shift($public, $length);
103
104 // PuTTY pads private keys with a null byte per the following:
105 // https://github.com/github/putty/blob/a3d14d77f566a41fc61dfdc5c2e0e384c9e6ae8b/sshecc.c#L1926
106 if (!$curve instanceof TwistedEdwardsCurve) {
107 $private = $privateKey->toBytes();
108 if (!(strlen($privateKey->toBits()) & 7)) {
109 $private = "\0$private";
110 }
111 }
112
113 $private = $curve instanceof TwistedEdwardsCurve ?
114 Strings::packSSH2('s', $secret) :
115 Strings::packSSH2('s', $private);
116
117 return self::wrapPrivateKey($public, $private, $name, $password, $options);
118 }
119
120 /**
121 * Convert an EC public key to the appropriate format
122 *
123 * @param FiniteField[] $publicKey
124 */
125 public static function savePublicKey(BaseCurve $curve, array $publicKey): string
126 {
127 $public = explode(' ', OpenSSH::savePublicKey($curve, $publicKey));
128 $type = $public[0];
129 $public = Strings::base64_decode($public[1]);
130 [, $length] = unpack('N', Strings::shift($public, 4));
131 Strings::shift($public, $length);
132
133 return self::wrapPublicKey($public, $type);
134 }
135 }
136