mirror of
https://github.com/phpseclib/phpseclib.git
synced 2024-09-28 07:09:01 +00:00
Merge branch 'master' into exceptions-v1
Conflicts: phpseclib/Net/SSH2.php
This commit is contained in:
commit
2a8da097ae
10
.travis.yml
10
.travis.yml
@ -1,13 +1,12 @@
|
||||
language: php
|
||||
|
||||
# When adding environments here, the number of runs specified in .scrutinizer.yml
|
||||
# may have to be adjusted.
|
||||
php:
|
||||
- 5.3.3
|
||||
- 5.3
|
||||
- 5.4
|
||||
- 5.5
|
||||
- 5.6
|
||||
- 7.0
|
||||
- hhvm
|
||||
|
||||
env:
|
||||
@ -22,7 +21,7 @@ install:
|
||||
- sudo apt-get install parallel
|
||||
- eval `ssh-agent -s`
|
||||
- travis/setup-secure-shell.sh
|
||||
- sh -c "if [ '$TRAVIS_PHP_VERSION' != 'hhvm' ]; then travis/install-php-extensions.sh; fi"
|
||||
- sh -c "if [ '$TRAVIS_PHP_VERSION' != 'hhvm' -a '$TRAVIS_PHP_VERSION' != '7.0' ]; then travis/install-php-extensions.sh; fi"
|
||||
- travis/setup-composer.sh
|
||||
|
||||
script:
|
||||
@ -31,3 +30,8 @@ script:
|
||||
|
||||
after_success:
|
||||
- sh -c "if $TRAVIS_SECURE_ENV_VARS; then travis/upload-code-coverage-html.sh; fi"
|
||||
|
||||
matrix:
|
||||
allow_failures:
|
||||
- php: 7.0
|
||||
fast_finish: true
|
||||
|
16
CHANGELOG.md
16
CHANGELOG.md
@ -1,5 +1,21 @@
|
||||
# Changelog
|
||||
|
||||
## 1.0.0 - 2015-08-02
|
||||
|
||||
- OpenSSL support for symmetric ciphers ([#507](https://github.com/phpseclib/phpseclib/pull/507))
|
||||
- rewritten vt100 terminal emulator (File_ANSI) ([#689](https://github.com/phpseclib/phpseclib/pull/689))
|
||||
- agent-forwarding support (System_SSH_Agent) ([#592](https://github.com/phpseclib/phpseclib/pull/592))
|
||||
- Net_SSH2 improvements
|
||||
- diffie-hellman-group-exchange-sha1/sha256 support ([#714](https://github.com/phpseclib/phpseclib/pull/714))
|
||||
- window size handling updates ([#717](https://github.com/phpseclib/phpseclib/pull/717))
|
||||
- Net_SFTP improvements
|
||||
- add callback support to put() ([#655](https://github.com/phpseclib/phpseclib/pull/655))
|
||||
- stat cache fixes ([#743](https://github.com/phpseclib/phpseclib/issues/743), [#730](https://github.com/phpseclib/phpseclib/issues/730), [#709](https://github.com/phpseclib/phpseclib/issues/709), [#726](https://github.com/phpseclib/phpseclib/issues/726))
|
||||
- add "none" encryption mode to Crypt_RSA ([#692](https://github.com/phpseclib/phpseclib/pull/692))
|
||||
- misc ASN.1 / X.509 parsing fixes ([#721](https://github.com/phpseclib/phpseclib/pull/721), [#627](https://github.com/phpseclib/phpseclib/pull/627))
|
||||
- use a random serial number for new X509 certs ([#740](https://github.com/phpseclib/phpseclib/pull/740))
|
||||
- add getPublicKeyFingerprint() to Crypt_RSA ([#677](https://github.com/phpseclib/phpseclib/pull/677))
|
||||
|
||||
## 0.3.10 - 2015-02-04
|
||||
|
||||
- simplify SSH2 window size handling ([#538](https://github.com/phpseclib/phpseclib/pull/538))
|
||||
|
@ -6,7 +6,7 @@ MIT-licensed pure-PHP implementations of an arbitrary-precision integer
|
||||
arithmetic library, fully PKCS#1 (v2.1) compliant RSA, DES, 3DES, RC4, Rijndael,
|
||||
AES, Blowfish, Twofish, SSH-1, SSH-2, SFTP, and X.509
|
||||
|
||||
* [Download (0.3.10)](http://sourceforge.net/projects/phpseclib/files/phpseclib0.3.10.zip/download)
|
||||
* [Download (1.0.0)](http://sourceforge.net/projects/phpseclib/files/phpseclib1.0.0.zip/download)
|
||||
* [Browse Git](https://github.com/phpseclib/phpseclib)
|
||||
* [Code Coverage Report](http://phpseclib.bantux.org/code_coverage/php5/latest/)
|
||||
|
||||
|
@ -7,18 +7,10 @@
|
||||
<rule ref="./code-sniffer-ruleset.xml">
|
||||
<!-- Exceptions to the library coding standard follow. -->
|
||||
|
||||
<!-- We do not care too much about method, class and file documentation,
|
||||
but having @author, @copyright and @license tags would be nice.
|
||||
The following configuration does not check for these tags, but
|
||||
complains if the file doc block is missing completely. -->
|
||||
<exclude name="PEAR.Commenting.ClassComment" />
|
||||
<exclude name="PEAR.Commenting.FunctionComment" />
|
||||
<exclude name="PEAR.Commenting.FileComment.MissingTag" />
|
||||
<exclude name="PEAR.Commenting.FileComment.MissingVersion" />
|
||||
<exclude name="PEAR.Commenting.FileComment.SpacingBeforeTags" />
|
||||
|
||||
<!-- Test classes do not have to be namespaced. -->
|
||||
<!-- Test classes do not have to be namespaced but may use pseudo-namespacing
|
||||
using underscore. -->
|
||||
<exclude name="PSR1.Classes.ClassDeclaration.MissingNamespace" />
|
||||
<exclude name="Squiz.Classes.ValidClassName.NotCamelCaps" />
|
||||
</rule>
|
||||
|
||||
</ruleset>
|
||||
|
@ -3,35 +3,25 @@
|
||||
|
||||
<description>phpseclib coding standard</description>
|
||||
|
||||
<!-- We are using the PEAR standard as a base -->
|
||||
<rule ref="PEAR">
|
||||
<!-- Temporary exceptions to the PEAR standard follow -->
|
||||
<exclude name="Generic.ControlStructures.InlineControlStructure.Discouraged" />
|
||||
<!-- We are using the PSR2 standard as a base -->
|
||||
<rule ref="PSR2">
|
||||
<!-- Exceptions due to legacy code with PHP4 compatibility -->
|
||||
<exclude name="PSR2.Classes.PropertyDeclaration.ScopeMissing" />
|
||||
<exclude name="PSR2.Classes.PropertyDeclaration.VarUsed" />
|
||||
<exclude name="Squiz.Scope.MethodScope.Missing" />
|
||||
|
||||
<!-- Exceptions for backward compatibility -->
|
||||
<exclude name="PSR1.Methods.CamelCapsMethodName.NotCamelCaps" />
|
||||
<exclude name="PSR2.Methods.MethodDeclaration.Underscore" />
|
||||
|
||||
<!-- Exceptions for whitespacing -->
|
||||
<exclude name="Generic.Functions.FunctionCallArgumentSpacing.TooMuchSpaceAfterComma" />
|
||||
<exclude name="PSR2.ControlStructures.SwitchDeclaration.SpaceBeforeColonCASE" />
|
||||
<exclude name="PSR2.ControlStructures.SwitchDeclaration.SpaceBeforeColonDEFAULT" />
|
||||
|
||||
<!-- Other Exceptions -->
|
||||
<exclude name="Generic.Files.LineLength.TooLong" />
|
||||
<exclude name="PEAR.NamingConventions.ValidFunctionName.FunctionNoCapital" />
|
||||
<exclude name="PEAR.NamingConventions.ValidFunctionName.NotCamelCaps" />
|
||||
<exclude name="PEAR.Commenting.ClassComment.InvalidVersion" />
|
||||
<exclude name="PEAR.Commenting.ClassComment.MissingTag" />
|
||||
<exclude name="PEAR.Commenting.FileComment.EmptyCopyright" />
|
||||
<exclude name="PEAR.Commenting.FileComment.InvalidVersion" />
|
||||
<exclude name="PEAR.Commenting.FunctionComment.ExtraParamComment" />
|
||||
<exclude name="PEAR.Commenting.FunctionComment.MissingReturn" />
|
||||
<exclude name="PEAR.Commenting.FunctionComment.MissingParamComment" />
|
||||
<exclude name="PEAR.Commenting.FunctionComment.MissingParamName" />
|
||||
<exclude name="PEAR.Commenting.FunctionComment.MissingParamTag" />
|
||||
<exclude name="PEAR.Commenting.FunctionComment.ParameterCommentsNotAligned" />
|
||||
<exclude name="PEAR.Commenting.FunctionComment.ParameterNamesNotAligned" />
|
||||
<exclude name="PEAR.Commenting.FunctionComment.ParamNameNoMatch" />
|
||||
<exclude name="PEAR.Commenting.FunctionComment.SpacingAfterParams" />
|
||||
<exclude name="PEAR.Commenting.FunctionComment.SpacingBeforeParams" />
|
||||
<exclude name="PEAR.Commenting.FunctionComment.SpacingBeforeTags" />
|
||||
<exclude name="PEAR.Functions.FunctionCallSignature.ContentAfterOpenBracket" />
|
||||
<exclude name="PEAR.Functions.FunctionCallSignature.CloseBracketLine" />
|
||||
<exclude name="PEAR.Functions.FunctionCallSignature.SpaceAfterOpenBracket" />
|
||||
<exclude name="PEAR.WhiteSpace.ScopeClosingBrace.BreakIdent" />
|
||||
<exclude name="PEAR.WhiteSpace.ScopeClosingBrace.Indent" />
|
||||
<exclude name="PEAR.WhiteSpace.ScopeClosingBrace.Line" />
|
||||
<exclude name="PEAR.WhiteSpace.ScopeIndent.Incorrect" />
|
||||
<exclude name="PSR2.ControlStructures.SwitchDeclaration.TerminatingComment" />
|
||||
</rule>
|
||||
|
||||
<!-- Useful additional rules follow -->
|
||||
@ -42,46 +32,4 @@
|
||||
<!-- A method MUST not only call its parent -->
|
||||
<rule ref="Generic.CodeAnalysis.UselessOverridingMethod" />
|
||||
|
||||
<!-- All code files MUST use only UTF-8 without BOM. -->
|
||||
<rule ref="Generic.Files.ByteOrderMark" />
|
||||
|
||||
<!-- Constructors MUST be called __construct() instead of after the class. -->
|
||||
<rule ref="Generic.NamingConventions.ConstructorName" />
|
||||
|
||||
<!-- Classes etc. MUST be namespaced -->
|
||||
<rule ref="PSR1.Classes.ClassDeclaration.MissingNamespace" />
|
||||
|
||||
<!-- A file MUST not contain more than one class/interface -->
|
||||
<rule ref="PSR1.Classes.ClassDeclaration.MultipleClasses" />
|
||||
|
||||
<!-- Files containing classes MUST not have any side-effects -->
|
||||
<rule ref="PSR1.Files.SideEffects.FoundWithSymbols" />
|
||||
|
||||
<!-- Each file MUST end with exactly one newline character -->
|
||||
<rule ref="PSR2.Files.EndFileNewline" />
|
||||
|
||||
<!-- In the argument list, there MUST NOT be a space before each comma,
|
||||
and there MUST be one space after each comma. -->
|
||||
<rule ref="Squiz.Functions.FunctionDeclarationArgumentSpacing">
|
||||
<properties>
|
||||
<property name="equalsSpacing" value="1"/>
|
||||
</properties>
|
||||
</rule>
|
||||
<rule ref="Squiz.Functions.FunctionDeclarationArgumentSpacing.SpacingAfterHint" />
|
||||
|
||||
<!-- There MUST NOT be trailing whitespace at the end of lines. -->
|
||||
<rule ref="Squiz.WhiteSpace.SuperfluousWhitespace" />
|
||||
|
||||
<!-- There MUST NOT be whitespace before the first content of a file -->
|
||||
<rule ref="Squiz.WhiteSpace.SuperfluousWhitespace.StartFile" />
|
||||
|
||||
<!-- There MUST NOT be whitespace after the last content of a file -->
|
||||
<rule ref="Squiz.WhiteSpace.SuperfluousWhitespace.EndFile" />
|
||||
|
||||
<!-- Functions MUST NOT contain multiple empty lines in a row -->
|
||||
<rule ref="Squiz.WhiteSpace.SuperfluousWhitespace.EmptyLines" />
|
||||
|
||||
<!-- The ?> closing tag MUST be omitted from files containing only PHP. -->
|
||||
<rule ref="Zend.Files.ClosingTag" />
|
||||
|
||||
</ruleset>
|
||||
|
@ -52,13 +52,14 @@
|
||||
"phing/phing": "~2.7",
|
||||
"phpunit/phpunit": "~4.0",
|
||||
"sami/sami": "~2.0",
|
||||
"squizlabs/php_codesniffer": "~1.5"
|
||||
"squizlabs/php_codesniffer": "~2.0"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-mcrypt": "Install the Mcrypt extension in order to speed up a wide variety of cryptographic operations.",
|
||||
"ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.",
|
||||
"ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations.",
|
||||
"ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
|
||||
"ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations."
|
||||
},
|
||||
"include-path": ["phpseclib/"],
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"phpseclib\\": "phpseclib/"
|
||||
|
27
composer.lock
generated
27
composer.lock
generated
@ -1,10 +1,10 @@
|
||||
{
|
||||
"_readme": [
|
||||
"This file locks the dependencies of your project to a known state",
|
||||
"Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"hash": "1973a3fc1c8f678a9cd0ff646f7a8bee",
|
||||
"hash": "3c1701cdae74c93eba5311e59f11cdb6",
|
||||
"packages": [],
|
||||
"packages-dev": [
|
||||
{
|
||||
@ -1201,32 +1201,31 @@
|
||||
},
|
||||
{
|
||||
"name": "squizlabs/php_codesniffer",
|
||||
"version": "1.5.6",
|
||||
"version": "2.3.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
|
||||
"reference": "6f3e42d311b882b25b4d409d23a289f4d3b803d5"
|
||||
"reference": "c1a26c729508f73560c1a4f767f60b8ab6b4a666"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/6f3e42d311b882b25b4d409d23a289f4d3b803d5",
|
||||
"reference": "6f3e42d311b882b25b4d409d23a289f4d3b803d5",
|
||||
"url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/c1a26c729508f73560c1a4f767f60b8ab6b4a666",
|
||||
"reference": "c1a26c729508f73560c1a4f767f60b8ab6b4a666",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-tokenizer": "*",
|
||||
"ext-xmlwriter": "*",
|
||||
"php": ">=5.1.2"
|
||||
},
|
||||
"suggest": {
|
||||
"phpunit/php-timer": "dev-master"
|
||||
},
|
||||
"bin": [
|
||||
"scripts/phpcs"
|
||||
"scripts/phpcs",
|
||||
"scripts/phpcbf"
|
||||
],
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-phpcs-fixer": "2.0.x-dev"
|
||||
"dev-master": "2.0.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
@ -1235,12 +1234,12 @@
|
||||
"CodeSniffer/CLI.php",
|
||||
"CodeSniffer/Exception.php",
|
||||
"CodeSniffer/File.php",
|
||||
"CodeSniffer/Fixer.php",
|
||||
"CodeSniffer/Report.php",
|
||||
"CodeSniffer/Reporting.php",
|
||||
"CodeSniffer/Sniff.php",
|
||||
"CodeSniffer/Tokens.php",
|
||||
"CodeSniffer/Reports/",
|
||||
"CodeSniffer/CommentParser/",
|
||||
"CodeSniffer/Tokenizers/",
|
||||
"CodeSniffer/DocGenerators/",
|
||||
"CodeSniffer/Standards/AbstractPatternSniff.php",
|
||||
@ -1266,13 +1265,13 @@
|
||||
"role": "lead"
|
||||
}
|
||||
],
|
||||
"description": "PHP_CodeSniffer tokenises PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
|
||||
"description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
|
||||
"homepage": "http://www.squizlabs.com/php-codesniffer",
|
||||
"keywords": [
|
||||
"phpcs",
|
||||
"standards"
|
||||
],
|
||||
"time": "2014-12-04 22:32:15"
|
||||
"time": "2015-06-24 03:16:23"
|
||||
},
|
||||
{
|
||||
"name": "symfony/console",
|
||||
|
@ -1378,7 +1378,6 @@ class DES extends Base
|
||||
// Creating code for en- and decryption.
|
||||
$crypt_block = array();
|
||||
foreach (array(self::ENCRYPT, self::DECRYPT) as $c) {
|
||||
|
||||
/* Do the initial IP permutation. */
|
||||
$crypt_block[$c] = '
|
||||
$in = unpack("N*", $in);
|
||||
|
@ -497,12 +497,14 @@ class Hash
|
||||
|
||||
// Extend the sixteen 32-bit words into sixty-four 32-bit words
|
||||
for ($i = 16; $i < 64; $i++) {
|
||||
// @codingStandardsIgnoreStart
|
||||
$s0 = $this->_rightRotate($w[$i - 15], 7) ^
|
||||
$this->_rightRotate($w[$i - 15], 18) ^
|
||||
$this->_rightShift( $w[$i - 15], 3);
|
||||
$s1 = $this->_rightRotate($w[$i - 2], 17) ^
|
||||
$this->_rightRotate($w[$i - 2], 19) ^
|
||||
$this->_rightShift( $w[$i - 2], 10);
|
||||
// @codingStandardsIgnoreEnd
|
||||
$w[$i] = $this->_add($w[$i - 16], $s0, $w[$i - 7], $s1);
|
||||
|
||||
}
|
||||
|
@ -572,7 +572,8 @@ class RSA
|
||||
$publickey = call_user_func_array(array($this, '_convertPublicKey'), array_values($this->_parseKey($publickey, self::PUBLIC_FORMAT_PKCS1)));
|
||||
|
||||
// clear the buffer of error strings stemming from a minimalistic openssl.cnf
|
||||
while (openssl_error_string() !== false);
|
||||
while (openssl_error_string() !== false) {
|
||||
}
|
||||
|
||||
return array(
|
||||
'privatekey' => $privatekey,
|
||||
@ -762,19 +763,39 @@ class RSA
|
||||
$encryption = (!empty($this->password) || is_string($this->password)) ? 'aes256-cbc' : 'none';
|
||||
$key.= $encryption;
|
||||
$key.= "\r\nComment: " . $this->comment . "\r\n";
|
||||
$public = pack('Na*Na*Na*',
|
||||
strlen('ssh-rsa'), 'ssh-rsa', strlen($raw['publicExponent']), $raw['publicExponent'], strlen($raw['modulus']), $raw['modulus']
|
||||
$public = pack(
|
||||
'Na*Na*Na*',
|
||||
strlen('ssh-rsa'),
|
||||
'ssh-rsa',
|
||||
strlen($raw['publicExponent']),
|
||||
$raw['publicExponent'],
|
||||
strlen($raw['modulus']),
|
||||
$raw['modulus']
|
||||
);
|
||||
$source = pack('Na*Na*Na*Na*',
|
||||
strlen('ssh-rsa'), 'ssh-rsa', strlen($encryption), $encryption,
|
||||
strlen($this->comment), $this->comment, strlen($public), $public
|
||||
$source = pack(
|
||||
'Na*Na*Na*Na*',
|
||||
strlen('ssh-rsa'),
|
||||
'ssh-rsa',
|
||||
strlen($encryption),
|
||||
$encryption,
|
||||
strlen($this->comment),
|
||||
$this->comment,
|
||||
strlen($public),
|
||||
$public
|
||||
);
|
||||
$public = base64_encode($public);
|
||||
$key.= "Public-Lines: " . ((strlen($public) + 63) >> 6) . "\r\n";
|
||||
$key.= chunk_split($public, 64);
|
||||
$private = pack('Na*Na*Na*Na*',
|
||||
strlen($raw['privateExponent']), $raw['privateExponent'], strlen($raw['prime1']), $raw['prime1'],
|
||||
strlen($raw['prime2']), $raw['prime2'], strlen($raw['coefficient']), $raw['coefficient']
|
||||
$private = pack(
|
||||
'Na*Na*Na*Na*',
|
||||
strlen($raw['privateExponent']),
|
||||
$raw['privateExponent'],
|
||||
strlen($raw['prime1']),
|
||||
$raw['prime1'],
|
||||
strlen($raw['prime2']),
|
||||
$raw['prime2'],
|
||||
strlen($raw['coefficient']),
|
||||
$raw['coefficient']
|
||||
);
|
||||
if (empty($this->password) && !is_string($this->password)) {
|
||||
$source.= pack('Na*', strlen($private), $private);
|
||||
@ -835,8 +856,14 @@ class RSA
|
||||
|
||||
if ($this->privateKeyFormat == self::PRIVATE_FORMAT_PKCS8) {
|
||||
$rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA
|
||||
$RSAPrivateKey = pack('Ca*a*Ca*a*',
|
||||
self::ASN1_INTEGER, "\01\00", $rsaOID, 4, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey
|
||||
$RSAPrivateKey = pack(
|
||||
'Ca*a*Ca*a*',
|
||||
self::ASN1_INTEGER,
|
||||
"\01\00",
|
||||
$rsaOID,
|
||||
4,
|
||||
$this->_encodeLength(strlen($RSAPrivateKey)),
|
||||
$RSAPrivateKey
|
||||
);
|
||||
$RSAPrivateKey = pack('Ca*a*', self::ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey);
|
||||
if (!empty($this->password) || is_string($this->password)) {
|
||||
@ -847,20 +874,35 @@ class RSA
|
||||
$crypto->setPassword($this->password, 'pbkdf1', 'md5', $salt, $iterationCount);
|
||||
$RSAPrivateKey = $crypto->encrypt($RSAPrivateKey);
|
||||
|
||||
$parameters = pack('Ca*a*Ca*N',
|
||||
self::ASN1_OCTETSTRING, $this->_encodeLength(strlen($salt)), $salt,
|
||||
self::ASN1_INTEGER, $this->_encodeLength(4), $iterationCount
|
||||
$parameters = pack(
|
||||
'Ca*a*Ca*N',
|
||||
self::ASN1_OCTETSTRING,
|
||||
$this->_encodeLength(strlen($salt)),
|
||||
$salt,
|
||||
self::ASN1_INTEGER,
|
||||
$this->_encodeLength(4),
|
||||
$iterationCount
|
||||
);
|
||||
$pbeWithMD5AndDES_CBC = "\x2a\x86\x48\x86\xf7\x0d\x01\x05\x03";
|
||||
|
||||
$encryptionAlgorithm = pack('Ca*a*Ca*a*',
|
||||
self::ASN1_OBJECT, $this->_encodeLength(strlen($pbeWithMD5AndDES_CBC)), $pbeWithMD5AndDES_CBC,
|
||||
self::ASN1_SEQUENCE, $this->_encodeLength(strlen($parameters)), $parameters
|
||||
$encryptionAlgorithm = pack(
|
||||
'Ca*a*Ca*a*',
|
||||
self::ASN1_OBJECT,
|
||||
$this->_encodeLength(strlen($pbeWithMD5AndDES_CBC)),
|
||||
$pbeWithMD5AndDES_CBC,
|
||||
self::ASN1_SEQUENCE,
|
||||
$this->_encodeLength(strlen($parameters)),
|
||||
$parameters
|
||||
);
|
||||
|
||||
$RSAPrivateKey = pack('Ca*a*Ca*a*',
|
||||
self::ASN1_SEQUENCE, $this->_encodeLength(strlen($encryptionAlgorithm)), $encryptionAlgorithm,
|
||||
self::ASN1_OCTETSTRING, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey
|
||||
$RSAPrivateKey = pack(
|
||||
'Ca*a*Ca*a*',
|
||||
self::ASN1_SEQUENCE,
|
||||
$this->_encodeLength(strlen($encryptionAlgorithm)),
|
||||
$encryptionAlgorithm,
|
||||
self::ASN1_OCTETSTRING,
|
||||
$this->_encodeLength(strlen($RSAPrivateKey)),
|
||||
$RSAPrivateKey
|
||||
);
|
||||
|
||||
$RSAPrivateKey = pack('Ca*a*', self::ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey);
|
||||
@ -944,9 +986,12 @@ class RSA
|
||||
'publicExponent' => pack('Ca*a*', self::ASN1_INTEGER, $this->_encodeLength(strlen($publicExponent)), $publicExponent)
|
||||
);
|
||||
|
||||
$RSAPublicKey = pack('Ca*a*a*',
|
||||
self::ASN1_SEQUENCE, $this->_encodeLength(strlen($components['modulus']) + strlen($components['publicExponent'])),
|
||||
$components['modulus'], $components['publicExponent']
|
||||
$RSAPublicKey = pack(
|
||||
'Ca*a*a*',
|
||||
self::ASN1_SEQUENCE,
|
||||
$this->_encodeLength(strlen($components['modulus']) + strlen($components['publicExponent'])),
|
||||
$components['modulus'],
|
||||
$components['publicExponent']
|
||||
);
|
||||
|
||||
if ($this->publicKeyFormat == self::PUBLIC_FORMAT_PKCS1_RAW) {
|
||||
@ -959,8 +1004,11 @@ class RSA
|
||||
$RSAPublicKey = chr(0) . $RSAPublicKey;
|
||||
$RSAPublicKey = chr(3) . $this->_encodeLength(strlen($RSAPublicKey)) . $RSAPublicKey;
|
||||
|
||||
$RSAPublicKey = pack('Ca*a*',
|
||||
self::ASN1_SEQUENCE, $this->_encodeLength(strlen($rsaOID . $RSAPublicKey)), $rsaOID . $RSAPublicKey
|
||||
$RSAPublicKey = pack(
|
||||
'Ca*a*',
|
||||
self::ASN1_SEQUENCE,
|
||||
$this->_encodeLength(strlen($rsaOID . $RSAPublicKey)),
|
||||
$rsaOID . $RSAPublicKey
|
||||
);
|
||||
|
||||
$RSAPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" .
|
||||
@ -1734,8 +1782,7 @@ class RSA
|
||||
|
||||
$RSAPublicKey = pack('Na*Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($publicExponent), $publicExponent, strlen($modulus), $modulus);
|
||||
|
||||
switch($algorithm)
|
||||
{
|
||||
switch ($algorithm) {
|
||||
case 'sha256':
|
||||
$hash = new Hash('sha256');
|
||||
$base = base64_encode($hash->hash($RSAPublicKey));
|
||||
@ -2518,7 +2565,7 @@ class RSA
|
||||
// be output.
|
||||
|
||||
$emLen = ($emBits + 1) >> 3; // ie. ceil($emBits / 8)
|
||||
$sLen = $this->sLen === false ? $this->hLen : $this->sLen;
|
||||
$sLen = $this->sLen ? $this->sLen : $this->hLen;
|
||||
|
||||
$mHash = $this->hash->hash($m);
|
||||
if ($emLen < $this->hLen + $sLen + 2) {
|
||||
@ -2555,7 +2602,7 @@ class RSA
|
||||
// be output.
|
||||
|
||||
$emLen = ($emBits + 1) >> 3; // ie. ceil($emBits / 8);
|
||||
$sLen = $this->sLen === false ? $this->hLen : $this->sLen;
|
||||
$sLen = $this->sLen ? $this->sLen : $this->hLen;
|
||||
|
||||
$mHash = $this->hash->hash($m);
|
||||
if ($emLen < $this->hLen + $sLen + 2) {
|
||||
|
@ -533,7 +533,9 @@ class Twofish extends Base
|
||||
$u^= 0x7fffffff & ($t >> 1);
|
||||
|
||||
// Add the modular polynomial on underflow.
|
||||
if ($t & 0x01) $u^= 0xa6 ;
|
||||
if ($t & 0x01) {
|
||||
$u^= 0xa6 ;
|
||||
}
|
||||
|
||||
// Remove t * (a + 1/a) * (x^3 + x).
|
||||
$B^= ($u << 24) | ($u << 8);
|
||||
|
@ -337,6 +337,7 @@ class ANSI
|
||||
//$back = $attr_cell->reverse ? &$attr_cell->foreground : &$attr_cell->background;
|
||||
$back = &$attr_cell->{ $attr_cell->reverse ? 'foreground' : 'background' };
|
||||
switch ($mod) {
|
||||
// @codingStandardsIgnoreStart
|
||||
case 30: $front = 'black'; break;
|
||||
case 31: $front = 'red'; break;
|
||||
case 32: $front = 'green'; break;
|
||||
@ -354,6 +355,7 @@ class ANSI
|
||||
case 45: $back = 'magenta'; break;
|
||||
case 46: $back = 'cyan'; break;
|
||||
case 47: $back = 'white'; break;
|
||||
// @codingStandardsIgnoreEnd
|
||||
|
||||
default:
|
||||
//user_error('Unsupported attribute: ' . $mod);
|
||||
|
@ -28,6 +28,7 @@ namespace phpseclib\File;
|
||||
|
||||
use phpseclib\Crypt\Hash;
|
||||
use phpseclib\Crypt\RSA;
|
||||
use phpseclib\Crypt\Random;
|
||||
use phpseclib\File\ASN1;
|
||||
use phpseclib\File\ASN1\Element;
|
||||
use phpseclib\Math\BigInteger;
|
||||
@ -3244,7 +3245,16 @@ class X509
|
||||
|
||||
$startDate = !empty($this->startDate) ? $this->startDate : @date('D, d M Y H:i:s O');
|
||||
$endDate = !empty($this->endDate) ? $this->endDate : @date('D, d M Y H:i:s O', strtotime('+1 year'));
|
||||
$serialNumber = !empty($this->serialNumber) ? $this->serialNumber : new BigInteger();
|
||||
/* "The serial number MUST be a positive integer"
|
||||
"Conforming CAs MUST NOT use serialNumber values longer than 20 octets."
|
||||
-- https://tools.ietf.org/html/rfc5280#section-4.1.2.2
|
||||
|
||||
for the integer to be positive the leading bit needs to be 0 hence the
|
||||
application of a bitmap
|
||||
*/
|
||||
$serialNumber = !empty($this->serialNumber) ?
|
||||
$this->serialNumber :
|
||||
new BigInteger(Random::string(20) & ("\x7F" . str_repeat("\xFF", 19)), 256);
|
||||
|
||||
$this->currentCert = array(
|
||||
'tbsCertificate' =>
|
||||
@ -3282,8 +3292,7 @@ class X509
|
||||
// )
|
||||
//),
|
||||
'keyIdentifier' => $issuer->currentKeyIdentifier
|
||||
)
|
||||
);
|
||||
));
|
||||
//$extensions = &$this->currentCert['tbsCertificate']['extensions'];
|
||||
//if (isset($issuer->serialNumber)) {
|
||||
// $extensions[count($extensions) - 1]['authorityCertSerialNumber'] = $issuer->serialNumber;
|
||||
@ -3326,7 +3335,8 @@ class X509
|
||||
$keyUsage = array();
|
||||
}
|
||||
|
||||
$this->setExtension('id-ce-keyUsage',
|
||||
$this->setExtension(
|
||||
'id-ce-keyUsage',
|
||||
array_values(array_unique(array_merge($keyUsage, array('cRLSign', 'keyCertSign'))))
|
||||
);
|
||||
|
||||
@ -3335,8 +3345,11 @@ class X509
|
||||
$basicConstraints = array();
|
||||
}
|
||||
|
||||
$this->setExtension('id-ce-basicConstraints',
|
||||
array_unique(array_merge(array('cA' => true), $basicConstraints)), true);
|
||||
$this->setExtension(
|
||||
'id-ce-basicConstraints',
|
||||
array_unique(array_merge(array('cA' => true), $basicConstraints)),
|
||||
true
|
||||
);
|
||||
|
||||
if (!isset($subject->currentKeyIdentifier)) {
|
||||
$this->setExtension('id-ce-subjectKeyIdentifier', base64_encode($this->computeKeyIdentifier($this->currentCert)), false, false);
|
||||
@ -3533,6 +3546,11 @@ class X509
|
||||
$crlNumber = $this->serialNumber;
|
||||
} else {
|
||||
$crlNumber = $this->getExtension('id-ce-cRLNumber');
|
||||
// "The CRL number is a non-critical CRL extension that conveys a
|
||||
// monotonically increasing sequence number for a given CRL scope and
|
||||
// CRL issuer. This extension allows users to easily determine when a
|
||||
// particular CRL supersedes another CRL."
|
||||
// -- https://tools.ietf.org/html/rfc5280#section-5.2.3
|
||||
$crlNumber = $crlNumber !== false ? $crlNumber->add(new BigInteger(1)) : null;
|
||||
}
|
||||
|
||||
@ -3571,8 +3589,7 @@ class X509
|
||||
// )
|
||||
//),
|
||||
'keyIdentifier' => $issuer->currentKeyIdentifier
|
||||
)
|
||||
);
|
||||
));
|
||||
//$extensions = &$tbsCertList['crlExtensions'];
|
||||
//if (isset($issuer->serialNumber)) {
|
||||
// $extensions[count($extensions) - 1]['authorityCertSerialNumber'] = $issuer->serialNumber;
|
||||
@ -4354,7 +4371,6 @@ class X509
|
||||
if (is_array($rclist = &$this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates', true))) {
|
||||
if ($this->_revokedCertificate($rclist, $serial) === false) { // If not yet revoked
|
||||
if (($i = $this->_revokedCertificate($rclist, $serial, true)) !== false) {
|
||||
|
||||
if (!empty($date)) {
|
||||
$rclist[$i]['revocationDate'] = $this->_timeField($date);
|
||||
}
|
||||
|
@ -1656,17 +1656,23 @@ class BigInteger
|
||||
'publicExponent' => pack('Ca*a*', 2, $this->_encodeASN1Length(strlen($components['publicExponent'])), $components['publicExponent'])
|
||||
);
|
||||
|
||||
$RSAPublicKey = pack('Ca*a*a*',
|
||||
48, $this->_encodeASN1Length(strlen($components['modulus']) + strlen($components['publicExponent'])),
|
||||
$components['modulus'], $components['publicExponent']
|
||||
$RSAPublicKey = pack(
|
||||
'Ca*a*a*',
|
||||
48,
|
||||
$this->_encodeASN1Length(strlen($components['modulus']) + strlen($components['publicExponent'])),
|
||||
$components['modulus'],
|
||||
$components['publicExponent']
|
||||
);
|
||||
|
||||
$rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA
|
||||
$RSAPublicKey = chr(0) . $RSAPublicKey;
|
||||
$RSAPublicKey = chr(3) . $this->_encodeASN1Length(strlen($RSAPublicKey)) . $RSAPublicKey;
|
||||
|
||||
$encapsulated = pack('Ca*a*',
|
||||
48, $this->_encodeASN1Length(strlen($rsaOID . $RSAPublicKey)), $rsaOID . $RSAPublicKey
|
||||
$encapsulated = pack(
|
||||
'Ca*a*',
|
||||
48,
|
||||
$this->_encodeASN1Length(strlen($rsaOID . $RSAPublicKey)),
|
||||
$rsaOID . $RSAPublicKey
|
||||
);
|
||||
|
||||
$RSAPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" .
|
||||
@ -1798,7 +1804,8 @@ class BigInteger
|
||||
|
||||
// calculate the appropriate window size.
|
||||
// $window_size == 3 if $window_ranges is between 25 and 81, for example.
|
||||
for ($i = 0, $window_size = 1; $e_length > $window_ranges[$i] && $i < count($window_ranges); ++$window_size, ++$i);
|
||||
for ($i = 0, $window_size = 1; $e_length > $window_ranges[$i] && $i < count($window_ranges); ++$window_size, ++$i) {
|
||||
}
|
||||
|
||||
$n_value = $n->value;
|
||||
|
||||
@ -2993,7 +3000,8 @@ class BigInteger
|
||||
}
|
||||
} else {
|
||||
$temp = ord($bits[0]);
|
||||
for ($i = 0; $temp >> $i; ++$i);
|
||||
for ($i = 0; $temp >> $i; ++$i) {
|
||||
}
|
||||
$precision = 8 * strlen($bits) - 8 + $i;
|
||||
$mask = chr((1 << ($precision & 0x7)) - 1) . str_repeat(chr(0xFF), $precision >> 3);
|
||||
}
|
||||
@ -3396,7 +3404,8 @@ class BigInteger
|
||||
} else {
|
||||
for ($i = 0, $r_length = count($r_value); $i < $r_length; ++$i) {
|
||||
$temp = ~$r_value[$i] & 0xFFFFFF;
|
||||
for ($j = 1; ($temp >> $j) & 1; ++$j);
|
||||
for ($j = 1; ($temp >> $j) & 1; ++$j) {
|
||||
}
|
||||
if ($j != 25) {
|
||||
break;
|
||||
}
|
||||
|
@ -397,8 +397,15 @@ class SFTP extends SSH2
|
||||
|
||||
$this->window_size_server_to_client[self::CHANNEL] = $this->window_size;
|
||||
|
||||
$packet = pack('CNa*N3',
|
||||
NET_SSH2_MSG_CHANNEL_OPEN, strlen('session'), 'session', self::CHANNEL, $this->window_size, 0x4000);
|
||||
$packet = pack(
|
||||
'CNa*N3',
|
||||
NET_SSH2_MSG_CHANNEL_OPEN,
|
||||
strlen('session'),
|
||||
'session',
|
||||
self::CHANNEL,
|
||||
$this->window_size,
|
||||
0x4000
|
||||
);
|
||||
|
||||
if (!$this->_send_binary_packet($packet)) {
|
||||
return false;
|
||||
@ -411,8 +418,16 @@ class SFTP extends SSH2
|
||||
return false;
|
||||
}
|
||||
|
||||
$packet = pack('CNNa*CNa*',
|
||||
NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[self::CHANNEL], strlen('subsystem'), 'subsystem', 1, strlen('sftp'), 'sftp');
|
||||
$packet = pack(
|
||||
'CNNa*CNa*',
|
||||
NET_SSH2_MSG_CHANNEL_REQUEST,
|
||||
$this->server_channels[self::CHANNEL],
|
||||
strlen('subsystem'),
|
||||
'subsystem',
|
||||
1,
|
||||
strlen('sftp'),
|
||||
'sftp'
|
||||
);
|
||||
if (!$this->_send_binary_packet($packet)) {
|
||||
return false;
|
||||
}
|
||||
@ -427,8 +442,16 @@ class SFTP extends SSH2
|
||||
"exec sftp-server";
|
||||
// we don't do $this->exec($command, false) because exec() operates on a different channel and plus the SSH_MSG_CHANNEL_OPEN that exec() does
|
||||
// is redundant
|
||||
$packet = pack('CNNa*CNa*',
|
||||
NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[self::CHANNEL], strlen('exec'), 'exec', 1, strlen($command), $command);
|
||||
$packet = pack(
|
||||
'CNNa*CNa*',
|
||||
NET_SSH2_MSG_CHANNEL_REQUEST,
|
||||
$this->server_channels[self::CHANNEL],
|
||||
strlen('exec'),
|
||||
'exec',
|
||||
1,
|
||||
strlen($command),
|
||||
$command
|
||||
);
|
||||
if (!$this->_send_binary_packet($packet)) {
|
||||
return false;
|
||||
}
|
||||
@ -863,7 +886,7 @@ class SFTP extends SSH2
|
||||
} else {
|
||||
$temp = $dir . '/' . $shortname;
|
||||
}
|
||||
$this->_update_stat_cache($temp, (object) array('stat' => $attributes));
|
||||
$this->_update_stat_cache($temp, (object) array('lstat' => $attributes));
|
||||
}
|
||||
// SFTPv6 has an optional boolean end-of-list field, but we'll ignore that, since the
|
||||
// final SSH_FXP_STATUS packet should tell us that, already.
|
||||
@ -1033,6 +1056,12 @@ class SFTP extends SSH2
|
||||
$temp = &$this->stat_cache;
|
||||
$max = count($dirs) - 1;
|
||||
foreach ($dirs as $i => $dir) {
|
||||
// if $temp is an object that means one of two things.
|
||||
// 1. a file was deleted and changed to a directory behind phpseclib's back
|
||||
// 2. it's a symlink. when lstat is done it's unclear what it's a symlink to
|
||||
if (is_object($temp)) {
|
||||
$temp = array();
|
||||
}
|
||||
if (!isset($temp[$dir])) {
|
||||
$temp[$dir] = array();
|
||||
}
|
||||
@ -1122,7 +1151,7 @@ class SFTP extends SSH2
|
||||
|
||||
if ($this->use_stat_cache) {
|
||||
$result = $this->_query_stat_cache($filename);
|
||||
if (is_array($result) && isset($result['.'])) {
|
||||
if (is_array($result) && isset($result['.']) && isset($result['.']->stat)) {
|
||||
return $result['.']->stat;
|
||||
}
|
||||
if (is_object($result) && isset($result->stat)) {
|
||||
@ -2369,13 +2398,20 @@ class SFTP extends SSH2
|
||||
}
|
||||
|
||||
switch ($type) {
|
||||
case NET_SFTP_TYPE_BLOCK_DEVICE: return 'block';
|
||||
case NET_SFTP_TYPE_CHAR_DEVICE: return 'char';
|
||||
case NET_SFTP_TYPE_DIRECTORY: return 'dir';
|
||||
case NET_SFTP_TYPE_FIFO: return 'fifo';
|
||||
case NET_SFTP_TYPE_REGULAR: return 'file';
|
||||
case NET_SFTP_TYPE_SYMLINK: return 'link';
|
||||
default: return false;
|
||||
case NET_SFTP_TYPE_BLOCK_DEVICE:
|
||||
return 'block';
|
||||
case NET_SFTP_TYPE_CHAR_DEVICE:
|
||||
return 'char';
|
||||
case NET_SFTP_TYPE_DIRECTORY:
|
||||
return 'dir';
|
||||
case NET_SFTP_TYPE_FIFO:
|
||||
return 'fifo';
|
||||
case NET_SFTP_TYPE_REGULAR:
|
||||
return 'file';
|
||||
case NET_SFTP_TYPE_SYMLINK:
|
||||
return 'link';
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -226,8 +226,14 @@ class Agent
|
||||
return false;
|
||||
}
|
||||
|
||||
$packet = pack('CNNa*C',
|
||||
NET_SSH2_MSG_CHANNEL_REQUEST, $ssh->server_channels[$request_channel], strlen('auth-agent-req@openssh.com'), 'auth-agent-req@openssh.com', 1);
|
||||
$packet = pack(
|
||||
'CNNa*C',
|
||||
NET_SSH2_MSG_CHANNEL_REQUEST,
|
||||
$ssh->server_channels[$request_channel],
|
||||
strlen('auth-agent-req@openssh.com'),
|
||||
'auth-agent-req@openssh.com',
|
||||
1
|
||||
);
|
||||
|
||||
$ssh->channel_status[$request_channel] = NET_SSH2_MSG_CHANNEL_REQUEST;
|
||||
|
||||
|
@ -15,7 +15,7 @@ class Functional_Net_SCPSSH2UserStoryTest extends PhpseclibFunctionalTestCase
|
||||
static protected $exampleData;
|
||||
static protected $exampleDataLength;
|
||||
|
||||
static public function setUpBeforeClass()
|
||||
public static function setUpBeforeClass()
|
||||
{
|
||||
parent::setUpBeforeClass();
|
||||
self::$remoteFile = uniqid('phpseclib-scp-ssh2-') . '.txt';
|
||||
|
@ -11,7 +11,7 @@ use phpseclib\Net\SFTP;
|
||||
|
||||
class Functional_Net_SFTPLargeFileTest extends Functional_Net_SFTPTestCase
|
||||
{
|
||||
static public function setUpBeforeClass()
|
||||
public static function setUpBeforeClass()
|
||||
{
|
||||
if (!extension_loaded('mcrypt') && !extension_loaded('openssl')) {
|
||||
self::markTestSkipped('This test depends on mcrypt or openssl for performance.');
|
||||
|
@ -10,7 +10,7 @@ use phpseclib\Net\SFTP\Stream;
|
||||
|
||||
class Functional_Net_SFTPStreamTest extends Functional_Net_SFTPTestCase
|
||||
{
|
||||
static public function setUpBeforeClass()
|
||||
public static function setUpBeforeClass()
|
||||
{
|
||||
Stream::register();
|
||||
parent::setUpBeforeClass();
|
||||
|
@ -15,7 +15,7 @@ class Functional_Net_SFTPUserStoryTest extends PhpseclibFunctionalTestCase
|
||||
static protected $exampleDataLength;
|
||||
static protected $buffer;
|
||||
|
||||
static public function setUpBeforeClass()
|
||||
public static function setUpBeforeClass()
|
||||
{
|
||||
parent::setUpBeforeClass();
|
||||
|
||||
@ -164,7 +164,9 @@ class Functional_Net_SFTPUserStoryTest extends PhpseclibFunctionalTestCase
|
||||
{
|
||||
$r = substr(self::$buffer, 0, $length);
|
||||
self::$buffer = substr(self::$buffer, $length);
|
||||
if (strlen($r)) return $r;
|
||||
if (strlen($r)) {
|
||||
return $r;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@ -337,7 +339,8 @@ class Functional_Net_SFTPUserStoryTest extends PhpseclibFunctionalTestCase
|
||||
if ($sftp->is_file($file)) {
|
||||
$cur_size = $sftp->size($file);
|
||||
$this->assertLessThanOrEqual(
|
||||
$last_size, $cur_size,
|
||||
$last_size,
|
||||
$cur_size,
|
||||
'Failed asserting that nlist() is in descending order'
|
||||
);
|
||||
$last_size = $cur_size;
|
||||
@ -388,7 +391,8 @@ class Functional_Net_SFTPUserStoryTest extends PhpseclibFunctionalTestCase
|
||||
$stat = $sftp->stat('symlink');
|
||||
$lstat = $sftp->lstat('symlink');
|
||||
$this->assertNotEquals(
|
||||
$stat, $lstat,
|
||||
$stat,
|
||||
$lstat,
|
||||
'Failed asserting that stat and lstat returned different output for a symlink'
|
||||
);
|
||||
|
||||
@ -421,7 +425,9 @@ class Functional_Net_SFTPUserStoryTest extends PhpseclibFunctionalTestCase
|
||||
*/
|
||||
public function testReadlink($sftp)
|
||||
{
|
||||
$this->assertInternalType('string', $sftp->readlink('symlink'),
|
||||
$this->assertInternalType(
|
||||
'string',
|
||||
$sftp->readlink('symlink'),
|
||||
'Failed asserting that a symlink\'s target could be read'
|
||||
);
|
||||
|
||||
@ -436,12 +442,14 @@ class Functional_Net_SFTPUserStoryTest extends PhpseclibFunctionalTestCase
|
||||
{
|
||||
$stat = $sftp->stat('.');
|
||||
$this->assertInternalType(
|
||||
'array', $stat,
|
||||
'array',
|
||||
$stat,
|
||||
'Failed asserting that stat on . returns an array'
|
||||
);
|
||||
$lstat = $sftp->lstat('.');
|
||||
$this->assertInternalType(
|
||||
'array', $lstat,
|
||||
'array',
|
||||
$lstat,
|
||||
'Failed asserting that lstat on . returns an array'
|
||||
);
|
||||
|
||||
@ -596,5 +604,52 @@ class Functional_Net_SFTPUserStoryTest extends PhpseclibFunctionalTestCase
|
||||
$sftp->stat(self::$scratchDir),
|
||||
'Failed asserting that stat on a deleted directory returns false'
|
||||
);
|
||||
|
||||
return $sftp;
|
||||
}
|
||||
|
||||
/**
|
||||
* @depends testDeleteEmptyDir
|
||||
* @group github735
|
||||
*/
|
||||
public function testStatVsLstat($sftp)
|
||||
{
|
||||
$this->assertTrue($sftp->mkdir(self::$scratchDir));
|
||||
$this->assertTrue($sftp->chdir(self::$scratchDir));
|
||||
$this->assertTrue($sftp->put('text.txt', 'zzzzz'));
|
||||
$this->assertTrue($sftp->symlink('text.txt', 'link.txt'));
|
||||
$this->assertTrue($sftp->mkdir('subdir'));
|
||||
$this->assertTrue($sftp->symlink('subdir', 'linkdir'));
|
||||
|
||||
$sftp->clearStatCache();
|
||||
|
||||
// pre-populate the stat cache
|
||||
$sftp->nlist();
|
||||
|
||||
$stat = $sftp->stat('link.txt');
|
||||
$this->assertSame($stat['type'], NET_SFTP_TYPE_REGULAR);
|
||||
$stat = $sftp->lstat('link.txt');
|
||||
$this->assertSame($stat['type'], NET_SFTP_TYPE_SYMLINK);
|
||||
|
||||
$stat = $sftp->stat('linkdir');
|
||||
$this->assertSame($stat['type'], NET_SFTP_TYPE_DIRECTORY);
|
||||
$stat = $sftp->lstat('link.txt');
|
||||
$this->assertSame($stat['type'], NET_SFTP_TYPE_SYMLINK);
|
||||
|
||||
$sftp->disableStatCache();
|
||||
|
||||
$sftp->nlist();
|
||||
|
||||
$stat = $sftp->stat('link.txt');
|
||||
$this->assertSame($stat['type'], NET_SFTP_TYPE_REGULAR);
|
||||
$stat = $sftp->lstat('link.txt');
|
||||
$this->assertSame($stat['type'], NET_SFTP_TYPE_SYMLINK);
|
||||
|
||||
$stat = $sftp->stat('linkdir');
|
||||
$this->assertSame($stat['type'], NET_SFTP_TYPE_DIRECTORY);
|
||||
$stat = $sftp->lstat('link.txt');
|
||||
$this->assertSame($stat['type'], NET_SFTP_TYPE_SYMLINK);
|
||||
|
||||
$sftp->enableStatCache();
|
||||
}
|
||||
}
|
||||
|
@ -87,4 +87,17 @@ class Functional_Net_SSH2Test extends PhpseclibFunctionalTestCase
|
||||
|
||||
$this->assertInternalType('string', $ssh->getServerPublicHostKey());
|
||||
}
|
||||
|
||||
public function testOpenSocketConnect()
|
||||
{
|
||||
$fsock = fsockopen($this->getEnv('SSH_HOSTNAME'), 22);
|
||||
$ssh = new SSH2($fsock);
|
||||
|
||||
$username = $this->getEnv('SSH_USERNAME');
|
||||
$password = $this->getEnv('SSH_PASSWORD');
|
||||
$this->assertTrue(
|
||||
$ssh->login($username, $password),
|
||||
'SSH2 login using an open socket failed.'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -10,7 +10,7 @@ use phpseclib\Math\BigInteger;
|
||||
|
||||
abstract class PhpseclibFunctionalTestCase extends PhpseclibTestCase
|
||||
{
|
||||
static public function setUpBeforeClass()
|
||||
public static function setUpBeforeClass()
|
||||
{
|
||||
if (extension_loaded('runkit')) {
|
||||
if (extension_loaded('gmp')) {
|
||||
|
@ -53,7 +53,7 @@ abstract class PhpseclibTestCase extends PHPUnit_Framework_TestCase
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
static protected function ensureConstant($constant, $expected)
|
||||
protected static function ensureConstant($constant, $expected)
|
||||
{
|
||||
if (defined($constant)) {
|
||||
$value = constant($constant);
|
||||
@ -82,15 +82,15 @@ abstract class PhpseclibTestCase extends PHPUnit_Framework_TestCase
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $filename
|
||||
* @param string $filename Filename relative to library directory.
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
static protected function reRequireFile($filename)
|
||||
protected static function reRequireFile($filename)
|
||||
{
|
||||
if (function_exists('runkit_import')) {
|
||||
$result = runkit_import(
|
||||
$filename,
|
||||
sprintf('%s/../phpseclib/%s', __DIR__, $filename),
|
||||
RUNKIT_IMPORT_FUNCTIONS |
|
||||
RUNKIT_IMPORT_CLASS_METHODS |
|
||||
RUNKIT_IMPORT_OVERRIDE
|
||||
|
@ -22,7 +22,7 @@ class Unit_Crypt_Hash_MD5Test extends Unit_Crypt_Hash_TestCase
|
||||
$this->assertHashesTo($this->getInstance(), $message, $result);
|
||||
}
|
||||
|
||||
static public function hashData()
|
||||
public static function hashData()
|
||||
{
|
||||
return array(
|
||||
array('', 'd41d8cd98f00b204e9800998ecf8427e'),
|
||||
@ -39,7 +39,7 @@ class Unit_Crypt_Hash_MD5Test extends Unit_Crypt_Hash_TestCase
|
||||
$this->assertHMACsTo($this->getInstance(), $key, $message, $result);
|
||||
}
|
||||
|
||||
static public function hmacData()
|
||||
public static function hmacData()
|
||||
{
|
||||
return array(
|
||||
array('', '', '74e6f7298a9c2d168935f58c001bad88'),
|
||||
|
@ -22,7 +22,7 @@ class Unit_Crypt_Hash_SHA256Test extends Unit_Crypt_Hash_TestCase
|
||||
$this->assertHashesTo($this->getInstance(), $message, $result);
|
||||
}
|
||||
|
||||
static public function hashData()
|
||||
public static function hashData()
|
||||
{
|
||||
return array(
|
||||
array(
|
||||
@ -48,7 +48,7 @@ class Unit_Crypt_Hash_SHA256Test extends Unit_Crypt_Hash_TestCase
|
||||
$this->assertHMACsTo($this->getInstance(), $key, $message, $result);
|
||||
}
|
||||
|
||||
static public function hmacData()
|
||||
public static function hmacData()
|
||||
{
|
||||
return array(
|
||||
// RFC 4231
|
||||
|
@ -22,7 +22,7 @@ class Unit_Crypt_Hash_SHA512Test extends Unit_Crypt_Hash_TestCase
|
||||
$this->assertHashesTo($this->getInstance(), $message, $result);
|
||||
}
|
||||
|
||||
static public function hashData()
|
||||
public static function hashData()
|
||||
{
|
||||
return array(
|
||||
array(
|
||||
@ -48,7 +48,7 @@ class Unit_Crypt_Hash_SHA512Test extends Unit_Crypt_Hash_TestCase
|
||||
$this->assertHMACsTo($this->getInstance(), $key, $message, $result);
|
||||
}
|
||||
|
||||
static public function hmacData()
|
||||
public static function hmacData()
|
||||
{
|
||||
return array(
|
||||
// RFC 4231
|
||||
|
@ -9,7 +9,7 @@ use phpseclib\Crypt\Hash;
|
||||
|
||||
abstract class Unit_Crypt_Hash_TestCase extends PhpseclibTestCase
|
||||
{
|
||||
static public function setUpBeforeClass()
|
||||
public static function setUpBeforeClass()
|
||||
{
|
||||
if (!defined('CRYPT_HASH_MODE')) {
|
||||
define('CRYPT_HASH_MODE', Hash::MODE_INTERNAL);
|
||||
|
@ -43,4 +43,24 @@ U9VQQSQzY1oZMVX8i1m5WUTLPz2yLJIBQVdXqhMCQBGoiuSoSjafUhV7i1cEGpb88h5NBYZzWXGZ
|
||||
$rsa->loadKey($privatekey);
|
||||
$this->assertEquals(trim($rsa->decrypt($result), "\0"), $plaintext);
|
||||
}
|
||||
|
||||
/**
|
||||
* @group github768
|
||||
*/
|
||||
public function testPSSSigs()
|
||||
{
|
||||
$rsa = new RSA();
|
||||
$rsa->loadKey('-----BEGIN PUBLIC KEY-----
|
||||
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqGKukO1De7zhZj6+H0qtjTkVx
|
||||
wTCpvKe4eCZ0FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFnc
|
||||
CzWBQ7RKNUSesmQRMSGkVb1/3j+skZ6UtW+5u09lHNsj6tQ51s1SPrCBkedbNf0T
|
||||
p0GbMJDyR4e9T04ZZwIDAQAB
|
||||
-----END PUBLIC KEY-----');
|
||||
|
||||
$sig = pack('H*', '1bd29a1d704a906cd7f726370ce1c63d8fb7b9a620871a05f3141a311c0d6e75fefb5d36dfb50d3ea2d37cd67992471419bfadd35da6e13b494' .
|
||||
'058ddc9b568d4cfea13ddc3c62b86a6256f5f296980d1131d3eaec6089069a3de79983f73eae20198a18721338b4a66e9cfe80e4f8e4fcef7a5bead5cbb' .
|
||||
'b8ac4c76adffbc178c');
|
||||
|
||||
$this->assertTrue($rsa->verify('zzzz', $sig));
|
||||
}
|
||||
}
|
||||
|
@ -12,6 +12,55 @@ use phpseclib\Crypt\RSA;
|
||||
|
||||
class Unit_File_X509_X509Test extends PhpseclibTestCase
|
||||
{
|
||||
public function testExtensionMapping()
|
||||
{
|
||||
$test = '-----BEGIN CERTIFICATE-----
|
||||
MIIG1jCCBL6gAwIBAgITUAAAAA0qg8bE6DhrLAAAAAAADTANBgkqhkiG9w0BAQsF
|
||||
ADAiMSAwHgYDVQQDExcuU2VjdXJlIEVudGVycHJpc2UgQ0EgMTAeFw0xNTAyMjMx
|
||||
NTE1MDdaFw0xNjAyMjMxNTE1MDdaMD8xFjAUBgoJkiaJk/IsZAEZFgZzZWN1cmUx
|
||||
DjAMBgNVBAMTBVVzZXJzMRUwEwYDVQQDEwxtZXRhY2xhc3NpbmcwggEiMA0GCSqG
|
||||
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDMdG1CzR/gTalbLN9J+2cvMGeD7wsR7S78
|
||||
HU5hdwE+kECROjRAcjFBOR57ezSDrkmhkTzo28tj0oAHjOh8N9vuXtASfZSCXugx
|
||||
H+ImJ+E7PA4aXBp+0H2hohW9sXNNCFiVNmJLX66O4bxIeKtVRq/+eSNijV4OOEkC
|
||||
zMyTHAUbOFP0t6KoJtM1syNoQ1+fKdfcjz5XtiEzSVcp2zf0MwNFSeZSgGQ0jh8A
|
||||
Kd6YVKA8ZnrqOWZxKETT+bBNTjIT0ggjQfzcE4zW2RzrN7zWabUowoU92+DAp4s3
|
||||
sAEywX9ISSge62DEzTnZZSf9bpoScAfT8raRFA3BkoJ/s4c4CgfPAgMBAAGjggLm
|
||||
MIIC4jAdBgNVHQ4EFgQULlIyJL9+ZwAI/SkVdsJMxFOVp+EwHwYDVR0jBBgwFoAU
|
||||
5nEIMEUT5mMd1WepmviwgK7dIzwwggEKBgNVHR8EggEBMIH+MIH7oIH4oIH1hoG5
|
||||
bGRhcDovLy9DTj0uU2VjdXJlJTIwRW50ZXJwcmlzZSUyMENBJTIwMSxDTj1hdXRo
|
||||
LENOPUNEUCxDTj1QdWJsaWMlMjBLZXklMjBTZXJ2aWNlcyxDTj1TZXJ2aWNlcyxD
|
||||
Tj1Db25maWd1cmF0aW9uLERDPXNlY3VyZT9jZXJ0aWZpY2F0ZVJldm9jYXRpb25M
|
||||
aXN0P2Jhc2U/b2JqZWN0Q2xhc3M9Y1JMRGlzdHJpYnV0aW9uUG9pbnSGN2h0dHA6
|
||||
Ly9jcmwuc2VjdXJlb2JzY3VyZS5jb20vP2FjdGlvbj1jcmwmY2E9ZW50ZXJwcmlz
|
||||
ZTEwgccGCCsGAQUFBwEBBIG6MIG3MIG0BggrBgEFBQcwAoaBp2xkYXA6Ly8vQ049
|
||||
LlNlY3VyZSUyMEVudGVycHJpc2UlMjBDQSUyMDEsQ049QUlBLENOPVB1YmxpYyUy
|
||||
MEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRpb24sREM9
|
||||
c2VjdXJlP2NBQ2VydGlmaWNhdGU/YmFzZT9vYmplY3RDbGFzcz1jZXJ0aWZpY2F0
|
||||
aW9uQXV0aG9yaXR5MBcGCSsGAQQBgjcUAgQKHggAVQBzAGUAcjAOBgNVHQ8BAf8E
|
||||
BAMCBaAwKQYDVR0lBCIwIAYKKwYBBAGCNwoDBAYIKwYBBQUHAwQGCCsGAQUFBwMC
|
||||
MC4GA1UdEQQnMCWgIwYKKwYBBAGCNxQCA6AVDBNtZXRhY2xhc3NpbmdAc2VjdXJl
|
||||
MEQGCSqGSIb3DQEJDwQ3MDUwDgYIKoZIhvcNAwICAgCAMA4GCCqGSIb3DQMEAgIA
|
||||
gDAHBgUrDgMCBzAKBggqhkiG9w0DBzANBgkqhkiG9w0BAQsFAAOCAgEAKNmjYh+h
|
||||
cObJEM0CWgz50jOYKZ4M5iIxoAWgrYY9Pv+0O9aPjvPLzjd5bY322L8lxh5wy5my
|
||||
DKmip+irzjdVdxzQfoyy+ceODmCbX9L6MfEDn0RBzdwjLe1/eOxE1na0sZztrVCc
|
||||
yt5nI91NNGZJUcVqVQsIA/25FWlkvo/FTfuqTuXdQiEVM5MCKJI915anmTdugy+G
|
||||
0CmBJALIxtyz5P7sZhaHZFNdpKnx82QsauErqjP9H0RXc6VXX5qt+tEDvYfSlFcc
|
||||
0lv3aQnV/eIdfm7APJkQ3lmNWWQwdkVf7adXJ7KAAPHSt1yvSbVxThJR/jmIkyeQ
|
||||
XW/TOP5m7JI/GrmvdlzI1AgwJ+zO8fOmCDuif99pDb1CvkzQ65RZ8p5J1ZV6hzlb
|
||||
VvOhn4LDnT1jnTcEqigmx1gxM/5ifvMorXn/ItMjKPlb72vHpeF7OeKE8GHsvZAm
|
||||
osHcKyJXbTIcXchmpZX1efbmCMJBqHgJ/qBTBMl9BX0+YqbTZyabRJSs9ezbTRn0
|
||||
oRYl21Q8EnvS71CemxEUkSsKJmfJKkQNCsOjc8AbX/V/X9R7LJkH3UEx6K2zQQKK
|
||||
k6m17mi63YW/+iPCGOWZ2qXmY5HPEyyF2L4L4IDryFJ+8xLyw3pH9/yp5aHZDtp6
|
||||
833K6qyjgHJT+fUzSEYpiwF5rSBJIGClOCY=
|
||||
-----END CERTIFICATE-----';
|
||||
|
||||
$x509 = new X509();
|
||||
|
||||
$cert = $x509->loadX509($test);
|
||||
|
||||
$this->assertInternalType('array', $cert['tbsCertificate']['extensions'][3]['extnValue']);
|
||||
}
|
||||
|
||||
public function testLoadUnsupportedExtension()
|
||||
{
|
||||
$test = '-----BEGIN CERTIFICATE-----
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
class Unit_Math_BigInteger_BCMathTest extends Unit_Math_BigInteger_TestCase
|
||||
{
|
||||
static public function setUpBeforeClass()
|
||||
public static function setUpBeforeClass()
|
||||
{
|
||||
if (!extension_loaded('bcmath')) {
|
||||
self::markTestSkipped('BCMath extension is not available.');
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
class Unit_Math_BigInteger_GMPTest extends Unit_Math_BigInteger_TestCase
|
||||
{
|
||||
static public function setUpBeforeClass()
|
||||
public static function setUpBeforeClass()
|
||||
{
|
||||
if (!extension_loaded('gmp')) {
|
||||
self::markTestSkipped('GNU Multiple Precision (GMP) extension is not available.');
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
class Unit_Math_BigInteger_InternalOpenSSLTest extends Unit_Math_BigInteger_TestCase
|
||||
{
|
||||
static public function setUpBeforeClass()
|
||||
public static function setUpBeforeClass()
|
||||
{
|
||||
if (!function_exists('openssl_public_encrypt')) {
|
||||
self::markTestSkipped('openssl_public_encrypt() function is not available.');
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
class Unit_Math_BigInteger_InternalTest extends Unit_Math_BigInteger_TestCase
|
||||
{
|
||||
static public function setUpBeforeClass()
|
||||
public static function setUpBeforeClass()
|
||||
{
|
||||
parent::setUpBeforeClass();
|
||||
|
||||
|
@ -7,12 +7,9 @@
|
||||
|
||||
abstract class Unit_Math_BigInteger_TestCase extends PhpseclibTestCase
|
||||
{
|
||||
static public function setUpBeforeClass()
|
||||
public static function setUpBeforeClass()
|
||||
{
|
||||
include_once 'Math/BigInteger.php';
|
||||
|
||||
parent::setUpBeforeClass();
|
||||
|
||||
self::reRequireFile('Math/BigInteger.php');
|
||||
}
|
||||
|
||||
|
@ -39,7 +39,11 @@ class Unit_Net_SSH2Test extends PhpseclibTestCase
|
||||
public function testGenerateIdentifier()
|
||||
{
|
||||
$identifier = $this->createSSHMock()->_generate_identifier();
|
||||
$this->assertStringStartsWith('SSH-2.0-phpseclib_0.3', $identifier);
|
||||
$this->assertStringStartsWith('SSH-2.0-phpseclib_2.0', $identifier);
|
||||
|
||||
if (extension_loaded('libsodium')) {
|
||||
$this->assertContains('libsodium', $identifier);
|
||||
}
|
||||
|
||||
if (extension_loaded('openssl')) {
|
||||
$this->assertContains('openssl', $identifier);
|
||||
|
@ -20,7 +20,7 @@ then
|
||||
PHPUNIT_ARGS="$PHPUNIT_ARGS -d zend.enable_gc=0"
|
||||
fi
|
||||
|
||||
if [ "$TRAVIS_PHP_VERSION" = 'hhvm' ]
|
||||
if [ "$TRAVIS_PHP_VERSION" = 'hhvm' -o "$TRAVIS_PHP_VERSION" = '7.0' ]
|
||||
then
|
||||
find tests -type f -name "*Test.php" | \
|
||||
parallel --gnu --keep-order \
|
||||
|
Loading…
Reference in New Issue
Block a user