diff --git a/phpseclib/Net/SSH2.php b/phpseclib/Net/SSH2.php index 43ddbccd..9af20c07 100644 --- a/phpseclib/Net/SSH2.php +++ b/phpseclib/Net/SSH2.php @@ -5089,41 +5089,65 @@ class SSH2 */ public function setPreferredAlgorithms(array $methods) { + $keys = ['client_to_server', 'server_to_client']; + + if (isset($methods['kex']) && is_string($methods['kex'])) { + $methods['kex'] = explode(',', $methods['kex']); + } + + if (isset($methods['hostkey']) && is_string($methods['hostkey'])) { + $methods['hostkey'] = explode(',', $methods['hostkey']); + } + + foreach ($keys as $key) { + if (isset($methods[$key])) { + $a = &$methods[$key]; + if (isset($a['crypt']) && is_string($a['crypt'])) { + $a['crypt'] = explode(',', $a['crypt']); + } + if (isset($a['comp']) && is_string($a['comp'])) { + $a['comp'] = explode(',', $a['comp']); + } + if (isset($a['mac']) && is_string($a['mac'])) { + $a['mac'] = explode(',', $a['mac']); + } + } + } + $preferred = $methods; if (isset($preferred['kex'])) { $preferred['kex'] = array_intersect( - is_string($preferred['kex']) ? [$preferred['kex']] : $preferred['kex'], + $preferred['kex'], static::getSupportedKEXAlgorithms() ); } if (isset($preferred['hostkey'])) { $preferred['hostkey'] = array_intersect( - is_string($preferred['hostkey']) ? [$preferred['hostkey']] : $preferred['hostkey'], + $preferred['hostkey'], static::getSupportedHostKeyAlgorithms() ); } - $keys = ['client_to_server', 'server_to_client']; foreach ($keys as $key) { if (isset($preferred[$key])) { $a = &$preferred[$key]; if (isset($a['crypt'])) { $a['crypt'] = array_intersect( - is_string($a['crypt']) ? [$a['crypt']] : $a['crypt'], + $a['crypt'], static::getSupportedEncryptionAlgorithms() ); } if (isset($a['comp'])) { $a['comp'] = array_intersect( - is_string($a['comp']) ? [$a['comp']] : $a['comp'], + $a['comp'], static::getSupportedCompressionAlgorithms() ); } if (isset($a['mac'])) { $a['mac'] = array_intersect( - is_string($a['mac']) ? [$a['mac']] : $a['mac'], + $a['mac'], static::getSupportedMACAlgorithms() ); }