mirror of
https://github.com/phpseclib/phpseclib.git
synced 2024-12-30 12:50:38 +00:00
Merge branch '2.0'
* 2.0: Fix indentation phpcbf did not fix. Remove PSR2.Methods.FunctionCallSignature.SpaceAfterOpenBracket exception. Use phpcbf to fix PHP code to ruleset. Ignore coding guidelines in ANSI switch block. Base code sniffer ruleset on PSR2 rather than PEAR. Update PHP Code Sniffer to 2.3.3
This commit is contained in:
commit
f0d653a8f3
@ -5,20 +5,12 @@
|
|||||||
|
|
||||||
<!-- In general rules that apply to library code also apply to tests. -->
|
<!-- In general rules that apply to library code also apply to tests. -->
|
||||||
<rule ref="./code-sniffer-ruleset.xml">
|
<rule ref="./code-sniffer-ruleset.xml">
|
||||||
<!-- Exceptions to the library coding standard follow. -->
|
<!-- Exceptions to the library coding standard follow. -->
|
||||||
|
|
||||||
<!-- We do not care too much about method, class and file documentation,
|
<!-- Test classes do not have to be namespaced but may use pseudo-namespacing
|
||||||
but having @author, @copyright and @license tags would be nice.
|
using underscore. -->
|
||||||
The following configuration does not check for these tags, but
|
<exclude name="PSR1.Classes.ClassDeclaration.MissingNamespace" />
|
||||||
complains if the file doc block is missing completely. -->
|
<exclude name="Squiz.Classes.ValidClassName.NotCamelCaps" />
|
||||||
<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. -->
|
|
||||||
<exclude name="PSR1.Classes.ClassDeclaration.MissingNamespace" />
|
|
||||||
</rule>
|
</rule>
|
||||||
|
|
||||||
</ruleset>
|
</ruleset>
|
||||||
|
@ -3,35 +3,25 @@
|
|||||||
|
|
||||||
<description>phpseclib coding standard</description>
|
<description>phpseclib coding standard</description>
|
||||||
|
|
||||||
<!-- We are using the PEAR standard as a base -->
|
<!-- We are using the PSR2 standard as a base -->
|
||||||
<rule ref="PEAR">
|
<rule ref="PSR2">
|
||||||
<!-- Temporary exceptions to the PEAR standard follow -->
|
<!-- Exceptions due to legacy code with PHP4 compatibility -->
|
||||||
<exclude name="Generic.ControlStructures.InlineControlStructure.Discouraged" />
|
<exclude name="PSR2.Classes.PropertyDeclaration.ScopeMissing" />
|
||||||
<exclude name="Generic.Files.LineLength.TooLong" />
|
<exclude name="PSR2.Classes.PropertyDeclaration.VarUsed" />
|
||||||
<exclude name="PEAR.NamingConventions.ValidFunctionName.FunctionNoCapital" />
|
<exclude name="Squiz.Scope.MethodScope.Missing" />
|
||||||
<exclude name="PEAR.NamingConventions.ValidFunctionName.NotCamelCaps" />
|
|
||||||
<exclude name="PEAR.Commenting.ClassComment.InvalidVersion" />
|
<!-- Exceptions for backward compatibility -->
|
||||||
<exclude name="PEAR.Commenting.ClassComment.MissingTag" />
|
<exclude name="PSR1.Methods.CamelCapsMethodName.NotCamelCaps" />
|
||||||
<exclude name="PEAR.Commenting.FileComment.EmptyCopyright" />
|
<exclude name="PSR2.Methods.MethodDeclaration.Underscore" />
|
||||||
<exclude name="PEAR.Commenting.FileComment.InvalidVersion" />
|
|
||||||
<exclude name="PEAR.Commenting.FunctionComment.ExtraParamComment" />
|
<!-- Exceptions for whitespacing -->
|
||||||
<exclude name="PEAR.Commenting.FunctionComment.MissingReturn" />
|
<exclude name="Generic.Functions.FunctionCallArgumentSpacing.TooMuchSpaceAfterComma" />
|
||||||
<exclude name="PEAR.Commenting.FunctionComment.MissingParamComment" />
|
<exclude name="PSR2.ControlStructures.SwitchDeclaration.SpaceBeforeColonCASE" />
|
||||||
<exclude name="PEAR.Commenting.FunctionComment.MissingParamName" />
|
<exclude name="PSR2.ControlStructures.SwitchDeclaration.SpaceBeforeColonDEFAULT" />
|
||||||
<exclude name="PEAR.Commenting.FunctionComment.MissingParamTag" />
|
|
||||||
<exclude name="PEAR.Commenting.FunctionComment.ParameterCommentsNotAligned" />
|
<!-- Other Exceptions -->
|
||||||
<exclude name="PEAR.Commenting.FunctionComment.ParameterNamesNotAligned" />
|
<exclude name="Generic.Files.LineLength.TooLong" />
|
||||||
<exclude name="PEAR.Commenting.FunctionComment.ParamNameNoMatch" />
|
<exclude name="PSR2.ControlStructures.SwitchDeclaration.TerminatingComment" />
|
||||||
<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" />
|
|
||||||
</rule>
|
</rule>
|
||||||
|
|
||||||
<!-- Useful additional rules follow -->
|
<!-- Useful additional rules follow -->
|
||||||
@ -42,46 +32,4 @@
|
|||||||
<!-- A method MUST not only call its parent -->
|
<!-- A method MUST not only call its parent -->
|
||||||
<rule ref="Generic.CodeAnalysis.UselessOverridingMethod" />
|
<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>
|
</ruleset>
|
||||||
|
@ -52,7 +52,7 @@
|
|||||||
"phing/phing": "~2.7",
|
"phing/phing": "~2.7",
|
||||||
"phpunit/phpunit": "~4.0",
|
"phpunit/phpunit": "~4.0",
|
||||||
"sami/sami": "~2.0",
|
"sami/sami": "~2.0",
|
||||||
"squizlabs/php_codesniffer": "~1.5"
|
"squizlabs/php_codesniffer": "~2.0"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"ext-mcrypt": "Install the Mcrypt extension in order to speed up a wide variety of cryptographic operations.",
|
"ext-mcrypt": "Install the Mcrypt extension in order to speed up a wide variety of cryptographic operations.",
|
||||||
|
27
composer.lock
generated
27
composer.lock
generated
@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"_readme": [
|
"_readme": [
|
||||||
"This file locks the dependencies of your project to a known state",
|
"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"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"hash": "1973a3fc1c8f678a9cd0ff646f7a8bee",
|
"hash": "a8adabfa04c250bbec41c87f79a59b31",
|
||||||
"packages": [],
|
"packages": [],
|
||||||
"packages-dev": [
|
"packages-dev": [
|
||||||
{
|
{
|
||||||
@ -1201,32 +1201,31 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "squizlabs/php_codesniffer",
|
"name": "squizlabs/php_codesniffer",
|
||||||
"version": "1.5.6",
|
"version": "2.3.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
|
"url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
|
||||||
"reference": "6f3e42d311b882b25b4d409d23a289f4d3b803d5"
|
"reference": "c1a26c729508f73560c1a4f767f60b8ab6b4a666"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/6f3e42d311b882b25b4d409d23a289f4d3b803d5",
|
"url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/c1a26c729508f73560c1a4f767f60b8ab6b4a666",
|
||||||
"reference": "6f3e42d311b882b25b4d409d23a289f4d3b803d5",
|
"reference": "c1a26c729508f73560c1a4f767f60b8ab6b4a666",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"ext-tokenizer": "*",
|
"ext-tokenizer": "*",
|
||||||
|
"ext-xmlwriter": "*",
|
||||||
"php": ">=5.1.2"
|
"php": ">=5.1.2"
|
||||||
},
|
},
|
||||||
"suggest": {
|
|
||||||
"phpunit/php-timer": "dev-master"
|
|
||||||
},
|
|
||||||
"bin": [
|
"bin": [
|
||||||
"scripts/phpcs"
|
"scripts/phpcs",
|
||||||
|
"scripts/phpcbf"
|
||||||
],
|
],
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-phpcs-fixer": "2.0.x-dev"
|
"dev-master": "2.0.x-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
@ -1235,12 +1234,12 @@
|
|||||||
"CodeSniffer/CLI.php",
|
"CodeSniffer/CLI.php",
|
||||||
"CodeSniffer/Exception.php",
|
"CodeSniffer/Exception.php",
|
||||||
"CodeSniffer/File.php",
|
"CodeSniffer/File.php",
|
||||||
|
"CodeSniffer/Fixer.php",
|
||||||
"CodeSniffer/Report.php",
|
"CodeSniffer/Report.php",
|
||||||
"CodeSniffer/Reporting.php",
|
"CodeSniffer/Reporting.php",
|
||||||
"CodeSniffer/Sniff.php",
|
"CodeSniffer/Sniff.php",
|
||||||
"CodeSniffer/Tokens.php",
|
"CodeSniffer/Tokens.php",
|
||||||
"CodeSniffer/Reports/",
|
"CodeSniffer/Reports/",
|
||||||
"CodeSniffer/CommentParser/",
|
|
||||||
"CodeSniffer/Tokenizers/",
|
"CodeSniffer/Tokenizers/",
|
||||||
"CodeSniffer/DocGenerators/",
|
"CodeSniffer/DocGenerators/",
|
||||||
"CodeSniffer/Standards/AbstractPatternSniff.php",
|
"CodeSniffer/Standards/AbstractPatternSniff.php",
|
||||||
@ -1266,13 +1265,13 @@
|
|||||||
"role": "lead"
|
"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",
|
"homepage": "http://www.squizlabs.com/php-codesniffer",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"phpcs",
|
"phpcs",
|
||||||
"standards"
|
"standards"
|
||||||
],
|
],
|
||||||
"time": "2014-12-04 22:32:15"
|
"time": "2015-06-24 03:16:23"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/console",
|
"name": "symfony/console",
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
* PHP version 5
|
* PHP version 5
|
||||||
*
|
*
|
||||||
* NOTE: Since AES.php is (for compatibility and phpseclib-historical reasons) virtually
|
* NOTE: Since AES.php is (for compatibility and phpseclib-historical reasons) virtually
|
||||||
* just a wrapper to Rijndael.php you may consider using Rijndael.php instead of
|
* just a wrapper to Rijndael.php you may consider using Rijndael.php instead of
|
||||||
* to save one include_once().
|
* to save one include_once().
|
||||||
*
|
*
|
||||||
|
@ -707,7 +707,7 @@ abstract class Base
|
|||||||
$iv = substr_replace($iv, $block, 0, $overflow);
|
$iv = substr_replace($iv, $block, 0, $overflow);
|
||||||
$ciphertext.= $block;
|
$ciphertext.= $block;
|
||||||
$pos = $overflow;
|
$pos = $overflow;
|
||||||
} else if ($len) {
|
} elseif ($len) {
|
||||||
$ciphertext = openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, $this->openssl_options, $iv);
|
$ciphertext = openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, $this->openssl_options, $iv);
|
||||||
$iv = substr($ciphertext, -$this->block_size);
|
$iv = substr($ciphertext, -$this->block_size);
|
||||||
}
|
}
|
||||||
@ -1014,7 +1014,7 @@ abstract class Base
|
|||||||
$plaintext.= $iv ^ substr($ciphertext, -$overflow);
|
$plaintext.= $iv ^ substr($ciphertext, -$overflow);
|
||||||
$iv = substr_replace($iv, substr($ciphertext, -$overflow), 0, $overflow);
|
$iv = substr_replace($iv, substr($ciphertext, -$overflow), 0, $overflow);
|
||||||
$pos = $overflow;
|
$pos = $overflow;
|
||||||
} else if ($len) {
|
} elseif ($len) {
|
||||||
$plaintext.= openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, $this->openssl_options, $iv);
|
$plaintext.= openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, $this->openssl_options, $iv);
|
||||||
$iv = substr($ciphertext, -$this->block_size);
|
$iv = substr($ciphertext, -$this->block_size);
|
||||||
}
|
}
|
||||||
@ -1290,7 +1290,7 @@ abstract class Base
|
|||||||
$buffer['ciphertext'] = substr($temp, $overflow);
|
$buffer['ciphertext'] = substr($temp, $overflow);
|
||||||
$encryptIV = $temp;
|
$encryptIV = $temp;
|
||||||
}
|
}
|
||||||
} else if (!strlen($buffer['ciphertext'])) {
|
} elseif (!strlen($buffer['ciphertext'])) {
|
||||||
$ciphertext.= openssl_encrypt($plaintext . str_repeat("\0", $block_size), $this->cipher_name_openssl, $key, $this->openssl_options, $encryptIV);
|
$ciphertext.= openssl_encrypt($plaintext . str_repeat("\0", $block_size), $this->cipher_name_openssl, $key, $this->openssl_options, $encryptIV);
|
||||||
$temp = $this->_string_pop($ciphertext, $block_size);
|
$temp = $this->_string_pop($ciphertext, $block_size);
|
||||||
if ($this->continuousBuffer) {
|
if ($this->continuousBuffer) {
|
||||||
|
@ -1378,7 +1378,6 @@ class DES extends Base
|
|||||||
// Creating code for en- and decryption.
|
// Creating code for en- and decryption.
|
||||||
$crypt_block = array();
|
$crypt_block = array();
|
||||||
foreach (array(self::ENCRYPT, self::DECRYPT) as $c) {
|
foreach (array(self::ENCRYPT, self::DECRYPT) as $c) {
|
||||||
|
|
||||||
/* Do the initial IP permutation. */
|
/* Do the initial IP permutation. */
|
||||||
$crypt_block[$c] = '
|
$crypt_block[$c] = '
|
||||||
$in = unpack("N*", $in);
|
$in = unpack("N*", $in);
|
||||||
|
@ -139,7 +139,7 @@ class Hash
|
|||||||
*/
|
*/
|
||||||
function __construct($hash = 'sha1')
|
function __construct($hash = 'sha1')
|
||||||
{
|
{
|
||||||
if ( !defined('CRYPT_HASH_MODE') ) {
|
if (!defined('CRYPT_HASH_MODE')) {
|
||||||
switch (true) {
|
switch (true) {
|
||||||
case extension_loaded('hash'):
|
case extension_loaded('hash'):
|
||||||
define('CRYPT_HASH_MODE', self::MODE_HASH);
|
define('CRYPT_HASH_MODE', self::MODE_HASH);
|
||||||
@ -228,7 +228,7 @@ class Hash
|
|||||||
$mode = CRYPT_HASH_MODE;
|
$mode = CRYPT_HASH_MODE;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ( $mode ) {
|
switch ($mode) {
|
||||||
case self::MODE_MHASH:
|
case self::MODE_MHASH:
|
||||||
switch ($hash) {
|
switch ($hash) {
|
||||||
case 'md5':
|
case 'md5':
|
||||||
@ -262,26 +262,26 @@ class Hash
|
|||||||
|
|
||||||
switch ($hash) {
|
switch ($hash) {
|
||||||
case 'md2':
|
case 'md2':
|
||||||
$this->b = 16;
|
$this->b = 16;
|
||||||
$this->hash = array($this, '_md2');
|
$this->hash = array($this, '_md2');
|
||||||
break;
|
break;
|
||||||
case 'md5':
|
case 'md5':
|
||||||
$this->b = 64;
|
$this->b = 64;
|
||||||
$this->hash = array($this, '_md5');
|
$this->hash = array($this, '_md5');
|
||||||
break;
|
break;
|
||||||
case 'sha256':
|
case 'sha256':
|
||||||
$this->b = 64;
|
$this->b = 64;
|
||||||
$this->hash = array($this, '_sha256');
|
$this->hash = array($this, '_sha256');
|
||||||
break;
|
break;
|
||||||
case 'sha384':
|
case 'sha384':
|
||||||
case 'sha512':
|
case 'sha512':
|
||||||
$this->b = 128;
|
$this->b = 128;
|
||||||
$this->hash = array($this, '_sha512');
|
$this->hash = array($this, '_sha512');
|
||||||
break;
|
break;
|
||||||
case 'sha1':
|
case 'sha1':
|
||||||
default:
|
default:
|
||||||
$this->b = 64;
|
$this->b = 64;
|
||||||
$this->hash = array($this, '_sha1');
|
$this->hash = array($this, '_sha1');
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->ipad = str_repeat(chr(0x36), $this->b);
|
$this->ipad = str_repeat(chr(0x36), $this->b);
|
||||||
@ -300,7 +300,7 @@ class Hash
|
|||||||
$mode = is_array($this->hash) ? self::MODE_INTERNAL : CRYPT_HASH_MODE;
|
$mode = is_array($this->hash) ? self::MODE_INTERNAL : CRYPT_HASH_MODE;
|
||||||
|
|
||||||
if (!empty($this->key) || is_string($this->key)) {
|
if (!empty($this->key) || is_string($this->key)) {
|
||||||
switch ( $mode ) {
|
switch ($mode) {
|
||||||
case self::MODE_MHASH:
|
case self::MODE_MHASH:
|
||||||
$output = mhash($this->hash, $text, $this->key);
|
$output = mhash($this->hash, $text, $this->key);
|
||||||
break;
|
break;
|
||||||
@ -323,7 +323,7 @@ class Hash
|
|||||||
$output = call_user_func($this->hash, $output); // step 7
|
$output = call_user_func($this->hash, $output); // step 7
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
switch ( $mode ) {
|
switch ($mode) {
|
||||||
case self::MODE_MHASH:
|
case self::MODE_MHASH:
|
||||||
$output = mhash($this->hash, $text);
|
$output = mhash($this->hash, $text);
|
||||||
break;
|
break;
|
||||||
@ -497,12 +497,14 @@ class Hash
|
|||||||
|
|
||||||
// Extend the sixteen 32-bit words into sixty-four 32-bit words
|
// Extend the sixteen 32-bit words into sixty-four 32-bit words
|
||||||
for ($i = 16; $i < 64; $i++) {
|
for ($i = 16; $i < 64; $i++) {
|
||||||
|
// @codingStandardsIgnoreStart
|
||||||
$s0 = $this->_rightRotate($w[$i - 15], 7) ^
|
$s0 = $this->_rightRotate($w[$i - 15], 7) ^
|
||||||
$this->_rightRotate($w[$i - 15], 18) ^
|
$this->_rightRotate($w[$i - 15], 18) ^
|
||||||
$this->_rightShift( $w[$i - 15], 3);
|
$this->_rightShift( $w[$i - 15], 3);
|
||||||
$s1 = $this->_rightRotate($w[$i - 2], 17) ^
|
$s1 = $this->_rightRotate($w[$i - 2], 17) ^
|
||||||
$this->_rightRotate($w[$i - 2], 19) ^
|
$this->_rightRotate($w[$i - 2], 19) ^
|
||||||
$this->_rightShift( $w[$i - 2], 10);
|
$this->_rightShift( $w[$i - 2], 10);
|
||||||
|
// @codingStandardsIgnoreEnd
|
||||||
$w[$i] = $this->_add($w[$i - 16], $s0, $w[$i - 7], $s1);
|
$w[$i] = $this->_add($w[$i - 16], $s0, $w[$i - 7], $s1);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -316,7 +316,7 @@ class RC2 extends Base
|
|||||||
|
|
||||||
if ($t1 <= 0) {
|
if ($t1 <= 0) {
|
||||||
$t1 = $this->default_key_length;
|
$t1 = $this->default_key_length;
|
||||||
} else if ($t1 > 1024) {
|
} elseif ($t1 > 1024) {
|
||||||
$t1 = 1024;
|
$t1 = 1024;
|
||||||
}
|
}
|
||||||
$this->current_key_length = $t1;
|
$this->current_key_length = $t1;
|
||||||
|
@ -465,7 +465,7 @@ class RSA
|
|||||||
{
|
{
|
||||||
$this->configFile = dirname(__FILE__) . '/../openssl.cnf';
|
$this->configFile = dirname(__FILE__) . '/../openssl.cnf';
|
||||||
|
|
||||||
if ( !defined('CRYPT_RSA_MODE') ) {
|
if (!defined('CRYPT_RSA_MODE')) {
|
||||||
switch (true) {
|
switch (true) {
|
||||||
// Math/BigInteger's openssl requirements are a little less stringent than Crypt/RSA's. in particular,
|
// Math/BigInteger's openssl requirements are a little less stringent than Crypt/RSA's. in particular,
|
||||||
// Math/BigInteger doesn't require an openssl.cfg file whereas Crypt/RSA does. so if Math/BigInteger
|
// Math/BigInteger doesn't require an openssl.cfg file whereas Crypt/RSA does. so if Math/BigInteger
|
||||||
@ -558,7 +558,7 @@ class RSA
|
|||||||
}
|
}
|
||||||
|
|
||||||
// OpenSSL uses 65537 as the exponent and requires RSA keys be 384 bits minimum
|
// OpenSSL uses 65537 as the exponent and requires RSA keys be 384 bits minimum
|
||||||
if ( CRYPT_RSA_MODE == self::MODE_OPENSSL && $bits >= 384 && CRYPT_RSA_EXPONENT == 65537) {
|
if (CRYPT_RSA_MODE == self::MODE_OPENSSL && $bits >= 384 && CRYPT_RSA_EXPONENT == 65537) {
|
||||||
$config = array();
|
$config = array();
|
||||||
if (isset($this->configFile)) {
|
if (isset($this->configFile)) {
|
||||||
$config['config'] = $this->configFile;
|
$config['config'] = $this->configFile;
|
||||||
@ -572,7 +572,8 @@ class RSA
|
|||||||
$publickey = call_user_func_array(array($this, '_convertPublicKey'), array_values($this->_parseKey($publickey, self::PUBLIC_FORMAT_PKCS1)));
|
$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
|
// clear the buffer of error strings stemming from a minimalistic openssl.cnf
|
||||||
while (openssl_error_string() !== false);
|
while (openssl_error_string() !== false) {
|
||||||
|
}
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
'privatekey' => $privatekey,
|
'privatekey' => $privatekey,
|
||||||
@ -762,19 +763,39 @@ class RSA
|
|||||||
$encryption = (!empty($this->password) || is_string($this->password)) ? 'aes256-cbc' : 'none';
|
$encryption = (!empty($this->password) || is_string($this->password)) ? 'aes256-cbc' : 'none';
|
||||||
$key.= $encryption;
|
$key.= $encryption;
|
||||||
$key.= "\r\nComment: " . $this->comment . "\r\n";
|
$key.= "\r\nComment: " . $this->comment . "\r\n";
|
||||||
$public = pack('Na*Na*Na*',
|
$public = pack(
|
||||||
strlen('ssh-rsa'), 'ssh-rsa', strlen($raw['publicExponent']), $raw['publicExponent'], strlen($raw['modulus']), $raw['modulus']
|
'Na*Na*Na*',
|
||||||
|
strlen('ssh-rsa'),
|
||||||
|
'ssh-rsa',
|
||||||
|
strlen($raw['publicExponent']),
|
||||||
|
$raw['publicExponent'],
|
||||||
|
strlen($raw['modulus']),
|
||||||
|
$raw['modulus']
|
||||||
);
|
);
|
||||||
$source = pack('Na*Na*Na*Na*',
|
$source = pack(
|
||||||
strlen('ssh-rsa'), 'ssh-rsa', strlen($encryption), $encryption,
|
'Na*Na*Na*Na*',
|
||||||
strlen($this->comment), $this->comment, strlen($public), $public
|
strlen('ssh-rsa'),
|
||||||
|
'ssh-rsa',
|
||||||
|
strlen($encryption),
|
||||||
|
$encryption,
|
||||||
|
strlen($this->comment),
|
||||||
|
$this->comment,
|
||||||
|
strlen($public),
|
||||||
|
$public
|
||||||
);
|
);
|
||||||
$public = base64_encode($public);
|
$public = base64_encode($public);
|
||||||
$key.= "Public-Lines: " . ((strlen($public) + 63) >> 6) . "\r\n";
|
$key.= "Public-Lines: " . ((strlen($public) + 63) >> 6) . "\r\n";
|
||||||
$key.= chunk_split($public, 64);
|
$key.= chunk_split($public, 64);
|
||||||
$private = pack('Na*Na*Na*Na*',
|
$private = pack(
|
||||||
strlen($raw['privateExponent']), $raw['privateExponent'], strlen($raw['prime1']), $raw['prime1'],
|
'Na*Na*Na*Na*',
|
||||||
strlen($raw['prime2']), $raw['prime2'], strlen($raw['coefficient']), $raw['coefficient']
|
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)) {
|
if (empty($this->password) && !is_string($this->password)) {
|
||||||
$source.= pack('Na*', strlen($private), $private);
|
$source.= pack('Na*', strlen($private), $private);
|
||||||
@ -835,8 +856,14 @@ class RSA
|
|||||||
|
|
||||||
if ($this->privateKeyFormat == self::PRIVATE_FORMAT_PKCS8) {
|
if ($this->privateKeyFormat == self::PRIVATE_FORMAT_PKCS8) {
|
||||||
$rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA
|
$rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA
|
||||||
$RSAPrivateKey = pack('Ca*a*Ca*a*',
|
$RSAPrivateKey = pack(
|
||||||
self::ASN1_INTEGER, "\01\00", $rsaOID, 4, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey
|
'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);
|
$RSAPrivateKey = pack('Ca*a*', self::ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey);
|
||||||
if (!empty($this->password) || is_string($this->password)) {
|
if (!empty($this->password) || is_string($this->password)) {
|
||||||
@ -847,20 +874,35 @@ class RSA
|
|||||||
$crypto->setPassword($this->password, 'pbkdf1', 'md5', $salt, $iterationCount);
|
$crypto->setPassword($this->password, 'pbkdf1', 'md5', $salt, $iterationCount);
|
||||||
$RSAPrivateKey = $crypto->encrypt($RSAPrivateKey);
|
$RSAPrivateKey = $crypto->encrypt($RSAPrivateKey);
|
||||||
|
|
||||||
$parameters = pack('Ca*a*Ca*N',
|
$parameters = pack(
|
||||||
self::ASN1_OCTETSTRING, $this->_encodeLength(strlen($salt)), $salt,
|
'Ca*a*Ca*N',
|
||||||
self::ASN1_INTEGER, $this->_encodeLength(4), $iterationCount
|
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";
|
$pbeWithMD5AndDES_CBC = "\x2a\x86\x48\x86\xf7\x0d\x01\x05\x03";
|
||||||
|
|
||||||
$encryptionAlgorithm = pack('Ca*a*Ca*a*',
|
$encryptionAlgorithm = pack(
|
||||||
self::ASN1_OBJECT, $this->_encodeLength(strlen($pbeWithMD5AndDES_CBC)), $pbeWithMD5AndDES_CBC,
|
'Ca*a*Ca*a*',
|
||||||
self::ASN1_SEQUENCE, $this->_encodeLength(strlen($parameters)), $parameters
|
self::ASN1_OBJECT,
|
||||||
|
$this->_encodeLength(strlen($pbeWithMD5AndDES_CBC)),
|
||||||
|
$pbeWithMD5AndDES_CBC,
|
||||||
|
self::ASN1_SEQUENCE,
|
||||||
|
$this->_encodeLength(strlen($parameters)),
|
||||||
|
$parameters
|
||||||
);
|
);
|
||||||
|
|
||||||
$RSAPrivateKey = pack('Ca*a*Ca*a*',
|
$RSAPrivateKey = pack(
|
||||||
self::ASN1_SEQUENCE, $this->_encodeLength(strlen($encryptionAlgorithm)), $encryptionAlgorithm,
|
'Ca*a*Ca*a*',
|
||||||
self::ASN1_OCTETSTRING, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey
|
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);
|
$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)
|
'publicExponent' => pack('Ca*a*', self::ASN1_INTEGER, $this->_encodeLength(strlen($publicExponent)), $publicExponent)
|
||||||
);
|
);
|
||||||
|
|
||||||
$RSAPublicKey = pack('Ca*a*a*',
|
$RSAPublicKey = pack(
|
||||||
self::ASN1_SEQUENCE, $this->_encodeLength(strlen($components['modulus']) + strlen($components['publicExponent'])),
|
'Ca*a*a*',
|
||||||
$components['modulus'], $components['publicExponent']
|
self::ASN1_SEQUENCE,
|
||||||
|
$this->_encodeLength(strlen($components['modulus']) + strlen($components['publicExponent'])),
|
||||||
|
$components['modulus'],
|
||||||
|
$components['publicExponent']
|
||||||
);
|
);
|
||||||
|
|
||||||
if ($this->publicKeyFormat == self::PUBLIC_FORMAT_PKCS1_RAW) {
|
if ($this->publicKeyFormat == self::PUBLIC_FORMAT_PKCS1_RAW) {
|
||||||
@ -959,8 +1004,11 @@ class RSA
|
|||||||
$RSAPublicKey = chr(0) . $RSAPublicKey;
|
$RSAPublicKey = chr(0) . $RSAPublicKey;
|
||||||
$RSAPublicKey = chr(3) . $this->_encodeLength(strlen($RSAPublicKey)) . $RSAPublicKey;
|
$RSAPublicKey = chr(3) . $this->_encodeLength(strlen($RSAPublicKey)) . $RSAPublicKey;
|
||||||
|
|
||||||
$RSAPublicKey = pack('Ca*a*',
|
$RSAPublicKey = pack(
|
||||||
self::ASN1_SEQUENCE, $this->_encodeLength(strlen($rsaOID . $RSAPublicKey)), $rsaOID . $RSAPublicKey
|
'Ca*a*',
|
||||||
|
self::ASN1_SEQUENCE,
|
||||||
|
$this->_encodeLength(strlen($rsaOID . $RSAPublicKey)),
|
||||||
|
$rsaOID . $RSAPublicKey
|
||||||
);
|
);
|
||||||
|
|
||||||
$RSAPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" .
|
$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);
|
$RSAPublicKey = pack('Na*Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($publicExponent), $publicExponent, strlen($modulus), $modulus);
|
||||||
|
|
||||||
switch($algorithm)
|
switch ($algorithm) {
|
||||||
{
|
|
||||||
case 'sha256':
|
case 'sha256':
|
||||||
$hash = new Hash('sha256');
|
$hash = new Hash('sha256');
|
||||||
$base = base64_encode($hash->hash($RSAPublicKey));
|
$base = base64_encode($hash->hash($RSAPublicKey));
|
||||||
@ -1861,7 +1908,7 @@ class RSA
|
|||||||
function _decodeLength(&$string)
|
function _decodeLength(&$string)
|
||||||
{
|
{
|
||||||
$length = ord($this->_string_shift($string));
|
$length = ord($this->_string_shift($string));
|
||||||
if ( $length & 0x80 ) { // definite length, long form
|
if ($length & 0x80) { // definite length, long form
|
||||||
$length&= 0x7F;
|
$length&= 0x7F;
|
||||||
$temp = $this->_string_shift($string, $length);
|
$temp = $this->_string_shift($string, $length);
|
||||||
list(, $length) = unpack('N', substr(str_pad($temp, 4, chr(0), STR_PAD_LEFT), -4));
|
list(, $length) = unpack('N', substr(str_pad($temp, 4, chr(0), STR_PAD_LEFT), -4));
|
||||||
|
@ -157,9 +157,9 @@ class Random
|
|||||||
ini_set('session.use_cookies', $old_use_cookies);
|
ini_set('session.use_cookies', $old_use_cookies);
|
||||||
session_cache_limiter($old_session_cache_limiter);
|
session_cache_limiter($old_session_cache_limiter);
|
||||||
} else {
|
} else {
|
||||||
if ($_OLD_SESSION !== false) {
|
if ($_OLD_SESSION !== false) {
|
||||||
$_SESSION = $_OLD_SESSION;
|
$_SESSION = $_OLD_SESSION;
|
||||||
unset($_OLD_SESSION);
|
unset($_OLD_SESSION);
|
||||||
} else {
|
} else {
|
||||||
unset($_SESSION);
|
unset($_SESSION);
|
||||||
}
|
}
|
||||||
|
@ -311,7 +311,7 @@ class Rijndael extends Base
|
|||||||
$length >>= 5;
|
$length >>= 5;
|
||||||
if ($length > 8) {
|
if ($length > 8) {
|
||||||
$length = 8;
|
$length = 8;
|
||||||
} else if ($length < 4) {
|
} elseif ($length < 4) {
|
||||||
$length = 4;
|
$length = 4;
|
||||||
}
|
}
|
||||||
$this->Nb = $length;
|
$this->Nb = $length;
|
||||||
@ -614,7 +614,7 @@ class Rijndael extends Base
|
|||||||
// with 0xFFFFFFFF (or 0xFFFFFF00) on a 32-bit machine is unnecessary, but on a 64-bit machine, it is.
|
// with 0xFFFFFFFF (or 0xFFFFFF00) on a 32-bit machine is unnecessary, but on a 64-bit machine, it is.
|
||||||
$temp = (($temp << 8) & 0xFFFFFF00) | (($temp >> 24) & 0x000000FF); // rotWord
|
$temp = (($temp << 8) & 0xFFFFFF00) | (($temp >> 24) & 0x000000FF); // rotWord
|
||||||
$temp = $this->_subWord($temp) ^ $rcon[$i / $this->Nk];
|
$temp = $this->_subWord($temp) ^ $rcon[$i / $this->Nk];
|
||||||
} else if ($this->Nk > 6 && $i % $this->Nk == 4) {
|
} elseif ($this->Nk > 6 && $i % $this->Nk == 4) {
|
||||||
$temp = $this->_subWord($temp);
|
$temp = $this->_subWord($temp);
|
||||||
}
|
}
|
||||||
$w[$i] = $w[$i - $this->Nk] ^ $temp;
|
$w[$i] = $w[$i - $this->Nk] ^ $temp;
|
||||||
|
@ -533,7 +533,9 @@ class Twofish extends Base
|
|||||||
$u^= 0x7fffffff & ($t >> 1);
|
$u^= 0x7fffffff & ($t >> 1);
|
||||||
|
|
||||||
// Add the modular polynomial on underflow.
|
// Add the modular polynomial on underflow.
|
||||||
if ($t & 0x01) $u^= 0xa6 ;
|
if ($t & 0x01) {
|
||||||
|
$u^= 0xa6 ;
|
||||||
|
}
|
||||||
|
|
||||||
// Remove t * (a + 1/a) * (x^3 + x).
|
// Remove t * (a + 1/a) * (x^3 + x).
|
||||||
$B^= ($u << 24) | ($u << 8);
|
$B^= ($u << 24) | ($u << 8);
|
||||||
|
@ -337,6 +337,7 @@ class ANSI
|
|||||||
//$back = $attr_cell->reverse ? &$attr_cell->foreground : &$attr_cell->background;
|
//$back = $attr_cell->reverse ? &$attr_cell->foreground : &$attr_cell->background;
|
||||||
$back = &$attr_cell->{ $attr_cell->reverse ? 'foreground' : 'background' };
|
$back = &$attr_cell->{ $attr_cell->reverse ? 'foreground' : 'background' };
|
||||||
switch ($mod) {
|
switch ($mod) {
|
||||||
|
// @codingStandardsIgnoreStart
|
||||||
case 30: $front = 'black'; break;
|
case 30: $front = 'black'; break;
|
||||||
case 31: $front = 'red'; break;
|
case 31: $front = 'red'; break;
|
||||||
case 32: $front = 'green'; break;
|
case 32: $front = 'green'; break;
|
||||||
@ -354,6 +355,7 @@ class ANSI
|
|||||||
case 45: $back = 'magenta'; break;
|
case 45: $back = 'magenta'; break;
|
||||||
case 46: $back = 'cyan'; break;
|
case 46: $back = 'cyan'; break;
|
||||||
case 47: $back = 'white'; break;
|
case 47: $back = 'white'; break;
|
||||||
|
// @codingStandardsIgnoreEnd
|
||||||
|
|
||||||
default:
|
default:
|
||||||
//user_error('Unsupported attribute: ' . $mod);
|
//user_error('Unsupported attribute: ' . $mod);
|
||||||
|
@ -245,17 +245,17 @@ class ASN1
|
|||||||
$tag <<= 7;
|
$tag <<= 7;
|
||||||
$tag |= ord($this->_string_shift($encoded)) & 0x7F;
|
$tag |= ord($this->_string_shift($encoded)) & 0x7F;
|
||||||
$start++;
|
$start++;
|
||||||
} while ( $loop );
|
} while ($loop);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Length, as discussed in paragraph 8.1.3 of X.690-0207.pdf#page=13
|
// Length, as discussed in paragraph 8.1.3 of X.690-0207.pdf#page=13
|
||||||
$length = ord($this->_string_shift($encoded));
|
$length = ord($this->_string_shift($encoded));
|
||||||
$start++;
|
$start++;
|
||||||
if ( $length == 0x80 ) { // indefinite length
|
if ($length == 0x80) { // indefinite length
|
||||||
// "[A sender shall] use the indefinite form (see 8.1.3.6) if the encoding is constructed and is not all
|
// "[A sender shall] use the indefinite form (see 8.1.3.6) if the encoding is constructed and is not all
|
||||||
// immediately available." -- paragraph 8.1.3.2.c
|
// immediately available." -- paragraph 8.1.3.2.c
|
||||||
$length = strlen($encoded);
|
$length = strlen($encoded);
|
||||||
} elseif ( $length & 0x80 ) { // definite length, long form
|
} elseif ($length & 0x80) { // definite length, long form
|
||||||
// technically, the long form of the length can be represented by up to 126 octets (bytes), but we'll only
|
// technically, the long form of the length can be represented by up to 126 octets (bytes), but we'll only
|
||||||
// support it up to four.
|
// support it up to four.
|
||||||
$length&= 0x7F;
|
$length&= 0x7F;
|
||||||
@ -1027,7 +1027,7 @@ class ASN1
|
|||||||
if ($outtype !== false) {
|
if ($outtype !== false) {
|
||||||
return $this->_encode_der($source[$typename], array('type' => $outtype) + $mapping, null, $special);
|
return $this->_encode_der($source[$typename], array('type' => $outtype) + $mapping, null, $special);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$filters = $this->filters;
|
$filters = $this->filters;
|
||||||
foreach ($loc as $part) {
|
foreach ($loc as $part) {
|
||||||
|
@ -2500,7 +2500,7 @@ class X509
|
|||||||
$asn1->loadFilters($filters);
|
$asn1->loadFilters($filters);
|
||||||
$result = '';
|
$result = '';
|
||||||
foreach ($dn['rdnSequence'] as $rdn) {
|
foreach ($dn['rdnSequence'] as $rdn) {
|
||||||
foreach ($rdn as $i=>$attr) {
|
foreach ($rdn as $i => $attr) {
|
||||||
$attr = &$rdn[$i];
|
$attr = &$rdn[$i];
|
||||||
if (is_array($attr['value'])) {
|
if (is_array($attr['value'])) {
|
||||||
foreach ($attr['value'] as $type => $v) {
|
foreach ($attr['value'] as $type => $v) {
|
||||||
@ -2721,7 +2721,7 @@ class X509
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach ($chain as $key=>$value) {
|
foreach ($chain as $key => $value) {
|
||||||
$chain[$key] = new X509();
|
$chain[$key] = new X509();
|
||||||
$chain[$key]->loadX509($value);
|
$chain[$key]->loadX509($value);
|
||||||
}
|
}
|
||||||
@ -3177,9 +3177,9 @@ class X509
|
|||||||
{
|
{
|
||||||
$year = @gmdate("Y", @strtotime($date)); // the same way ASN1.php parses this
|
$year = @gmdate("Y", @strtotime($date)); // the same way ASN1.php parses this
|
||||||
if ($year < 2050) {
|
if ($year < 2050) {
|
||||||
return array('utcTime' => $date);
|
return array('utcTime' => $date);
|
||||||
} else {
|
} else {
|
||||||
return array('generalTime' => $date);
|
return array('generalTime' => $date);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3233,7 +3233,7 @@ class X509
|
|||||||
if (isset($subject->domains)) {
|
if (isset($subject->domains)) {
|
||||||
$this->removeExtension('id-ce-subjectAltName');
|
$this->removeExtension('id-ce-subjectAltName');
|
||||||
}
|
}
|
||||||
} else if (isset($subject->currentCert) && is_array($subject->currentCert) && isset($subject->currentCert['tbsCertList'])) {
|
} elseif (isset($subject->currentCert) && is_array($subject->currentCert) && isset($subject->currentCert['tbsCertList'])) {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
if (!isset($subject->publicKey)) {
|
if (!isset($subject->publicKey)) {
|
||||||
@ -3267,8 +3267,8 @@ class X509
|
|||||||
'subject' => $subject->dn,
|
'subject' => $subject->dn,
|
||||||
'subjectPublicKeyInfo' => $subjectPublicKey
|
'subjectPublicKeyInfo' => $subjectPublicKey
|
||||||
),
|
),
|
||||||
'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm),
|
'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm),
|
||||||
'signature' => false // this is going to be overwritten later
|
'signature' => false // this is going to be overwritten later
|
||||||
);
|
);
|
||||||
|
|
||||||
// Copy extensions from CSR.
|
// Copy extensions from CSR.
|
||||||
@ -3289,8 +3289,7 @@ class X509
|
|||||||
// )
|
// )
|
||||||
//),
|
//),
|
||||||
'keyIdentifier' => $issuer->currentKeyIdentifier
|
'keyIdentifier' => $issuer->currentKeyIdentifier
|
||||||
)
|
));
|
||||||
);
|
|
||||||
//$extensions = &$this->currentCert['tbsCertificate']['extensions'];
|
//$extensions = &$this->currentCert['tbsCertificate']['extensions'];
|
||||||
//if (isset($issuer->serialNumber)) {
|
//if (isset($issuer->serialNumber)) {
|
||||||
// $extensions[count($extensions) - 1]['authorityCertSerialNumber'] = $issuer->serialNumber;
|
// $extensions[count($extensions) - 1]['authorityCertSerialNumber'] = $issuer->serialNumber;
|
||||||
@ -3333,7 +3332,8 @@ class X509
|
|||||||
$keyUsage = array();
|
$keyUsage = array();
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->setExtension('id-ce-keyUsage',
|
$this->setExtension(
|
||||||
|
'id-ce-keyUsage',
|
||||||
array_values(array_unique(array_merge($keyUsage, array('cRLSign', 'keyCertSign'))))
|
array_values(array_unique(array_merge($keyUsage, array('cRLSign', 'keyCertSign'))))
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -3342,8 +3342,11 @@ class X509
|
|||||||
$basicConstraints = array();
|
$basicConstraints = array();
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->setExtension('id-ce-basicConstraints',
|
$this->setExtension(
|
||||||
array_unique(array_merge(array('cA' => true), $basicConstraints)), true);
|
'id-ce-basicConstraints',
|
||||||
|
array_unique(array_merge(array('cA' => true), $basicConstraints)),
|
||||||
|
true
|
||||||
|
);
|
||||||
|
|
||||||
if (!isset($subject->currentKeyIdentifier)) {
|
if (!isset($subject->currentKeyIdentifier)) {
|
||||||
$this->setExtension('id-ce-subjectKeyIdentifier', base64_encode($this->computeKeyIdentifier($this->currentCert)), false, false);
|
$this->setExtension('id-ce-subjectKeyIdentifier', base64_encode($this->computeKeyIdentifier($this->currentCert)), false, false);
|
||||||
@ -3403,8 +3406,8 @@ class X509
|
|||||||
'subject' => $this->dn,
|
'subject' => $this->dn,
|
||||||
'subjectPKInfo' => $publicKey
|
'subjectPKInfo' => $publicKey
|
||||||
),
|
),
|
||||||
'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm),
|
'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm),
|
||||||
'signature' => false // this is going to be overwritten later
|
'signature' => false // this is going to be overwritten later
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3468,8 +3471,8 @@ class X509
|
|||||||
// Random::string(8) & str_repeat("\x7F", 8)
|
// Random::string(8) & str_repeat("\x7F", 8)
|
||||||
'challenge' => !empty($this->challenge) ? $this->challenge : ''
|
'challenge' => !empty($this->challenge) ? $this->challenge : ''
|
||||||
),
|
),
|
||||||
'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm),
|
'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm),
|
||||||
'signature' => false // this is going to be overwritten later
|
'signature' => false // this is going to be overwritten later
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3521,8 +3524,8 @@ class X509
|
|||||||
'issuer' => false, // this is going to be overwritten later
|
'issuer' => false, // this is going to be overwritten later
|
||||||
'thisUpdate' => $this->_timeField($thisUpdate) // $this->setStartDate()
|
'thisUpdate' => $this->_timeField($thisUpdate) // $this->setStartDate()
|
||||||
),
|
),
|
||||||
'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm),
|
'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm),
|
||||||
'signature' => false // this is going to be overwritten later
|
'signature' => false // this is going to be overwritten later
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3583,8 +3586,7 @@ class X509
|
|||||||
// )
|
// )
|
||||||
//),
|
//),
|
||||||
'keyIdentifier' => $issuer->currentKeyIdentifier
|
'keyIdentifier' => $issuer->currentKeyIdentifier
|
||||||
)
|
));
|
||||||
);
|
|
||||||
//$extensions = &$tbsCertList['crlExtensions'];
|
//$extensions = &$tbsCertList['crlExtensions'];
|
||||||
//if (isset($issuer->serialNumber)) {
|
//if (isset($issuer->serialNumber)) {
|
||||||
// $extensions[count($extensions) - 1]['authorityCertSerialNumber'] = $issuer->serialNumber;
|
// $extensions[count($extensions) - 1]['authorityCertSerialNumber'] = $issuer->serialNumber;
|
||||||
@ -4363,7 +4365,6 @@ class X509
|
|||||||
if (is_array($rclist = &$this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates', true))) {
|
if (is_array($rclist = &$this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates', true))) {
|
||||||
if ($this->_revokedCertificate($rclist, $serial) === false) { // If not yet revoked
|
if ($this->_revokedCertificate($rclist, $serial) === false) { // If not yet revoked
|
||||||
if (($i = $this->_revokedCertificate($rclist, $serial, true)) !== false) {
|
if (($i = $this->_revokedCertificate($rclist, $serial, true)) !== false) {
|
||||||
|
|
||||||
if (!empty($date)) {
|
if (!empty($date)) {
|
||||||
$rclist[$i]['revocationDate'] = $this->_timeField($date);
|
$rclist[$i]['revocationDate'] = $this->_timeField($date);
|
||||||
}
|
}
|
||||||
|
@ -258,7 +258,7 @@ class BigInteger
|
|||||||
*/
|
*/
|
||||||
function __construct($x = 0, $base = 10)
|
function __construct($x = 0, $base = 10)
|
||||||
{
|
{
|
||||||
if ( !defined('MATH_BIGINTEGER_MODE') ) {
|
if (!defined('MATH_BIGINTEGER_MODE')) {
|
||||||
switch (true) {
|
switch (true) {
|
||||||
case extension_loaded('gmp'):
|
case extension_loaded('gmp'):
|
||||||
define('MATH_BIGINTEGER_MODE', self::MODE_GMP);
|
define('MATH_BIGINTEGER_MODE', self::MODE_GMP);
|
||||||
@ -334,7 +334,7 @@ class BigInteger
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ( MATH_BIGINTEGER_MODE ) {
|
switch (MATH_BIGINTEGER_MODE) {
|
||||||
case self::MODE_GMP:
|
case self::MODE_GMP:
|
||||||
switch (true) {
|
switch (true) {
|
||||||
case is_resource($x) && get_resource_type($x) == 'GMP integer':
|
case is_resource($x) && get_resource_type($x) == 'GMP integer':
|
||||||
@ -364,8 +364,8 @@ class BigInteger
|
|||||||
$x = ~$x;
|
$x = ~$x;
|
||||||
$this->is_negative = true;
|
$this->is_negative = true;
|
||||||
}
|
}
|
||||||
case 256:
|
case 256:
|
||||||
switch ( MATH_BIGINTEGER_MODE ) {
|
switch (MATH_BIGINTEGER_MODE) {
|
||||||
case self::MODE_GMP:
|
case self::MODE_GMP:
|
||||||
$sign = $this->is_negative ? '-' : '';
|
$sign = $this->is_negative ? '-' : '';
|
||||||
$this->value = gmp_init($sign . '0x' . bin2hex($x));
|
$this->value = gmp_init($sign . '0x' . bin2hex($x));
|
||||||
@ -401,7 +401,7 @@ class BigInteger
|
|||||||
$this->value = $temp->value;
|
$this->value = $temp->value;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 16:
|
case 16:
|
||||||
case -16:
|
case -16:
|
||||||
if ($base > 0 && $x[0] == '-') {
|
if ($base > 0 && $x[0] == '-') {
|
||||||
$this->is_negative = true;
|
$this->is_negative = true;
|
||||||
@ -416,7 +416,7 @@ class BigInteger
|
|||||||
$x = bin2hex(~pack('H*', $x));
|
$x = bin2hex(~pack('H*', $x));
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ( MATH_BIGINTEGER_MODE ) {
|
switch (MATH_BIGINTEGER_MODE) {
|
||||||
case self::MODE_GMP:
|
case self::MODE_GMP:
|
||||||
$temp = $this->is_negative ? '-0x' . $x : '0x' . $x;
|
$temp = $this->is_negative ? '-0x' . $x : '0x' . $x;
|
||||||
$this->value = gmp_init($temp);
|
$this->value = gmp_init($temp);
|
||||||
@ -439,14 +439,14 @@ class BigInteger
|
|||||||
$this->value = $temp->value;
|
$this->value = $temp->value;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 10:
|
case 10:
|
||||||
case -10:
|
case -10:
|
||||||
// (?<!^)(?:-).*: find any -'s that aren't at the beginning and then any characters that follow that
|
// (?<!^)(?:-).*: find any -'s that aren't at the beginning and then any characters that follow that
|
||||||
// (?<=^|-)0*: find any 0's that are preceded by the start of the string or by a - (ie. octals)
|
// (?<=^|-)0*: find any 0's that are preceded by the start of the string or by a - (ie. octals)
|
||||||
// [^-0-9].*: find any non-numeric characters and then any characters that follow that
|
// [^-0-9].*: find any non-numeric characters and then any characters that follow that
|
||||||
$x = preg_replace('#(?<!^)(?:-).*|(?<=^|-)0*|[^-0-9].*#', '', $x);
|
$x = preg_replace('#(?<!^)(?:-).*|(?<=^|-)0*|[^-0-9].*#', '', $x);
|
||||||
|
|
||||||
switch ( MATH_BIGINTEGER_MODE ) {
|
switch (MATH_BIGINTEGER_MODE) {
|
||||||
case self::MODE_GMP:
|
case self::MODE_GMP:
|
||||||
$this->value = gmp_init($x);
|
$this->value = gmp_init($x);
|
||||||
break;
|
break;
|
||||||
@ -476,7 +476,7 @@ class BigInteger
|
|||||||
$this->value = $temp->value;
|
$this->value = $temp->value;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2: // base-2 support originally implemented by Lluis Pamies - thanks!
|
case 2: // base-2 support originally implemented by Lluis Pamies - thanks!
|
||||||
case -2:
|
case -2:
|
||||||
if ($base > 0 && $x[0] == '-') {
|
if ($base > 0 && $x[0] == '-') {
|
||||||
$this->is_negative = true;
|
$this->is_negative = true;
|
||||||
@ -549,7 +549,7 @@ class BigInteger
|
|||||||
return $comparison < 0 ? ~$bytes : $bytes;
|
return $comparison < 0 ? ~$bytes : $bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ( MATH_BIGINTEGER_MODE ) {
|
switch (MATH_BIGINTEGER_MODE) {
|
||||||
case self::MODE_GMP:
|
case self::MODE_GMP:
|
||||||
if (gmp_cmp($this->value, gmp_init(0)) == 0) {
|
if (gmp_cmp($this->value, gmp_init(0)) == 0) {
|
||||||
return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : '';
|
return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : '';
|
||||||
@ -684,7 +684,7 @@ class BigInteger
|
|||||||
*/
|
*/
|
||||||
function toString()
|
function toString()
|
||||||
{
|
{
|
||||||
switch ( MATH_BIGINTEGER_MODE ) {
|
switch (MATH_BIGINTEGER_MODE) {
|
||||||
case self::MODE_GMP:
|
case self::MODE_GMP:
|
||||||
return gmp_strval($this->value);
|
return gmp_strval($this->value);
|
||||||
case self::MODE_BCMATH:
|
case self::MODE_BCMATH:
|
||||||
@ -838,7 +838,7 @@ class BigInteger
|
|||||||
*/
|
*/
|
||||||
function add($y)
|
function add($y)
|
||||||
{
|
{
|
||||||
switch ( MATH_BIGINTEGER_MODE ) {
|
switch (MATH_BIGINTEGER_MODE) {
|
||||||
case self::MODE_GMP:
|
case self::MODE_GMP:
|
||||||
$temp = new static();
|
$temp = new static();
|
||||||
$temp->value = gmp_add($this->value, $y->value);
|
$temp->value = gmp_add($this->value, $y->value);
|
||||||
@ -880,7 +880,7 @@ class BigInteger
|
|||||||
self::VALUE => $y_value,
|
self::VALUE => $y_value,
|
||||||
self::SIGN => $y_negative
|
self::SIGN => $y_negative
|
||||||
);
|
);
|
||||||
} else if ($y_size == 0) {
|
} elseif ($y_size == 0) {
|
||||||
return array(
|
return array(
|
||||||
self::VALUE => $x_value,
|
self::VALUE => $x_value,
|
||||||
self::SIGN => $x_negative
|
self::SIGN => $x_negative
|
||||||
@ -888,8 +888,8 @@ class BigInteger
|
|||||||
}
|
}
|
||||||
|
|
||||||
// subtract, if appropriate
|
// subtract, if appropriate
|
||||||
if ( $x_negative != $y_negative ) {
|
if ($x_negative != $y_negative) {
|
||||||
if ( $x_value == $y_value ) {
|
if ($x_value == $y_value) {
|
||||||
return array(
|
return array(
|
||||||
self::VALUE => array(),
|
self::VALUE => array(),
|
||||||
self::SIGN => false
|
self::SIGN => false
|
||||||
@ -967,7 +967,7 @@ class BigInteger
|
|||||||
*/
|
*/
|
||||||
function subtract($y)
|
function subtract($y)
|
||||||
{
|
{
|
||||||
switch ( MATH_BIGINTEGER_MODE ) {
|
switch (MATH_BIGINTEGER_MODE) {
|
||||||
case self::MODE_GMP:
|
case self::MODE_GMP:
|
||||||
$temp = new static();
|
$temp = new static();
|
||||||
$temp->value = gmp_sub($this->value, $y->value);
|
$temp->value = gmp_sub($this->value, $y->value);
|
||||||
@ -1009,7 +1009,7 @@ class BigInteger
|
|||||||
self::VALUE => $y_value,
|
self::VALUE => $y_value,
|
||||||
self::SIGN => !$y_negative
|
self::SIGN => !$y_negative
|
||||||
);
|
);
|
||||||
} else if ($y_size == 0) {
|
} elseif ($y_size == 0) {
|
||||||
return array(
|
return array(
|
||||||
self::VALUE => $x_value,
|
self::VALUE => $x_value,
|
||||||
self::SIGN => $x_negative
|
self::SIGN => $x_negative
|
||||||
@ -1017,7 +1017,7 @@ class BigInteger
|
|||||||
}
|
}
|
||||||
|
|
||||||
// add, if appropriate (ie. -$x - +$y or +$x - -$y)
|
// add, if appropriate (ie. -$x - +$y or +$x - -$y)
|
||||||
if ( $x_negative != $y_negative ) {
|
if ($x_negative != $y_negative) {
|
||||||
$temp = $this->_add($x_value, false, $y_value, false);
|
$temp = $this->_add($x_value, false, $y_value, false);
|
||||||
$temp[self::SIGN] = $x_negative;
|
$temp[self::SIGN] = $x_negative;
|
||||||
|
|
||||||
@ -1026,7 +1026,7 @@ class BigInteger
|
|||||||
|
|
||||||
$diff = $this->_compare($x_value, $x_negative, $y_value, $y_negative);
|
$diff = $this->_compare($x_value, $x_negative, $y_value, $y_negative);
|
||||||
|
|
||||||
if ( !$diff ) {
|
if (!$diff) {
|
||||||
return array(
|
return array(
|
||||||
self::VALUE => array(),
|
self::VALUE => array(),
|
||||||
self::SIGN => false
|
self::SIGN => false
|
||||||
@ -1034,7 +1034,7 @@ class BigInteger
|
|||||||
}
|
}
|
||||||
|
|
||||||
// switch $x and $y around, if appropriate.
|
// switch $x and $y around, if appropriate.
|
||||||
if ( (!$x_negative && $diff < 0) || ($x_negative && $diff > 0) ) {
|
if ((!$x_negative && $diff < 0) || ($x_negative && $diff > 0)) {
|
||||||
$temp = $x_value;
|
$temp = $x_value;
|
||||||
$x_value = $y_value;
|
$x_value = $y_value;
|
||||||
$y_value = $temp;
|
$y_value = $temp;
|
||||||
@ -1100,7 +1100,7 @@ class BigInteger
|
|||||||
*/
|
*/
|
||||||
function multiply($x)
|
function multiply($x)
|
||||||
{
|
{
|
||||||
switch ( MATH_BIGINTEGER_MODE ) {
|
switch (MATH_BIGINTEGER_MODE) {
|
||||||
case self::MODE_GMP:
|
case self::MODE_GMP:
|
||||||
$temp = new static();
|
$temp = new static();
|
||||||
$temp->value = gmp_mul($this->value, $x->value);
|
$temp->value = gmp_mul($this->value, $x->value);
|
||||||
@ -1144,7 +1144,7 @@ class BigInteger
|
|||||||
$x_length = count($x_value);
|
$x_length = count($x_value);
|
||||||
$y_length = count($y_value);
|
$y_length = count($y_value);
|
||||||
|
|
||||||
if ( !$x_length || !$y_length ) { // a 0 is being multiplied
|
if (!$x_length || !$y_length) { // a 0 is being multiplied
|
||||||
return array(
|
return array(
|
||||||
self::VALUE => array(),
|
self::VALUE => array(),
|
||||||
self::SIGN => false
|
self::SIGN => false
|
||||||
@ -1174,11 +1174,11 @@ class BigInteger
|
|||||||
$x_length = count($x_value);
|
$x_length = count($x_value);
|
||||||
$y_length = count($y_value);
|
$y_length = count($y_value);
|
||||||
|
|
||||||
if ( !$x_length || !$y_length ) { // a 0 is being multiplied
|
if (!$x_length || !$y_length) { // a 0 is being multiplied
|
||||||
return array();
|
return array();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( $x_length < $y_length ) {
|
if ($x_length < $y_length) {
|
||||||
$temp = $x_value;
|
$temp = $x_value;
|
||||||
$x_value = $y_value;
|
$x_value = $y_value;
|
||||||
$y_value = $temp;
|
$y_value = $temp;
|
||||||
@ -1291,7 +1291,7 @@ class BigInteger
|
|||||||
*/
|
*/
|
||||||
function _baseSquare($value)
|
function _baseSquare($value)
|
||||||
{
|
{
|
||||||
if ( empty($value) ) {
|
if (empty($value)) {
|
||||||
return array();
|
return array();
|
||||||
}
|
}
|
||||||
$square_value = $this->_array_repeat(0, 2 * count($value));
|
$square_value = $this->_array_repeat(0, 2 * count($value));
|
||||||
@ -1385,7 +1385,7 @@ class BigInteger
|
|||||||
*/
|
*/
|
||||||
function divide($y)
|
function divide($y)
|
||||||
{
|
{
|
||||||
switch ( MATH_BIGINTEGER_MODE ) {
|
switch (MATH_BIGINTEGER_MODE) {
|
||||||
case self::MODE_GMP:
|
case self::MODE_GMP:
|
||||||
$quotient = new static();
|
$quotient = new static();
|
||||||
$remainder = new static();
|
$remainder = new static();
|
||||||
@ -1422,7 +1422,7 @@ class BigInteger
|
|||||||
}
|
}
|
||||||
|
|
||||||
static $zero;
|
static $zero;
|
||||||
if ( !isset($zero) ) {
|
if (!isset($zero)) {
|
||||||
$zero = new static();
|
$zero = new static();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1436,16 +1436,16 @@ class BigInteger
|
|||||||
|
|
||||||
$diff = $x->compare($y);
|
$diff = $x->compare($y);
|
||||||
|
|
||||||
if ( !$diff ) {
|
if (!$diff) {
|
||||||
$temp = new static();
|
$temp = new static();
|
||||||
$temp->value = array(1);
|
$temp->value = array(1);
|
||||||
$temp->is_negative = $x_sign != $y_sign;
|
$temp->is_negative = $x_sign != $y_sign;
|
||||||
return array($this->_normalize($temp), $this->_normalize(new static()));
|
return array($this->_normalize($temp), $this->_normalize(new static()));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( $diff < 0 ) {
|
if ($diff < 0) {
|
||||||
// if $x is negative, "add" $y.
|
// if $x is negative, "add" $y.
|
||||||
if ( $x_sign ) {
|
if ($x_sign) {
|
||||||
$x = $y->subtract($x);
|
$x = $y->subtract($x);
|
||||||
}
|
}
|
||||||
return array($this->_normalize(new static()), $this->_normalize($x));
|
return array($this->_normalize(new static()), $this->_normalize($x));
|
||||||
@ -1479,7 +1479,7 @@ class BigInteger
|
|||||||
// $temp = $y << ($x_max - $y_max-1) in base 2**26
|
// $temp = $y << ($x_max - $y_max-1) in base 2**26
|
||||||
$temp_value = array_merge($this->_array_repeat(0, $x_max - $y_max), $y_value);
|
$temp_value = array_merge($this->_array_repeat(0, $x_max - $y_max), $y_value);
|
||||||
|
|
||||||
while ( $x->compare($temp) >= 0 ) {
|
while ($x->compare($temp) >= 0) {
|
||||||
// calculate the "common residue"
|
// calculate the "common residue"
|
||||||
++$quotient_value[$x_max - $y_max];
|
++$quotient_value[$x_max - $y_max];
|
||||||
$x = $x->subtract($temp);
|
$x = $x->subtract($temp);
|
||||||
@ -1515,7 +1515,7 @@ class BigInteger
|
|||||||
|
|
||||||
$rhs_value = array($x_window[2], $x_window[1], $x_window[0]);
|
$rhs_value = array($x_window[2], $x_window[1], $x_window[0]);
|
||||||
|
|
||||||
while ( $lhs->compare($rhs) > 0 ) {
|
while ($lhs->compare($rhs) > 0) {
|
||||||
--$quotient_value[$q_index];
|
--$quotient_value[$q_index];
|
||||||
|
|
||||||
$lhs->value = array($quotient_value[$q_index]);
|
$lhs->value = array($quotient_value[$q_index]);
|
||||||
@ -1546,7 +1546,7 @@ class BigInteger
|
|||||||
$quotient->is_negative = $x_sign != $y_sign;
|
$quotient->is_negative = $x_sign != $y_sign;
|
||||||
|
|
||||||
// calculate the "common residue", if appropriate
|
// calculate the "common residue", if appropriate
|
||||||
if ( $x_sign ) {
|
if ($x_sign) {
|
||||||
$y->_rshift($shift);
|
$y->_rshift($shift);
|
||||||
$x = $y->subtract($x);
|
$x = $y->subtract($x);
|
||||||
}
|
}
|
||||||
@ -1633,7 +1633,7 @@ class BigInteger
|
|||||||
return $this->_normalize($temp->modPow($e, $n));
|
return $this->_normalize($temp->modPow($e, $n));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( MATH_BIGINTEGER_MODE == self::MODE_GMP ) {
|
if (MATH_BIGINTEGER_MODE == self::MODE_GMP) {
|
||||||
$temp = new static();
|
$temp = new static();
|
||||||
$temp->value = gmp_powm($this->value, $e->value, $n->value);
|
$temp->value = gmp_powm($this->value, $e->value, $n->value);
|
||||||
|
|
||||||
@ -1656,17 +1656,23 @@ class BigInteger
|
|||||||
'publicExponent' => pack('Ca*a*', 2, $this->_encodeASN1Length(strlen($components['publicExponent'])), $components['publicExponent'])
|
'publicExponent' => pack('Ca*a*', 2, $this->_encodeASN1Length(strlen($components['publicExponent'])), $components['publicExponent'])
|
||||||
);
|
);
|
||||||
|
|
||||||
$RSAPublicKey = pack('Ca*a*a*',
|
$RSAPublicKey = pack(
|
||||||
48, $this->_encodeASN1Length(strlen($components['modulus']) + strlen($components['publicExponent'])),
|
'Ca*a*a*',
|
||||||
$components['modulus'], $components['publicExponent']
|
48,
|
||||||
|
$this->_encodeASN1Length(strlen($components['modulus']) + strlen($components['publicExponent'])),
|
||||||
|
$components['modulus'],
|
||||||
|
$components['publicExponent']
|
||||||
);
|
);
|
||||||
|
|
||||||
$rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA
|
$rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA
|
||||||
$RSAPublicKey = chr(0) . $RSAPublicKey;
|
$RSAPublicKey = chr(0) . $RSAPublicKey;
|
||||||
$RSAPublicKey = chr(3) . $this->_encodeASN1Length(strlen($RSAPublicKey)) . $RSAPublicKey;
|
$RSAPublicKey = chr(3) . $this->_encodeASN1Length(strlen($RSAPublicKey)) . $RSAPublicKey;
|
||||||
|
|
||||||
$encapsulated = pack('Ca*a*',
|
$encapsulated = pack(
|
||||||
48, $this->_encodeASN1Length(strlen($rsaOID . $RSAPublicKey)), $rsaOID . $RSAPublicKey
|
'Ca*a*',
|
||||||
|
48,
|
||||||
|
$this->_encodeASN1Length(strlen($rsaOID . $RSAPublicKey)),
|
||||||
|
$rsaOID . $RSAPublicKey
|
||||||
);
|
);
|
||||||
|
|
||||||
$RSAPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" .
|
$RSAPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" .
|
||||||
@ -1680,25 +1686,25 @@ class BigInteger
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( MATH_BIGINTEGER_MODE == self::MODE_BCMATH ) {
|
if (MATH_BIGINTEGER_MODE == self::MODE_BCMATH) {
|
||||||
$temp = new static();
|
$temp = new static();
|
||||||
$temp->value = bcpowmod($this->value, $e->value, $n->value, 0);
|
$temp->value = bcpowmod($this->value, $e->value, $n->value, 0);
|
||||||
|
|
||||||
return $this->_normalize($temp);
|
return $this->_normalize($temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( empty($e->value) ) {
|
if (empty($e->value)) {
|
||||||
$temp = new static();
|
$temp = new static();
|
||||||
$temp->value = array(1);
|
$temp->value = array(1);
|
||||||
return $this->_normalize($temp);
|
return $this->_normalize($temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( $e->value == array(1) ) {
|
if ($e->value == array(1)) {
|
||||||
list(, $temp) = $this->divide($n);
|
list(, $temp) = $this->divide($n);
|
||||||
return $this->_normalize($temp);
|
return $this->_normalize($temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( $e->value == array(2) ) {
|
if ($e->value == array(2)) {
|
||||||
$temp = new static();
|
$temp = new static();
|
||||||
$temp->value = $this->_square($this->value);
|
$temp->value = $this->_square($this->value);
|
||||||
list(, $temp) = $temp->divide($n);
|
list(, $temp) = $temp->divide($n);
|
||||||
@ -1713,14 +1719,14 @@ class BigInteger
|
|||||||
// made uncallable
|
// made uncallable
|
||||||
|
|
||||||
// is the modulo odd?
|
// is the modulo odd?
|
||||||
if ( $n->value[0] & 1 ) {
|
if ($n->value[0] & 1) {
|
||||||
return $this->_normalize($this->_slidingWindow($e, $n, self::MONTGOMERY));
|
return $this->_normalize($this->_slidingWindow($e, $n, self::MONTGOMERY));
|
||||||
}
|
}
|
||||||
// if it's not, it's even
|
// if it's not, it's even
|
||||||
|
|
||||||
// find the lowest set bit (eg. the max pow of 2 that divides $n)
|
// find the lowest set bit (eg. the max pow of 2 that divides $n)
|
||||||
for ($i = 0; $i < count($n->value); ++$i) {
|
for ($i = 0; $i < count($n->value); ++$i) {
|
||||||
if ( $n->value[$i] ) {
|
if ($n->value[$i]) {
|
||||||
$temp = decbin($n->value[$i]);
|
$temp = decbin($n->value[$i]);
|
||||||
$j = strlen($temp) - strrpos($temp, '1') - 1;
|
$j = strlen($temp) - strrpos($temp, '1') - 1;
|
||||||
$j+= 26 * $i;
|
$j+= 26 * $i;
|
||||||
@ -1798,7 +1804,8 @@ class BigInteger
|
|||||||
|
|
||||||
// calculate the appropriate window size.
|
// calculate the appropriate window size.
|
||||||
// $window_size == 3 if $window_ranges is between 25 and 81, for example.
|
// $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;
|
$n_value = $n->value;
|
||||||
|
|
||||||
@ -1818,13 +1825,13 @@ class BigInteger
|
|||||||
$result = array(1);
|
$result = array(1);
|
||||||
$result = $this->_prepareReduce($result, $n_value, $mode);
|
$result = $this->_prepareReduce($result, $n_value, $mode);
|
||||||
|
|
||||||
for ($i = 0; $i < $e_length; ) {
|
for ($i = 0; $i < $e_length;) {
|
||||||
if ( !$e_bits[$i] ) {
|
if (!$e_bits[$i]) {
|
||||||
$result = $this->_squareReduce($result, $n_value, $mode);
|
$result = $this->_squareReduce($result, $n_value, $mode);
|
||||||
++$i;
|
++$i;
|
||||||
} else {
|
} else {
|
||||||
for ($j = $window_size - 1; $j > 0; --$j) {
|
for ($j = $window_size - 1; $j > 0; --$j) {
|
||||||
if ( !empty($e_bits[$i + $j]) ) {
|
if (!empty($e_bits[$i + $j])) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2008,7 +2015,7 @@ class BigInteger
|
|||||||
|
|
||||||
// n = 2 * m.length
|
// n = 2 * m.length
|
||||||
|
|
||||||
if ( ($key = array_search($m, $cache[self::VARIABLE])) === false ) {
|
if (($key = array_search($m, $cache[self::VARIABLE])) === false) {
|
||||||
$key = count($cache[self::VARIABLE]);
|
$key = count($cache[self::VARIABLE]);
|
||||||
$cache[self::VARIABLE][] = $m;
|
$cache[self::VARIABLE][] = $m;
|
||||||
|
|
||||||
@ -2097,7 +2104,7 @@ class BigInteger
|
|||||||
return $temp->value;
|
return $temp->value;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ($key = array_search($n, $cache[self::VARIABLE])) === false ) {
|
if (($key = array_search($n, $cache[self::VARIABLE])) === false) {
|
||||||
$key = count($cache[self::VARIABLE]);
|
$key = count($cache[self::VARIABLE]);
|
||||||
$cache[self::VARIABLE][] = $n;
|
$cache[self::VARIABLE][] = $n;
|
||||||
$lhs = new static();
|
$lhs = new static();
|
||||||
@ -2158,14 +2165,14 @@ class BigInteger
|
|||||||
$x_length = count($x_value);
|
$x_length = count($x_value);
|
||||||
$y_length = count($y_value);
|
$y_length = count($y_value);
|
||||||
|
|
||||||
if ( !$x_length || !$y_length ) { // a 0 is being multiplied
|
if (!$x_length || !$y_length) { // a 0 is being multiplied
|
||||||
return array(
|
return array(
|
||||||
self::VALUE => array(),
|
self::VALUE => array(),
|
||||||
self::SIGN => false
|
self::SIGN => false
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( $x_length < $y_length ) {
|
if ($x_length < $y_length) {
|
||||||
$temp = $x_value;
|
$temp = $x_value;
|
||||||
$x_value = $y_value;
|
$x_value = $y_value;
|
||||||
$y_value = $temp;
|
$y_value = $temp;
|
||||||
@ -2239,7 +2246,7 @@ class BigInteger
|
|||||||
self::DATA => array()
|
self::DATA => array()
|
||||||
);
|
);
|
||||||
|
|
||||||
if ( ($key = array_search($n, $cache[self::VARIABLE])) === false ) {
|
if (($key = array_search($n, $cache[self::VARIABLE])) === false) {
|
||||||
$key = count($cache[self::VARIABLE]);
|
$key = count($cache[self::VARIABLE]);
|
||||||
$cache[self::VARIABLE][] = $x;
|
$cache[self::VARIABLE][] = $x;
|
||||||
$cache[self::DATA][] = $this->_modInverse67108864($n);
|
$cache[self::DATA][] = $this->_modInverse67108864($n);
|
||||||
@ -2295,7 +2302,7 @@ class BigInteger
|
|||||||
self::DATA => array()
|
self::DATA => array()
|
||||||
);
|
);
|
||||||
|
|
||||||
if ( ($key = array_search($m, $cache[self::VARIABLE])) === false ) {
|
if (($key = array_search($m, $cache[self::VARIABLE])) === false) {
|
||||||
$key = count($cache[self::VARIABLE]);
|
$key = count($cache[self::VARIABLE]);
|
||||||
$cache[self::VARIABLE][] = $m;
|
$cache[self::VARIABLE][] = $m;
|
||||||
$cache[self::DATA][] = $this->_modInverse67108864($m);
|
$cache[self::DATA][] = $this->_modInverse67108864($m);
|
||||||
@ -2408,7 +2415,7 @@ class BigInteger
|
|||||||
*/
|
*/
|
||||||
function modInverse($n)
|
function modInverse($n)
|
||||||
{
|
{
|
||||||
switch ( MATH_BIGINTEGER_MODE ) {
|
switch (MATH_BIGINTEGER_MODE) {
|
||||||
case self::MODE_GMP:
|
case self::MODE_GMP:
|
||||||
$temp = new static();
|
$temp = new static();
|
||||||
$temp->value = gmp_invert($this->value, $n->value);
|
$temp->value = gmp_invert($this->value, $n->value);
|
||||||
@ -2472,7 +2479,7 @@ class BigInteger
|
|||||||
*/
|
*/
|
||||||
function extendedGCD($n)
|
function extendedGCD($n)
|
||||||
{
|
{
|
||||||
switch ( MATH_BIGINTEGER_MODE ) {
|
switch (MATH_BIGINTEGER_MODE) {
|
||||||
case self::MODE_GMP:
|
case self::MODE_GMP:
|
||||||
extract(gmp_gcdext($this->value, $n->value));
|
extract(gmp_gcdext($this->value, $n->value));
|
||||||
|
|
||||||
@ -2522,7 +2529,7 @@ class BigInteger
|
|||||||
$g = new static();
|
$g = new static();
|
||||||
$g->value = array(1);
|
$g->value = array(1);
|
||||||
|
|
||||||
while ( !(($x->value[0] & 1)|| ($y->value[0] & 1)) ) {
|
while (!(($x->value[0] & 1)|| ($y->value[0] & 1))) {
|
||||||
$x->_rshift(1);
|
$x->_rshift(1);
|
||||||
$y->_rshift(1);
|
$y->_rshift(1);
|
||||||
$g->_lshift(1);
|
$g->_lshift(1);
|
||||||
@ -2539,10 +2546,10 @@ class BigInteger
|
|||||||
$a->value = $d->value = $g->value = array(1);
|
$a->value = $d->value = $g->value = array(1);
|
||||||
$b->value = $c->value = array();
|
$b->value = $c->value = array();
|
||||||
|
|
||||||
while ( !empty($u->value) ) {
|
while (!empty($u->value)) {
|
||||||
while ( !($u->value[0] & 1) ) {
|
while (!($u->value[0] & 1)) {
|
||||||
$u->_rshift(1);
|
$u->_rshift(1);
|
||||||
if ( (!empty($a->value) && ($a->value[0] & 1)) || (!empty($b->value) && ($b->value[0] & 1)) ) {
|
if ((!empty($a->value) && ($a->value[0] & 1)) || (!empty($b->value) && ($b->value[0] & 1))) {
|
||||||
$a = $a->add($y);
|
$a = $a->add($y);
|
||||||
$b = $b->subtract($x);
|
$b = $b->subtract($x);
|
||||||
}
|
}
|
||||||
@ -2550,9 +2557,9 @@ class BigInteger
|
|||||||
$b->_rshift(1);
|
$b->_rshift(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
while ( !($v->value[0] & 1) ) {
|
while (!($v->value[0] & 1)) {
|
||||||
$v->_rshift(1);
|
$v->_rshift(1);
|
||||||
if ( (!empty($d->value) && ($d->value[0] & 1)) || (!empty($c->value) && ($c->value[0] & 1)) ) {
|
if ((!empty($d->value) && ($d->value[0] & 1)) || (!empty($c->value) && ($c->value[0] & 1))) {
|
||||||
$c = $c->add($y);
|
$c = $c->add($y);
|
||||||
$d = $d->subtract($x);
|
$d = $d->subtract($x);
|
||||||
}
|
}
|
||||||
@ -2615,7 +2622,7 @@ class BigInteger
|
|||||||
{
|
{
|
||||||
$temp = new static();
|
$temp = new static();
|
||||||
|
|
||||||
switch ( MATH_BIGINTEGER_MODE ) {
|
switch (MATH_BIGINTEGER_MODE) {
|
||||||
case self::MODE_GMP:
|
case self::MODE_GMP:
|
||||||
$temp->value = gmp_abs($this->value);
|
$temp->value = gmp_abs($this->value);
|
||||||
break;
|
break;
|
||||||
@ -2649,7 +2656,7 @@ class BigInteger
|
|||||||
*/
|
*/
|
||||||
function compare($y)
|
function compare($y)
|
||||||
{
|
{
|
||||||
switch ( MATH_BIGINTEGER_MODE ) {
|
switch (MATH_BIGINTEGER_MODE) {
|
||||||
case self::MODE_GMP:
|
case self::MODE_GMP:
|
||||||
return gmp_cmp($this->value, $y->value);
|
return gmp_cmp($this->value, $y->value);
|
||||||
case self::MODE_BCMATH:
|
case self::MODE_BCMATH:
|
||||||
@ -2672,13 +2679,13 @@ class BigInteger
|
|||||||
*/
|
*/
|
||||||
function _compare($x_value, $x_negative, $y_value, $y_negative)
|
function _compare($x_value, $x_negative, $y_value, $y_negative)
|
||||||
{
|
{
|
||||||
if ( $x_negative != $y_negative ) {
|
if ($x_negative != $y_negative) {
|
||||||
return ( !$x_negative && $y_negative ) ? 1 : -1;
|
return ( !$x_negative && $y_negative ) ? 1 : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
$result = $x_negative ? -1 : 1;
|
$result = $x_negative ? -1 : 1;
|
||||||
|
|
||||||
if ( count($x_value) != count($y_value) ) {
|
if (count($x_value) != count($y_value)) {
|
||||||
return ( count($x_value) > count($y_value) ) ? $result : -$result;
|
return ( count($x_value) > count($y_value) ) ? $result : -$result;
|
||||||
}
|
}
|
||||||
$size = max(count($x_value), count($y_value));
|
$size = max(count($x_value), count($y_value));
|
||||||
@ -2707,7 +2714,7 @@ class BigInteger
|
|||||||
*/
|
*/
|
||||||
function equals($x)
|
function equals($x)
|
||||||
{
|
{
|
||||||
switch ( MATH_BIGINTEGER_MODE ) {
|
switch (MATH_BIGINTEGER_MODE) {
|
||||||
case self::MODE_GMP:
|
case self::MODE_GMP:
|
||||||
return gmp_cmp($this->value, $x->value) == 0;
|
return gmp_cmp($this->value, $x->value) == 0;
|
||||||
default:
|
default:
|
||||||
@ -2727,7 +2734,7 @@ class BigInteger
|
|||||||
function setPrecision($bits)
|
function setPrecision($bits)
|
||||||
{
|
{
|
||||||
$this->precision = $bits;
|
$this->precision = $bits;
|
||||||
if ( MATH_BIGINTEGER_MODE != self::MODE_BCMATH ) {
|
if (MATH_BIGINTEGER_MODE != self::MODE_BCMATH) {
|
||||||
$this->bitmask = new static(chr((1 << ($bits & 0x7)) - 1) . str_repeat(chr(0xFF), $bits >> 3), 256);
|
$this->bitmask = new static(chr((1 << ($bits & 0x7)) - 1) . str_repeat(chr(0xFF), $bits >> 3), 256);
|
||||||
} else {
|
} else {
|
||||||
$this->bitmask = new static(bcpow('2', $bits, 0));
|
$this->bitmask = new static(bcpow('2', $bits, 0));
|
||||||
@ -2747,7 +2754,7 @@ class BigInteger
|
|||||||
*/
|
*/
|
||||||
function bitwise_and($x)
|
function bitwise_and($x)
|
||||||
{
|
{
|
||||||
switch ( MATH_BIGINTEGER_MODE ) {
|
switch (MATH_BIGINTEGER_MODE) {
|
||||||
case self::MODE_GMP:
|
case self::MODE_GMP:
|
||||||
$temp = new static();
|
$temp = new static();
|
||||||
$temp->value = gmp_and($this->value, $x->value);
|
$temp->value = gmp_and($this->value, $x->value);
|
||||||
@ -2788,7 +2795,7 @@ class BigInteger
|
|||||||
*/
|
*/
|
||||||
function bitwise_or($x)
|
function bitwise_or($x)
|
||||||
{
|
{
|
||||||
switch ( MATH_BIGINTEGER_MODE ) {
|
switch (MATH_BIGINTEGER_MODE) {
|
||||||
case self::MODE_GMP:
|
case self::MODE_GMP:
|
||||||
$temp = new static();
|
$temp = new static();
|
||||||
$temp->value = gmp_or($this->value, $x->value);
|
$temp->value = gmp_or($this->value, $x->value);
|
||||||
@ -2828,7 +2835,7 @@ class BigInteger
|
|||||||
*/
|
*/
|
||||||
function bitwise_xor($x)
|
function bitwise_xor($x)
|
||||||
{
|
{
|
||||||
switch ( MATH_BIGINTEGER_MODE ) {
|
switch (MATH_BIGINTEGER_MODE) {
|
||||||
case self::MODE_GMP:
|
case self::MODE_GMP:
|
||||||
$temp = new static();
|
$temp = new static();
|
||||||
$temp->value = gmp_xor($this->value, $x->value);
|
$temp->value = gmp_xor($this->value, $x->value);
|
||||||
@ -2908,7 +2915,7 @@ class BigInteger
|
|||||||
{
|
{
|
||||||
$temp = new static();
|
$temp = new static();
|
||||||
|
|
||||||
switch ( MATH_BIGINTEGER_MODE ) {
|
switch (MATH_BIGINTEGER_MODE) {
|
||||||
case self::MODE_GMP:
|
case self::MODE_GMP:
|
||||||
static $two;
|
static $two;
|
||||||
|
|
||||||
@ -2946,7 +2953,7 @@ class BigInteger
|
|||||||
{
|
{
|
||||||
$temp = new static();
|
$temp = new static();
|
||||||
|
|
||||||
switch ( MATH_BIGINTEGER_MODE ) {
|
switch (MATH_BIGINTEGER_MODE) {
|
||||||
case self::MODE_GMP:
|
case self::MODE_GMP:
|
||||||
static $two;
|
static $two;
|
||||||
|
|
||||||
@ -2985,7 +2992,7 @@ class BigInteger
|
|||||||
|
|
||||||
if ($this->precision > 0) {
|
if ($this->precision > 0) {
|
||||||
$precision = $this->precision;
|
$precision = $this->precision;
|
||||||
if ( MATH_BIGINTEGER_MODE == self::MODE_BCMATH ) {
|
if (MATH_BIGINTEGER_MODE == self::MODE_BCMATH) {
|
||||||
$mask = $this->bitmask->subtract(new static(1));
|
$mask = $this->bitmask->subtract(new static(1));
|
||||||
$mask = $mask->toBytes();
|
$mask = $mask->toBytes();
|
||||||
} else {
|
} else {
|
||||||
@ -2993,7 +3000,8 @@ class BigInteger
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$temp = ord($bits[0]);
|
$temp = ord($bits[0]);
|
||||||
for ($i = 0; $temp >> $i; ++$i);
|
for ($i = 0; $temp >> $i; ++$i) {
|
||||||
|
}
|
||||||
$precision = 8 * strlen($bits) - 8 + $i;
|
$precision = 8 * strlen($bits) - 8 + $i;
|
||||||
$mask = chr((1 << ($precision & 0x7)) - 1) . str_repeat(chr(0xFF), $precision >> 3);
|
$mask = chr((1 << ($precision & 0x7)) - 1) . str_repeat(chr(0xFF), $precision >> 3);
|
||||||
}
|
}
|
||||||
@ -3092,7 +3100,7 @@ class BigInteger
|
|||||||
|
|
||||||
if (!$compare) {
|
if (!$compare) {
|
||||||
return $this->_normalize($min);
|
return $this->_normalize($min);
|
||||||
} else if ($compare < 0) {
|
} elseif ($compare < 0) {
|
||||||
// if $min is bigger then $max, swap $min and $max
|
// if $min is bigger then $max, swap $min and $max
|
||||||
$temp = $max;
|
$temp = $max;
|
||||||
$max = $min;
|
$max = $min;
|
||||||
@ -3173,7 +3181,7 @@ class BigInteger
|
|||||||
|
|
||||||
if (!$compare) {
|
if (!$compare) {
|
||||||
return $min->isPrime() ? $min : false;
|
return $min->isPrime() ? $min : false;
|
||||||
} else if ($compare < 0) {
|
} elseif ($compare < 0) {
|
||||||
// if $min is bigger then $max, swap $min and $max
|
// if $min is bigger then $max, swap $min and $max
|
||||||
$temp = $max;
|
$temp = $max;
|
||||||
$max = $min;
|
$max = $min;
|
||||||
@ -3191,7 +3199,7 @@ class BigInteger
|
|||||||
$x = $this->random($min, $max);
|
$x = $this->random($min, $max);
|
||||||
|
|
||||||
// gmp_nextprime() requires PHP 5 >= 5.2.0 per <http://php.net/gmp-nextprime>.
|
// gmp_nextprime() requires PHP 5 >= 5.2.0 per <http://php.net/gmp-nextprime>.
|
||||||
if ( MATH_BIGINTEGER_MODE == self::MODE_GMP && function_exists('gmp_nextprime') ) {
|
if (MATH_BIGINTEGER_MODE == self::MODE_GMP && function_exists('gmp_nextprime')) {
|
||||||
$p = new static();
|
$p = new static();
|
||||||
$p->value = gmp_nextprime($x->value);
|
$p->value = gmp_nextprime($x->value);
|
||||||
|
|
||||||
@ -3257,7 +3265,7 @@ class BigInteger
|
|||||||
*/
|
*/
|
||||||
function _make_odd()
|
function _make_odd()
|
||||||
{
|
{
|
||||||
switch ( MATH_BIGINTEGER_MODE ) {
|
switch (MATH_BIGINTEGER_MODE) {
|
||||||
case self::MODE_GMP:
|
case self::MODE_GMP:
|
||||||
gmp_setbit($this->value, 0);
|
gmp_setbit($this->value, 0);
|
||||||
break;
|
break;
|
||||||
@ -3309,7 +3317,7 @@ class BigInteger
|
|||||||
|
|
||||||
// ie. gmp_testbit($this, 0)
|
// ie. gmp_testbit($this, 0)
|
||||||
// ie. isEven() or !isOdd()
|
// ie. isEven() or !isOdd()
|
||||||
switch ( MATH_BIGINTEGER_MODE ) {
|
switch (MATH_BIGINTEGER_MODE) {
|
||||||
case self::MODE_GMP:
|
case self::MODE_GMP:
|
||||||
return gmp_prob_prime($this->value, $t) != 0;
|
return gmp_prob_prime($this->value, $t) != 0;
|
||||||
case self::MODE_BCMATH:
|
case self::MODE_BCMATH:
|
||||||
@ -3346,7 +3354,7 @@ class BigInteger
|
|||||||
953, 967, 971, 977, 983, 991, 997
|
953, 967, 971, 977, 983, 991, 997
|
||||||
);
|
);
|
||||||
|
|
||||||
if ( MATH_BIGINTEGER_MODE != self::MODE_INTERNAL ) {
|
if (MATH_BIGINTEGER_MODE != self::MODE_INTERNAL) {
|
||||||
for ($i = 0; $i < count($primes); ++$i) {
|
for ($i = 0; $i < count($primes); ++$i) {
|
||||||
$primes[$i] = new static($primes[$i]);
|
$primes[$i] = new static($primes[$i]);
|
||||||
}
|
}
|
||||||
@ -3362,7 +3370,7 @@ class BigInteger
|
|||||||
}
|
}
|
||||||
|
|
||||||
// see HAC 4.4.1 "Random search for probable primes"
|
// see HAC 4.4.1 "Random search for probable primes"
|
||||||
if ( MATH_BIGINTEGER_MODE != self::MODE_INTERNAL ) {
|
if (MATH_BIGINTEGER_MODE != self::MODE_INTERNAL) {
|
||||||
foreach ($primes as $prime) {
|
foreach ($primes as $prime) {
|
||||||
list(, $r) = $this->divide($prime);
|
list(, $r) = $this->divide($prime);
|
||||||
if ($r->equals($zero)) {
|
if ($r->equals($zero)) {
|
||||||
@ -3386,7 +3394,7 @@ class BigInteger
|
|||||||
$r = $n_1->copy();
|
$r = $n_1->copy();
|
||||||
$r_value = $r->value;
|
$r_value = $r->value;
|
||||||
// ie. $s = gmp_scan1($n, 0) and $r = gmp_div_q($n, gmp_pow(gmp_init('2'), $s));
|
// ie. $s = gmp_scan1($n, 0) and $r = gmp_div_q($n, gmp_pow(gmp_init('2'), $s));
|
||||||
if ( MATH_BIGINTEGER_MODE == self::MODE_BCMATH ) {
|
if (MATH_BIGINTEGER_MODE == self::MODE_BCMATH) {
|
||||||
$s = 0;
|
$s = 0;
|
||||||
// if $n was 1, $r would be 0 and this would be an infinite loop, hence our $this->equals($one) check earlier
|
// if $n was 1, $r would be 0 and this would be an infinite loop, hence our $this->equals($one) check earlier
|
||||||
while ($r->value[strlen($r->value) - 1] % 2 == 0) {
|
while ($r->value[strlen($r->value) - 1] % 2 == 0) {
|
||||||
@ -3396,7 +3404,8 @@ class BigInteger
|
|||||||
} else {
|
} else {
|
||||||
for ($i = 0, $r_length = count($r_value); $i < $r_length; ++$i) {
|
for ($i = 0, $r_length = count($r_value); $i < $r_length; ++$i) {
|
||||||
$temp = ~$r_value[$i] & 0xFFFFFF;
|
$temp = ~$r_value[$i] & 0xFFFFFF;
|
||||||
for ($j = 1; ($temp >> $j) & 1; ++$j);
|
for ($j = 1; ($temp >> $j) & 1; ++$j) {
|
||||||
|
}
|
||||||
if ($j != 25) {
|
if ($j != 25) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -3435,7 +3444,7 @@ class BigInteger
|
|||||||
*/
|
*/
|
||||||
function _lshift($shift)
|
function _lshift($shift)
|
||||||
{
|
{
|
||||||
if ( $shift == 0 ) {
|
if ($shift == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3451,7 +3460,7 @@ class BigInteger
|
|||||||
$this->value[$i] = (int) ($temp - $carry * self::$baseFull);
|
$this->value[$i] = (int) ($temp - $carry * self::$baseFull);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( $carry ) {
|
if ($carry) {
|
||||||
$this->value[count($this->value)] = $carry;
|
$this->value[count($this->value)] = $carry;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3479,7 +3488,7 @@ class BigInteger
|
|||||||
$carry_shift = self::$base - $shift;
|
$carry_shift = self::$base - $shift;
|
||||||
$carry_mask = (1 << $shift) - 1;
|
$carry_mask = (1 << $shift) - 1;
|
||||||
|
|
||||||
if ( $num_digits ) {
|
if ($num_digits) {
|
||||||
$this->value = array_slice($this->value, $num_digits);
|
$this->value = array_slice($this->value, $num_digits);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3509,7 +3518,7 @@ class BigInteger
|
|||||||
$result->precision = $this->precision;
|
$result->precision = $this->precision;
|
||||||
$result->bitmask = $this->bitmask;
|
$result->bitmask = $this->bitmask;
|
||||||
|
|
||||||
switch ( MATH_BIGINTEGER_MODE ) {
|
switch (MATH_BIGINTEGER_MODE) {
|
||||||
case self::MODE_GMP:
|
case self::MODE_GMP:
|
||||||
if (!empty($result->bitmask->value)) {
|
if (!empty($result->bitmask->value)) {
|
||||||
$result->value = gmp_and($result->value, $result->bitmask->value);
|
$result->value = gmp_and($result->value, $result->bitmask->value);
|
||||||
@ -3526,7 +3535,7 @@ class BigInteger
|
|||||||
|
|
||||||
$value = &$result->value;
|
$value = &$result->value;
|
||||||
|
|
||||||
if ( !count($value) ) {
|
if (!count($value)) {
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3556,7 +3565,7 @@ class BigInteger
|
|||||||
function _trim($value)
|
function _trim($value)
|
||||||
{
|
{
|
||||||
for ($i = count($value) - 1; $i >= 0; --$i) {
|
for ($i = count($value) - 1; $i >= 0; --$i) {
|
||||||
if ( $value[$i] ) {
|
if ($value[$i]) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
unset($value[$i]);
|
unset($value[$i]);
|
||||||
|
@ -282,7 +282,7 @@ class SCP
|
|||||||
case self::MODE_SSH1:
|
case self::MODE_SSH1:
|
||||||
$data = pack('CNa*', NET_SSH1_CMSG_STDIN_DATA, strlen($data), $data);
|
$data = pack('CNa*', NET_SSH1_CMSG_STDIN_DATA, strlen($data), $data);
|
||||||
$this->ssh->_send_binary_packet($data);
|
$this->ssh->_send_binary_packet($data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -318,7 +318,7 @@ class SCP
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -334,6 +334,6 @@ class SCP
|
|||||||
break;
|
break;
|
||||||
case self::MODE_SSH1:
|
case self::MODE_SSH1:
|
||||||
$this->ssh->disconnect();
|
$this->ssh->disconnect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -395,8 +395,15 @@ class SFTP extends SSH2
|
|||||||
|
|
||||||
$this->window_size_server_to_client[self::CHANNEL] = $this->window_size;
|
$this->window_size_server_to_client[self::CHANNEL] = $this->window_size;
|
||||||
|
|
||||||
$packet = pack('CNa*N3',
|
$packet = pack(
|
||||||
NET_SSH2_MSG_CHANNEL_OPEN, strlen('session'), 'session', self::CHANNEL, $this->window_size, 0x4000);
|
'CNa*N3',
|
||||||
|
NET_SSH2_MSG_CHANNEL_OPEN,
|
||||||
|
strlen('session'),
|
||||||
|
'session',
|
||||||
|
self::CHANNEL,
|
||||||
|
$this->window_size,
|
||||||
|
0x4000
|
||||||
|
);
|
||||||
|
|
||||||
if (!$this->_send_binary_packet($packet)) {
|
if (!$this->_send_binary_packet($packet)) {
|
||||||
return false;
|
return false;
|
||||||
@ -409,8 +416,16 @@ class SFTP extends SSH2
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$packet = pack('CNNa*CNa*',
|
$packet = pack(
|
||||||
NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[self::CHANNEL], strlen('subsystem'), 'subsystem', 1, strlen('sftp'), 'sftp');
|
'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)) {
|
if (!$this->_send_binary_packet($packet)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -425,8 +440,16 @@ class SFTP extends SSH2
|
|||||||
"exec sftp-server";
|
"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
|
// 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
|
// is redundant
|
||||||
$packet = pack('CNNa*CNa*',
|
$packet = pack(
|
||||||
NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[self::CHANNEL], strlen('exec'), 'exec', 1, strlen($command), $command);
|
'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)) {
|
if (!$this->_send_binary_packet($packet)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -767,7 +790,7 @@ class SFTP extends SSH2
|
|||||||
|
|
||||||
static $depth = 0;
|
static $depth = 0;
|
||||||
|
|
||||||
foreach ($files as $key=>$value) {
|
foreach ($files as $key => $value) {
|
||||||
if ($depth != 0 && $key == '..') {
|
if ($depth != 0 && $key == '..') {
|
||||||
unset($files[$key]);
|
unset($files[$key]);
|
||||||
continue;
|
continue;
|
||||||
@ -1032,7 +1055,7 @@ class SFTP extends SSH2
|
|||||||
|
|
||||||
$temp = &$this->stat_cache;
|
$temp = &$this->stat_cache;
|
||||||
$max = count($dirs) - 1;
|
$max = count($dirs) - 1;
|
||||||
foreach ($dirs as $i=>$dir) {
|
foreach ($dirs as $i => $dir) {
|
||||||
// if $temp is an object that means one of two things.
|
// 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
|
// 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
|
// 2. it's a symlink. when lstat is done it's unclear what it's a symlink to
|
||||||
@ -1071,7 +1094,7 @@ class SFTP extends SSH2
|
|||||||
|
|
||||||
$temp = &$this->stat_cache;
|
$temp = &$this->stat_cache;
|
||||||
$max = count($dirs) - 1;
|
$max = count($dirs) - 1;
|
||||||
foreach ($dirs as $i=>$dir) {
|
foreach ($dirs as $i => $dir) {
|
||||||
if ($i === $max) {
|
if ($i === $max) {
|
||||||
unset($temp[$dir]);
|
unset($temp[$dir]);
|
||||||
return true;
|
return true;
|
||||||
@ -1501,7 +1524,7 @@ class SFTP extends SSH2
|
|||||||
}
|
}
|
||||||
|
|
||||||
unset($entries['.'], $entries['..']);
|
unset($entries['.'], $entries['..']);
|
||||||
foreach ($entries as $filename=>$props) {
|
foreach ($entries as $filename => $props) {
|
||||||
if (!isset($props['type'])) {
|
if (!isset($props['type'])) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -2173,7 +2196,7 @@ class SFTP extends SSH2
|
|||||||
}
|
}
|
||||||
|
|
||||||
unset($entries['.'], $entries['..']);
|
unset($entries['.'], $entries['..']);
|
||||||
foreach ($entries as $filename=>$props) {
|
foreach ($entries as $filename => $props) {
|
||||||
if (!isset($props['type'])) {
|
if (!isset($props['type'])) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -2375,13 +2398,20 @@ class SFTP extends SSH2
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch ($type) {
|
switch ($type) {
|
||||||
case NET_SFTP_TYPE_BLOCK_DEVICE: return 'block';
|
case NET_SFTP_TYPE_BLOCK_DEVICE:
|
||||||
case NET_SFTP_TYPE_CHAR_DEVICE: return 'char';
|
return 'block';
|
||||||
case NET_SFTP_TYPE_DIRECTORY: return 'dir';
|
case NET_SFTP_TYPE_CHAR_DEVICE:
|
||||||
case NET_SFTP_TYPE_FIFO: return 'fifo';
|
return 'char';
|
||||||
case NET_SFTP_TYPE_REGULAR: return 'file';
|
case NET_SFTP_TYPE_DIRECTORY:
|
||||||
case NET_SFTP_TYPE_SYMLINK: return 'link';
|
return 'dir';
|
||||||
default: return false;
|
case NET_SFTP_TYPE_FIFO:
|
||||||
|
return 'fifo';
|
||||||
|
case NET_SFTP_TYPE_REGULAR:
|
||||||
|
return 'file';
|
||||||
|
case NET_SFTP_TYPE_SYMLINK:
|
||||||
|
return 'link';
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -597,7 +597,7 @@ class SSH1
|
|||||||
|
|
||||||
// get a list of the supported ciphers
|
// get a list of the supported ciphers
|
||||||
extract(unpack('Nsupported_ciphers_mask', $this->_string_shift($response[self::RESPONSE_DATA], 4)));
|
extract(unpack('Nsupported_ciphers_mask', $this->_string_shift($response[self::RESPONSE_DATA], 4)));
|
||||||
foreach ($this->supported_ciphers as $mask=>$name) {
|
foreach ($this->supported_ciphers as $mask => $name) {
|
||||||
if (($supported_ciphers_mask & (1 << $mask)) == 0) {
|
if (($supported_ciphers_mask & (1 << $mask)) == 0) {
|
||||||
unset($this->supported_ciphers[$mask]);
|
unset($this->supported_ciphers[$mask]);
|
||||||
}
|
}
|
||||||
@ -605,7 +605,7 @@ class SSH1
|
|||||||
|
|
||||||
// get a list of the supported authentications
|
// get a list of the supported authentications
|
||||||
extract(unpack('Nsupported_authentications_mask', $this->_string_shift($response[self::RESPONSE_DATA], 4)));
|
extract(unpack('Nsupported_authentications_mask', $this->_string_shift($response[self::RESPONSE_DATA], 4)));
|
||||||
foreach ($this->supported_authentications as $mask=>$name) {
|
foreach ($this->supported_authentications as $mask => $name) {
|
||||||
if (($supported_authentications_mask & (1 << $mask)) == 0) {
|
if (($supported_authentications_mask & (1 << $mask)) == 0) {
|
||||||
unset($this->supported_authentications[$mask]);
|
unset($this->supported_authentications[$mask]);
|
||||||
}
|
}
|
||||||
@ -727,7 +727,7 @@ class SSH1
|
|||||||
if ($response[self::RESPONSE_TYPE] == NET_SSH1_SMSG_SUCCESS) {
|
if ($response[self::RESPONSE_TYPE] == NET_SSH1_SMSG_SUCCESS) {
|
||||||
$this->bitmap |= self::MASK_LOGIN;
|
$this->bitmap |= self::MASK_LOGIN;
|
||||||
return true;
|
return true;
|
||||||
} else if ($response[self::RESPONSE_TYPE] != NET_SSH1_SMSG_FAILURE) {
|
} elseif ($response[self::RESPONSE_TYPE] != NET_SSH1_SMSG_FAILURE) {
|
||||||
user_error('Expected SSH_SMSG_SUCCESS or SSH_SMSG_FAILURE');
|
user_error('Expected SSH_SMSG_SUCCESS or SSH_SMSG_FAILURE');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -753,7 +753,7 @@ class SSH1
|
|||||||
if ($response[self::RESPONSE_TYPE] == NET_SSH1_SMSG_SUCCESS) {
|
if ($response[self::RESPONSE_TYPE] == NET_SSH1_SMSG_SUCCESS) {
|
||||||
$this->bitmap |= self::MASK_LOGIN;
|
$this->bitmap |= self::MASK_LOGIN;
|
||||||
return true;
|
return true;
|
||||||
} else if ($response[self::RESPONSE_TYPE] == NET_SSH1_SMSG_FAILURE) {
|
} elseif ($response[self::RESPONSE_TYPE] == NET_SSH1_SMSG_FAILURE) {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
user_error('Expected SSH_SMSG_SUCCESS or SSH_SMSG_FAILURE');
|
user_error('Expected SSH_SMSG_SUCCESS or SSH_SMSG_FAILURE');
|
||||||
@ -1266,7 +1266,7 @@ class SSH1
|
|||||||
$crc = 0x00000000;
|
$crc = 0x00000000;
|
||||||
$length = strlen($data);
|
$length = strlen($data);
|
||||||
|
|
||||||
for ($i=0;$i<$length;$i++) {
|
for ($i=0; $i<$length; $i++) {
|
||||||
// We AND $crc >> 8 with 0x00FFFFFF because we want the eight newly added bits to all
|
// We AND $crc >> 8 with 0x00FFFFFF because we want the eight newly added bits to all
|
||||||
// be zero. PHP, unfortunately, doesn't always do this. 0x80000000 >> 8, as an example,
|
// be zero. PHP, unfortunately, doesn't always do this. 0x80000000 >> 8, as an example,
|
||||||
// yields 0xFF800000 - not 0x00800000. The following link elaborates:
|
// yields 0xFF800000 - not 0x00800000. The following link elaborates:
|
||||||
@ -1361,7 +1361,7 @@ class SSH1
|
|||||||
{
|
{
|
||||||
$args = func_get_args();
|
$args = func_get_args();
|
||||||
foreach ($args as $arg) {
|
foreach ($args as $arg) {
|
||||||
foreach ($arg as $key=>$value) {
|
foreach ($arg as $key => $value) {
|
||||||
if (!defined($value)) {
|
if (!defined($value)) {
|
||||||
define($value, $key);
|
define($value, $key);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1299,14 +1299,32 @@ class SSH2
|
|||||||
$first_kex_packet_follows = $first_kex_packet_follows != 0;
|
$first_kex_packet_follows = $first_kex_packet_follows != 0;
|
||||||
|
|
||||||
// the sending of SSH2_MSG_KEXINIT could go in one of two places. this is the second place.
|
// the sending of SSH2_MSG_KEXINIT could go in one of two places. this is the second place.
|
||||||
$kexinit_payload_client = pack('Ca*Na*Na*Na*Na*Na*Na*Na*Na*Na*Na*CN',
|
$kexinit_payload_client = pack(
|
||||||
NET_SSH2_MSG_KEXINIT, $client_cookie, strlen($str_kex_algorithms), $str_kex_algorithms,
|
'Ca*Na*Na*Na*Na*Na*Na*Na*Na*Na*Na*CN',
|
||||||
strlen($str_server_host_key_algorithms), $str_server_host_key_algorithms, strlen($encryption_algorithms_client_to_server),
|
NET_SSH2_MSG_KEXINIT,
|
||||||
$encryption_algorithms_client_to_server, strlen($encryption_algorithms_server_to_client), $encryption_algorithms_server_to_client,
|
$client_cookie,
|
||||||
strlen($mac_algorithms_client_to_server), $mac_algorithms_client_to_server, strlen($mac_algorithms_server_to_client),
|
strlen($str_kex_algorithms),
|
||||||
$mac_algorithms_server_to_client, strlen($compression_algorithms_client_to_server), $compression_algorithms_client_to_server,
|
$str_kex_algorithms,
|
||||||
strlen($compression_algorithms_server_to_client), $compression_algorithms_server_to_client, 0, '', 0, '',
|
strlen($str_server_host_key_algorithms),
|
||||||
0, 0
|
$str_server_host_key_algorithms,
|
||||||
|
strlen($encryption_algorithms_client_to_server),
|
||||||
|
$encryption_algorithms_client_to_server,
|
||||||
|
strlen($encryption_algorithms_server_to_client),
|
||||||
|
$encryption_algorithms_server_to_client,
|
||||||
|
strlen($mac_algorithms_client_to_server),
|
||||||
|
$mac_algorithms_client_to_server,
|
||||||
|
strlen($mac_algorithms_server_to_client),
|
||||||
|
$mac_algorithms_server_to_client,
|
||||||
|
strlen($compression_algorithms_client_to_server),
|
||||||
|
$compression_algorithms_client_to_server,
|
||||||
|
strlen($compression_algorithms_server_to_client),
|
||||||
|
$compression_algorithms_server_to_client,
|
||||||
|
0,
|
||||||
|
'',
|
||||||
|
0,
|
||||||
|
'',
|
||||||
|
0,
|
||||||
|
0
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!$this->_send_binary_packet($kexinit_payload_client)) {
|
if (!$this->_send_binary_packet($kexinit_payload_client)) {
|
||||||
@ -1315,7 +1333,8 @@ class SSH2
|
|||||||
// here ends the second place.
|
// here ends the second place.
|
||||||
|
|
||||||
// we need to decide upon the symmetric encryption algorithms before we do the diffie-hellman key exchange
|
// we need to decide upon the symmetric encryption algorithms before we do the diffie-hellman key exchange
|
||||||
for ($i = 0; $i < count($encryption_algorithms) && !in_array($encryption_algorithms[$i], $this->encryption_algorithms_server_to_client); $i++);
|
for ($i = 0; $i < count($encryption_algorithms) && !in_array($encryption_algorithms[$i], $this->encryption_algorithms_server_to_client); $i++) {
|
||||||
|
}
|
||||||
if ($i == count($encryption_algorithms)) {
|
if ($i == count($encryption_algorithms)) {
|
||||||
user_error('No compatible server to client encryption algorithms found');
|
user_error('No compatible server to client encryption algorithms found');
|
||||||
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
|
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
|
||||||
@ -1361,7 +1380,8 @@ class SSH2
|
|||||||
$decryptKeyLength = 0;
|
$decryptKeyLength = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for ($i = 0; $i < count($encryption_algorithms) && !in_array($encryption_algorithms[$i], $this->encryption_algorithms_client_to_server); $i++);
|
for ($i = 0; $i < count($encryption_algorithms) && !in_array($encryption_algorithms[$i], $this->encryption_algorithms_client_to_server); $i++) {
|
||||||
|
}
|
||||||
if ($i == count($encryption_algorithms)) {
|
if ($i == count($encryption_algorithms)) {
|
||||||
user_error('No compatible client to server encryption algorithms found');
|
user_error('No compatible client to server encryption algorithms found');
|
||||||
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
|
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
|
||||||
@ -1408,19 +1428,22 @@ class SSH2
|
|||||||
$keyLength = $decryptKeyLength > $encryptKeyLength ? $decryptKeyLength : $encryptKeyLength;
|
$keyLength = $decryptKeyLength > $encryptKeyLength ? $decryptKeyLength : $encryptKeyLength;
|
||||||
|
|
||||||
// through diffie-hellman key exchange a symmetric key is obtained
|
// through diffie-hellman key exchange a symmetric key is obtained
|
||||||
for ($i = 0; $i < count($kex_algorithms) && !in_array($kex_algorithms[$i], $this->kex_algorithms); $i++);
|
for ($i = 0; $i < count($kex_algorithms) && !in_array($kex_algorithms[$i], $this->kex_algorithms); $i++) {
|
||||||
|
}
|
||||||
if ($i == count($kex_algorithms)) {
|
if ($i == count($kex_algorithms)) {
|
||||||
user_error('No compatible key exchange algorithms found');
|
user_error('No compatible key exchange algorithms found');
|
||||||
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
|
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strpos($kex_algorithms[$i], 'diffie-hellman-group-exchange') === 0) {
|
if (strpos($kex_algorithms[$i], 'diffie-hellman-group-exchange') === 0) {
|
||||||
$dh_group_sizes_packed = pack('NNN',
|
$dh_group_sizes_packed = pack(
|
||||||
|
'NNN',
|
||||||
$this->kex_dh_group_size_min,
|
$this->kex_dh_group_size_min,
|
||||||
$this->kex_dh_group_size_preferred,
|
$this->kex_dh_group_size_preferred,
|
||||||
$this->kex_dh_group_size_max
|
$this->kex_dh_group_size_max
|
||||||
);
|
);
|
||||||
$packet = pack('Ca*',
|
$packet = pack(
|
||||||
|
'Ca*',
|
||||||
NET_SSH2_MSG_KEXDH_GEX_REQUEST,
|
NET_SSH2_MSG_KEXDH_GEX_REQUEST,
|
||||||
$dh_group_sizes_packed
|
$dh_group_sizes_packed
|
||||||
);
|
);
|
||||||
@ -1447,10 +1470,13 @@ class SSH2
|
|||||||
$gBytes = $this->_string_shift($response, $gLength);
|
$gBytes = $this->_string_shift($response, $gLength);
|
||||||
$g = new BigInteger($gBytes, -256);
|
$g = new BigInteger($gBytes, -256);
|
||||||
|
|
||||||
$exchange_hash_rfc4419 = pack('a*Na*Na*',
|
$exchange_hash_rfc4419 = pack(
|
||||||
|
'a*Na*Na*',
|
||||||
$dh_group_sizes_packed,
|
$dh_group_sizes_packed,
|
||||||
$primeLength, $primeBytes,
|
$primeLength,
|
||||||
$gLength, $gBytes
|
$primeBytes,
|
||||||
|
$gLength,
|
||||||
|
$gBytes
|
||||||
);
|
);
|
||||||
|
|
||||||
$clientKexInitMessage = NET_SSH2_MSG_KEXDH_GEX_INIT;
|
$clientKexInitMessage = NET_SSH2_MSG_KEXDH_GEX_INIT;
|
||||||
@ -1548,16 +1574,25 @@ class SSH2
|
|||||||
$key = $f->modPow($x, $prime);
|
$key = $f->modPow($x, $prime);
|
||||||
$keyBytes = $key->toBytes(true);
|
$keyBytes = $key->toBytes(true);
|
||||||
|
|
||||||
$this->exchange_hash = pack('Na*Na*Na*Na*Na*a*Na*Na*Na*',
|
$this->exchange_hash = pack(
|
||||||
strlen($this->identifier), $this->identifier,
|
'Na*Na*Na*Na*Na*a*Na*Na*Na*',
|
||||||
strlen($this->server_identifier), $this->server_identifier,
|
strlen($this->identifier),
|
||||||
strlen($kexinit_payload_client), $kexinit_payload_client,
|
$this->identifier,
|
||||||
strlen($kexinit_payload_server), $kexinit_payload_server,
|
strlen($this->server_identifier),
|
||||||
strlen($this->server_public_host_key), $this->server_public_host_key,
|
$this->server_identifier,
|
||||||
|
strlen($kexinit_payload_client),
|
||||||
|
$kexinit_payload_client,
|
||||||
|
strlen($kexinit_payload_server),
|
||||||
|
$kexinit_payload_server,
|
||||||
|
strlen($this->server_public_host_key),
|
||||||
|
$this->server_public_host_key,
|
||||||
$exchange_hash_rfc4419,
|
$exchange_hash_rfc4419,
|
||||||
strlen($eBytes), $eBytes,
|
strlen($eBytes),
|
||||||
strlen($fBytes), $fBytes,
|
$eBytes,
|
||||||
strlen($keyBytes), $keyBytes
|
strlen($fBytes),
|
||||||
|
$fBytes,
|
||||||
|
strlen($keyBytes),
|
||||||
|
$keyBytes
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->exchange_hash = $kexHash->hash($this->exchange_hash);
|
$this->exchange_hash = $kexHash->hash($this->exchange_hash);
|
||||||
@ -1566,7 +1601,8 @@ class SSH2
|
|||||||
$this->session_id = $this->exchange_hash;
|
$this->session_id = $this->exchange_hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
for ($i = 0; $i < count($server_host_key_algorithms) && !in_array($server_host_key_algorithms[$i], $this->server_host_key_algorithms); $i++);
|
for ($i = 0; $i < count($server_host_key_algorithms) && !in_array($server_host_key_algorithms[$i], $this->server_host_key_algorithms); $i++) {
|
||||||
|
}
|
||||||
if ($i == count($server_host_key_algorithms)) {
|
if ($i == count($server_host_key_algorithms)) {
|
||||||
user_error('No compatible server host key algorithms found');
|
user_error('No compatible server host key algorithms found');
|
||||||
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
|
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
|
||||||
@ -1577,7 +1613,8 @@ class SSH2
|
|||||||
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
|
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
|
||||||
}
|
}
|
||||||
|
|
||||||
$packet = pack('C',
|
$packet = pack(
|
||||||
|
'C',
|
||||||
NET_SSH2_MSG_NEWKEYS
|
NET_SSH2_MSG_NEWKEYS
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -1755,7 +1792,8 @@ class SSH2
|
|||||||
$this->decrypt->decrypt(str_repeat("\0", 1536));
|
$this->decrypt->decrypt(str_repeat("\0", 1536));
|
||||||
}
|
}
|
||||||
|
|
||||||
for ($i = 0; $i < count($mac_algorithms) && !in_array($mac_algorithms[$i], $this->mac_algorithms_client_to_server); $i++);
|
for ($i = 0; $i < count($mac_algorithms) && !in_array($mac_algorithms[$i], $this->mac_algorithms_client_to_server); $i++) {
|
||||||
|
}
|
||||||
if ($i == count($mac_algorithms)) {
|
if ($i == count($mac_algorithms)) {
|
||||||
user_error('No compatible client to server message authentication algorithms found');
|
user_error('No compatible client to server message authentication algorithms found');
|
||||||
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
|
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
|
||||||
@ -1784,7 +1822,8 @@ class SSH2
|
|||||||
$createKeyLength = 16;
|
$createKeyLength = 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
for ($i = 0; $i < count($mac_algorithms) && !in_array($mac_algorithms[$i], $this->mac_algorithms_server_to_client); $i++);
|
for ($i = 0; $i < count($mac_algorithms) && !in_array($mac_algorithms[$i], $this->mac_algorithms_server_to_client); $i++) {
|
||||||
|
}
|
||||||
if ($i == count($mac_algorithms)) {
|
if ($i == count($mac_algorithms)) {
|
||||||
user_error('No compatible server to client message authentication algorithms found');
|
user_error('No compatible server to client message authentication algorithms found');
|
||||||
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
|
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
|
||||||
@ -1831,14 +1870,16 @@ class SSH2
|
|||||||
}
|
}
|
||||||
$this->hmac_check->setKey(substr($key, 0, $checkKeyLength));
|
$this->hmac_check->setKey(substr($key, 0, $checkKeyLength));
|
||||||
|
|
||||||
for ($i = 0; $i < count($compression_algorithms) && !in_array($compression_algorithms[$i], $this->compression_algorithms_server_to_client); $i++);
|
for ($i = 0; $i < count($compression_algorithms) && !in_array($compression_algorithms[$i], $this->compression_algorithms_server_to_client); $i++) {
|
||||||
|
}
|
||||||
if ($i == count($compression_algorithms)) {
|
if ($i == count($compression_algorithms)) {
|
||||||
user_error('No compatible server to client compression algorithms found');
|
user_error('No compatible server to client compression algorithms found');
|
||||||
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
|
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
|
||||||
}
|
}
|
||||||
$this->decompress = $compression_algorithms[$i] == 'zlib';
|
$this->decompress = $compression_algorithms[$i] == 'zlib';
|
||||||
|
|
||||||
for ($i = 0; $i < count($compression_algorithms) && !in_array($compression_algorithms[$i], $this->compression_algorithms_client_to_server); $i++);
|
for ($i = 0; $i < count($compression_algorithms) && !in_array($compression_algorithms[$i], $this->compression_algorithms_client_to_server); $i++) {
|
||||||
|
}
|
||||||
if ($i == count($compression_algorithms)) {
|
if ($i == count($compression_algorithms)) {
|
||||||
user_error('No compatible client to server compression algorithms found');
|
user_error('No compatible client to server compression algorithms found');
|
||||||
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
|
return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
|
||||||
@ -1914,8 +1955,11 @@ class SSH2
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!($this->bitmap & self::MASK_LOGIN_REQ)) {
|
if (!($this->bitmap & self::MASK_LOGIN_REQ)) {
|
||||||
$packet = pack('CNa*',
|
$packet = pack(
|
||||||
NET_SSH2_MSG_SERVICE_REQUEST, strlen('ssh-userauth'), 'ssh-userauth'
|
'CNa*',
|
||||||
|
NET_SSH2_MSG_SERVICE_REQUEST,
|
||||||
|
strlen('ssh-userauth'),
|
||||||
|
'ssh-userauth'
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!$this->_send_binary_packet($packet)) {
|
if (!$this->_send_binary_packet($packet)) {
|
||||||
@ -1956,9 +2000,15 @@ class SSH2
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!isset($password)) {
|
if (!isset($password)) {
|
||||||
$packet = pack('CNa*Na*Na*',
|
$packet = pack(
|
||||||
NET_SSH2_MSG_USERAUTH_REQUEST, strlen($username), $username, strlen('ssh-connection'), 'ssh-connection',
|
'CNa*Na*Na*',
|
||||||
strlen('none'), 'none'
|
NET_SSH2_MSG_USERAUTH_REQUEST,
|
||||||
|
strlen($username),
|
||||||
|
$username,
|
||||||
|
strlen('ssh-connection'),
|
||||||
|
'ssh-connection',
|
||||||
|
strlen('none'),
|
||||||
|
'none'
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!$this->_send_binary_packet($packet)) {
|
if (!$this->_send_binary_packet($packet)) {
|
||||||
@ -1983,18 +2033,36 @@ class SSH2
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$packet = pack('CNa*Na*Na*CNa*',
|
$packet = pack(
|
||||||
NET_SSH2_MSG_USERAUTH_REQUEST, strlen($username), $username, strlen('ssh-connection'), 'ssh-connection',
|
'CNa*Na*Na*CNa*',
|
||||||
strlen('password'), 'password', 0, strlen($password), $password
|
NET_SSH2_MSG_USERAUTH_REQUEST,
|
||||||
|
strlen($username),
|
||||||
|
$username,
|
||||||
|
strlen('ssh-connection'),
|
||||||
|
'ssh-connection',
|
||||||
|
strlen('password'),
|
||||||
|
'password',
|
||||||
|
0,
|
||||||
|
strlen($password),
|
||||||
|
$password
|
||||||
);
|
);
|
||||||
|
|
||||||
// remove the username and password from the logged packet
|
// remove the username and password from the logged packet
|
||||||
if (!defined('NET_SSH2_LOGGING')) {
|
if (!defined('NET_SSH2_LOGGING')) {
|
||||||
$logged = null;
|
$logged = null;
|
||||||
} else {
|
} else {
|
||||||
$logged = pack('CNa*Na*Na*CNa*',
|
$logged = pack(
|
||||||
NET_SSH2_MSG_USERAUTH_REQUEST, strlen('username'), 'username', strlen('ssh-connection'), 'ssh-connection',
|
'CNa*Na*Na*CNa*',
|
||||||
strlen('password'), 'password', 0, strlen('password'), 'password'
|
NET_SSH2_MSG_USERAUTH_REQUEST,
|
||||||
|
strlen('username'),
|
||||||
|
'username',
|
||||||
|
strlen('ssh-connection'),
|
||||||
|
'ssh-connection',
|
||||||
|
strlen('password'),
|
||||||
|
'password',
|
||||||
|
0,
|
||||||
|
strlen('password'),
|
||||||
|
'password'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2054,9 +2122,19 @@ class SSH2
|
|||||||
*/
|
*/
|
||||||
function _keyboard_interactive_login($username, $password)
|
function _keyboard_interactive_login($username, $password)
|
||||||
{
|
{
|
||||||
$packet = pack('CNa*Na*Na*Na*Na*',
|
$packet = pack(
|
||||||
NET_SSH2_MSG_USERAUTH_REQUEST, strlen($username), $username, strlen('ssh-connection'), 'ssh-connection',
|
'CNa*Na*Na*Na*Na*',
|
||||||
strlen('keyboard-interactive'), 'keyboard-interactive', 0, '', 0, ''
|
NET_SSH2_MSG_USERAUTH_REQUEST,
|
||||||
|
strlen($username),
|
||||||
|
$username,
|
||||||
|
strlen('ssh-connection'),
|
||||||
|
'ssh-connection',
|
||||||
|
strlen('keyboard-interactive'),
|
||||||
|
'keyboard-interactive',
|
||||||
|
0,
|
||||||
|
'',
|
||||||
|
0,
|
||||||
|
''
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!$this->_send_binary_packet($packet)) {
|
if (!$this->_send_binary_packet($packet)) {
|
||||||
@ -2127,7 +2205,7 @@ class SSH2
|
|||||||
// see http://tools.ietf.org/html/rfc4256#section-3.2
|
// see http://tools.ietf.org/html/rfc4256#section-3.2
|
||||||
if (strlen($this->last_interactive_response)) {
|
if (strlen($this->last_interactive_response)) {
|
||||||
$this->last_interactive_response = '';
|
$this->last_interactive_response = '';
|
||||||
} else if (defined('NET_SSH2_LOGGING')) {
|
} elseif (defined('NET_SSH2_LOGGING')) {
|
||||||
$this->message_number_log[count($this->message_number_log) - 1] = str_replace(
|
$this->message_number_log[count($this->message_number_log) - 1] = str_replace(
|
||||||
'UNKNOWN',
|
'UNKNOWN',
|
||||||
'NET_SSH2_MSG_USERAUTH_INFO_REQUEST',
|
'NET_SSH2_MSG_USERAUTH_INFO_REQUEST',
|
||||||
@ -2223,13 +2301,25 @@ class SSH2
|
|||||||
'e' => $publickey['e']->toBytes(true),
|
'e' => $publickey['e']->toBytes(true),
|
||||||
'n' => $publickey['n']->toBytes(true)
|
'n' => $publickey['n']->toBytes(true)
|
||||||
);
|
);
|
||||||
$publickey = pack('Na*Na*Na*',
|
$publickey = pack(
|
||||||
strlen('ssh-rsa'), 'ssh-rsa', strlen($publickey['e']), $publickey['e'], strlen($publickey['n']), $publickey['n']
|
'Na*Na*Na*',
|
||||||
|
strlen('ssh-rsa'),
|
||||||
|
'ssh-rsa',
|
||||||
|
strlen($publickey['e']),
|
||||||
|
$publickey['e'],
|
||||||
|
strlen($publickey['n']),
|
||||||
|
$publickey['n']
|
||||||
);
|
);
|
||||||
|
|
||||||
$part1 = pack('CNa*Na*Na*',
|
$part1 = pack(
|
||||||
NET_SSH2_MSG_USERAUTH_REQUEST, strlen($username), $username, strlen('ssh-connection'), 'ssh-connection',
|
'CNa*Na*Na*',
|
||||||
strlen('publickey'), 'publickey'
|
NET_SSH2_MSG_USERAUTH_REQUEST,
|
||||||
|
strlen($username),
|
||||||
|
$username,
|
||||||
|
strlen('ssh-connection'),
|
||||||
|
'ssh-connection',
|
||||||
|
strlen('publickey'),
|
||||||
|
'publickey'
|
||||||
);
|
);
|
||||||
$part2 = pack('Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($publickey), $publickey);
|
$part2 = pack('Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($publickey), $publickey);
|
||||||
|
|
||||||
@ -2347,8 +2437,15 @@ class SSH2
|
|||||||
// uses 0x4000, that's what will be used here, as well.
|
// uses 0x4000, that's what will be used here, as well.
|
||||||
$packet_size = 0x4000;
|
$packet_size = 0x4000;
|
||||||
|
|
||||||
$packet = pack('CNa*N3',
|
$packet = pack(
|
||||||
NET_SSH2_MSG_CHANNEL_OPEN, strlen('session'), 'session', self::CHANNEL_EXEC, $this->window_size_server_to_client[self::CHANNEL_EXEC], $packet_size);
|
'CNa*N3',
|
||||||
|
NET_SSH2_MSG_CHANNEL_OPEN,
|
||||||
|
strlen('session'),
|
||||||
|
'session',
|
||||||
|
self::CHANNEL_EXEC,
|
||||||
|
$this->window_size_server_to_client[self::CHANNEL_EXEC],
|
||||||
|
$packet_size
|
||||||
|
);
|
||||||
|
|
||||||
if (!$this->_send_binary_packet($packet)) {
|
if (!$this->_send_binary_packet($packet)) {
|
||||||
return false;
|
return false;
|
||||||
@ -2363,9 +2460,22 @@ class SSH2
|
|||||||
|
|
||||||
if ($this->request_pty === true) {
|
if ($this->request_pty === true) {
|
||||||
$terminal_modes = pack('C', NET_SSH2_TTY_OP_END);
|
$terminal_modes = pack('C', NET_SSH2_TTY_OP_END);
|
||||||
$packet = pack('CNNa*CNa*N5a*',
|
$packet = pack(
|
||||||
NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[self::CHANNEL_EXEC], strlen('pty-req'), 'pty-req', 1, strlen('vt100'), 'vt100',
|
'CNNa*CNa*N5a*',
|
||||||
$this->windowColumns, $this->windowRows, 0, 0, strlen($terminal_modes), $terminal_modes);
|
NET_SSH2_MSG_CHANNEL_REQUEST,
|
||||||
|
$this->server_channels[self::CHANNEL_EXEC],
|
||||||
|
strlen('pty-req'),
|
||||||
|
'pty-req',
|
||||||
|
1,
|
||||||
|
strlen('vt100'),
|
||||||
|
'vt100',
|
||||||
|
$this->windowColumns,
|
||||||
|
$this->windowRows,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
strlen($terminal_modes),
|
||||||
|
$terminal_modes
|
||||||
|
);
|
||||||
|
|
||||||
if (!$this->_send_binary_packet($packet)) {
|
if (!$this->_send_binary_packet($packet)) {
|
||||||
return false;
|
return false;
|
||||||
@ -2399,8 +2509,16 @@ class SSH2
|
|||||||
// although, in theory, the size of SSH_MSG_CHANNEL_REQUEST could exceed the maximum packet size established by
|
// although, in theory, the size of SSH_MSG_CHANNEL_REQUEST could exceed the maximum packet size established by
|
||||||
// SSH_MSG_CHANNEL_OPEN_CONFIRMATION, RFC4254#section-5.1 states that the "maximum packet size" refers to the
|
// SSH_MSG_CHANNEL_OPEN_CONFIRMATION, RFC4254#section-5.1 states that the "maximum packet size" refers to the
|
||||||
// "maximum size of an individual data packet". ie. SSH_MSG_CHANNEL_DATA. RFC4254#section-5.2 corroborates.
|
// "maximum size of an individual data packet". ie. SSH_MSG_CHANNEL_DATA. RFC4254#section-5.2 corroborates.
|
||||||
$packet = pack('CNNa*CNa*',
|
$packet = pack(
|
||||||
NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[self::CHANNEL_EXEC], strlen('exec'), 'exec', 1, strlen($command), $command);
|
'CNNa*CNa*',
|
||||||
|
NET_SSH2_MSG_CHANNEL_REQUEST,
|
||||||
|
$this->server_channels[self::CHANNEL_EXEC],
|
||||||
|
strlen('exec'),
|
||||||
|
'exec',
|
||||||
|
1,
|
||||||
|
strlen($command),
|
||||||
|
$command
|
||||||
|
);
|
||||||
if (!$this->_send_binary_packet($packet)) {
|
if (!$this->_send_binary_packet($packet)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -2456,8 +2574,15 @@ class SSH2
|
|||||||
$this->window_size_server_to_client[self::CHANNEL_SHELL] = $this->window_size;
|
$this->window_size_server_to_client[self::CHANNEL_SHELL] = $this->window_size;
|
||||||
$packet_size = 0x4000;
|
$packet_size = 0x4000;
|
||||||
|
|
||||||
$packet = pack('CNa*N3',
|
$packet = pack(
|
||||||
NET_SSH2_MSG_CHANNEL_OPEN, strlen('session'), 'session', self::CHANNEL_SHELL, $this->window_size_server_to_client[self::CHANNEL_SHELL], $packet_size);
|
'CNa*N3',
|
||||||
|
NET_SSH2_MSG_CHANNEL_OPEN,
|
||||||
|
strlen('session'),
|
||||||
|
'session',
|
||||||
|
self::CHANNEL_SHELL,
|
||||||
|
$this->window_size_server_to_client[self::CHANNEL_SHELL],
|
||||||
|
$packet_size
|
||||||
|
);
|
||||||
|
|
||||||
if (!$this->_send_binary_packet($packet)) {
|
if (!$this->_send_binary_packet($packet)) {
|
||||||
return false;
|
return false;
|
||||||
@ -2471,9 +2596,22 @@ class SSH2
|
|||||||
}
|
}
|
||||||
|
|
||||||
$terminal_modes = pack('C', NET_SSH2_TTY_OP_END);
|
$terminal_modes = pack('C', NET_SSH2_TTY_OP_END);
|
||||||
$packet = pack('CNNa*CNa*N5a*',
|
$packet = pack(
|
||||||
NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[self::CHANNEL_SHELL], strlen('pty-req'), 'pty-req', 1, strlen('vt100'), 'vt100',
|
'CNNa*CNa*N5a*',
|
||||||
$this->windowColumns, $this->windowRows, 0, 0, strlen($terminal_modes), $terminal_modes);
|
NET_SSH2_MSG_CHANNEL_REQUEST,
|
||||||
|
$this->server_channels[self::CHANNEL_SHELL],
|
||||||
|
strlen('pty-req'),
|
||||||
|
'pty-req',
|
||||||
|
1,
|
||||||
|
strlen('vt100'),
|
||||||
|
'vt100',
|
||||||
|
$this->windowColumns,
|
||||||
|
$this->windowRows,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
strlen($terminal_modes),
|
||||||
|
$terminal_modes
|
||||||
|
);
|
||||||
|
|
||||||
if (!$this->_send_binary_packet($packet)) {
|
if (!$this->_send_binary_packet($packet)) {
|
||||||
return false;
|
return false;
|
||||||
@ -2497,8 +2635,14 @@ class SSH2
|
|||||||
return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION);
|
return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
$packet = pack('CNNa*C',
|
$packet = pack(
|
||||||
NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[self::CHANNEL_SHELL], strlen('shell'), 'shell', 1);
|
'CNNa*C',
|
||||||
|
NET_SSH2_MSG_CHANNEL_REQUEST,
|
||||||
|
$this->server_channels[self::CHANNEL_SHELL],
|
||||||
|
strlen('shell'),
|
||||||
|
'shell',
|
||||||
|
1
|
||||||
|
);
|
||||||
if (!$this->_send_binary_packet($packet)) {
|
if (!$this->_send_binary_packet($packet)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -2645,8 +2789,15 @@ class SSH2
|
|||||||
{
|
{
|
||||||
$this->window_size_server_to_client[self::CHANNEL_SUBSYSTEM] = $this->window_size;
|
$this->window_size_server_to_client[self::CHANNEL_SUBSYSTEM] = $this->window_size;
|
||||||
|
|
||||||
$packet = pack('CNa*N3',
|
$packet = pack(
|
||||||
NET_SSH2_MSG_CHANNEL_OPEN, strlen('session'), 'session', self::CHANNEL_SUBSYSTEM, $this->window_size, 0x4000);
|
'CNa*N3',
|
||||||
|
NET_SSH2_MSG_CHANNEL_OPEN,
|
||||||
|
strlen('session'),
|
||||||
|
'session',
|
||||||
|
self::CHANNEL_SUBSYSTEM,
|
||||||
|
$this->window_size,
|
||||||
|
0x4000
|
||||||
|
);
|
||||||
|
|
||||||
if (!$this->_send_binary_packet($packet)) {
|
if (!$this->_send_binary_packet($packet)) {
|
||||||
return false;
|
return false;
|
||||||
@ -2659,8 +2810,16 @@ class SSH2
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$packet = pack('CNNa*CNa*',
|
$packet = pack(
|
||||||
NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[self::CHANNEL_SUBSYSTEM], strlen('subsystem'), 'subsystem', 1, strlen($subsystem), $subsystem);
|
'CNNa*CNa*',
|
||||||
|
NET_SSH2_MSG_CHANNEL_REQUEST,
|
||||||
|
$this->server_channels[self::CHANNEL_SUBSYSTEM],
|
||||||
|
strlen('subsystem'),
|
||||||
|
'subsystem',
|
||||||
|
1,
|
||||||
|
strlen($subsystem),
|
||||||
|
$subsystem
|
||||||
|
);
|
||||||
if (!$this->_send_binary_packet($packet)) {
|
if (!$this->_send_binary_packet($packet)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -2670,7 +2829,7 @@ class SSH2
|
|||||||
$response = $this->_get_channel_packet(self::CHANNEL_SUBSYSTEM);
|
$response = $this->_get_channel_packet(self::CHANNEL_SUBSYSTEM);
|
||||||
|
|
||||||
if ($response === false) {
|
if ($response === false) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->channel_status[self::CHANNEL_SUBSYSTEM] = NET_SSH2_MSG_CHANNEL_DATA;
|
$this->channel_status[self::CHANNEL_SUBSYSTEM] = NET_SSH2_MSG_CHANNEL_DATA;
|
||||||
@ -2914,34 +3073,48 @@ class SSH2
|
|||||||
extract(unpack('Nlength', $this->_string_shift($payload, 4)));
|
extract(unpack('Nlength', $this->_string_shift($payload, 4)));
|
||||||
$data = $this->_string_shift($payload, $length);
|
$data = $this->_string_shift($payload, $length);
|
||||||
extract(unpack('Nserver_channel', $this->_string_shift($payload, 4)));
|
extract(unpack('Nserver_channel', $this->_string_shift($payload, 4)));
|
||||||
switch($data) {
|
switch ($data) {
|
||||||
case 'auth-agent':
|
case 'auth-agent':
|
||||||
case 'auth-agent@openssh.com':
|
case 'auth-agent@openssh.com':
|
||||||
if (isset($this->agent)) {
|
if (isset($this->agent)) {
|
||||||
$new_channel = self::CHANNEL_AGENT_FORWARD;
|
$new_channel = self::CHANNEL_AGENT_FORWARD;
|
||||||
|
|
||||||
extract(unpack('Nremote_window_size', $this->_string_shift($payload, 4)));
|
extract(unpack('Nremote_window_size', $this->_string_shift($payload, 4)));
|
||||||
extract(unpack('Nremote_maximum_packet_size', $this->_string_shift($payload, 4)));
|
extract(unpack('Nremote_maximum_packet_size', $this->_string_shift($payload, 4)));
|
||||||
|
|
||||||
$this->packet_size_client_to_server[$new_channel] = $remote_window_size;
|
$this->packet_size_client_to_server[$new_channel] = $remote_window_size;
|
||||||
$this->window_size_server_to_client[$new_channel] = $remote_maximum_packet_size;
|
$this->window_size_server_to_client[$new_channel] = $remote_maximum_packet_size;
|
||||||
$this->window_size_client_to_server[$new_channel] = $this->window_size;
|
$this->window_size_client_to_server[$new_channel] = $this->window_size;
|
||||||
|
|
||||||
$packet_size = 0x4000;
|
$packet_size = 0x4000;
|
||||||
|
|
||||||
$packet = pack('CN4',
|
$packet = pack(
|
||||||
NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION, $server_channel, $new_channel, $packet_size, $packet_size);
|
'CN4',
|
||||||
|
NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION,
|
||||||
|
$server_channel,
|
||||||
|
$new_channel,
|
||||||
|
$packet_size,
|
||||||
|
$packet_size
|
||||||
|
);
|
||||||
|
|
||||||
$this->server_channels[$new_channel] = $server_channel;
|
$this->server_channels[$new_channel] = $server_channel;
|
||||||
$this->channel_status[$new_channel] = NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION;
|
$this->channel_status[$new_channel] = NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION;
|
||||||
if (!$this->_send_binary_packet($packet)) {
|
if (!$this->_send_binary_packet($packet)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
$packet = pack('CN3a*Na*',
|
$packet = pack(
|
||||||
NET_SSH2_MSG_REQUEST_FAILURE, $server_channel, NET_SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED, 0, '', 0, '');
|
'CN3a*Na*',
|
||||||
|
NET_SSH2_MSG_REQUEST_FAILURE,
|
||||||
|
$server_channel,
|
||||||
|
NET_SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED,
|
||||||
|
0,
|
||||||
|
'',
|
||||||
|
0,
|
||||||
|
''
|
||||||
|
);
|
||||||
|
|
||||||
if (!$this->_send_binary_packet($packet)) {
|
if (!$this->_send_binary_packet($packet)) {
|
||||||
return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION);
|
return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION);
|
||||||
@ -3417,7 +3590,8 @@ class SSH2
|
|||||||
);
|
);
|
||||||
|
|
||||||
$temp = $this->_string_shift($data, $max_size);
|
$temp = $this->_string_shift($data, $max_size);
|
||||||
$packet = pack('CN2a*',
|
$packet = pack(
|
||||||
|
'CN2a*',
|
||||||
NET_SSH2_MSG_CHANNEL_DATA,
|
NET_SSH2_MSG_CHANNEL_DATA,
|
||||||
$this->server_channels[$client_channel],
|
$this->server_channels[$client_channel],
|
||||||
strlen($temp),
|
strlen($temp),
|
||||||
@ -3458,7 +3632,8 @@ class SSH2
|
|||||||
|
|
||||||
$this->curTimeout = 0;
|
$this->curTimeout = 0;
|
||||||
|
|
||||||
while (!is_bool($this->_get_channel_packet($client_channel)));
|
while (!is_bool($this->_get_channel_packet($client_channel))) {
|
||||||
|
}
|
||||||
|
|
||||||
if ($want_reply) {
|
if ($want_reply) {
|
||||||
$this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$client_channel]));
|
$this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$client_channel]));
|
||||||
@ -3518,7 +3693,7 @@ class SSH2
|
|||||||
{
|
{
|
||||||
$args = func_get_args();
|
$args = func_get_args();
|
||||||
foreach ($args as $arg) {
|
foreach ($args as $arg) {
|
||||||
foreach ($arg as $key=>$value) {
|
foreach ($arg as $key => $value) {
|
||||||
if (!defined($value)) {
|
if (!defined($value)) {
|
||||||
define($value, $key);
|
define($value, $key);
|
||||||
} else {
|
} else {
|
||||||
|
@ -223,8 +223,14 @@ class Agent
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$packet = pack('CNNa*C',
|
$packet = pack(
|
||||||
NET_SSH2_MSG_CHANNEL_REQUEST, $ssh->server_channels[$request_channel], strlen('auth-agent-req@openssh.com'), 'auth-agent-req@openssh.com', 1);
|
'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;
|
$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 $exampleData;
|
||||||
static protected $exampleDataLength;
|
static protected $exampleDataLength;
|
||||||
|
|
||||||
static public function setUpBeforeClass()
|
public static function setUpBeforeClass()
|
||||||
{
|
{
|
||||||
parent::setUpBeforeClass();
|
parent::setUpBeforeClass();
|
||||||
self::$remoteFile = uniqid('phpseclib-scp-ssh2-') . '.txt';
|
self::$remoteFile = uniqid('phpseclib-scp-ssh2-') . '.txt';
|
||||||
|
@ -11,7 +11,7 @@ use phpseclib\Net\SFTP;
|
|||||||
|
|
||||||
class Functional_Net_SFTPLargeFileTest extends Functional_Net_SFTPTestCase
|
class Functional_Net_SFTPLargeFileTest extends Functional_Net_SFTPTestCase
|
||||||
{
|
{
|
||||||
static public function setUpBeforeClass()
|
public static function setUpBeforeClass()
|
||||||
{
|
{
|
||||||
if (!extension_loaded('mcrypt') && !extension_loaded('openssl')) {
|
if (!extension_loaded('mcrypt') && !extension_loaded('openssl')) {
|
||||||
self::markTestSkipped('This test depends on mcrypt or openssl for performance.');
|
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
|
class Functional_Net_SFTPStreamTest extends Functional_Net_SFTPTestCase
|
||||||
{
|
{
|
||||||
static public function setUpBeforeClass()
|
public static function setUpBeforeClass()
|
||||||
{
|
{
|
||||||
Stream::register();
|
Stream::register();
|
||||||
parent::setUpBeforeClass();
|
parent::setUpBeforeClass();
|
||||||
|
@ -15,7 +15,7 @@ class Functional_Net_SFTPUserStoryTest extends PhpseclibFunctionalTestCase
|
|||||||
static protected $exampleDataLength;
|
static protected $exampleDataLength;
|
||||||
static protected $buffer;
|
static protected $buffer;
|
||||||
|
|
||||||
static public function setUpBeforeClass()
|
public static function setUpBeforeClass()
|
||||||
{
|
{
|
||||||
parent::setUpBeforeClass();
|
parent::setUpBeforeClass();
|
||||||
|
|
||||||
@ -164,7 +164,9 @@ class Functional_Net_SFTPUserStoryTest extends PhpseclibFunctionalTestCase
|
|||||||
{
|
{
|
||||||
$r = substr(self::$buffer, 0, $length);
|
$r = substr(self::$buffer, 0, $length);
|
||||||
self::$buffer = substr(self::$buffer, $length);
|
self::$buffer = substr(self::$buffer, $length);
|
||||||
if (strlen($r)) return $r;
|
if (strlen($r)) {
|
||||||
|
return $r;
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -337,7 +339,8 @@ class Functional_Net_SFTPUserStoryTest extends PhpseclibFunctionalTestCase
|
|||||||
if ($sftp->is_file($file)) {
|
if ($sftp->is_file($file)) {
|
||||||
$cur_size = $sftp->size($file);
|
$cur_size = $sftp->size($file);
|
||||||
$this->assertLessThanOrEqual(
|
$this->assertLessThanOrEqual(
|
||||||
$last_size, $cur_size,
|
$last_size,
|
||||||
|
$cur_size,
|
||||||
'Failed asserting that nlist() is in descending order'
|
'Failed asserting that nlist() is in descending order'
|
||||||
);
|
);
|
||||||
$last_size = $cur_size;
|
$last_size = $cur_size;
|
||||||
@ -388,7 +391,8 @@ class Functional_Net_SFTPUserStoryTest extends PhpseclibFunctionalTestCase
|
|||||||
$stat = $sftp->stat('symlink');
|
$stat = $sftp->stat('symlink');
|
||||||
$lstat = $sftp->lstat('symlink');
|
$lstat = $sftp->lstat('symlink');
|
||||||
$this->assertNotEquals(
|
$this->assertNotEquals(
|
||||||
$stat, $lstat,
|
$stat,
|
||||||
|
$lstat,
|
||||||
'Failed asserting that stat and lstat returned different output for a symlink'
|
'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)
|
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'
|
'Failed asserting that a symlink\'s target could be read'
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -436,12 +442,14 @@ class Functional_Net_SFTPUserStoryTest extends PhpseclibFunctionalTestCase
|
|||||||
{
|
{
|
||||||
$stat = $sftp->stat('.');
|
$stat = $sftp->stat('.');
|
||||||
$this->assertInternalType(
|
$this->assertInternalType(
|
||||||
'array', $stat,
|
'array',
|
||||||
|
$stat,
|
||||||
'Failed asserting that stat on . returns an array'
|
'Failed asserting that stat on . returns an array'
|
||||||
);
|
);
|
||||||
$lstat = $sftp->lstat('.');
|
$lstat = $sftp->lstat('.');
|
||||||
$this->assertInternalType(
|
$this->assertInternalType(
|
||||||
'array', $lstat,
|
'array',
|
||||||
|
$lstat,
|
||||||
'Failed asserting that lstat on . returns an array'
|
'Failed asserting that lstat on . returns an array'
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ use phpseclib\Math\BigInteger;
|
|||||||
|
|
||||||
abstract class PhpseclibFunctionalTestCase extends PhpseclibTestCase
|
abstract class PhpseclibFunctionalTestCase extends PhpseclibTestCase
|
||||||
{
|
{
|
||||||
static public function setUpBeforeClass()
|
public static function setUpBeforeClass()
|
||||||
{
|
{
|
||||||
if (extension_loaded('runkit')) {
|
if (extension_loaded('runkit')) {
|
||||||
if (extension_loaded('gmp')) {
|
if (extension_loaded('gmp')) {
|
||||||
|
@ -53,7 +53,7 @@ abstract class PhpseclibTestCase extends PHPUnit_Framework_TestCase
|
|||||||
*
|
*
|
||||||
* @return null
|
* @return null
|
||||||
*/
|
*/
|
||||||
static protected function ensureConstant($constant, $expected)
|
protected static function ensureConstant($constant, $expected)
|
||||||
{
|
{
|
||||||
if (defined($constant)) {
|
if (defined($constant)) {
|
||||||
$value = constant($constant);
|
$value = constant($constant);
|
||||||
@ -86,7 +86,7 @@ abstract class PhpseclibTestCase extends PHPUnit_Framework_TestCase
|
|||||||
*
|
*
|
||||||
* @return null
|
* @return null
|
||||||
*/
|
*/
|
||||||
static protected function reRequireFile($filename)
|
protected static function reRequireFile($filename)
|
||||||
{
|
{
|
||||||
if (function_exists('runkit_import')) {
|
if (function_exists('runkit_import')) {
|
||||||
$result = runkit_import(
|
$result = runkit_import(
|
||||||
|
@ -22,7 +22,7 @@ class Unit_Crypt_Hash_MD5Test extends Unit_Crypt_Hash_TestCase
|
|||||||
$this->assertHashesTo($this->getInstance(), $message, $result);
|
$this->assertHashesTo($this->getInstance(), $message, $result);
|
||||||
}
|
}
|
||||||
|
|
||||||
static public function hashData()
|
public static function hashData()
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
array('', 'd41d8cd98f00b204e9800998ecf8427e'),
|
array('', 'd41d8cd98f00b204e9800998ecf8427e'),
|
||||||
@ -39,7 +39,7 @@ class Unit_Crypt_Hash_MD5Test extends Unit_Crypt_Hash_TestCase
|
|||||||
$this->assertHMACsTo($this->getInstance(), $key, $message, $result);
|
$this->assertHMACsTo($this->getInstance(), $key, $message, $result);
|
||||||
}
|
}
|
||||||
|
|
||||||
static public function hmacData()
|
public static function hmacData()
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
array('', '', '74e6f7298a9c2d168935f58c001bad88'),
|
array('', '', '74e6f7298a9c2d168935f58c001bad88'),
|
||||||
|
@ -22,7 +22,7 @@ class Unit_Crypt_Hash_SHA256Test extends Unit_Crypt_Hash_TestCase
|
|||||||
$this->assertHashesTo($this->getInstance(), $message, $result);
|
$this->assertHashesTo($this->getInstance(), $message, $result);
|
||||||
}
|
}
|
||||||
|
|
||||||
static public function hashData()
|
public static function hashData()
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
array(
|
array(
|
||||||
@ -48,7 +48,7 @@ class Unit_Crypt_Hash_SHA256Test extends Unit_Crypt_Hash_TestCase
|
|||||||
$this->assertHMACsTo($this->getInstance(), $key, $message, $result);
|
$this->assertHMACsTo($this->getInstance(), $key, $message, $result);
|
||||||
}
|
}
|
||||||
|
|
||||||
static public function hmacData()
|
public static function hmacData()
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
// RFC 4231
|
// RFC 4231
|
||||||
|
@ -22,7 +22,7 @@ class Unit_Crypt_Hash_SHA512Test extends Unit_Crypt_Hash_TestCase
|
|||||||
$this->assertHashesTo($this->getInstance(), $message, $result);
|
$this->assertHashesTo($this->getInstance(), $message, $result);
|
||||||
}
|
}
|
||||||
|
|
||||||
static public function hashData()
|
public static function hashData()
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
array(
|
array(
|
||||||
@ -48,7 +48,7 @@ class Unit_Crypt_Hash_SHA512Test extends Unit_Crypt_Hash_TestCase
|
|||||||
$this->assertHMACsTo($this->getInstance(), $key, $message, $result);
|
$this->assertHMACsTo($this->getInstance(), $key, $message, $result);
|
||||||
}
|
}
|
||||||
|
|
||||||
static public function hmacData()
|
public static function hmacData()
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
// RFC 4231
|
// RFC 4231
|
||||||
|
@ -9,7 +9,7 @@ use phpseclib\Crypt\Hash;
|
|||||||
|
|
||||||
abstract class Unit_Crypt_Hash_TestCase extends PhpseclibTestCase
|
abstract class Unit_Crypt_Hash_TestCase extends PhpseclibTestCase
|
||||||
{
|
{
|
||||||
static public function setUpBeforeClass()
|
public static function setUpBeforeClass()
|
||||||
{
|
{
|
||||||
if (!defined('CRYPT_HASH_MODE')) {
|
if (!defined('CRYPT_HASH_MODE')) {
|
||||||
define('CRYPT_HASH_MODE', Hash::MODE_INTERNAL);
|
define('CRYPT_HASH_MODE', Hash::MODE_INTERNAL);
|
||||||
|
@ -18,7 +18,7 @@ class Unit_Crypt_TwofishTest extends PhpseclibTestCase
|
|||||||
Base::ENGINE_OPENSSL => 'OpenSSL',
|
Base::ENGINE_OPENSSL => 'OpenSSL',
|
||||||
);
|
);
|
||||||
|
|
||||||
foreach ($engines as $engine=>$name) {
|
foreach ($engines as $engine => $name) {
|
||||||
$tf = new Twofish();
|
$tf = new Twofish();
|
||||||
$tf->disablePadding();
|
$tf->disablePadding();
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
class Unit_Math_BigInteger_BCMathTest extends Unit_Math_BigInteger_TestCase
|
class Unit_Math_BigInteger_BCMathTest extends Unit_Math_BigInteger_TestCase
|
||||||
{
|
{
|
||||||
static public function setUpBeforeClass()
|
public static function setUpBeforeClass()
|
||||||
{
|
{
|
||||||
if (!extension_loaded('bcmath')) {
|
if (!extension_loaded('bcmath')) {
|
||||||
self::markTestSkipped('BCMath extension is not available.');
|
self::markTestSkipped('BCMath extension is not available.');
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
class Unit_Math_BigInteger_GMPTest extends Unit_Math_BigInteger_TestCase
|
class Unit_Math_BigInteger_GMPTest extends Unit_Math_BigInteger_TestCase
|
||||||
{
|
{
|
||||||
static public function setUpBeforeClass()
|
public static function setUpBeforeClass()
|
||||||
{
|
{
|
||||||
if (!extension_loaded('gmp')) {
|
if (!extension_loaded('gmp')) {
|
||||||
self::markTestSkipped('GNU Multiple Precision (GMP) extension is not available.');
|
self::markTestSkipped('GNU Multiple Precision (GMP) extension is not available.');
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
class Unit_Math_BigInteger_InternalOpenSSLTest extends Unit_Math_BigInteger_TestCase
|
class Unit_Math_BigInteger_InternalOpenSSLTest extends Unit_Math_BigInteger_TestCase
|
||||||
{
|
{
|
||||||
static public function setUpBeforeClass()
|
public static function setUpBeforeClass()
|
||||||
{
|
{
|
||||||
if (!function_exists('openssl_public_encrypt')) {
|
if (!function_exists('openssl_public_encrypt')) {
|
||||||
self::markTestSkipped('openssl_public_encrypt() function is not available.');
|
self::markTestSkipped('openssl_public_encrypt() function is not available.');
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
class Unit_Math_BigInteger_InternalTest extends Unit_Math_BigInteger_TestCase
|
class Unit_Math_BigInteger_InternalTest extends Unit_Math_BigInteger_TestCase
|
||||||
{
|
{
|
||||||
static public function setUpBeforeClass()
|
public static function setUpBeforeClass()
|
||||||
{
|
{
|
||||||
parent::setUpBeforeClass();
|
parent::setUpBeforeClass();
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
abstract class Unit_Math_BigInteger_TestCase extends PhpseclibTestCase
|
abstract class Unit_Math_BigInteger_TestCase extends PhpseclibTestCase
|
||||||
{
|
{
|
||||||
static public function setUpBeforeClass()
|
public static function setUpBeforeClass()
|
||||||
{
|
{
|
||||||
include_once 'Math/BigInteger.php';
|
include_once 'Math/BigInteger.php';
|
||||||
|
|
||||||
@ -63,7 +63,7 @@ abstract class Unit_Math_BigInteger_TestCase extends PhpseclibTestCase
|
|||||||
public function testAdd()
|
public function testAdd()
|
||||||
{
|
{
|
||||||
$x = $this->getInstance('18446744073709551615');
|
$x = $this->getInstance('18446744073709551615');
|
||||||
$y = $this->getInstance( '100000000000');
|
$y = $this->getInstance('100000000000');
|
||||||
|
|
||||||
$a = $x->add($y);
|
$a = $x->add($y);
|
||||||
$b = $y->add($x);
|
$b = $y->add($x);
|
||||||
@ -78,7 +78,7 @@ abstract class Unit_Math_BigInteger_TestCase extends PhpseclibTestCase
|
|||||||
public function testSubtract()
|
public function testSubtract()
|
||||||
{
|
{
|
||||||
$x = $this->getInstance('18446744073709551618');
|
$x = $this->getInstance('18446744073709551618');
|
||||||
$y = $this->getInstance( '4000000000000');
|
$y = $this->getInstance('4000000000000');
|
||||||
$this->assertSame('18446740073709551618', (string) $x->subtract($y));
|
$this->assertSame('18446740073709551618', (string) $x->subtract($y));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@ class Unit_Net_SSH2Test extends PhpseclibTestCase
|
|||||||
if (extension_loaded('openssl')) {
|
if (extension_loaded('openssl')) {
|
||||||
$this->assertContains('openssl', $identifier);
|
$this->assertContains('openssl', $identifier);
|
||||||
$this->assertNotContains('mcrypt', $identifier);
|
$this->assertNotContains('mcrypt', $identifier);
|
||||||
} else if (extension_loaded('mcrypt')) {
|
} elseif (extension_loaded('mcrypt')) {
|
||||||
$this->assertNotContains('openssl', $identifier);
|
$this->assertNotContains('openssl', $identifier);
|
||||||
$this->assertContains('mcrypt', $identifier);
|
$this->assertContains('mcrypt', $identifier);
|
||||||
} else {
|
} else {
|
||||||
@ -55,7 +55,7 @@ class Unit_Net_SSH2Test extends PhpseclibTestCase
|
|||||||
if (extension_loaded('gmp')) {
|
if (extension_loaded('gmp')) {
|
||||||
$this->assertContains('gmp', $identifier);
|
$this->assertContains('gmp', $identifier);
|
||||||
$this->assertNotContains('bcmath', $identifier);
|
$this->assertNotContains('bcmath', $identifier);
|
||||||
} else if (extension_loaded('bcmath')) {
|
} elseif (extension_loaded('bcmath')) {
|
||||||
$this->assertNotContains('gmp', $identifier);
|
$this->assertNotContains('gmp', $identifier);
|
||||||
$this->assertContains('bcmath', $identifier);
|
$this->assertContains('bcmath', $identifier);
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user