mirror of
https://github.com/phpseclib/phpseclib.git
synced 2024-11-05 21:17:53 +00:00
Merge branch 'openssl-support-2.0'
This commit is contained in:
commit
5304afd5c1
@ -3,5 +3,5 @@ imports:
|
|||||||
|
|
||||||
tools:
|
tools:
|
||||||
external_code_coverage:
|
external_code_coverage:
|
||||||
runs: 5 # No Code Coverage on PHP 5.2 and HHVM
|
runs: 5 # No Code Coverage and HHVM
|
||||||
timeout: 2700 # 45 minutes
|
timeout: 2700 # 45 minutes
|
||||||
|
@ -23,7 +23,7 @@ install:
|
|||||||
- eval `ssh-agent -s`
|
- eval `ssh-agent -s`
|
||||||
- travis/setup-secure-shell.sh
|
- travis/setup-secure-shell.sh
|
||||||
- sh -c "if [ '$TRAVIS_PHP_VERSION' != 'hhvm' ]; then travis/install-php-extensions.sh; fi"
|
- sh -c "if [ '$TRAVIS_PHP_VERSION' != 'hhvm' ]; then travis/install-php-extensions.sh; fi"
|
||||||
- sh -c "if [ '$TRAVIS_PHP_VERSION' != '5.2' ]; then travis/setup-composer.sh; fi"
|
- travis/setup-composer.sh
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.5' ]; then vendor/bin/phing -f build/build.xml sniff; fi"
|
- sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.5' ]; then vendor/bin/phing -f build/build.xml sniff; fi"
|
||||||
@ -31,4 +31,4 @@ script:
|
|||||||
|
|
||||||
after_success:
|
after_success:
|
||||||
- sh -c "if $TRAVIS_SECURE_ENV_VARS; then travis/upload-code-coverage-html.sh; fi"
|
- sh -c "if $TRAVIS_SECURE_ENV_VARS; then travis/upload-code-coverage-html.sh; fi"
|
||||||
- sh -c "if [ '$TRAVIS_PHP_VERSION' != '5.2' -a '$TRAVIS_PHP_VERSION' != 'hhvm' ]; then travis/upload-code-coverage-scrutinizer.sh; fi"
|
- sh -c "if [ '$TRAVIS_PHP_VERSION' != 'hhvm' ]; then travis/upload-code-coverage-scrutinizer.sh; fi"
|
||||||
|
@ -1,5 +1,11 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 0.3.10 - 2015-02-04
|
||||||
|
|
||||||
|
- simplify SSH2 window size handling ([#538](https://github.com/phpseclib/phpseclib/pull/538))
|
||||||
|
- slightly relax the conditions under which OpenSSL is used ([#598](https://github.com/phpseclib/phpseclib/pull/598))
|
||||||
|
- fix issue with empty constructed context-specific tags in ASN1 ([#606](https://github.com/phpseclib/phpseclib/pull/606))
|
||||||
|
|
||||||
## 0.3.9 - 2014-11-09
|
## 0.3.9 - 2014-11-09
|
||||||
|
|
||||||
- PHP 5.6 improvements ([#482](https://github.com/phpseclib/phpseclib/pull/482), [#491](https://github.com/phpseclib/phpseclib/issues/491))
|
- PHP 5.6 improvements ([#482](https://github.com/phpseclib/phpseclib/pull/482), [#491](https://github.com/phpseclib/phpseclib/issues/491))
|
||||||
|
@ -63,10 +63,5 @@
|
|||||||
"psr-4": {
|
"psr-4": {
|
||||||
"phpseclib\\": "phpseclib/"
|
"phpseclib\\": "phpseclib/"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"extra": {
|
|
||||||
"branch-alias": {
|
|
||||||
"dev-php5": "2.0-dev"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
394
composer.lock
generated
394
composer.lock
generated
@ -4,7 +4,7 @@
|
|||||||
"Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
"Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"hash": "8bfef4eaee8f139a70e6250eb9175fd6",
|
"hash": "1973a3fc1c8f678a9cd0ff646f7a8bee",
|
||||||
"packages": [],
|
"packages": [],
|
||||||
"packages-dev": [
|
"packages-dev": [
|
||||||
{
|
{
|
||||||
@ -159,16 +159,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phing/phing",
|
"name": "phing/phing",
|
||||||
"version": "2.9.0",
|
"version": "2.9.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/phingofficial/phing.git",
|
"url": "https://github.com/phingofficial/phing.git",
|
||||||
"reference": "12af1264dd4c5b88e28ee787e829de13c5ec172e"
|
"reference": "393edeffa8a85d43636ce0c9b4deb1ff9ac60a5c"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/phingofficial/phing/zipball/12af1264dd4c5b88e28ee787e829de13c5ec172e",
|
"url": "https://api.github.com/repos/phingofficial/phing/zipball/393edeffa8a85d43636ce0c9b4deb1ff9ac60a5c",
|
||||||
"reference": "12af1264dd4c5b88e28ee787e829de13c5ec172e",
|
"reference": "393edeffa8a85d43636ce0c9b4deb1ff9ac60a5c",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -244,20 +244,128 @@
|
|||||||
"task",
|
"task",
|
||||||
"tool"
|
"tool"
|
||||||
],
|
],
|
||||||
"time": "2014-11-25 14:58:59"
|
"time": "2014-12-03 09:18:46"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpunit/php-code-coverage",
|
"name": "phpdocumentor/reflection-docblock",
|
||||||
"version": "2.0.12",
|
"version": "2.0.4",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
|
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
|
||||||
"reference": "7ce9da20f96964bb7a4033f53834df13328dbeab"
|
"reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7ce9da20f96964bb7a4033f53834df13328dbeab",
|
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8",
|
||||||
"reference": "7ce9da20f96964bb7a4033f53834df13328dbeab",
|
"reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "~4.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"dflydev/markdown": "~1.0",
|
||||||
|
"erusev/parsedown": "~1.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"phpDocumentor": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Mike van Riel",
|
||||||
|
"email": "mike.vanriel@naenius.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"time": "2015-02-03 12:10:50"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "phpspec/prophecy",
|
||||||
|
"version": "v1.3.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/phpspec/prophecy.git",
|
||||||
|
"reference": "9ca52329bcdd1500de24427542577ebf3fc2f1c9"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/phpspec/prophecy/zipball/9ca52329bcdd1500de24427542577ebf3fc2f1c9",
|
||||||
|
"reference": "9ca52329bcdd1500de24427542577ebf3fc2f1c9",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"doctrine/instantiator": "~1.0,>=1.0.2",
|
||||||
|
"phpdocumentor/reflection-docblock": "~2.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpspec/phpspec": "~2.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.2.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"Prophecy\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Konstantin Kudryashov",
|
||||||
|
"email": "ever.zet@gmail.com",
|
||||||
|
"homepage": "http://everzet.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Marcello Duarte",
|
||||||
|
"email": "marcello.duarte@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Highly opinionated mocking framework for PHP 5.3+",
|
||||||
|
"homepage": "http://phpspec.org",
|
||||||
|
"keywords": [
|
||||||
|
"Double",
|
||||||
|
"Dummy",
|
||||||
|
"fake",
|
||||||
|
"mock",
|
||||||
|
"spy",
|
||||||
|
"stub"
|
||||||
|
],
|
||||||
|
"time": "2014-11-17 16:23:49"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "phpunit/php-code-coverage",
|
||||||
|
"version": "2.0.15",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
|
||||||
|
"reference": "34cc484af1ca149188d0d9e91412191e398e0b67"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/34cc484af1ca149188d0d9e91412191e398e0b67",
|
||||||
|
"reference": "34cc484af1ca149188d0d9e91412191e398e0b67",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -270,7 +378,7 @@
|
|||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"ext-xdebug": ">=2.1.4",
|
"ext-xdebug": ">=2.1.4",
|
||||||
"phpunit/phpunit": "~4.1"
|
"phpunit/phpunit": "~4"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"ext-dom": "*",
|
"ext-dom": "*",
|
||||||
@ -289,9 +397,6 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
"include-path": [
|
|
||||||
""
|
|
||||||
],
|
|
||||||
"license": [
|
"license": [
|
||||||
"BSD-3-Clause"
|
"BSD-3-Clause"
|
||||||
],
|
],
|
||||||
@ -309,7 +414,7 @@
|
|||||||
"testing",
|
"testing",
|
||||||
"xunit"
|
"xunit"
|
||||||
],
|
],
|
||||||
"time": "2014-12-02 13:17:01"
|
"time": "2015-01-24 10:06:35"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpunit/php-file-iterator",
|
"name": "phpunit/php-file-iterator",
|
||||||
@ -446,16 +551,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpunit/php-token-stream",
|
"name": "phpunit/php-token-stream",
|
||||||
"version": "1.3.0",
|
"version": "1.4.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/php-token-stream.git",
|
"url": "https://github.com/sebastianbergmann/php-token-stream.git",
|
||||||
"reference": "f8d5d08c56de5cfd592b3340424a81733259a876"
|
"reference": "db32c18eba00b121c145575fcbcd4d4d24e6db74"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/f8d5d08c56de5cfd592b3340424a81733259a876",
|
"url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/db32c18eba00b121c145575fcbcd4d4d24e6db74",
|
||||||
"reference": "f8d5d08c56de5cfd592b3340424a81733259a876",
|
"reference": "db32c18eba00b121c145575fcbcd4d4d24e6db74",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -468,7 +573,7 @@
|
|||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "1.3-dev"
|
"dev-master": "1.4-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
@ -491,20 +596,20 @@
|
|||||||
"keywords": [
|
"keywords": [
|
||||||
"tokenizer"
|
"tokenizer"
|
||||||
],
|
],
|
||||||
"time": "2014-08-31 06:12:13"
|
"time": "2015-01-17 09:51:32"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpunit/phpunit",
|
"name": "phpunit/phpunit",
|
||||||
"version": "4.3.5",
|
"version": "4.5.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
||||||
"reference": "2dab9d593997db4abcf58d0daf798eb4e9cecfe1"
|
"reference": "5b578d3865a9128b9c209b011fda6539ec06e7a5"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2dab9d593997db4abcf58d0daf798eb4e9cecfe1",
|
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5b578d3865a9128b9c209b011fda6539ec06e7a5",
|
||||||
"reference": "2dab9d593997db4abcf58d0daf798eb4e9cecfe1",
|
"reference": "5b578d3865a9128b9c209b011fda6539ec06e7a5",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -514,15 +619,17 @@
|
|||||||
"ext-reflection": "*",
|
"ext-reflection": "*",
|
||||||
"ext-spl": "*",
|
"ext-spl": "*",
|
||||||
"php": ">=5.3.3",
|
"php": ">=5.3.3",
|
||||||
|
"phpspec/prophecy": "~1.3.1",
|
||||||
"phpunit/php-code-coverage": "~2.0",
|
"phpunit/php-code-coverage": "~2.0",
|
||||||
"phpunit/php-file-iterator": "~1.3.2",
|
"phpunit/php-file-iterator": "~1.3.2",
|
||||||
"phpunit/php-text-template": "~1.2",
|
"phpunit/php-text-template": "~1.2",
|
||||||
"phpunit/php-timer": "~1.0.2",
|
"phpunit/php-timer": "~1.0.2",
|
||||||
"phpunit/phpunit-mock-objects": "~2.3",
|
"phpunit/phpunit-mock-objects": "~2.3",
|
||||||
"sebastian/comparator": "~1.0",
|
"sebastian/comparator": "~1.1",
|
||||||
"sebastian/diff": "~1.1",
|
"sebastian/diff": "~1.1",
|
||||||
"sebastian/environment": "~1.0",
|
"sebastian/environment": "~1.2",
|
||||||
"sebastian/exporter": "~1.0",
|
"sebastian/exporter": "~1.2",
|
||||||
|
"sebastian/global-state": "~1.0",
|
||||||
"sebastian/version": "~1.0",
|
"sebastian/version": "~1.0",
|
||||||
"symfony/yaml": "~2.0"
|
"symfony/yaml": "~2.0"
|
||||||
},
|
},
|
||||||
@ -535,7 +642,7 @@
|
|||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "4.3.x-dev"
|
"dev-master": "4.5.x-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
@ -544,10 +651,6 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
"include-path": [
|
|
||||||
"",
|
|
||||||
"../../symfony/yaml/"
|
|
||||||
],
|
|
||||||
"license": [
|
"license": [
|
||||||
"BSD-3-Clause"
|
"BSD-3-Clause"
|
||||||
],
|
],
|
||||||
@ -559,13 +662,13 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"description": "The PHP Unit Testing framework.",
|
"description": "The PHP Unit Testing framework.",
|
||||||
"homepage": "http://www.phpunit.de/",
|
"homepage": "https://phpunit.de/",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"phpunit",
|
"phpunit",
|
||||||
"testing",
|
"testing",
|
||||||
"xunit"
|
"xunit"
|
||||||
],
|
],
|
||||||
"time": "2014-11-11 10:11:09"
|
"time": "2015-02-05 15:51:19"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpunit/phpunit-mock-objects",
|
"name": "phpunit/phpunit-mock-objects",
|
||||||
@ -727,30 +830,30 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sebastian/comparator",
|
"name": "sebastian/comparator",
|
||||||
"version": "1.0.1",
|
"version": "1.1.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/comparator.git",
|
"url": "https://github.com/sebastianbergmann/comparator.git",
|
||||||
"reference": "e54a01c0da1b87db3c5a3c4c5277ddf331da4aef"
|
"reference": "1dd8869519a225f7f2b9eb663e225298fade819e"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/e54a01c0da1b87db3c5a3c4c5277ddf331da4aef",
|
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dd8869519a225f7f2b9eb663e225298fade819e",
|
||||||
"reference": "e54a01c0da1b87db3c5a3c4c5277ddf331da4aef",
|
"reference": "1dd8869519a225f7f2b9eb663e225298fade819e",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=5.3.3",
|
"php": ">=5.3.3",
|
||||||
"sebastian/diff": "~1.1",
|
"sebastian/diff": "~1.2",
|
||||||
"sebastian/exporter": "~1.0"
|
"sebastian/exporter": "~1.2"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpunit/phpunit": "~4.1"
|
"phpunit/phpunit": "~4.4"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "1.0.x-dev"
|
"dev-master": "1.1.x-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
@ -787,7 +890,7 @@
|
|||||||
"compare",
|
"compare",
|
||||||
"equality"
|
"equality"
|
||||||
],
|
],
|
||||||
"time": "2014-05-11 23:00:21"
|
"time": "2015-01-29 16:28:08"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sebastian/diff",
|
"name": "sebastian/diff",
|
||||||
@ -893,28 +996,29 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sebastian/exporter",
|
"name": "sebastian/exporter",
|
||||||
"version": "1.0.2",
|
"version": "1.2.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/exporter.git",
|
"url": "https://github.com/sebastianbergmann/exporter.git",
|
||||||
"reference": "c7d59948d6e82818e1bdff7cadb6c34710eb7dc0"
|
"reference": "84839970d05254c73cde183a721c7af13aede943"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c7d59948d6e82818e1bdff7cadb6c34710eb7dc0",
|
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/84839970d05254c73cde183a721c7af13aede943",
|
||||||
"reference": "c7d59948d6e82818e1bdff7cadb6c34710eb7dc0",
|
"reference": "84839970d05254c73cde183a721c7af13aede943",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=5.3.3"
|
"php": ">=5.3.3",
|
||||||
|
"sebastian/recursion-context": "~1.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpunit/phpunit": "~4.0"
|
"phpunit/phpunit": "~4.4"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "1.0.x-dev"
|
"dev-master": "1.2.x-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
@ -954,20 +1058,124 @@
|
|||||||
"export",
|
"export",
|
||||||
"exporter"
|
"exporter"
|
||||||
],
|
],
|
||||||
"time": "2014-09-10 00:51:36"
|
"time": "2015-01-27 07:23:06"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sebastian/version",
|
"name": "sebastian/global-state",
|
||||||
"version": "1.0.3",
|
"version": "1.0.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/version.git",
|
"url": "https://github.com/sebastianbergmann/global-state.git",
|
||||||
"reference": "b6e1f0cf6b9e1ec409a0d3e2f2a5fb0998e36b43"
|
"reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/sebastianbergmann/version/zipball/b6e1f0cf6b9e1ec409a0d3e2f2a5fb0998e36b43",
|
"url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/c7428acdb62ece0a45e6306f1ae85e1c05b09c01",
|
||||||
"reference": "b6e1f0cf6b9e1ec409a0d3e2f2a5fb0998e36b43",
|
"reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "~4.2"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-uopz": "*"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.0-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Sebastian Bergmann",
|
||||||
|
"email": "sebastian@phpunit.de"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Snapshotting of global state",
|
||||||
|
"homepage": "http://www.github.com/sebastianbergmann/global-state",
|
||||||
|
"keywords": [
|
||||||
|
"global state"
|
||||||
|
],
|
||||||
|
"time": "2014-10-06 09:23:50"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "sebastian/recursion-context",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/sebastianbergmann/recursion-context.git",
|
||||||
|
"reference": "3989662bbb30a29d20d9faa04a846af79b276252"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/3989662bbb30a29d20d9faa04a846af79b276252",
|
||||||
|
"reference": "3989662bbb30a29d20d9faa04a846af79b276252",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "~4.4"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"src/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Jeff Welch",
|
||||||
|
"email": "whatthejeff@gmail.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Sebastian Bergmann",
|
||||||
|
"email": "sebastian@phpunit.de"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Adam Harvey",
|
||||||
|
"email": "aharvey@php.net"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Provides functionality to recursively process PHP variables",
|
||||||
|
"homepage": "http://www.github.com/sebastianbergmann/recursion-context",
|
||||||
|
"time": "2015-01-24 09:48:32"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "sebastian/version",
|
||||||
|
"version": "1.0.4",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/sebastianbergmann/version.git",
|
||||||
|
"reference": "a77d9123f8e809db3fbdea15038c27a95da4058b"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/sebastianbergmann/version/zipball/a77d9123f8e809db3fbdea15038c27a95da4058b",
|
||||||
|
"reference": "a77d9123f8e809db3fbdea15038c27a95da4058b",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
@ -989,7 +1197,7 @@
|
|||||||
],
|
],
|
||||||
"description": "Library that helps with managing the version number of Git-hosted PHP projects",
|
"description": "Library that helps with managing the version number of Git-hosted PHP projects",
|
||||||
"homepage": "https://github.com/sebastianbergmann/version",
|
"homepage": "https://github.com/sebastianbergmann/version",
|
||||||
"time": "2014-03-07 15:35:33"
|
"time": "2014-12-15 14:25:24"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "squizlabs/php_codesniffer",
|
"name": "squizlabs/php_codesniffer",
|
||||||
@ -1068,17 +1276,17 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/console",
|
"name": "symfony/console",
|
||||||
"version": "v2.6.0",
|
"version": "v2.6.4",
|
||||||
"target-dir": "Symfony/Component/Console",
|
"target-dir": "Symfony/Component/Console",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/Console.git",
|
"url": "https://github.com/symfony/Console.git",
|
||||||
"reference": "d3bac228fd7a2aac9193e241b239880b3ba39a10"
|
"reference": "e44154bfe3e41e8267d7a3794cd9da9a51cfac34"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/Console/zipball/d3bac228fd7a2aac9193e241b239880b3ba39a10",
|
"url": "https://api.github.com/repos/symfony/Console/zipball/e44154bfe3e41e8267d7a3794cd9da9a51cfac34",
|
||||||
"reference": "d3bac228fd7a2aac9193e241b239880b3ba39a10",
|
"reference": "e44154bfe3e41e8267d7a3794cd9da9a51cfac34",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -1121,21 +1329,21 @@
|
|||||||
],
|
],
|
||||||
"description": "Symfony Console Component",
|
"description": "Symfony Console Component",
|
||||||
"homepage": "http://symfony.com",
|
"homepage": "http://symfony.com",
|
||||||
"time": "2014-11-20 13:24:23"
|
"time": "2015-01-25 04:39:26"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/filesystem",
|
"name": "symfony/filesystem",
|
||||||
"version": "v2.6.0",
|
"version": "v2.6.4",
|
||||||
"target-dir": "Symfony/Component/Filesystem",
|
"target-dir": "Symfony/Component/Filesystem",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/Filesystem.git",
|
"url": "https://github.com/symfony/Filesystem.git",
|
||||||
"reference": "6f7c7e42f20ee200d8ac5d2ec1d2a524138305e0"
|
"reference": "a1f566d1f92e142fa1593f4555d6d89e3044a9b7"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/Filesystem/zipball/6f7c7e42f20ee200d8ac5d2ec1d2a524138305e0",
|
"url": "https://api.github.com/repos/symfony/Filesystem/zipball/a1f566d1f92e142fa1593f4555d6d89e3044a9b7",
|
||||||
"reference": "6f7c7e42f20ee200d8ac5d2ec1d2a524138305e0",
|
"reference": "a1f566d1f92e142fa1593f4555d6d89e3044a9b7",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -1168,21 +1376,21 @@
|
|||||||
],
|
],
|
||||||
"description": "Symfony Filesystem Component",
|
"description": "Symfony Filesystem Component",
|
||||||
"homepage": "http://symfony.com",
|
"homepage": "http://symfony.com",
|
||||||
"time": "2014-11-16 17:28:09"
|
"time": "2015-01-03 21:13:09"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/finder",
|
"name": "symfony/finder",
|
||||||
"version": "v2.6.0",
|
"version": "v2.6.4",
|
||||||
"target-dir": "Symfony/Component/Finder",
|
"target-dir": "Symfony/Component/Finder",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/Finder.git",
|
"url": "https://github.com/symfony/Finder.git",
|
||||||
"reference": "d574347c652a14cfee0349f744c7880e1d9029fd"
|
"reference": "16513333bca64186c01609961a2bb1b95b5e1355"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/Finder/zipball/d574347c652a14cfee0349f744c7880e1d9029fd",
|
"url": "https://api.github.com/repos/symfony/Finder/zipball/16513333bca64186c01609961a2bb1b95b5e1355",
|
||||||
"reference": "d574347c652a14cfee0349f744c7880e1d9029fd",
|
"reference": "16513333bca64186c01609961a2bb1b95b5e1355",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -1215,21 +1423,21 @@
|
|||||||
],
|
],
|
||||||
"description": "Symfony Finder Component",
|
"description": "Symfony Finder Component",
|
||||||
"homepage": "http://symfony.com",
|
"homepage": "http://symfony.com",
|
||||||
"time": "2014-11-28 10:00:40"
|
"time": "2015-01-03 08:01:59"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/process",
|
"name": "symfony/process",
|
||||||
"version": "v2.6.0",
|
"version": "v2.6.4",
|
||||||
"target-dir": "Symfony/Component/Process",
|
"target-dir": "Symfony/Component/Process",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/Process.git",
|
"url": "https://github.com/symfony/Process.git",
|
||||||
"reference": "dc88f75d1c07791e5733f90be747961dce26cf05"
|
"reference": "ecfc23e89d9967999fa5f60a1e9af7384396e9ae"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/Process/zipball/dc88f75d1c07791e5733f90be747961dce26cf05",
|
"url": "https://api.github.com/repos/symfony/Process/zipball/ecfc23e89d9967999fa5f60a1e9af7384396e9ae",
|
||||||
"reference": "dc88f75d1c07791e5733f90be747961dce26cf05",
|
"reference": "ecfc23e89d9967999fa5f60a1e9af7384396e9ae",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -1262,21 +1470,21 @@
|
|||||||
],
|
],
|
||||||
"description": "Symfony Process Component",
|
"description": "Symfony Process Component",
|
||||||
"homepage": "http://symfony.com",
|
"homepage": "http://symfony.com",
|
||||||
"time": "2014-11-04 14:29:39"
|
"time": "2015-01-25 04:39:26"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/yaml",
|
"name": "symfony/yaml",
|
||||||
"version": "v2.6.0",
|
"version": "v2.6.4",
|
||||||
"target-dir": "Symfony/Component/Yaml",
|
"target-dir": "Symfony/Component/Yaml",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/Yaml.git",
|
"url": "https://github.com/symfony/Yaml.git",
|
||||||
"reference": "51c845cf3e4bfc182d1d5c05ed1c7338361d86f8"
|
"reference": "60ed7751671113cf1ee7d7778e691642c2e9acd8"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/Yaml/zipball/51c845cf3e4bfc182d1d5c05ed1c7338361d86f8",
|
"url": "https://api.github.com/repos/symfony/Yaml/zipball/60ed7751671113cf1ee7d7778e691642c2e9acd8",
|
||||||
"reference": "51c845cf3e4bfc182d1d5c05ed1c7338361d86f8",
|
"reference": "60ed7751671113cf1ee7d7778e691642c2e9acd8",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -1309,20 +1517,20 @@
|
|||||||
],
|
],
|
||||||
"description": "Symfony Yaml Component",
|
"description": "Symfony Yaml Component",
|
||||||
"homepage": "http://symfony.com",
|
"homepage": "http://symfony.com",
|
||||||
"time": "2014-11-20 13:24:23"
|
"time": "2015-01-25 04:39:26"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "twig/twig",
|
"name": "twig/twig",
|
||||||
"version": "v1.16.2",
|
"version": "v1.18.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/twigphp/Twig.git",
|
"url": "https://github.com/twigphp/Twig.git",
|
||||||
"reference": "42f758d9fe2146d1f0470604fc05ee43580873fc"
|
"reference": "4cf7464348e7f9893a93f7096a90b73722be99cf"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/twigphp/Twig/zipball/42f758d9fe2146d1f0470604fc05ee43580873fc",
|
"url": "https://api.github.com/repos/twigphp/Twig/zipball/4cf7464348e7f9893a93f7096a90b73722be99cf",
|
||||||
"reference": "42f758d9fe2146d1f0470604fc05ee43580873fc",
|
"reference": "4cf7464348e7f9893a93f7096a90b73722be99cf",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -1331,7 +1539,7 @@
|
|||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "1.16-dev"
|
"dev-master": "1.18-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
@ -1357,7 +1565,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Twig Team",
|
"name": "Twig Team",
|
||||||
"homepage": "https://github.com/fabpot/Twig/graphs/contributors",
|
"homepage": "http://twig.sensiolabs.org/contributors",
|
||||||
"role": "Contributors"
|
"role": "Contributors"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@ -1366,7 +1574,7 @@
|
|||||||
"keywords": [
|
"keywords": [
|
||||||
"templating"
|
"templating"
|
||||||
],
|
],
|
||||||
"time": "2014-10-17 12:53:44"
|
"time": "2015-01-25 17:32:08"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
|
@ -5,7 +5,11 @@
|
|||||||
*
|
*
|
||||||
* Uses mcrypt, if available/possible, and an internal implementation, otherwise.
|
* Uses mcrypt, if available/possible, and an internal implementation, otherwise.
|
||||||
*
|
*
|
||||||
* PHP versions 4 and 5
|
* PHP version 5
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* to save one include_once().
|
||||||
*
|
*
|
||||||
* If {@link \phpseclib\Crypt\AES::setKeyLength() setKeyLength()} isn't called, it'll be calculated from
|
* If {@link \phpseclib\Crypt\AES::setKeyLength() setKeyLength()} isn't called, it'll be calculated from
|
||||||
* {@link \phpseclib\Crypt\AES::setKey() setKey()}. ie. if the key is 128-bits, the key length will be 128-bits. If it's 136-bits
|
* {@link \phpseclib\Crypt\AES::setKey() setKey()}. ie. if the key is 128-bits, the key length will be 128-bits. If it's 136-bits
|
||||||
@ -56,15 +60,6 @@ use phpseclib\Crypt\Rijndael;
|
|||||||
*/
|
*/
|
||||||
class AES extends Rijndael
|
class AES extends Rijndael
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* The namespace used by the cipher for its constants.
|
|
||||||
*
|
|
||||||
* @see \phpseclib\Crypt\Base::const_namespace
|
|
||||||
* @var String
|
|
||||||
* @access private
|
|
||||||
*/
|
|
||||||
var $const_namespace = 'AES';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dummy function
|
* Dummy function
|
||||||
*
|
*
|
||||||
@ -127,7 +122,7 @@ class AES extends Rijndael
|
|||||||
default:
|
default:
|
||||||
$this->key_size = 32;
|
$this->key_size = 32;
|
||||||
}
|
}
|
||||||
$this->_setupEngine();
|
$this->_setEngine();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -5,7 +5,7 @@
|
|||||||
*
|
*
|
||||||
* Uses mcrypt, if available, and an internal implementation, otherwise.
|
* Uses mcrypt, if available, and an internal implementation, otherwise.
|
||||||
*
|
*
|
||||||
* PHP versions 4 and 5
|
* PHP version 5
|
||||||
*
|
*
|
||||||
* Useful resources are as follows:
|
* Useful resources are as follows:
|
||||||
*
|
*
|
||||||
@ -68,15 +68,6 @@ class Blowfish extends Base
|
|||||||
*/
|
*/
|
||||||
var $password_key_size = 56;
|
var $password_key_size = 56;
|
||||||
|
|
||||||
/**
|
|
||||||
* The namespace used by the cipher for its constants.
|
|
||||||
*
|
|
||||||
* @see \phpseclib\Crypt\Base::const_namespace
|
|
||||||
* @var String
|
|
||||||
* @access private
|
|
||||||
*/
|
|
||||||
var $const_namespace = 'BLOWFISH';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The mcrypt specific name of the cipher
|
* The mcrypt specific name of the cipher
|
||||||
*
|
*
|
||||||
@ -98,7 +89,7 @@ class Blowfish extends Base
|
|||||||
/**
|
/**
|
||||||
* The fixed subkeys boxes ($sbox0 - $sbox3) with 256 entries each
|
* The fixed subkeys boxes ($sbox0 - $sbox3) with 256 entries each
|
||||||
*
|
*
|
||||||
* S-Box 1
|
* S-Box 0
|
||||||
*
|
*
|
||||||
* @access private
|
* @access private
|
||||||
* @var array
|
* @var array
|
||||||
@ -319,6 +310,29 @@ class Blowfish extends Base
|
|||||||
parent::setKey($key);
|
parent::setKey($key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for engine validity
|
||||||
|
*
|
||||||
|
* This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine()
|
||||||
|
*
|
||||||
|
* @see \phpseclib\Crypt\Base::isValidEngine()
|
||||||
|
* @param Integer $engine
|
||||||
|
* @access public
|
||||||
|
* @return Boolean
|
||||||
|
*/
|
||||||
|
function isValidEngine($engine)
|
||||||
|
{
|
||||||
|
if ($engine == self::ENGINE_OPENSSL) {
|
||||||
|
if (strlen($this->key) != 16) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$this->cipher_name_openssl_ecb = 'bf-ecb';
|
||||||
|
$this->cipher_name_openssl = 'bf-' . $this->_openssl_translate_mode();
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent::isValidEngine($engine);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Setup the key (expansion)
|
* Setup the key (expansion)
|
||||||
*
|
*
|
||||||
@ -443,7 +457,6 @@ class Blowfish extends Base
|
|||||||
$sb_2[$r >> 8 & 0xff]) +
|
$sb_2[$r >> 8 & 0xff]) +
|
||||||
$sb_3[$r & 0xff];
|
$sb_3[$r & 0xff];
|
||||||
}
|
}
|
||||||
|
|
||||||
return pack("N*", $r ^ $p[0], $l ^ $p[1]);
|
return pack("N*", $r ^ $p[0], $l ^ $p[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -458,15 +471,14 @@ class Blowfish extends Base
|
|||||||
$lambda_functions =& self::_getLambdaFunctions();
|
$lambda_functions =& self::_getLambdaFunctions();
|
||||||
|
|
||||||
// We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function.
|
// We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function.
|
||||||
|
// (Currently, for Crypt_Blowfish, one generated $lambda_function cost on php5.5@32bit ~100kb unfreeable mem and ~180kb on php5.5@64bit)
|
||||||
// After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one.
|
// After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one.
|
||||||
$gen_hi_opt_code = (bool)( count($lambda_functions) < 10 );
|
$gen_hi_opt_code = (bool)( count($lambda_functions) < 10 );
|
||||||
|
|
||||||
switch (true) {
|
// Generation of a unique hash for our generated code
|
||||||
case $gen_hi_opt_code:
|
$code_hash = "Crypt_Blowfish, {$this->mode}";
|
||||||
$code_hash = md5(str_pad("Blowfish, {$this->mode}, ", 32, "\0") . $this->key);
|
if ($gen_hi_opt_code) {
|
||||||
break;
|
$code_hash = str_pad($code_hash, 32) . $this->_hashInlineCryptFunction($this->key);
|
||||||
default:
|
|
||||||
$code_hash = "Blowfish, {$this->mode}";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isset($lambda_functions[$code_hash])) {
|
if (!isset($lambda_functions[$code_hash])) {
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
*
|
*
|
||||||
* Uses mcrypt, if available, and an internal implementation, otherwise.
|
* Uses mcrypt, if available, and an internal implementation, otherwise.
|
||||||
*
|
*
|
||||||
* PHP versions 4 and 5
|
* PHP version 5
|
||||||
*
|
*
|
||||||
* Useful resources are as follows:
|
* Useful resources are as follows:
|
||||||
*
|
*
|
||||||
@ -97,15 +97,6 @@ class DES extends Base
|
|||||||
*/
|
*/
|
||||||
var $password_key_size = 8;
|
var $password_key_size = 8;
|
||||||
|
|
||||||
/**
|
|
||||||
* The namespace used by the cipher for its constants.
|
|
||||||
*
|
|
||||||
* @see \phpseclib\Crypt\Base::const_namespace
|
|
||||||
* @var String
|
|
||||||
* @access private
|
|
||||||
*/
|
|
||||||
var $const_namespace = 'DES';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The mcrypt specific name of the cipher
|
* The mcrypt specific name of the cipher
|
||||||
*
|
*
|
||||||
@ -115,6 +106,21 @@ class DES extends Base
|
|||||||
*/
|
*/
|
||||||
var $cipher_name_mcrypt = 'des';
|
var $cipher_name_mcrypt = 'des';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The OpenSSL names of the cipher / modes
|
||||||
|
*
|
||||||
|
* @see \phpseclib\Crypt\Base::openssl_mode_names
|
||||||
|
* @var Array
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $openssl_mode_names = array(
|
||||||
|
self::MODE_ECB => 'des-ecb',
|
||||||
|
self::MODE_CBC => 'des-cbc',
|
||||||
|
self::MODE_CFB => 'des-cfb',
|
||||||
|
self::MODE_OFB => 'des-ofb'
|
||||||
|
// self::MODE_CTR is undefined for DES
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Optimizing value while CFB-encrypting
|
* Optimizing value while CFB-encrypting
|
||||||
*
|
*
|
||||||
@ -585,6 +591,28 @@ class DES extends Base
|
|||||||
0x00000820, 0x00020020, 0x08000000, 0x08020800
|
0x00000820, 0x00020020, 0x08000000, 0x08020800
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for engine validity
|
||||||
|
*
|
||||||
|
* This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine()
|
||||||
|
*
|
||||||
|
* @see \phpseclib\Crypt\Base::isValidEngine()
|
||||||
|
* @param Integer $engine
|
||||||
|
* @access public
|
||||||
|
* @return Boolean
|
||||||
|
*/
|
||||||
|
function isValidEngine($engine)
|
||||||
|
{
|
||||||
|
if ($this->key_size_max == 8) {
|
||||||
|
if ($engine == self::ENGINE_OPENSSL) {
|
||||||
|
$this->cipher_name_openssl_ecb = 'des-ecb';
|
||||||
|
$this->cipher_name_openssl = 'des-' . $this->_openssl_translate_mode();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent::isValidEngine($engine);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the key.
|
* Sets the key.
|
||||||
*
|
*
|
||||||
@ -1282,21 +1310,20 @@ class DES extends Base
|
|||||||
$des_rounds = $this->des_rounds;
|
$des_rounds = $this->des_rounds;
|
||||||
|
|
||||||
// We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function.
|
// We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function.
|
||||||
|
// (Currently, for Crypt_DES, one generated $lambda_function cost on php5.5@32bit ~135kb unfreeable mem and ~230kb on php5.5@64bit)
|
||||||
|
// (Currently, for Crypt_TripleDES, one generated $lambda_function cost on php5.5@32bit ~240kb unfreeable mem and ~340kb on php5.5@64bit)
|
||||||
// After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one
|
// After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one
|
||||||
$gen_hi_opt_code = (bool)( count($lambda_functions) < 10 );
|
$gen_hi_opt_code = (bool)( count($lambda_functions) < 10 );
|
||||||
|
|
||||||
// Generation of a uniqe hash for our generated code
|
// Generation of a uniqe hash for our generated code
|
||||||
switch (true) {
|
$code_hash = "Crypt_DES, $des_rounds, {$this->mode}";
|
||||||
case $gen_hi_opt_code:
|
if ($gen_hi_opt_code) {
|
||||||
// For hi-optimized code, we create for each combination of
|
// For hi-optimized code, we create for each combination of
|
||||||
// $mode, $des_rounds and $this->key its own encrypt/decrypt function.
|
// $mode, $des_rounds and $this->key its own encrypt/decrypt function.
|
||||||
$code_hash = md5(str_pad("DES, $des_rounds, {$this->mode}, ", 32, "\0") . $this->key);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// After max 10 hi-optimized functions, we create generic
|
// After max 10 hi-optimized functions, we create generic
|
||||||
// (still very fast.. but not ultra) functions for each $mode/$des_rounds
|
// (still very fast.. but not ultra) functions for each $mode/$des_rounds
|
||||||
// Currently 2 * 5 generic functions will be then max. possible.
|
// Currently 2 * 5 generic functions will be then max. possible.
|
||||||
$code_hash = "DES, $des_rounds, {$this->mode}";
|
$code_hash = str_pad($code_hash, 32) . $this->_hashInlineCryptFunction($this->key);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Is there a re-usable $lambda_functions in there? If not, we have to create it.
|
// Is there a re-usable $lambda_functions in there? If not, we have to create it.
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
* If {@link \phpseclib\Crypt\Hash::setKey() setKey()} is called, {@link \phpseclib\Crypt\Hash::hash() hash()} will return the HMAC as opposed to
|
* If {@link \phpseclib\Crypt\Hash::setKey() setKey()} is called, {@link \phpseclib\Crypt\Hash::hash() hash()} will return the HMAC as opposed to
|
||||||
* the hash. If no valid algorithm is provided, sha1 will be used.
|
* the hash. If no valid algorithm is provided, sha1 will be used.
|
||||||
*
|
*
|
||||||
* PHP versions 4 and 5
|
* PHP version 5
|
||||||
*
|
*
|
||||||
* {@internal The variable names are the same as those in
|
* {@internal The variable names are the same as those in
|
||||||
* {@link http://tools.ietf.org/html/rfc2104#section-2 RFC2104}.}}
|
* {@link http://tools.ietf.org/html/rfc2104#section-2 RFC2104}.}}
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
*
|
*
|
||||||
* Uses mcrypt, if available, and an internal implementation, otherwise.
|
* Uses mcrypt, if available, and an internal implementation, otherwise.
|
||||||
*
|
*
|
||||||
* PHP versions 4 and 5
|
* PHP version 5
|
||||||
*
|
*
|
||||||
* Useful resources are as follows:
|
* Useful resources are as follows:
|
||||||
*
|
*
|
||||||
@ -62,7 +62,19 @@ class RC2 extends Base
|
|||||||
* @var String
|
* @var String
|
||||||
* @access private
|
* @access private
|
||||||
*/
|
*/
|
||||||
var $key = "\0";
|
var $key;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Original (unpadded) Key
|
||||||
|
*
|
||||||
|
* @see \phpseclib\Crypt\Base::key
|
||||||
|
* @see setKey()
|
||||||
|
* @see encrypt()
|
||||||
|
* @see decrypt()
|
||||||
|
* @var String
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $orig_key;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The default password key_size used by setPassword()
|
* The default password key_size used by setPassword()
|
||||||
@ -74,15 +86,6 @@ class RC2 extends Base
|
|||||||
*/
|
*/
|
||||||
var $password_key_size = 16; // = 128 bits
|
var $password_key_size = 16; // = 128 bits
|
||||||
|
|
||||||
/**
|
|
||||||
* The namespace used by the cipher for its constants.
|
|
||||||
*
|
|
||||||
* @see \phpseclib\Crypt\Base::const_namespace
|
|
||||||
* @var String
|
|
||||||
* @access private
|
|
||||||
*/
|
|
||||||
var $const_namespace = 'RC2';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The mcrypt specific name of the cipher
|
* The mcrypt specific name of the cipher
|
||||||
*
|
*
|
||||||
@ -113,6 +116,17 @@ class RC2 extends Base
|
|||||||
*/
|
*/
|
||||||
var $default_key_length = 1024;
|
var $default_key_length = 1024;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The key length in bits.
|
||||||
|
*
|
||||||
|
* @see \phpseclib\Crypt\RC2::isValidEnine()
|
||||||
|
* @see \phpseclib\Crypt\RC2::setKey()
|
||||||
|
* @var Integer
|
||||||
|
* @access private
|
||||||
|
* @internal Should be in range [1..1024].
|
||||||
|
*/
|
||||||
|
var $current_key_length;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Key Schedule
|
* The Key Schedule
|
||||||
*
|
*
|
||||||
@ -240,32 +254,27 @@ class RC2 extends Base
|
|||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default Constructor.
|
* Test for engine validity
|
||||||
*
|
*
|
||||||
* Determines whether or not the mcrypt extension should be used.
|
* This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine()
|
||||||
*
|
*
|
||||||
* $mode could be:
|
* @see \phpseclib\Crypt\Base::Crypt_Base()
|
||||||
*
|
* @param Integer $engine
|
||||||
* - \phpseclib\Crypt\Base::MODE_ECB
|
|
||||||
*
|
|
||||||
* - \phpseclib\Crypt\Base::MODE_CBC
|
|
||||||
*
|
|
||||||
* - \phpseclib\Crypt\Base::MODE_CTR
|
|
||||||
*
|
|
||||||
* - \phpseclib\Crypt\Base::MODE_CFB
|
|
||||||
*
|
|
||||||
* - \phpseclib\Crypt\Base::MODE_OFB
|
|
||||||
*
|
|
||||||
* If not explicitly set, \phpseclib\Crypt\Base::MODE_CBC will be used.
|
|
||||||
*
|
|
||||||
* @see \phpseclib\Crypt\Base::__construct()
|
|
||||||
* @param optional Integer $mode
|
|
||||||
* @access public
|
* @access public
|
||||||
|
* @return Boolean
|
||||||
*/
|
*/
|
||||||
function __construct($mode = Base::MODE_CBC)
|
function isValidEngine($engine)
|
||||||
{
|
{
|
||||||
parent::__construct($mode);
|
switch ($engine) {
|
||||||
$this->setKey('');
|
case self::ENGINE_OPENSSL:
|
||||||
|
if ($this->current_key_length != 128 || strlen($this->orig_key) != 16) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$this->cipher_name_openssl_ecb = 'rc2-ecb';
|
||||||
|
$this->cipher_name_openssl = 'rc2-' . $this->_openssl_translate_mode();
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent::isValidEngine($engine);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -303,11 +312,14 @@ class RC2 extends Base
|
|||||||
*/
|
*/
|
||||||
function setKey($key, $t1 = 0)
|
function setKey($key, $t1 = 0)
|
||||||
{
|
{
|
||||||
|
$this->orig_key = $key;
|
||||||
|
|
||||||
if ($t1 <= 0) {
|
if ($t1 <= 0) {
|
||||||
$t1 = $this->default_key_length;
|
$t1 = $this->default_key_length;
|
||||||
} else if ($t1 > 1024) {
|
} else if ($t1 > 1024) {
|
||||||
$t1 = 1024;
|
$t1 = 1024;
|
||||||
}
|
}
|
||||||
|
$this->current_key_length = $t1;
|
||||||
// Key byte count should be 1..128.
|
// Key byte count should be 1..128.
|
||||||
$key = strlen($key) ? substr($key, 0, 128) : "\x00";
|
$key = strlen($key) ? substr($key, 0, 128) : "\x00";
|
||||||
$t = strlen($key);
|
$t = strlen($key);
|
||||||
@ -340,6 +352,52 @@ class RC2 extends Base
|
|||||||
parent::setKey(call_user_func_array('pack', $l));
|
parent::setKey(call_user_func_array('pack', $l));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encrypts a message.
|
||||||
|
*
|
||||||
|
* Mostly a wrapper for Crypt_Base::encrypt, with some additional OpenSSL handling code
|
||||||
|
*
|
||||||
|
* @see decrypt()
|
||||||
|
* @access public
|
||||||
|
* @param String $plaintext
|
||||||
|
* @return String $ciphertext
|
||||||
|
*/
|
||||||
|
function encrypt($plaintext)
|
||||||
|
{
|
||||||
|
if ($this->engine == self::ENGINE_OPENSSL) {
|
||||||
|
$temp = $this->key;
|
||||||
|
$this->key = $this->orig_key;
|
||||||
|
$result = parent::encrypt($plaintext);
|
||||||
|
$this->key = $temp;
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent::encrypt($plaintext);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decrypts a message.
|
||||||
|
*
|
||||||
|
* Mostly a wrapper for Crypt_Base::decrypt, with some additional OpenSSL handling code
|
||||||
|
*
|
||||||
|
* @see encrypt()
|
||||||
|
* @access public
|
||||||
|
* @param String $ciphertext
|
||||||
|
* @return String $plaintext
|
||||||
|
*/
|
||||||
|
function decrypt($ciphertext)
|
||||||
|
{
|
||||||
|
if ($this->engine == self::ENGINE_OPENSSL) {
|
||||||
|
$temp = $this->key;
|
||||||
|
$this->key = $this->orig_key;
|
||||||
|
$result = parent::decrypt($ciphertext);
|
||||||
|
$this->key = $temp;
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent::encrypt($ciphertext);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encrypts a block
|
* Encrypts a block
|
||||||
*
|
*
|
||||||
@ -430,6 +488,21 @@ class RC2 extends Base
|
|||||||
return pack('vvvv', $r0, $r1, $r2, $r3);
|
return pack('vvvv', $r0, $r1, $r2, $r3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup the \phpseclib\Crypt\Base::ENGINE_MCRYPT $engine
|
||||||
|
*
|
||||||
|
* @see \phpseclib\Crypt\Base::_setupMcrypt()
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _setupMcrypt()
|
||||||
|
{
|
||||||
|
if (!isset($this->key)) {
|
||||||
|
$this->setKey('');
|
||||||
|
}
|
||||||
|
|
||||||
|
parent::_setupMcrypt();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates the key schedule
|
* Creates the key schedule
|
||||||
*
|
*
|
||||||
@ -438,6 +511,10 @@ class RC2 extends Base
|
|||||||
*/
|
*/
|
||||||
function _setupKey()
|
function _setupKey()
|
||||||
{
|
{
|
||||||
|
if (!isset($this->key)) {
|
||||||
|
$this->setKey('');
|
||||||
|
}
|
||||||
|
|
||||||
// Key has already been expanded in \phpseclib\Crypt\RC2::setKey():
|
// Key has already been expanded in \phpseclib\Crypt\RC2::setKey():
|
||||||
// Only the first value must be altered.
|
// Only the first value must be altered.
|
||||||
$l = unpack('Ca/Cb/v*', $this->key);
|
$l = unpack('Ca/Cb/v*', $this->key);
|
||||||
@ -460,14 +537,14 @@ class RC2 extends Base
|
|||||||
// The first 10 generated $lambda_functions will use the $keys hardcoded as integers
|
// The first 10 generated $lambda_functions will use the $keys hardcoded as integers
|
||||||
// for the mixing rounds, for better inline crypt performance [~20% faster].
|
// for the mixing rounds, for better inline crypt performance [~20% faster].
|
||||||
// But for memory reason we have to limit those ultra-optimized $lambda_functions to an amount of 10.
|
// But for memory reason we have to limit those ultra-optimized $lambda_functions to an amount of 10.
|
||||||
$keys = $this->keys;
|
// (Currently, for Crypt_RC2, one generated $lambda_function cost on php5.5@32bit ~60kb unfreeable mem and ~100kb on php5.5@64bit)
|
||||||
if (count($lambda_functions) >= 10) {
|
$gen_hi_opt_code = (bool)( count($lambda_functions) < 10 );
|
||||||
foreach ($this->keys as $k => $v) {
|
|
||||||
$keys[$k] = '$keys[' . $k . ']';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$code_hash = md5(str_pad("RC2, {$this->mode}, ", 32, "\0") . implode(',', $keys));
|
// Generation of a uniqe hash for our generated code
|
||||||
|
$code_hash = "Crypt_RC2, {$this->mode}";
|
||||||
|
if ($gen_hi_opt_code) {
|
||||||
|
$code_hash = str_pad($code_hash, 32) . $this->_hashInlineCryptFunction($this->key);
|
||||||
|
}
|
||||||
|
|
||||||
// Is there a re-usable $lambda_functions in there?
|
// Is there a re-usable $lambda_functions in there?
|
||||||
// If not, we have to create it.
|
// If not, we have to create it.
|
||||||
@ -475,6 +552,16 @@ class RC2 extends Base
|
|||||||
// Init code for both, encrypt and decrypt.
|
// Init code for both, encrypt and decrypt.
|
||||||
$init_crypt = '$keys = $self->keys;';
|
$init_crypt = '$keys = $self->keys;';
|
||||||
|
|
||||||
|
switch (true) {
|
||||||
|
case $gen_hi_opt_code:
|
||||||
|
$keys = $this->keys;
|
||||||
|
default:
|
||||||
|
$keys = array();
|
||||||
|
foreach ($this->keys as $k => $v) {
|
||||||
|
$keys[$k] = '$keys[' . $k . ']';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// $in is the current 8 bytes block which has to be en/decrypt
|
// $in is the current 8 bytes block which has to be en/decrypt
|
||||||
$encrypt_block = $decrypt_block = '
|
$encrypt_block = $decrypt_block = '
|
||||||
$in = unpack("v4", $in);
|
$in = unpack("v4", $in);
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
*
|
*
|
||||||
* Uses mcrypt, if available, and an internal implementation, otherwise.
|
* Uses mcrypt, if available, and an internal implementation, otherwise.
|
||||||
*
|
*
|
||||||
* PHP versions 4 and 5
|
* PHP version 5
|
||||||
*
|
*
|
||||||
* Useful resources are as follows:
|
* Useful resources are as follows:
|
||||||
*
|
*
|
||||||
@ -85,15 +85,6 @@ class RC4 extends Base
|
|||||||
*/
|
*/
|
||||||
var $password_key_size = 128; // = 1024 bits
|
var $password_key_size = 128; // = 1024 bits
|
||||||
|
|
||||||
/**
|
|
||||||
* The namespace used by the cipher for its constants.
|
|
||||||
*
|
|
||||||
* @see \phpseclib\Crypt\Base::const_namespace
|
|
||||||
* @var String
|
|
||||||
* @access private
|
|
||||||
*/
|
|
||||||
var $const_namespace = 'RC4';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The mcrypt specific name of the cipher
|
* The mcrypt specific name of the cipher
|
||||||
*
|
*
|
||||||
@ -193,7 +184,7 @@ class RC4 extends Base
|
|||||||
*/
|
*/
|
||||||
function encrypt($plaintext)
|
function encrypt($plaintext)
|
||||||
{
|
{
|
||||||
if ($this->engine == Base::ENGINE_MCRYPT) {
|
if ($this->engine != Base::ENGINE_INTERNAL) {
|
||||||
return parent::encrypt($plaintext);
|
return parent::encrypt($plaintext);
|
||||||
}
|
}
|
||||||
return $this->_crypt($plaintext, self::ENCRYPT);
|
return $this->_crypt($plaintext, self::ENCRYPT);
|
||||||
@ -213,7 +204,7 @@ class RC4 extends Base
|
|||||||
*/
|
*/
|
||||||
function decrypt($ciphertext)
|
function decrypt($ciphertext)
|
||||||
{
|
{
|
||||||
if ($this->engine == Base::ENGINE_MCRYPT) {
|
if ($this->engine != Base::ENGINE_INTERNAL) {
|
||||||
return parent::decrypt($ciphertext);
|
return parent::decrypt($ciphertext);
|
||||||
}
|
}
|
||||||
return $this->_crypt($ciphertext, self::DECRYPT);
|
return $this->_crypt($ciphertext, self::DECRYPT);
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
/**
|
/**
|
||||||
* Pure-PHP PKCS#1 (v2.1) compliant implementation of RSA.
|
* Pure-PHP PKCS#1 (v2.1) compliant implementation of RSA.
|
||||||
*
|
*
|
||||||
* PHP versions 4 and 5
|
* PHP version 5
|
||||||
*
|
*
|
||||||
* Here's an example of how to encrypt and decrypt text with this library:
|
* Here's an example of how to encrypt and decrypt text with this library:
|
||||||
* <code>
|
* <code>
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
/**
|
/**
|
||||||
* Random Number Generator
|
* Random Number Generator
|
||||||
*
|
*
|
||||||
* PHP versions 4 and 5
|
* PHP version 5
|
||||||
*
|
*
|
||||||
* Here's a short example of how to use this library:
|
* Here's a short example of how to use this library:
|
||||||
* <code>
|
* <code>
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
*
|
*
|
||||||
* Uses mcrypt, if available/possible, and an internal implementation, otherwise.
|
* Uses mcrypt, if available/possible, and an internal implementation, otherwise.
|
||||||
*
|
*
|
||||||
* PHP versions 4 and 5
|
* PHP version 5
|
||||||
*
|
*
|
||||||
* If {@link \phpseclib\Crypt\Rijndael::setBlockLength() setBlockLength()} isn't called, it'll be assumed to be 128 bits. If
|
* If {@link \phpseclib\Crypt\Rijndael::setBlockLength() setBlockLength()} isn't called, it'll be assumed to be 128 bits. If
|
||||||
* {@link \phpseclib\Crypt\Rijndael::setKeyLength() setKeyLength()} isn't called, it'll be calculated from
|
* {@link \phpseclib\Crypt\Rijndael::setKeyLength() setKeyLength()} isn't called, it'll be calculated from
|
||||||
@ -75,15 +75,6 @@ class Rijndael extends Base
|
|||||||
*/
|
*/
|
||||||
var $password_key_size = 16;
|
var $password_key_size = 16;
|
||||||
|
|
||||||
/**
|
|
||||||
* The namespace used by the cipher for its constants.
|
|
||||||
*
|
|
||||||
* @see \phpseclib\Crypt\Base::const_namespace
|
|
||||||
* @var String
|
|
||||||
* @access private
|
|
||||||
*/
|
|
||||||
var $const_namespace = 'RIJNDAEL';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The mcrypt specific name of the cipher
|
* The mcrypt specific name of the cipher
|
||||||
*
|
*
|
||||||
@ -94,7 +85,7 @@ class Rijndael extends Base
|
|||||||
*
|
*
|
||||||
* @see \phpseclib\Crypt\Base::cipher_name_mcrypt
|
* @see \phpseclib\Crypt\Base::cipher_name_mcrypt
|
||||||
* @see \phpseclib\Crypt\Base::engine
|
* @see \phpseclib\Crypt\Base::engine
|
||||||
* @see _setupEngine()
|
* @see isValidEngine()
|
||||||
* @var String
|
* @var String
|
||||||
* @access private
|
* @access private
|
||||||
*/
|
*/
|
||||||
@ -200,404 +191,27 @@ class Rijndael extends Base
|
|||||||
var $kl;
|
var $kl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Precomputed mixColumns table
|
* Default Constructor.
|
||||||
*
|
*
|
||||||
* According to <http://csrc.nist.gov/archive/aes/rijndael/Rijndael-ammended.pdf#page=19> (section 5.2.1),
|
* Determines whether or not the mcrypt extension should be used.
|
||||||
* precomputed tables can be used in the mixColumns phase. in that example, they're assigned t0...t3, so
|
|
||||||
* those are the names we'll use.
|
|
||||||
*
|
*
|
||||||
* @see \phpseclib\Crypt\Rijndael:_encryptBlock()
|
* $mode could be:
|
||||||
* @see \phpseclib\Crypt\Rijndael:_decryptBlock()
|
|
||||||
* @var Array
|
|
||||||
* @access private
|
|
||||||
*/
|
|
||||||
var $t0 = array(
|
|
||||||
0xC66363A5, 0xF87C7C84, 0xEE777799, 0xF67B7B8D, 0xFFF2F20D, 0xD66B6BBD, 0xDE6F6FB1, 0x91C5C554,
|
|
||||||
0x60303050, 0x02010103, 0xCE6767A9, 0x562B2B7D, 0xE7FEFE19, 0xB5D7D762, 0x4DABABE6, 0xEC76769A,
|
|
||||||
0x8FCACA45, 0x1F82829D, 0x89C9C940, 0xFA7D7D87, 0xEFFAFA15, 0xB25959EB, 0x8E4747C9, 0xFBF0F00B,
|
|
||||||
0x41ADADEC, 0xB3D4D467, 0x5FA2A2FD, 0x45AFAFEA, 0x239C9CBF, 0x53A4A4F7, 0xE4727296, 0x9BC0C05B,
|
|
||||||
0x75B7B7C2, 0xE1FDFD1C, 0x3D9393AE, 0x4C26266A, 0x6C36365A, 0x7E3F3F41, 0xF5F7F702, 0x83CCCC4F,
|
|
||||||
0x6834345C, 0x51A5A5F4, 0xD1E5E534, 0xF9F1F108, 0xE2717193, 0xABD8D873, 0x62313153, 0x2A15153F,
|
|
||||||
0x0804040C, 0x95C7C752, 0x46232365, 0x9DC3C35E, 0x30181828, 0x379696A1, 0x0A05050F, 0x2F9A9AB5,
|
|
||||||
0x0E070709, 0x24121236, 0x1B80809B, 0xDFE2E23D, 0xCDEBEB26, 0x4E272769, 0x7FB2B2CD, 0xEA75759F,
|
|
||||||
0x1209091B, 0x1D83839E, 0x582C2C74, 0x341A1A2E, 0x361B1B2D, 0xDC6E6EB2, 0xB45A5AEE, 0x5BA0A0FB,
|
|
||||||
0xA45252F6, 0x763B3B4D, 0xB7D6D661, 0x7DB3B3CE, 0x5229297B, 0xDDE3E33E, 0x5E2F2F71, 0x13848497,
|
|
||||||
0xA65353F5, 0xB9D1D168, 0x00000000, 0xC1EDED2C, 0x40202060, 0xE3FCFC1F, 0x79B1B1C8, 0xB65B5BED,
|
|
||||||
0xD46A6ABE, 0x8DCBCB46, 0x67BEBED9, 0x7239394B, 0x944A4ADE, 0x984C4CD4, 0xB05858E8, 0x85CFCF4A,
|
|
||||||
0xBBD0D06B, 0xC5EFEF2A, 0x4FAAAAE5, 0xEDFBFB16, 0x864343C5, 0x9A4D4DD7, 0x66333355, 0x11858594,
|
|
||||||
0x8A4545CF, 0xE9F9F910, 0x04020206, 0xFE7F7F81, 0xA05050F0, 0x783C3C44, 0x259F9FBA, 0x4BA8A8E3,
|
|
||||||
0xA25151F3, 0x5DA3A3FE, 0x804040C0, 0x058F8F8A, 0x3F9292AD, 0x219D9DBC, 0x70383848, 0xF1F5F504,
|
|
||||||
0x63BCBCDF, 0x77B6B6C1, 0xAFDADA75, 0x42212163, 0x20101030, 0xE5FFFF1A, 0xFDF3F30E, 0xBFD2D26D,
|
|
||||||
0x81CDCD4C, 0x180C0C14, 0x26131335, 0xC3ECEC2F, 0xBE5F5FE1, 0x359797A2, 0x884444CC, 0x2E171739,
|
|
||||||
0x93C4C457, 0x55A7A7F2, 0xFC7E7E82, 0x7A3D3D47, 0xC86464AC, 0xBA5D5DE7, 0x3219192B, 0xE6737395,
|
|
||||||
0xC06060A0, 0x19818198, 0x9E4F4FD1, 0xA3DCDC7F, 0x44222266, 0x542A2A7E, 0x3B9090AB, 0x0B888883,
|
|
||||||
0x8C4646CA, 0xC7EEEE29, 0x6BB8B8D3, 0x2814143C, 0xA7DEDE79, 0xBC5E5EE2, 0x160B0B1D, 0xADDBDB76,
|
|
||||||
0xDBE0E03B, 0x64323256, 0x743A3A4E, 0x140A0A1E, 0x924949DB, 0x0C06060A, 0x4824246C, 0xB85C5CE4,
|
|
||||||
0x9FC2C25D, 0xBDD3D36E, 0x43ACACEF, 0xC46262A6, 0x399191A8, 0x319595A4, 0xD3E4E437, 0xF279798B,
|
|
||||||
0xD5E7E732, 0x8BC8C843, 0x6E373759, 0xDA6D6DB7, 0x018D8D8C, 0xB1D5D564, 0x9C4E4ED2, 0x49A9A9E0,
|
|
||||||
0xD86C6CB4, 0xAC5656FA, 0xF3F4F407, 0xCFEAEA25, 0xCA6565AF, 0xF47A7A8E, 0x47AEAEE9, 0x10080818,
|
|
||||||
0x6FBABAD5, 0xF0787888, 0x4A25256F, 0x5C2E2E72, 0x381C1C24, 0x57A6A6F1, 0x73B4B4C7, 0x97C6C651,
|
|
||||||
0xCBE8E823, 0xA1DDDD7C, 0xE874749C, 0x3E1F1F21, 0x964B4BDD, 0x61BDBDDC, 0x0D8B8B86, 0x0F8A8A85,
|
|
||||||
0xE0707090, 0x7C3E3E42, 0x71B5B5C4, 0xCC6666AA, 0x904848D8, 0x06030305, 0xF7F6F601, 0x1C0E0E12,
|
|
||||||
0xC26161A3, 0x6A35355F, 0xAE5757F9, 0x69B9B9D0, 0x17868691, 0x99C1C158, 0x3A1D1D27, 0x279E9EB9,
|
|
||||||
0xD9E1E138, 0xEBF8F813, 0x2B9898B3, 0x22111133, 0xD26969BB, 0xA9D9D970, 0x078E8E89, 0x339494A7,
|
|
||||||
0x2D9B9BB6, 0x3C1E1E22, 0x15878792, 0xC9E9E920, 0x87CECE49, 0xAA5555FF, 0x50282878, 0xA5DFDF7A,
|
|
||||||
0x038C8C8F, 0x59A1A1F8, 0x09898980, 0x1A0D0D17, 0x65BFBFDA, 0xD7E6E631, 0x844242C6, 0xD06868B8,
|
|
||||||
0x824141C3, 0x299999B0, 0x5A2D2D77, 0x1E0F0F11, 0x7BB0B0CB, 0xA85454FC, 0x6DBBBBD6, 0x2C16163A
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Precomputed mixColumns table
|
|
||||||
*
|
*
|
||||||
* @see \phpseclib\Crypt\Rijndael:_encryptBlock()
|
* - \phpseclib\Crypt\Base::MODE_ECB
|
||||||
* @see \phpseclib\Crypt\Rijndael:_decryptBlock()
|
|
||||||
* @var Array
|
|
||||||
* @access private
|
|
||||||
*/
|
|
||||||
var $t1 = array(
|
|
||||||
0xA5C66363, 0x84F87C7C, 0x99EE7777, 0x8DF67B7B, 0x0DFFF2F2, 0xBDD66B6B, 0xB1DE6F6F, 0x5491C5C5,
|
|
||||||
0x50603030, 0x03020101, 0xA9CE6767, 0x7D562B2B, 0x19E7FEFE, 0x62B5D7D7, 0xE64DABAB, 0x9AEC7676,
|
|
||||||
0x458FCACA, 0x9D1F8282, 0x4089C9C9, 0x87FA7D7D, 0x15EFFAFA, 0xEBB25959, 0xC98E4747, 0x0BFBF0F0,
|
|
||||||
0xEC41ADAD, 0x67B3D4D4, 0xFD5FA2A2, 0xEA45AFAF, 0xBF239C9C, 0xF753A4A4, 0x96E47272, 0x5B9BC0C0,
|
|
||||||
0xC275B7B7, 0x1CE1FDFD, 0xAE3D9393, 0x6A4C2626, 0x5A6C3636, 0x417E3F3F, 0x02F5F7F7, 0x4F83CCCC,
|
|
||||||
0x5C683434, 0xF451A5A5, 0x34D1E5E5, 0x08F9F1F1, 0x93E27171, 0x73ABD8D8, 0x53623131, 0x3F2A1515,
|
|
||||||
0x0C080404, 0x5295C7C7, 0x65462323, 0x5E9DC3C3, 0x28301818, 0xA1379696, 0x0F0A0505, 0xB52F9A9A,
|
|
||||||
0x090E0707, 0x36241212, 0x9B1B8080, 0x3DDFE2E2, 0x26CDEBEB, 0x694E2727, 0xCD7FB2B2, 0x9FEA7575,
|
|
||||||
0x1B120909, 0x9E1D8383, 0x74582C2C, 0x2E341A1A, 0x2D361B1B, 0xB2DC6E6E, 0xEEB45A5A, 0xFB5BA0A0,
|
|
||||||
0xF6A45252, 0x4D763B3B, 0x61B7D6D6, 0xCE7DB3B3, 0x7B522929, 0x3EDDE3E3, 0x715E2F2F, 0x97138484,
|
|
||||||
0xF5A65353, 0x68B9D1D1, 0x00000000, 0x2CC1EDED, 0x60402020, 0x1FE3FCFC, 0xC879B1B1, 0xEDB65B5B,
|
|
||||||
0xBED46A6A, 0x468DCBCB, 0xD967BEBE, 0x4B723939, 0xDE944A4A, 0xD4984C4C, 0xE8B05858, 0x4A85CFCF,
|
|
||||||
0x6BBBD0D0, 0x2AC5EFEF, 0xE54FAAAA, 0x16EDFBFB, 0xC5864343, 0xD79A4D4D, 0x55663333, 0x94118585,
|
|
||||||
0xCF8A4545, 0x10E9F9F9, 0x06040202, 0x81FE7F7F, 0xF0A05050, 0x44783C3C, 0xBA259F9F, 0xE34BA8A8,
|
|
||||||
0xF3A25151, 0xFE5DA3A3, 0xC0804040, 0x8A058F8F, 0xAD3F9292, 0xBC219D9D, 0x48703838, 0x04F1F5F5,
|
|
||||||
0xDF63BCBC, 0xC177B6B6, 0x75AFDADA, 0x63422121, 0x30201010, 0x1AE5FFFF, 0x0EFDF3F3, 0x6DBFD2D2,
|
|
||||||
0x4C81CDCD, 0x14180C0C, 0x35261313, 0x2FC3ECEC, 0xE1BE5F5F, 0xA2359797, 0xCC884444, 0x392E1717,
|
|
||||||
0x5793C4C4, 0xF255A7A7, 0x82FC7E7E, 0x477A3D3D, 0xACC86464, 0xE7BA5D5D, 0x2B321919, 0x95E67373,
|
|
||||||
0xA0C06060, 0x98198181, 0xD19E4F4F, 0x7FA3DCDC, 0x66442222, 0x7E542A2A, 0xAB3B9090, 0x830B8888,
|
|
||||||
0xCA8C4646, 0x29C7EEEE, 0xD36BB8B8, 0x3C281414, 0x79A7DEDE, 0xE2BC5E5E, 0x1D160B0B, 0x76ADDBDB,
|
|
||||||
0x3BDBE0E0, 0x56643232, 0x4E743A3A, 0x1E140A0A, 0xDB924949, 0x0A0C0606, 0x6C482424, 0xE4B85C5C,
|
|
||||||
0x5D9FC2C2, 0x6EBDD3D3, 0xEF43ACAC, 0xA6C46262, 0xA8399191, 0xA4319595, 0x37D3E4E4, 0x8BF27979,
|
|
||||||
0x32D5E7E7, 0x438BC8C8, 0x596E3737, 0xB7DA6D6D, 0x8C018D8D, 0x64B1D5D5, 0xD29C4E4E, 0xE049A9A9,
|
|
||||||
0xB4D86C6C, 0xFAAC5656, 0x07F3F4F4, 0x25CFEAEA, 0xAFCA6565, 0x8EF47A7A, 0xE947AEAE, 0x18100808,
|
|
||||||
0xD56FBABA, 0x88F07878, 0x6F4A2525, 0x725C2E2E, 0x24381C1C, 0xF157A6A6, 0xC773B4B4, 0x5197C6C6,
|
|
||||||
0x23CBE8E8, 0x7CA1DDDD, 0x9CE87474, 0x213E1F1F, 0xDD964B4B, 0xDC61BDBD, 0x860D8B8B, 0x850F8A8A,
|
|
||||||
0x90E07070, 0x427C3E3E, 0xC471B5B5, 0xAACC6666, 0xD8904848, 0x05060303, 0x01F7F6F6, 0x121C0E0E,
|
|
||||||
0xA3C26161, 0x5F6A3535, 0xF9AE5757, 0xD069B9B9, 0x91178686, 0x5899C1C1, 0x273A1D1D, 0xB9279E9E,
|
|
||||||
0x38D9E1E1, 0x13EBF8F8, 0xB32B9898, 0x33221111, 0xBBD26969, 0x70A9D9D9, 0x89078E8E, 0xA7339494,
|
|
||||||
0xB62D9B9B, 0x223C1E1E, 0x92158787, 0x20C9E9E9, 0x4987CECE, 0xFFAA5555, 0x78502828, 0x7AA5DFDF,
|
|
||||||
0x8F038C8C, 0xF859A1A1, 0x80098989, 0x171A0D0D, 0xDA65BFBF, 0x31D7E6E6, 0xC6844242, 0xB8D06868,
|
|
||||||
0xC3824141, 0xB0299999, 0x775A2D2D, 0x111E0F0F, 0xCB7BB0B0, 0xFCA85454, 0xD66DBBBB, 0x3A2C1616
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Precomputed mixColumns table
|
|
||||||
*
|
*
|
||||||
* @see \phpseclib\Crypt\Rijndael:_encryptBlock()
|
* - \phpseclib\Crypt\Base::MODE_CBC
|
||||||
* @see \phpseclib\Crypt\Rijndael:_decryptBlock()
|
|
||||||
* @var Array
|
|
||||||
* @access private
|
|
||||||
*/
|
|
||||||
var $t2 = array(
|
|
||||||
0x63A5C663, 0x7C84F87C, 0x7799EE77, 0x7B8DF67B, 0xF20DFFF2, 0x6BBDD66B, 0x6FB1DE6F, 0xC55491C5,
|
|
||||||
0x30506030, 0x01030201, 0x67A9CE67, 0x2B7D562B, 0xFE19E7FE, 0xD762B5D7, 0xABE64DAB, 0x769AEC76,
|
|
||||||
0xCA458FCA, 0x829D1F82, 0xC94089C9, 0x7D87FA7D, 0xFA15EFFA, 0x59EBB259, 0x47C98E47, 0xF00BFBF0,
|
|
||||||
0xADEC41AD, 0xD467B3D4, 0xA2FD5FA2, 0xAFEA45AF, 0x9CBF239C, 0xA4F753A4, 0x7296E472, 0xC05B9BC0,
|
|
||||||
0xB7C275B7, 0xFD1CE1FD, 0x93AE3D93, 0x266A4C26, 0x365A6C36, 0x3F417E3F, 0xF702F5F7, 0xCC4F83CC,
|
|
||||||
0x345C6834, 0xA5F451A5, 0xE534D1E5, 0xF108F9F1, 0x7193E271, 0xD873ABD8, 0x31536231, 0x153F2A15,
|
|
||||||
0x040C0804, 0xC75295C7, 0x23654623, 0xC35E9DC3, 0x18283018, 0x96A13796, 0x050F0A05, 0x9AB52F9A,
|
|
||||||
0x07090E07, 0x12362412, 0x809B1B80, 0xE23DDFE2, 0xEB26CDEB, 0x27694E27, 0xB2CD7FB2, 0x759FEA75,
|
|
||||||
0x091B1209, 0x839E1D83, 0x2C74582C, 0x1A2E341A, 0x1B2D361B, 0x6EB2DC6E, 0x5AEEB45A, 0xA0FB5BA0,
|
|
||||||
0x52F6A452, 0x3B4D763B, 0xD661B7D6, 0xB3CE7DB3, 0x297B5229, 0xE33EDDE3, 0x2F715E2F, 0x84971384,
|
|
||||||
0x53F5A653, 0xD168B9D1, 0x00000000, 0xED2CC1ED, 0x20604020, 0xFC1FE3FC, 0xB1C879B1, 0x5BEDB65B,
|
|
||||||
0x6ABED46A, 0xCB468DCB, 0xBED967BE, 0x394B7239, 0x4ADE944A, 0x4CD4984C, 0x58E8B058, 0xCF4A85CF,
|
|
||||||
0xD06BBBD0, 0xEF2AC5EF, 0xAAE54FAA, 0xFB16EDFB, 0x43C58643, 0x4DD79A4D, 0x33556633, 0x85941185,
|
|
||||||
0x45CF8A45, 0xF910E9F9, 0x02060402, 0x7F81FE7F, 0x50F0A050, 0x3C44783C, 0x9FBA259F, 0xA8E34BA8,
|
|
||||||
0x51F3A251, 0xA3FE5DA3, 0x40C08040, 0x8F8A058F, 0x92AD3F92, 0x9DBC219D, 0x38487038, 0xF504F1F5,
|
|
||||||
0xBCDF63BC, 0xB6C177B6, 0xDA75AFDA, 0x21634221, 0x10302010, 0xFF1AE5FF, 0xF30EFDF3, 0xD26DBFD2,
|
|
||||||
0xCD4C81CD, 0x0C14180C, 0x13352613, 0xEC2FC3EC, 0x5FE1BE5F, 0x97A23597, 0x44CC8844, 0x17392E17,
|
|
||||||
0xC45793C4, 0xA7F255A7, 0x7E82FC7E, 0x3D477A3D, 0x64ACC864, 0x5DE7BA5D, 0x192B3219, 0x7395E673,
|
|
||||||
0x60A0C060, 0x81981981, 0x4FD19E4F, 0xDC7FA3DC, 0x22664422, 0x2A7E542A, 0x90AB3B90, 0x88830B88,
|
|
||||||
0x46CA8C46, 0xEE29C7EE, 0xB8D36BB8, 0x143C2814, 0xDE79A7DE, 0x5EE2BC5E, 0x0B1D160B, 0xDB76ADDB,
|
|
||||||
0xE03BDBE0, 0x32566432, 0x3A4E743A, 0x0A1E140A, 0x49DB9249, 0x060A0C06, 0x246C4824, 0x5CE4B85C,
|
|
||||||
0xC25D9FC2, 0xD36EBDD3, 0xACEF43AC, 0x62A6C462, 0x91A83991, 0x95A43195, 0xE437D3E4, 0x798BF279,
|
|
||||||
0xE732D5E7, 0xC8438BC8, 0x37596E37, 0x6DB7DA6D, 0x8D8C018D, 0xD564B1D5, 0x4ED29C4E, 0xA9E049A9,
|
|
||||||
0x6CB4D86C, 0x56FAAC56, 0xF407F3F4, 0xEA25CFEA, 0x65AFCA65, 0x7A8EF47A, 0xAEE947AE, 0x08181008,
|
|
||||||
0xBAD56FBA, 0x7888F078, 0x256F4A25, 0x2E725C2E, 0x1C24381C, 0xA6F157A6, 0xB4C773B4, 0xC65197C6,
|
|
||||||
0xE823CBE8, 0xDD7CA1DD, 0x749CE874, 0x1F213E1F, 0x4BDD964B, 0xBDDC61BD, 0x8B860D8B, 0x8A850F8A,
|
|
||||||
0x7090E070, 0x3E427C3E, 0xB5C471B5, 0x66AACC66, 0x48D89048, 0x03050603, 0xF601F7F6, 0x0E121C0E,
|
|
||||||
0x61A3C261, 0x355F6A35, 0x57F9AE57, 0xB9D069B9, 0x86911786, 0xC15899C1, 0x1D273A1D, 0x9EB9279E,
|
|
||||||
0xE138D9E1, 0xF813EBF8, 0x98B32B98, 0x11332211, 0x69BBD269, 0xD970A9D9, 0x8E89078E, 0x94A73394,
|
|
||||||
0x9BB62D9B, 0x1E223C1E, 0x87921587, 0xE920C9E9, 0xCE4987CE, 0x55FFAA55, 0x28785028, 0xDF7AA5DF,
|
|
||||||
0x8C8F038C, 0xA1F859A1, 0x89800989, 0x0D171A0D, 0xBFDA65BF, 0xE631D7E6, 0x42C68442, 0x68B8D068,
|
|
||||||
0x41C38241, 0x99B02999, 0x2D775A2D, 0x0F111E0F, 0xB0CB7BB0, 0x54FCA854, 0xBBD66DBB, 0x163A2C16
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Precomputed mixColumns table
|
|
||||||
*
|
*
|
||||||
* @see \phpseclib\Crypt\Rijndael:_encryptBlock()
|
* - \phpseclib\Crypt\Base::MODE_CTR
|
||||||
* @see \phpseclib\Crypt\Rijndael:_decryptBlock()
|
|
||||||
* @var Array
|
|
||||||
* @access private
|
|
||||||
*/
|
|
||||||
var $t3 = array(
|
|
||||||
0x6363A5C6, 0x7C7C84F8, 0x777799EE, 0x7B7B8DF6, 0xF2F20DFF, 0x6B6BBDD6, 0x6F6FB1DE, 0xC5C55491,
|
|
||||||
0x30305060, 0x01010302, 0x6767A9CE, 0x2B2B7D56, 0xFEFE19E7, 0xD7D762B5, 0xABABE64D, 0x76769AEC,
|
|
||||||
0xCACA458F, 0x82829D1F, 0xC9C94089, 0x7D7D87FA, 0xFAFA15EF, 0x5959EBB2, 0x4747C98E, 0xF0F00BFB,
|
|
||||||
0xADADEC41, 0xD4D467B3, 0xA2A2FD5F, 0xAFAFEA45, 0x9C9CBF23, 0xA4A4F753, 0x727296E4, 0xC0C05B9B,
|
|
||||||
0xB7B7C275, 0xFDFD1CE1, 0x9393AE3D, 0x26266A4C, 0x36365A6C, 0x3F3F417E, 0xF7F702F5, 0xCCCC4F83,
|
|
||||||
0x34345C68, 0xA5A5F451, 0xE5E534D1, 0xF1F108F9, 0x717193E2, 0xD8D873AB, 0x31315362, 0x15153F2A,
|
|
||||||
0x04040C08, 0xC7C75295, 0x23236546, 0xC3C35E9D, 0x18182830, 0x9696A137, 0x05050F0A, 0x9A9AB52F,
|
|
||||||
0x0707090E, 0x12123624, 0x80809B1B, 0xE2E23DDF, 0xEBEB26CD, 0x2727694E, 0xB2B2CD7F, 0x75759FEA,
|
|
||||||
0x09091B12, 0x83839E1D, 0x2C2C7458, 0x1A1A2E34, 0x1B1B2D36, 0x6E6EB2DC, 0x5A5AEEB4, 0xA0A0FB5B,
|
|
||||||
0x5252F6A4, 0x3B3B4D76, 0xD6D661B7, 0xB3B3CE7D, 0x29297B52, 0xE3E33EDD, 0x2F2F715E, 0x84849713,
|
|
||||||
0x5353F5A6, 0xD1D168B9, 0x00000000, 0xEDED2CC1, 0x20206040, 0xFCFC1FE3, 0xB1B1C879, 0x5B5BEDB6,
|
|
||||||
0x6A6ABED4, 0xCBCB468D, 0xBEBED967, 0x39394B72, 0x4A4ADE94, 0x4C4CD498, 0x5858E8B0, 0xCFCF4A85,
|
|
||||||
0xD0D06BBB, 0xEFEF2AC5, 0xAAAAE54F, 0xFBFB16ED, 0x4343C586, 0x4D4DD79A, 0x33335566, 0x85859411,
|
|
||||||
0x4545CF8A, 0xF9F910E9, 0x02020604, 0x7F7F81FE, 0x5050F0A0, 0x3C3C4478, 0x9F9FBA25, 0xA8A8E34B,
|
|
||||||
0x5151F3A2, 0xA3A3FE5D, 0x4040C080, 0x8F8F8A05, 0x9292AD3F, 0x9D9DBC21, 0x38384870, 0xF5F504F1,
|
|
||||||
0xBCBCDF63, 0xB6B6C177, 0xDADA75AF, 0x21216342, 0x10103020, 0xFFFF1AE5, 0xF3F30EFD, 0xD2D26DBF,
|
|
||||||
0xCDCD4C81, 0x0C0C1418, 0x13133526, 0xECEC2FC3, 0x5F5FE1BE, 0x9797A235, 0x4444CC88, 0x1717392E,
|
|
||||||
0xC4C45793, 0xA7A7F255, 0x7E7E82FC, 0x3D3D477A, 0x6464ACC8, 0x5D5DE7BA, 0x19192B32, 0x737395E6,
|
|
||||||
0x6060A0C0, 0x81819819, 0x4F4FD19E, 0xDCDC7FA3, 0x22226644, 0x2A2A7E54, 0x9090AB3B, 0x8888830B,
|
|
||||||
0x4646CA8C, 0xEEEE29C7, 0xB8B8D36B, 0x14143C28, 0xDEDE79A7, 0x5E5EE2BC, 0x0B0B1D16, 0xDBDB76AD,
|
|
||||||
0xE0E03BDB, 0x32325664, 0x3A3A4E74, 0x0A0A1E14, 0x4949DB92, 0x06060A0C, 0x24246C48, 0x5C5CE4B8,
|
|
||||||
0xC2C25D9F, 0xD3D36EBD, 0xACACEF43, 0x6262A6C4, 0x9191A839, 0x9595A431, 0xE4E437D3, 0x79798BF2,
|
|
||||||
0xE7E732D5, 0xC8C8438B, 0x3737596E, 0x6D6DB7DA, 0x8D8D8C01, 0xD5D564B1, 0x4E4ED29C, 0xA9A9E049,
|
|
||||||
0x6C6CB4D8, 0x5656FAAC, 0xF4F407F3, 0xEAEA25CF, 0x6565AFCA, 0x7A7A8EF4, 0xAEAEE947, 0x08081810,
|
|
||||||
0xBABAD56F, 0x787888F0, 0x25256F4A, 0x2E2E725C, 0x1C1C2438, 0xA6A6F157, 0xB4B4C773, 0xC6C65197,
|
|
||||||
0xE8E823CB, 0xDDDD7CA1, 0x74749CE8, 0x1F1F213E, 0x4B4BDD96, 0xBDBDDC61, 0x8B8B860D, 0x8A8A850F,
|
|
||||||
0x707090E0, 0x3E3E427C, 0xB5B5C471, 0x6666AACC, 0x4848D890, 0x03030506, 0xF6F601F7, 0x0E0E121C,
|
|
||||||
0x6161A3C2, 0x35355F6A, 0x5757F9AE, 0xB9B9D069, 0x86869117, 0xC1C15899, 0x1D1D273A, 0x9E9EB927,
|
|
||||||
0xE1E138D9, 0xF8F813EB, 0x9898B32B, 0x11113322, 0x6969BBD2, 0xD9D970A9, 0x8E8E8907, 0x9494A733,
|
|
||||||
0x9B9BB62D, 0x1E1E223C, 0x87879215, 0xE9E920C9, 0xCECE4987, 0x5555FFAA, 0x28287850, 0xDFDF7AA5,
|
|
||||||
0x8C8C8F03, 0xA1A1F859, 0x89898009, 0x0D0D171A, 0xBFBFDA65, 0xE6E631D7, 0x4242C684, 0x6868B8D0,
|
|
||||||
0x4141C382, 0x9999B029, 0x2D2D775A, 0x0F0F111E, 0xB0B0CB7B, 0x5454FCA8, 0xBBBBD66D, 0x16163A2C
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Precomputed invMixColumns table
|
|
||||||
*
|
*
|
||||||
* @see \phpseclib\Crypt\Rijndael:_encryptBlock()
|
* - \phpseclib\Crypt\Base::MODE_CFB
|
||||||
* @see \phpseclib\Crypt\Rijndael:_decryptBlock()
|
|
||||||
* @var Array
|
|
||||||
* @access private
|
|
||||||
*/
|
|
||||||
var $dt0 = array(
|
|
||||||
0x51F4A750, 0x7E416553, 0x1A17A4C3, 0x3A275E96, 0x3BAB6BCB, 0x1F9D45F1, 0xACFA58AB, 0x4BE30393,
|
|
||||||
0x2030FA55, 0xAD766DF6, 0x88CC7691, 0xF5024C25, 0x4FE5D7FC, 0xC52ACBD7, 0x26354480, 0xB562A38F,
|
|
||||||
0xDEB15A49, 0x25BA1B67, 0x45EA0E98, 0x5DFEC0E1, 0xC32F7502, 0x814CF012, 0x8D4697A3, 0x6BD3F9C6,
|
|
||||||
0x038F5FE7, 0x15929C95, 0xBF6D7AEB, 0x955259DA, 0xD4BE832D, 0x587421D3, 0x49E06929, 0x8EC9C844,
|
|
||||||
0x75C2896A, 0xF48E7978, 0x99583E6B, 0x27B971DD, 0xBEE14FB6, 0xF088AD17, 0xC920AC66, 0x7DCE3AB4,
|
|
||||||
0x63DF4A18, 0xE51A3182, 0x97513360, 0x62537F45, 0xB16477E0, 0xBB6BAE84, 0xFE81A01C, 0xF9082B94,
|
|
||||||
0x70486858, 0x8F45FD19, 0x94DE6C87, 0x527BF8B7, 0xAB73D323, 0x724B02E2, 0xE31F8F57, 0x6655AB2A,
|
|
||||||
0xB2EB2807, 0x2FB5C203, 0x86C57B9A, 0xD33708A5, 0x302887F2, 0x23BFA5B2, 0x02036ABA, 0xED16825C,
|
|
||||||
0x8ACF1C2B, 0xA779B492, 0xF307F2F0, 0x4E69E2A1, 0x65DAF4CD, 0x0605BED5, 0xD134621F, 0xC4A6FE8A,
|
|
||||||
0x342E539D, 0xA2F355A0, 0x058AE132, 0xA4F6EB75, 0x0B83EC39, 0x4060EFAA, 0x5E719F06, 0xBD6E1051,
|
|
||||||
0x3E218AF9, 0x96DD063D, 0xDD3E05AE, 0x4DE6BD46, 0x91548DB5, 0x71C45D05, 0x0406D46F, 0x605015FF,
|
|
||||||
0x1998FB24, 0xD6BDE997, 0x894043CC, 0x67D99E77, 0xB0E842BD, 0x07898B88, 0xE7195B38, 0x79C8EEDB,
|
|
||||||
0xA17C0A47, 0x7C420FE9, 0xF8841EC9, 0x00000000, 0x09808683, 0x322BED48, 0x1E1170AC, 0x6C5A724E,
|
|
||||||
0xFD0EFFFB, 0x0F853856, 0x3DAED51E, 0x362D3927, 0x0A0FD964, 0x685CA621, 0x9B5B54D1, 0x24362E3A,
|
|
||||||
0x0C0A67B1, 0x9357E70F, 0xB4EE96D2, 0x1B9B919E, 0x80C0C54F, 0x61DC20A2, 0x5A774B69, 0x1C121A16,
|
|
||||||
0xE293BA0A, 0xC0A02AE5, 0x3C22E043, 0x121B171D, 0x0E090D0B, 0xF28BC7AD, 0x2DB6A8B9, 0x141EA9C8,
|
|
||||||
0x57F11985, 0xAF75074C, 0xEE99DDBB, 0xA37F60FD, 0xF701269F, 0x5C72F5BC, 0x44663BC5, 0x5BFB7E34,
|
|
||||||
0x8B432976, 0xCB23C6DC, 0xB6EDFC68, 0xB8E4F163, 0xD731DCCA, 0x42638510, 0x13972240, 0x84C61120,
|
|
||||||
0x854A247D, 0xD2BB3DF8, 0xAEF93211, 0xC729A16D, 0x1D9E2F4B, 0xDCB230F3, 0x0D8652EC, 0x77C1E3D0,
|
|
||||||
0x2BB3166C, 0xA970B999, 0x119448FA, 0x47E96422, 0xA8FC8CC4, 0xA0F03F1A, 0x567D2CD8, 0x223390EF,
|
|
||||||
0x87494EC7, 0xD938D1C1, 0x8CCAA2FE, 0x98D40B36, 0xA6F581CF, 0xA57ADE28, 0xDAB78E26, 0x3FADBFA4,
|
|
||||||
0x2C3A9DE4, 0x5078920D, 0x6A5FCC9B, 0x547E4662, 0xF68D13C2, 0x90D8B8E8, 0x2E39F75E, 0x82C3AFF5,
|
|
||||||
0x9F5D80BE, 0x69D0937C, 0x6FD52DA9, 0xCF2512B3, 0xC8AC993B, 0x10187DA7, 0xE89C636E, 0xDB3BBB7B,
|
|
||||||
0xCD267809, 0x6E5918F4, 0xEC9AB701, 0x834F9AA8, 0xE6956E65, 0xAAFFE67E, 0x21BCCF08, 0xEF15E8E6,
|
|
||||||
0xBAE79BD9, 0x4A6F36CE, 0xEA9F09D4, 0x29B07CD6, 0x31A4B2AF, 0x2A3F2331, 0xC6A59430, 0x35A266C0,
|
|
||||||
0x744EBC37, 0xFC82CAA6, 0xE090D0B0, 0x33A7D815, 0xF104984A, 0x41ECDAF7, 0x7FCD500E, 0x1791F62F,
|
|
||||||
0x764DD68D, 0x43EFB04D, 0xCCAA4D54, 0xE49604DF, 0x9ED1B5E3, 0x4C6A881B, 0xC12C1FB8, 0x4665517F,
|
|
||||||
0x9D5EEA04, 0x018C355D, 0xFA877473, 0xFB0B412E, 0xB3671D5A, 0x92DBD252, 0xE9105633, 0x6DD64713,
|
|
||||||
0x9AD7618C, 0x37A10C7A, 0x59F8148E, 0xEB133C89, 0xCEA927EE, 0xB761C935, 0xE11CE5ED, 0x7A47B13C,
|
|
||||||
0x9CD2DF59, 0x55F2733F, 0x1814CE79, 0x73C737BF, 0x53F7CDEA, 0x5FFDAA5B, 0xDF3D6F14, 0x7844DB86,
|
|
||||||
0xCAAFF381, 0xB968C43E, 0x3824342C, 0xC2A3405F, 0x161DC372, 0xBCE2250C, 0x283C498B, 0xFF0D9541,
|
|
||||||
0x39A80171, 0x080CB3DE, 0xD8B4E49C, 0x6456C190, 0x7BCB8461, 0xD532B670, 0x486C5C74, 0xD0B85742
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Precomputed invMixColumns table
|
|
||||||
*
|
*
|
||||||
* @see \phpseclib\Crypt\Rijndael:_encryptBlock()
|
* - \phpseclib\Crypt\Base::MODE_OFB
|
||||||
* @see \phpseclib\Crypt\Rijndael:_decryptBlock()
|
|
||||||
* @var Array
|
|
||||||
* @access private
|
|
||||||
*/
|
|
||||||
var $dt1 = array(
|
|
||||||
0x5051F4A7, 0x537E4165, 0xC31A17A4, 0x963A275E, 0xCB3BAB6B, 0xF11F9D45, 0xABACFA58, 0x934BE303,
|
|
||||||
0x552030FA, 0xF6AD766D, 0x9188CC76, 0x25F5024C, 0xFC4FE5D7, 0xD7C52ACB, 0x80263544, 0x8FB562A3,
|
|
||||||
0x49DEB15A, 0x6725BA1B, 0x9845EA0E, 0xE15DFEC0, 0x02C32F75, 0x12814CF0, 0xA38D4697, 0xC66BD3F9,
|
|
||||||
0xE7038F5F, 0x9515929C, 0xEBBF6D7A, 0xDA955259, 0x2DD4BE83, 0xD3587421, 0x2949E069, 0x448EC9C8,
|
|
||||||
0x6A75C289, 0x78F48E79, 0x6B99583E, 0xDD27B971, 0xB6BEE14F, 0x17F088AD, 0x66C920AC, 0xB47DCE3A,
|
|
||||||
0x1863DF4A, 0x82E51A31, 0x60975133, 0x4562537F, 0xE0B16477, 0x84BB6BAE, 0x1CFE81A0, 0x94F9082B,
|
|
||||||
0x58704868, 0x198F45FD, 0x8794DE6C, 0xB7527BF8, 0x23AB73D3, 0xE2724B02, 0x57E31F8F, 0x2A6655AB,
|
|
||||||
0x07B2EB28, 0x032FB5C2, 0x9A86C57B, 0xA5D33708, 0xF2302887, 0xB223BFA5, 0xBA02036A, 0x5CED1682,
|
|
||||||
0x2B8ACF1C, 0x92A779B4, 0xF0F307F2, 0xA14E69E2, 0xCD65DAF4, 0xD50605BE, 0x1FD13462, 0x8AC4A6FE,
|
|
||||||
0x9D342E53, 0xA0A2F355, 0x32058AE1, 0x75A4F6EB, 0x390B83EC, 0xAA4060EF, 0x065E719F, 0x51BD6E10,
|
|
||||||
0xF93E218A, 0x3D96DD06, 0xAEDD3E05, 0x464DE6BD, 0xB591548D, 0x0571C45D, 0x6F0406D4, 0xFF605015,
|
|
||||||
0x241998FB, 0x97D6BDE9, 0xCC894043, 0x7767D99E, 0xBDB0E842, 0x8807898B, 0x38E7195B, 0xDB79C8EE,
|
|
||||||
0x47A17C0A, 0xE97C420F, 0xC9F8841E, 0x00000000, 0x83098086, 0x48322BED, 0xAC1E1170, 0x4E6C5A72,
|
|
||||||
0xFBFD0EFF, 0x560F8538, 0x1E3DAED5, 0x27362D39, 0x640A0FD9, 0x21685CA6, 0xD19B5B54, 0x3A24362E,
|
|
||||||
0xB10C0A67, 0x0F9357E7, 0xD2B4EE96, 0x9E1B9B91, 0x4F80C0C5, 0xA261DC20, 0x695A774B, 0x161C121A,
|
|
||||||
0x0AE293BA, 0xE5C0A02A, 0x433C22E0, 0x1D121B17, 0x0B0E090D, 0xADF28BC7, 0xB92DB6A8, 0xC8141EA9,
|
|
||||||
0x8557F119, 0x4CAF7507, 0xBBEE99DD, 0xFDA37F60, 0x9FF70126, 0xBC5C72F5, 0xC544663B, 0x345BFB7E,
|
|
||||||
0x768B4329, 0xDCCB23C6, 0x68B6EDFC, 0x63B8E4F1, 0xCAD731DC, 0x10426385, 0x40139722, 0x2084C611,
|
|
||||||
0x7D854A24, 0xF8D2BB3D, 0x11AEF932, 0x6DC729A1, 0x4B1D9E2F, 0xF3DCB230, 0xEC0D8652, 0xD077C1E3,
|
|
||||||
0x6C2BB316, 0x99A970B9, 0xFA119448, 0x2247E964, 0xC4A8FC8C, 0x1AA0F03F, 0xD8567D2C, 0xEF223390,
|
|
||||||
0xC787494E, 0xC1D938D1, 0xFE8CCAA2, 0x3698D40B, 0xCFA6F581, 0x28A57ADE, 0x26DAB78E, 0xA43FADBF,
|
|
||||||
0xE42C3A9D, 0x0D507892, 0x9B6A5FCC, 0x62547E46, 0xC2F68D13, 0xE890D8B8, 0x5E2E39F7, 0xF582C3AF,
|
|
||||||
0xBE9F5D80, 0x7C69D093, 0xA96FD52D, 0xB3CF2512, 0x3BC8AC99, 0xA710187D, 0x6EE89C63, 0x7BDB3BBB,
|
|
||||||
0x09CD2678, 0xF46E5918, 0x01EC9AB7, 0xA8834F9A, 0x65E6956E, 0x7EAAFFE6, 0x0821BCCF, 0xE6EF15E8,
|
|
||||||
0xD9BAE79B, 0xCE4A6F36, 0xD4EA9F09, 0xD629B07C, 0xAF31A4B2, 0x312A3F23, 0x30C6A594, 0xC035A266,
|
|
||||||
0x37744EBC, 0xA6FC82CA, 0xB0E090D0, 0x1533A7D8, 0x4AF10498, 0xF741ECDA, 0x0E7FCD50, 0x2F1791F6,
|
|
||||||
0x8D764DD6, 0x4D43EFB0, 0x54CCAA4D, 0xDFE49604, 0xE39ED1B5, 0x1B4C6A88, 0xB8C12C1F, 0x7F466551,
|
|
||||||
0x049D5EEA, 0x5D018C35, 0x73FA8774, 0x2EFB0B41, 0x5AB3671D, 0x5292DBD2, 0x33E91056, 0x136DD647,
|
|
||||||
0x8C9AD761, 0x7A37A10C, 0x8E59F814, 0x89EB133C, 0xEECEA927, 0x35B761C9, 0xEDE11CE5, 0x3C7A47B1,
|
|
||||||
0x599CD2DF, 0x3F55F273, 0x791814CE, 0xBF73C737, 0xEA53F7CD, 0x5B5FFDAA, 0x14DF3D6F, 0x867844DB,
|
|
||||||
0x81CAAFF3, 0x3EB968C4, 0x2C382434, 0x5FC2A340, 0x72161DC3, 0x0CBCE225, 0x8B283C49, 0x41FF0D95,
|
|
||||||
0x7139A801, 0xDE080CB3, 0x9CD8B4E4, 0x906456C1, 0x617BCB84, 0x70D532B6, 0x74486C5C, 0x42D0B857
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Precomputed invMixColumns table
|
|
||||||
*
|
*
|
||||||
* @see \phpseclib\Crypt\Rijndael:_encryptBlock()
|
* If not explictly set, \phpseclib\Crypt\Base::MODE_CBC will be used.
|
||||||
* @see \phpseclib\Crypt\Rijndael:_decryptBlock()
|
|
||||||
* @var Array
|
|
||||||
* @access private
|
|
||||||
*/
|
|
||||||
var $dt2 = array(
|
|
||||||
0xA75051F4, 0x65537E41, 0xA4C31A17, 0x5E963A27, 0x6BCB3BAB, 0x45F11F9D, 0x58ABACFA, 0x03934BE3,
|
|
||||||
0xFA552030, 0x6DF6AD76, 0x769188CC, 0x4C25F502, 0xD7FC4FE5, 0xCBD7C52A, 0x44802635, 0xA38FB562,
|
|
||||||
0x5A49DEB1, 0x1B6725BA, 0x0E9845EA, 0xC0E15DFE, 0x7502C32F, 0xF012814C, 0x97A38D46, 0xF9C66BD3,
|
|
||||||
0x5FE7038F, 0x9C951592, 0x7AEBBF6D, 0x59DA9552, 0x832DD4BE, 0x21D35874, 0x692949E0, 0xC8448EC9,
|
|
||||||
0x896A75C2, 0x7978F48E, 0x3E6B9958, 0x71DD27B9, 0x4FB6BEE1, 0xAD17F088, 0xAC66C920, 0x3AB47DCE,
|
|
||||||
0x4A1863DF, 0x3182E51A, 0x33609751, 0x7F456253, 0x77E0B164, 0xAE84BB6B, 0xA01CFE81, 0x2B94F908,
|
|
||||||
0x68587048, 0xFD198F45, 0x6C8794DE, 0xF8B7527B, 0xD323AB73, 0x02E2724B, 0x8F57E31F, 0xAB2A6655,
|
|
||||||
0x2807B2EB, 0xC2032FB5, 0x7B9A86C5, 0x08A5D337, 0x87F23028, 0xA5B223BF, 0x6ABA0203, 0x825CED16,
|
|
||||||
0x1C2B8ACF, 0xB492A779, 0xF2F0F307, 0xE2A14E69, 0xF4CD65DA, 0xBED50605, 0x621FD134, 0xFE8AC4A6,
|
|
||||||
0x539D342E, 0x55A0A2F3, 0xE132058A, 0xEB75A4F6, 0xEC390B83, 0xEFAA4060, 0x9F065E71, 0x1051BD6E,
|
|
||||||
0x8AF93E21, 0x063D96DD, 0x05AEDD3E, 0xBD464DE6, 0x8DB59154, 0x5D0571C4, 0xD46F0406, 0x15FF6050,
|
|
||||||
0xFB241998, 0xE997D6BD, 0x43CC8940, 0x9E7767D9, 0x42BDB0E8, 0x8B880789, 0x5B38E719, 0xEEDB79C8,
|
|
||||||
0x0A47A17C, 0x0FE97C42, 0x1EC9F884, 0x00000000, 0x86830980, 0xED48322B, 0x70AC1E11, 0x724E6C5A,
|
|
||||||
0xFFFBFD0E, 0x38560F85, 0xD51E3DAE, 0x3927362D, 0xD9640A0F, 0xA621685C, 0x54D19B5B, 0x2E3A2436,
|
|
||||||
0x67B10C0A, 0xE70F9357, 0x96D2B4EE, 0x919E1B9B, 0xC54F80C0, 0x20A261DC, 0x4B695A77, 0x1A161C12,
|
|
||||||
0xBA0AE293, 0x2AE5C0A0, 0xE0433C22, 0x171D121B, 0x0D0B0E09, 0xC7ADF28B, 0xA8B92DB6, 0xA9C8141E,
|
|
||||||
0x198557F1, 0x074CAF75, 0xDDBBEE99, 0x60FDA37F, 0x269FF701, 0xF5BC5C72, 0x3BC54466, 0x7E345BFB,
|
|
||||||
0x29768B43, 0xC6DCCB23, 0xFC68B6ED, 0xF163B8E4, 0xDCCAD731, 0x85104263, 0x22401397, 0x112084C6,
|
|
||||||
0x247D854A, 0x3DF8D2BB, 0x3211AEF9, 0xA16DC729, 0x2F4B1D9E, 0x30F3DCB2, 0x52EC0D86, 0xE3D077C1,
|
|
||||||
0x166C2BB3, 0xB999A970, 0x48FA1194, 0x642247E9, 0x8CC4A8FC, 0x3F1AA0F0, 0x2CD8567D, 0x90EF2233,
|
|
||||||
0x4EC78749, 0xD1C1D938, 0xA2FE8CCA, 0x0B3698D4, 0x81CFA6F5, 0xDE28A57A, 0x8E26DAB7, 0xBFA43FAD,
|
|
||||||
0x9DE42C3A, 0x920D5078, 0xCC9B6A5F, 0x4662547E, 0x13C2F68D, 0xB8E890D8, 0xF75E2E39, 0xAFF582C3,
|
|
||||||
0x80BE9F5D, 0x937C69D0, 0x2DA96FD5, 0x12B3CF25, 0x993BC8AC, 0x7DA71018, 0x636EE89C, 0xBB7BDB3B,
|
|
||||||
0x7809CD26, 0x18F46E59, 0xB701EC9A, 0x9AA8834F, 0x6E65E695, 0xE67EAAFF, 0xCF0821BC, 0xE8E6EF15,
|
|
||||||
0x9BD9BAE7, 0x36CE4A6F, 0x09D4EA9F, 0x7CD629B0, 0xB2AF31A4, 0x23312A3F, 0x9430C6A5, 0x66C035A2,
|
|
||||||
0xBC37744E, 0xCAA6FC82, 0xD0B0E090, 0xD81533A7, 0x984AF104, 0xDAF741EC, 0x500E7FCD, 0xF62F1791,
|
|
||||||
0xD68D764D, 0xB04D43EF, 0x4D54CCAA, 0x04DFE496, 0xB5E39ED1, 0x881B4C6A, 0x1FB8C12C, 0x517F4665,
|
|
||||||
0xEA049D5E, 0x355D018C, 0x7473FA87, 0x412EFB0B, 0x1D5AB367, 0xD25292DB, 0x5633E910, 0x47136DD6,
|
|
||||||
0x618C9AD7, 0x0C7A37A1, 0x148E59F8, 0x3C89EB13, 0x27EECEA9, 0xC935B761, 0xE5EDE11C, 0xB13C7A47,
|
|
||||||
0xDF599CD2, 0x733F55F2, 0xCE791814, 0x37BF73C7, 0xCDEA53F7, 0xAA5B5FFD, 0x6F14DF3D, 0xDB867844,
|
|
||||||
0xF381CAAF, 0xC43EB968, 0x342C3824, 0x405FC2A3, 0xC372161D, 0x250CBCE2, 0x498B283C, 0x9541FF0D,
|
|
||||||
0x017139A8, 0xB3DE080C, 0xE49CD8B4, 0xC1906456, 0x84617BCB, 0xB670D532, 0x5C74486C, 0x5742D0B8
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Precomputed invMixColumns table
|
|
||||||
*
|
*
|
||||||
* @see \phpseclib\Crypt\Rijndael:_encryptBlock()
|
* @see \phpseclib\Crypt\Base::Crypt_Base()
|
||||||
* @see \phpseclib\Crypt\Rijndael:_decryptBlock()
|
* @param optional Integer $mode
|
||||||
* @var Array
|
* @access public
|
||||||
* @access private
|
|
||||||
*/
|
|
||||||
var $dt3 = array(
|
|
||||||
0xF4A75051, 0x4165537E, 0x17A4C31A, 0x275E963A, 0xAB6BCB3B, 0x9D45F11F, 0xFA58ABAC, 0xE303934B,
|
|
||||||
0x30FA5520, 0x766DF6AD, 0xCC769188, 0x024C25F5, 0xE5D7FC4F, 0x2ACBD7C5, 0x35448026, 0x62A38FB5,
|
|
||||||
0xB15A49DE, 0xBA1B6725, 0xEA0E9845, 0xFEC0E15D, 0x2F7502C3, 0x4CF01281, 0x4697A38D, 0xD3F9C66B,
|
|
||||||
0x8F5FE703, 0x929C9515, 0x6D7AEBBF, 0x5259DA95, 0xBE832DD4, 0x7421D358, 0xE0692949, 0xC9C8448E,
|
|
||||||
0xC2896A75, 0x8E7978F4, 0x583E6B99, 0xB971DD27, 0xE14FB6BE, 0x88AD17F0, 0x20AC66C9, 0xCE3AB47D,
|
|
||||||
0xDF4A1863, 0x1A3182E5, 0x51336097, 0x537F4562, 0x6477E0B1, 0x6BAE84BB, 0x81A01CFE, 0x082B94F9,
|
|
||||||
0x48685870, 0x45FD198F, 0xDE6C8794, 0x7BF8B752, 0x73D323AB, 0x4B02E272, 0x1F8F57E3, 0x55AB2A66,
|
|
||||||
0xEB2807B2, 0xB5C2032F, 0xC57B9A86, 0x3708A5D3, 0x2887F230, 0xBFA5B223, 0x036ABA02, 0x16825CED,
|
|
||||||
0xCF1C2B8A, 0x79B492A7, 0x07F2F0F3, 0x69E2A14E, 0xDAF4CD65, 0x05BED506, 0x34621FD1, 0xA6FE8AC4,
|
|
||||||
0x2E539D34, 0xF355A0A2, 0x8AE13205, 0xF6EB75A4, 0x83EC390B, 0x60EFAA40, 0x719F065E, 0x6E1051BD,
|
|
||||||
0x218AF93E, 0xDD063D96, 0x3E05AEDD, 0xE6BD464D, 0x548DB591, 0xC45D0571, 0x06D46F04, 0x5015FF60,
|
|
||||||
0x98FB2419, 0xBDE997D6, 0x4043CC89, 0xD99E7767, 0xE842BDB0, 0x898B8807, 0x195B38E7, 0xC8EEDB79,
|
|
||||||
0x7C0A47A1, 0x420FE97C, 0x841EC9F8, 0x00000000, 0x80868309, 0x2BED4832, 0x1170AC1E, 0x5A724E6C,
|
|
||||||
0x0EFFFBFD, 0x8538560F, 0xAED51E3D, 0x2D392736, 0x0FD9640A, 0x5CA62168, 0x5B54D19B, 0x362E3A24,
|
|
||||||
0x0A67B10C, 0x57E70F93, 0xEE96D2B4, 0x9B919E1B, 0xC0C54F80, 0xDC20A261, 0x774B695A, 0x121A161C,
|
|
||||||
0x93BA0AE2, 0xA02AE5C0, 0x22E0433C, 0x1B171D12, 0x090D0B0E, 0x8BC7ADF2, 0xB6A8B92D, 0x1EA9C814,
|
|
||||||
0xF1198557, 0x75074CAF, 0x99DDBBEE, 0x7F60FDA3, 0x01269FF7, 0x72F5BC5C, 0x663BC544, 0xFB7E345B,
|
|
||||||
0x4329768B, 0x23C6DCCB, 0xEDFC68B6, 0xE4F163B8, 0x31DCCAD7, 0x63851042, 0x97224013, 0xC6112084,
|
|
||||||
0x4A247D85, 0xBB3DF8D2, 0xF93211AE, 0x29A16DC7, 0x9E2F4B1D, 0xB230F3DC, 0x8652EC0D, 0xC1E3D077,
|
|
||||||
0xB3166C2B, 0x70B999A9, 0x9448FA11, 0xE9642247, 0xFC8CC4A8, 0xF03F1AA0, 0x7D2CD856, 0x3390EF22,
|
|
||||||
0x494EC787, 0x38D1C1D9, 0xCAA2FE8C, 0xD40B3698, 0xF581CFA6, 0x7ADE28A5, 0xB78E26DA, 0xADBFA43F,
|
|
||||||
0x3A9DE42C, 0x78920D50, 0x5FCC9B6A, 0x7E466254, 0x8D13C2F6, 0xD8B8E890, 0x39F75E2E, 0xC3AFF582,
|
|
||||||
0x5D80BE9F, 0xD0937C69, 0xD52DA96F, 0x2512B3CF, 0xAC993BC8, 0x187DA710, 0x9C636EE8, 0x3BBB7BDB,
|
|
||||||
0x267809CD, 0x5918F46E, 0x9AB701EC, 0x4F9AA883, 0x956E65E6, 0xFFE67EAA, 0xBCCF0821, 0x15E8E6EF,
|
|
||||||
0xE79BD9BA, 0x6F36CE4A, 0x9F09D4EA, 0xB07CD629, 0xA4B2AF31, 0x3F23312A, 0xA59430C6, 0xA266C035,
|
|
||||||
0x4EBC3774, 0x82CAA6FC, 0x90D0B0E0, 0xA7D81533, 0x04984AF1, 0xECDAF741, 0xCD500E7F, 0x91F62F17,
|
|
||||||
0x4DD68D76, 0xEFB04D43, 0xAA4D54CC, 0x9604DFE4, 0xD1B5E39E, 0x6A881B4C, 0x2C1FB8C1, 0x65517F46,
|
|
||||||
0x5EEA049D, 0x8C355D01, 0x877473FA, 0x0B412EFB, 0x671D5AB3, 0xDBD25292, 0x105633E9, 0xD647136D,
|
|
||||||
0xD7618C9A, 0xA10C7A37, 0xF8148E59, 0x133C89EB, 0xA927EECE, 0x61C935B7, 0x1CE5EDE1, 0x47B13C7A,
|
|
||||||
0xD2DF599C, 0xF2733F55, 0x14CE7918, 0xC737BF73, 0xF7CDEA53, 0xFDAA5B5F, 0x3D6F14DF, 0x44DB8678,
|
|
||||||
0xAFF381CA, 0x68C43EB9, 0x24342C38, 0xA3405FC2, 0x1DC37216, 0xE2250CBC, 0x3C498B28, 0x0D9541FF,
|
|
||||||
0xA8017139, 0x0CB3DE08, 0xB4E49CD8, 0x56C19064, 0xCB84617B, 0x32B670D5, 0x6C5C7448, 0xB85742D0
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The SubByte S-Box
|
|
||||||
*
|
|
||||||
* @see \phpseclib\Crypt\Rijndael::_encryptBlock()
|
|
||||||
* @var Array
|
|
||||||
* @access private
|
|
||||||
*/
|
|
||||||
var $sbox = array(
|
|
||||||
0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
|
|
||||||
0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
|
|
||||||
0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
|
|
||||||
0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
|
|
||||||
0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
|
|
||||||
0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
|
|
||||||
0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
|
|
||||||
0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
|
|
||||||
0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
|
|
||||||
0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
|
|
||||||
0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
|
|
||||||
0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
|
|
||||||
0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
|
|
||||||
0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
|
|
||||||
0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
|
|
||||||
0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The inverse SubByte S-Box
|
|
||||||
*
|
|
||||||
* @see \phpseclib\Crypt\Rijndael::_decryptBlock()
|
|
||||||
* @var Array
|
|
||||||
* @access private
|
|
||||||
*/
|
|
||||||
var $isbox = array(
|
|
||||||
0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
|
|
||||||
0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
|
|
||||||
0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
|
|
||||||
0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
|
|
||||||
0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
|
|
||||||
0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
|
|
||||||
0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
|
|
||||||
0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
|
|
||||||
0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
|
|
||||||
0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
|
|
||||||
0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
|
|
||||||
0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
|
|
||||||
0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
|
|
||||||
0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
|
|
||||||
0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
|
|
||||||
0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the key.
|
* Sets the key.
|
||||||
@ -618,8 +232,6 @@ class Rijndael extends Base
|
|||||||
*/
|
*/
|
||||||
function setKey($key)
|
function setKey($key)
|
||||||
{
|
{
|
||||||
parent::setKey($key);
|
|
||||||
|
|
||||||
if (!$this->explicit_key_length) {
|
if (!$this->explicit_key_length) {
|
||||||
$length = strlen($key);
|
$length = strlen($key);
|
||||||
switch (true) {
|
switch (true) {
|
||||||
@ -638,8 +250,8 @@ class Rijndael extends Base
|
|||||||
default:
|
default:
|
||||||
$this->key_size = 32;
|
$this->key_size = 32;
|
||||||
}
|
}
|
||||||
$this->_setupEngine();
|
|
||||||
}
|
}
|
||||||
|
parent::setKey($key);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -683,7 +295,7 @@ class Rijndael extends Base
|
|||||||
|
|
||||||
$this->explicit_key_length = true;
|
$this->explicit_key_length = true;
|
||||||
$this->changed = true;
|
$this->changed = true;
|
||||||
$this->_setupEngine();
|
$this->_setEngine();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -706,64 +318,38 @@ class Rijndael extends Base
|
|||||||
$this->Nb = $length;
|
$this->Nb = $length;
|
||||||
$this->block_size = $length << 2;
|
$this->block_size = $length << 2;
|
||||||
$this->changed = true;
|
$this->changed = true;
|
||||||
$this->_setupEngine();
|
$this->_setEngine();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Setup the fastest possible $engine
|
* Test for engine validity
|
||||||
*
|
*
|
||||||
* Determines if the mcrypt (\phpseclib\Crypt\Base::ENGINE_MCRYPT) $engine available
|
* This is mainly just a wrapper to set things up for \phpseclib\Crypt\Base::isValidEngine()
|
||||||
* and usable for the current $block_size and $key_size.
|
|
||||||
*
|
*
|
||||||
* If not, the slower \phpseclib\Crypt\Base::ENGINE_INTERNAL $engine will be set.
|
* @see \phpseclib\Crypt\Base::Crypt_Base()
|
||||||
*
|
* @param Integer $engine
|
||||||
* @see setKey()
|
* @access public
|
||||||
* @see setKeyLength()
|
* @return Boolean
|
||||||
* @see setBlockLength()
|
|
||||||
* @access private
|
|
||||||
*/
|
*/
|
||||||
function _setupEngine()
|
function isValidEngine($engine)
|
||||||
{
|
{
|
||||||
if (constant('CRYPT_' . $this->const_namespace . '_MODE') == Base::ENGINE_INTERNAL) {
|
switch ($engine) {
|
||||||
// No mcrypt support at all for rijndael
|
case self::ENGINE_OPENSSL:
|
||||||
return;
|
if ($this->block_size != 16) {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
$this->cipher_name_openssl_ecb = 'aes-' . ($this->key_size << 3) . '-ecb';
|
||||||
// The required mcrypt module name for the current $block_size of rijndael
|
$this->cipher_name_openssl = 'aes-' . ($this->key_size << 3) . '-' . $this->_openssl_translate_mode();
|
||||||
$cipher_name_mcrypt = 'rijndael-' . ($this->block_size << 3);
|
|
||||||
|
|
||||||
// Determining the availibility/usability of $cipher_name_mcrypt
|
|
||||||
switch (true) {
|
|
||||||
case $this->key_size % 8: // mcrypt is not usable for 160/224-bit keys, only for 128/192/256-bit keys
|
|
||||||
case !in_array($cipher_name_mcrypt, mcrypt_list_algorithms()): // $cipher_name_mcrypt is not available for the current $block_size
|
|
||||||
$engine = Base::ENGINE_INTERNAL;
|
|
||||||
break;
|
break;
|
||||||
default:
|
case self::ENGINE_MCRYPT:
|
||||||
$engine = Base::ENGINE_MCRYPT;
|
$this->cipher_name_mcrypt = 'rijndael-' . ($this->block_size << 3);
|
||||||
}
|
if ($this->key_size % 8) { // is it a 160/224-bit key?
|
||||||
|
// mcrypt is not usable for them, only for 128/192/256-bit keys
|
||||||
if ($this->engine == $engine && $this->cipher_name_mcrypt == $cipher_name_mcrypt) {
|
return false;
|
||||||
// allready set, so we not unnecessary close $this->enmcrypt/demcrypt/ecb
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the $engine
|
|
||||||
$this->engine = $engine;
|
|
||||||
$this->cipher_name_mcrypt = $cipher_name_mcrypt;
|
|
||||||
|
|
||||||
if ($this->enmcrypt) {
|
|
||||||
// Closing the current mcrypt resource(s). _mcryptSetup() will, if needed,
|
|
||||||
// (re)open them with the module named in $this->cipher_name_mcrypt
|
|
||||||
mcrypt_module_close($this->enmcrypt);
|
|
||||||
mcrypt_module_close($this->demcrypt);
|
|
||||||
$this->enmcrypt = null;
|
|
||||||
$this->demcrypt = null;
|
|
||||||
|
|
||||||
if ($this->ecb) {
|
|
||||||
mcrypt_module_close($this->ecb);
|
|
||||||
$this->ecb = null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return parent::isValidEngine($engine);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -787,16 +373,15 @@ class Rijndael extends Base
|
|||||||
*/
|
*/
|
||||||
function _encryptBlock($in)
|
function _encryptBlock($in)
|
||||||
{
|
{
|
||||||
static $t0, $t1, $t2, $t3, $sbox;
|
static $tables;
|
||||||
if (!$t0) {
|
if (empty($tables)) {
|
||||||
for ($i = 0; $i < 256; ++$i) {
|
$tables = &$this->_getTables();
|
||||||
$t0[] = (int)$this->t0[$i];
|
|
||||||
$t1[] = (int)$this->t1[$i];
|
|
||||||
$t2[] = (int)$this->t2[$i];
|
|
||||||
$t3[] = (int)$this->t3[$i];
|
|
||||||
$sbox[] = (int)$this->sbox[$i];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
$t0 = $tables[0];
|
||||||
|
$t1 = $tables[1];
|
||||||
|
$t2 = $tables[2];
|
||||||
|
$t3 = $tables[3];
|
||||||
|
$sbox = $tables[4];
|
||||||
|
|
||||||
$state = array();
|
$state = array();
|
||||||
$words = unpack('N*', $in);
|
$words = unpack('N*', $in);
|
||||||
@ -807,9 +392,9 @@ class Rijndael extends Base
|
|||||||
$Nr = $this->Nr;
|
$Nr = $this->Nr;
|
||||||
|
|
||||||
// addRoundKey
|
// addRoundKey
|
||||||
$i = -1;
|
$wc = $Nb - 1;
|
||||||
foreach ($words as $word) {
|
foreach ($words as $word) {
|
||||||
$state[] = $word ^ $w[0][++$i];
|
$state[] = $word ^ $w[++$wc];
|
||||||
}
|
}
|
||||||
|
|
||||||
// fips-197.pdf#page=19, "Figure 5. Pseudo Code for the Cipher", states that this loop has four components -
|
// fips-197.pdf#page=19, "Figure 5. Pseudo Code for the Cipher", states that this loop has four components -
|
||||||
@ -832,7 +417,7 @@ class Rijndael extends Base
|
|||||||
$t1[$state[$j] >> 16 & 0x000000FF] ^
|
$t1[$state[$j] >> 16 & 0x000000FF] ^
|
||||||
$t2[$state[$k] >> 8 & 0x000000FF] ^
|
$t2[$state[$k] >> 8 & 0x000000FF] ^
|
||||||
$t3[$state[$l] & 0x000000FF] ^
|
$t3[$state[$l] & 0x000000FF] ^
|
||||||
$w[$round][$i];
|
$w[++$wc];
|
||||||
++$i;
|
++$i;
|
||||||
$j = ($j + 1) % $Nb;
|
$j = ($j + 1) % $Nb;
|
||||||
$k = ($k + 1) % $Nb;
|
$k = ($k + 1) % $Nb;
|
||||||
@ -859,7 +444,7 @@ class Rijndael extends Base
|
|||||||
($state[$j] & 0x00FF0000) ^
|
($state[$j] & 0x00FF0000) ^
|
||||||
($state[$k] & 0x0000FF00) ^
|
($state[$k] & 0x0000FF00) ^
|
||||||
($state[$l] & 0x000000FF) ^
|
($state[$l] & 0x000000FF) ^
|
||||||
$w[$Nr][$i];
|
$w[$i];
|
||||||
++$i;
|
++$i;
|
||||||
$j = ($j + 1) % $Nb;
|
$j = ($j + 1) % $Nb;
|
||||||
$k = ($k + 1) % $Nb;
|
$k = ($k + 1) % $Nb;
|
||||||
@ -889,16 +474,15 @@ class Rijndael extends Base
|
|||||||
*/
|
*/
|
||||||
function _decryptBlock($in)
|
function _decryptBlock($in)
|
||||||
{
|
{
|
||||||
static $dt0, $dt1, $dt2, $dt3, $isbox;
|
static $invtables;
|
||||||
if (!$dt0) {
|
if (empty($invtables)) {
|
||||||
for ($i = 0; $i < 256; ++$i) {
|
$invtables = &$this->_getInvTables();
|
||||||
$dt0[] = (int)$this->dt0[$i];
|
|
||||||
$dt1[] = (int)$this->dt1[$i];
|
|
||||||
$dt2[] = (int)$this->dt2[$i];
|
|
||||||
$dt3[] = (int)$this->dt3[$i];
|
|
||||||
$isbox[] = (int)$this->isbox[$i];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
$dt0 = $invtables[0];
|
||||||
|
$dt1 = $invtables[1];
|
||||||
|
$dt2 = $invtables[2];
|
||||||
|
$dt3 = $invtables[3];
|
||||||
|
$isbox = $invtables[4];
|
||||||
|
|
||||||
$state = array();
|
$state = array();
|
||||||
$words = unpack('N*', $in);
|
$words = unpack('N*', $in);
|
||||||
@ -909,9 +493,9 @@ class Rijndael extends Base
|
|||||||
$Nr = $this->Nr;
|
$Nr = $this->Nr;
|
||||||
|
|
||||||
// addRoundKey
|
// addRoundKey
|
||||||
$i = -1;
|
$wc = $Nb - 1;
|
||||||
foreach ($words as $word) {
|
foreach ($words as $word) {
|
||||||
$state[] = $word ^ $dw[$Nr][++$i];
|
$state[] = $word ^ $dw[++$wc];
|
||||||
}
|
}
|
||||||
|
|
||||||
$temp = array();
|
$temp = array();
|
||||||
@ -926,7 +510,7 @@ class Rijndael extends Base
|
|||||||
$dt1[$state[$j] >> 16 & 0x000000FF] ^
|
$dt1[$state[$j] >> 16 & 0x000000FF] ^
|
||||||
$dt2[$state[$k] >> 8 & 0x000000FF] ^
|
$dt2[$state[$k] >> 8 & 0x000000FF] ^
|
||||||
$dt3[$state[$l] & 0x000000FF] ^
|
$dt3[$state[$l] & 0x000000FF] ^
|
||||||
$dw[$round][$i];
|
$dw[++$wc];
|
||||||
++$i;
|
++$i;
|
||||||
$j = ($j + 1) % $Nb;
|
$j = ($j + 1) % $Nb;
|
||||||
$k = ($k + 1) % $Nb;
|
$k = ($k + 1) % $Nb;
|
||||||
@ -947,7 +531,7 @@ class Rijndael extends Base
|
|||||||
($state[$k] & 0x0000FF00) |
|
($state[$k] & 0x0000FF00) |
|
||||||
($state[$l] & 0x000000FF);
|
($state[$l] & 0x000000FF);
|
||||||
|
|
||||||
$temp[$i] = $dw[0][$i] ^ ($isbox[$word & 0x000000FF] |
|
$temp[$i] = $dw[$i] ^ ($isbox[$word & 0x000000FF] |
|
||||||
($isbox[$word >> 8 & 0x000000FF] << 8) |
|
($isbox[$word >> 8 & 0x000000FF] << 8) |
|
||||||
($isbox[$word >> 16 & 0x000000FF] << 16) |
|
($isbox[$word >> 16 & 0x000000FF] << 16) |
|
||||||
($isbox[$word >> 24 & 0x000000FF] << 24));
|
($isbox[$word >> 24 & 0x000000FF] << 24));
|
||||||
@ -1044,6 +628,7 @@ class Rijndael extends Base
|
|||||||
// 1. Apply the Key Expansion.
|
// 1. Apply the Key Expansion.
|
||||||
// 2. Apply InvMixColumn to all Round Keys except the first and the last one."
|
// 2. Apply InvMixColumn to all Round Keys except the first and the last one."
|
||||||
// also, see fips-197.pdf#page=27, "5.3.5 Equivalent Inverse Cipher"
|
// also, see fips-197.pdf#page=27, "5.3.5 Equivalent Inverse Cipher"
|
||||||
|
list($dt0, $dt1, $dt2, $dt3) = $this->_getInvTables();
|
||||||
$temp = $this->w = $this->dw = array();
|
$temp = $this->w = $this->dw = array();
|
||||||
for ($i = $row = $col = 0; $i < $length; $i++, $col++) {
|
for ($i = $row = $col = 0; $i < $length; $i++, $col++) {
|
||||||
if ($col == $this->Nb) {
|
if ($col == $this->Nb) {
|
||||||
@ -1054,10 +639,10 @@ class Rijndael extends Base
|
|||||||
$j = 0;
|
$j = 0;
|
||||||
while ($j < $this->Nb) {
|
while ($j < $this->Nb) {
|
||||||
$dw = $this->_subWord($this->w[$row][$j]);
|
$dw = $this->_subWord($this->w[$row][$j]);
|
||||||
$temp[$j] = $this->dt0[$dw >> 24 & 0x000000FF] ^
|
$temp[$j] = $dt0[$dw >> 24 & 0x000000FF] ^
|
||||||
$this->dt1[$dw >> 16 & 0x000000FF] ^
|
$dt1[$dw >> 16 & 0x000000FF] ^
|
||||||
$this->dt2[$dw >> 8 & 0x000000FF] ^
|
$dt2[$dw >> 8 & 0x000000FF] ^
|
||||||
$this->dt3[$dw & 0x000000FF];
|
$dt3[$dw & 0x000000FF];
|
||||||
$j++;
|
$j++;
|
||||||
}
|
}
|
||||||
$this->dw[$row] = $temp;
|
$this->dw[$row] = $temp;
|
||||||
@ -1071,8 +656,7 @@ class Rijndael extends Base
|
|||||||
|
|
||||||
$this->dw[$row] = $this->w[$row];
|
$this->dw[$row] = $this->w[$row];
|
||||||
|
|
||||||
// In case of $this->use_inline_crypt === true we have to use 1-dim key arrays (both ascending)
|
// Converting to 1-dim key arrays (both ascending)
|
||||||
if ($this->use_inline_crypt) {
|
|
||||||
$this->dw = array_reverse($this->dw);
|
$this->dw = array_reverse($this->dw);
|
||||||
$w = array_pop($this->w);
|
$w = array_pop($this->w);
|
||||||
$dw = array_pop($this->dw);
|
$dw = array_pop($this->dw);
|
||||||
@ -1085,7 +669,6 @@ class Rijndael extends Base
|
|||||||
$this->w = $w;
|
$this->w = $w;
|
||||||
$this->dw = $dw;
|
$this->dw = $dw;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Performs S-Box substitutions
|
* Performs S-Box substitutions
|
||||||
@ -1095,7 +678,10 @@ class Rijndael extends Base
|
|||||||
*/
|
*/
|
||||||
function _subWord($word)
|
function _subWord($word)
|
||||||
{
|
{
|
||||||
$sbox = $this->sbox;
|
static $sbox;
|
||||||
|
if (empty($sbox)) {
|
||||||
|
list(,,,, $sbox) = $this->_getTables();
|
||||||
|
}
|
||||||
|
|
||||||
return $sbox[$word & 0x000000FF] |
|
return $sbox[$word & 0x000000FF] |
|
||||||
($sbox[$word >> 8 & 0x000000FF] << 8) |
|
($sbox[$word >> 8 & 0x000000FF] << 8) |
|
||||||
@ -1103,6 +689,179 @@ class Rijndael extends Base
|
|||||||
($sbox[$word >> 24 & 0x000000FF] << 24);
|
($sbox[$word >> 24 & 0x000000FF] << 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides the mixColumns and sboxes tables
|
||||||
|
*
|
||||||
|
* @see Crypt_Rijndael:_encryptBlock()
|
||||||
|
* @see Crypt_Rijndael:_setupInlineCrypt()
|
||||||
|
* @see Crypt_Rijndael:_subWord()
|
||||||
|
* @access private
|
||||||
|
* @return Array &$tables
|
||||||
|
*/
|
||||||
|
function &_getTables()
|
||||||
|
{
|
||||||
|
static $tables;
|
||||||
|
if (empty($tables)) {
|
||||||
|
// according to <http://csrc.nist.gov/archive/aes/rijndael/Rijndael-ammended.pdf#page=19> (section 5.2.1),
|
||||||
|
// precomputed tables can be used in the mixColumns phase. in that example, they're assigned t0...t3, so
|
||||||
|
// those are the names we'll use.
|
||||||
|
$t3 = array_map('intval', array(
|
||||||
|
// with array_map('intval', ...) we ensure we have only int's and not
|
||||||
|
// some slower floats converted by php automatically on high values
|
||||||
|
0x6363A5C6, 0x7C7C84F8, 0x777799EE, 0x7B7B8DF6, 0xF2F20DFF, 0x6B6BBDD6, 0x6F6FB1DE, 0xC5C55491,
|
||||||
|
0x30305060, 0x01010302, 0x6767A9CE, 0x2B2B7D56, 0xFEFE19E7, 0xD7D762B5, 0xABABE64D, 0x76769AEC,
|
||||||
|
0xCACA458F, 0x82829D1F, 0xC9C94089, 0x7D7D87FA, 0xFAFA15EF, 0x5959EBB2, 0x4747C98E, 0xF0F00BFB,
|
||||||
|
0xADADEC41, 0xD4D467B3, 0xA2A2FD5F, 0xAFAFEA45, 0x9C9CBF23, 0xA4A4F753, 0x727296E4, 0xC0C05B9B,
|
||||||
|
0xB7B7C275, 0xFDFD1CE1, 0x9393AE3D, 0x26266A4C, 0x36365A6C, 0x3F3F417E, 0xF7F702F5, 0xCCCC4F83,
|
||||||
|
0x34345C68, 0xA5A5F451, 0xE5E534D1, 0xF1F108F9, 0x717193E2, 0xD8D873AB, 0x31315362, 0x15153F2A,
|
||||||
|
0x04040C08, 0xC7C75295, 0x23236546, 0xC3C35E9D, 0x18182830, 0x9696A137, 0x05050F0A, 0x9A9AB52F,
|
||||||
|
0x0707090E, 0x12123624, 0x80809B1B, 0xE2E23DDF, 0xEBEB26CD, 0x2727694E, 0xB2B2CD7F, 0x75759FEA,
|
||||||
|
0x09091B12, 0x83839E1D, 0x2C2C7458, 0x1A1A2E34, 0x1B1B2D36, 0x6E6EB2DC, 0x5A5AEEB4, 0xA0A0FB5B,
|
||||||
|
0x5252F6A4, 0x3B3B4D76, 0xD6D661B7, 0xB3B3CE7D, 0x29297B52, 0xE3E33EDD, 0x2F2F715E, 0x84849713,
|
||||||
|
0x5353F5A6, 0xD1D168B9, 0x00000000, 0xEDED2CC1, 0x20206040, 0xFCFC1FE3, 0xB1B1C879, 0x5B5BEDB6,
|
||||||
|
0x6A6ABED4, 0xCBCB468D, 0xBEBED967, 0x39394B72, 0x4A4ADE94, 0x4C4CD498, 0x5858E8B0, 0xCFCF4A85,
|
||||||
|
0xD0D06BBB, 0xEFEF2AC5, 0xAAAAE54F, 0xFBFB16ED, 0x4343C586, 0x4D4DD79A, 0x33335566, 0x85859411,
|
||||||
|
0x4545CF8A, 0xF9F910E9, 0x02020604, 0x7F7F81FE, 0x5050F0A0, 0x3C3C4478, 0x9F9FBA25, 0xA8A8E34B,
|
||||||
|
0x5151F3A2, 0xA3A3FE5D, 0x4040C080, 0x8F8F8A05, 0x9292AD3F, 0x9D9DBC21, 0x38384870, 0xF5F504F1,
|
||||||
|
0xBCBCDF63, 0xB6B6C177, 0xDADA75AF, 0x21216342, 0x10103020, 0xFFFF1AE5, 0xF3F30EFD, 0xD2D26DBF,
|
||||||
|
0xCDCD4C81, 0x0C0C1418, 0x13133526, 0xECEC2FC3, 0x5F5FE1BE, 0x9797A235, 0x4444CC88, 0x1717392E,
|
||||||
|
0xC4C45793, 0xA7A7F255, 0x7E7E82FC, 0x3D3D477A, 0x6464ACC8, 0x5D5DE7BA, 0x19192B32, 0x737395E6,
|
||||||
|
0x6060A0C0, 0x81819819, 0x4F4FD19E, 0xDCDC7FA3, 0x22226644, 0x2A2A7E54, 0x9090AB3B, 0x8888830B,
|
||||||
|
0x4646CA8C, 0xEEEE29C7, 0xB8B8D36B, 0x14143C28, 0xDEDE79A7, 0x5E5EE2BC, 0x0B0B1D16, 0xDBDB76AD,
|
||||||
|
0xE0E03BDB, 0x32325664, 0x3A3A4E74, 0x0A0A1E14, 0x4949DB92, 0x06060A0C, 0x24246C48, 0x5C5CE4B8,
|
||||||
|
0xC2C25D9F, 0xD3D36EBD, 0xACACEF43, 0x6262A6C4, 0x9191A839, 0x9595A431, 0xE4E437D3, 0x79798BF2,
|
||||||
|
0xE7E732D5, 0xC8C8438B, 0x3737596E, 0x6D6DB7DA, 0x8D8D8C01, 0xD5D564B1, 0x4E4ED29C, 0xA9A9E049,
|
||||||
|
0x6C6CB4D8, 0x5656FAAC, 0xF4F407F3, 0xEAEA25CF, 0x6565AFCA, 0x7A7A8EF4, 0xAEAEE947, 0x08081810,
|
||||||
|
0xBABAD56F, 0x787888F0, 0x25256F4A, 0x2E2E725C, 0x1C1C2438, 0xA6A6F157, 0xB4B4C773, 0xC6C65197,
|
||||||
|
0xE8E823CB, 0xDDDD7CA1, 0x74749CE8, 0x1F1F213E, 0x4B4BDD96, 0xBDBDDC61, 0x8B8B860D, 0x8A8A850F,
|
||||||
|
0x707090E0, 0x3E3E427C, 0xB5B5C471, 0x6666AACC, 0x4848D890, 0x03030506, 0xF6F601F7, 0x0E0E121C,
|
||||||
|
0x6161A3C2, 0x35355F6A, 0x5757F9AE, 0xB9B9D069, 0x86869117, 0xC1C15899, 0x1D1D273A, 0x9E9EB927,
|
||||||
|
0xE1E138D9, 0xF8F813EB, 0x9898B32B, 0x11113322, 0x6969BBD2, 0xD9D970A9, 0x8E8E8907, 0x9494A733,
|
||||||
|
0x9B9BB62D, 0x1E1E223C, 0x87879215, 0xE9E920C9, 0xCECE4987, 0x5555FFAA, 0x28287850, 0xDFDF7AA5,
|
||||||
|
0x8C8C8F03, 0xA1A1F859, 0x89898009, 0x0D0D171A, 0xBFBFDA65, 0xE6E631D7, 0x4242C684, 0x6868B8D0,
|
||||||
|
0x4141C382, 0x9999B029, 0x2D2D775A, 0x0F0F111E, 0xB0B0CB7B, 0x5454FCA8, 0xBBBBD66D, 0x16163A2C
|
||||||
|
));
|
||||||
|
|
||||||
|
foreach ($t3 as $t3i) {
|
||||||
|
$t0[] = (($t3i << 24) & 0xFF000000) | (($t3i >> 8) & 0x00FFFFFF);
|
||||||
|
$t1[] = (($t3i << 16) & 0xFFFF0000) | (($t3i >> 16) & 0x0000FFFF);
|
||||||
|
$t2[] = (($t3i << 8) & 0xFFFFFF00) | (($t3i >> 24) & 0x000000FF);
|
||||||
|
}
|
||||||
|
|
||||||
|
$tables = array(
|
||||||
|
// The Precomputed mixColumns tables t0 - t3
|
||||||
|
$t0,
|
||||||
|
$t1,
|
||||||
|
$t2,
|
||||||
|
$t3,
|
||||||
|
// The SubByte S-Box
|
||||||
|
array(
|
||||||
|
0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
|
||||||
|
0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
|
||||||
|
0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
|
||||||
|
0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
|
||||||
|
0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
|
||||||
|
0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
|
||||||
|
0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
|
||||||
|
0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
|
||||||
|
0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
|
||||||
|
0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
|
||||||
|
0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
|
||||||
|
0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
|
||||||
|
0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
|
||||||
|
0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
|
||||||
|
0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
|
||||||
|
0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return $tables;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides the inverse mixColumns and inverse sboxes tables
|
||||||
|
*
|
||||||
|
* @see Crypt_Rijndael:_decryptBlock()
|
||||||
|
* @see Crypt_Rijndael:_setupInlineCrypt()
|
||||||
|
* @see Crypt_Rijndael:_setupKey()
|
||||||
|
* @access private
|
||||||
|
* @return Array &$tables
|
||||||
|
*/
|
||||||
|
function &_getInvTables()
|
||||||
|
{
|
||||||
|
static $tables;
|
||||||
|
if (empty($tables)) {
|
||||||
|
$dt3 = array_map('intval', array(
|
||||||
|
0xF4A75051, 0x4165537E, 0x17A4C31A, 0x275E963A, 0xAB6BCB3B, 0x9D45F11F, 0xFA58ABAC, 0xE303934B,
|
||||||
|
0x30FA5520, 0x766DF6AD, 0xCC769188, 0x024C25F5, 0xE5D7FC4F, 0x2ACBD7C5, 0x35448026, 0x62A38FB5,
|
||||||
|
0xB15A49DE, 0xBA1B6725, 0xEA0E9845, 0xFEC0E15D, 0x2F7502C3, 0x4CF01281, 0x4697A38D, 0xD3F9C66B,
|
||||||
|
0x8F5FE703, 0x929C9515, 0x6D7AEBBF, 0x5259DA95, 0xBE832DD4, 0x7421D358, 0xE0692949, 0xC9C8448E,
|
||||||
|
0xC2896A75, 0x8E7978F4, 0x583E6B99, 0xB971DD27, 0xE14FB6BE, 0x88AD17F0, 0x20AC66C9, 0xCE3AB47D,
|
||||||
|
0xDF4A1863, 0x1A3182E5, 0x51336097, 0x537F4562, 0x6477E0B1, 0x6BAE84BB, 0x81A01CFE, 0x082B94F9,
|
||||||
|
0x48685870, 0x45FD198F, 0xDE6C8794, 0x7BF8B752, 0x73D323AB, 0x4B02E272, 0x1F8F57E3, 0x55AB2A66,
|
||||||
|
0xEB2807B2, 0xB5C2032F, 0xC57B9A86, 0x3708A5D3, 0x2887F230, 0xBFA5B223, 0x036ABA02, 0x16825CED,
|
||||||
|
0xCF1C2B8A, 0x79B492A7, 0x07F2F0F3, 0x69E2A14E, 0xDAF4CD65, 0x05BED506, 0x34621FD1, 0xA6FE8AC4,
|
||||||
|
0x2E539D34, 0xF355A0A2, 0x8AE13205, 0xF6EB75A4, 0x83EC390B, 0x60EFAA40, 0x719F065E, 0x6E1051BD,
|
||||||
|
0x218AF93E, 0xDD063D96, 0x3E05AEDD, 0xE6BD464D, 0x548DB591, 0xC45D0571, 0x06D46F04, 0x5015FF60,
|
||||||
|
0x98FB2419, 0xBDE997D6, 0x4043CC89, 0xD99E7767, 0xE842BDB0, 0x898B8807, 0x195B38E7, 0xC8EEDB79,
|
||||||
|
0x7C0A47A1, 0x420FE97C, 0x841EC9F8, 0x00000000, 0x80868309, 0x2BED4832, 0x1170AC1E, 0x5A724E6C,
|
||||||
|
0x0EFFFBFD, 0x8538560F, 0xAED51E3D, 0x2D392736, 0x0FD9640A, 0x5CA62168, 0x5B54D19B, 0x362E3A24,
|
||||||
|
0x0A67B10C, 0x57E70F93, 0xEE96D2B4, 0x9B919E1B, 0xC0C54F80, 0xDC20A261, 0x774B695A, 0x121A161C,
|
||||||
|
0x93BA0AE2, 0xA02AE5C0, 0x22E0433C, 0x1B171D12, 0x090D0B0E, 0x8BC7ADF2, 0xB6A8B92D, 0x1EA9C814,
|
||||||
|
0xF1198557, 0x75074CAF, 0x99DDBBEE, 0x7F60FDA3, 0x01269FF7, 0x72F5BC5C, 0x663BC544, 0xFB7E345B,
|
||||||
|
0x4329768B, 0x23C6DCCB, 0xEDFC68B6, 0xE4F163B8, 0x31DCCAD7, 0x63851042, 0x97224013, 0xC6112084,
|
||||||
|
0x4A247D85, 0xBB3DF8D2, 0xF93211AE, 0x29A16DC7, 0x9E2F4B1D, 0xB230F3DC, 0x8652EC0D, 0xC1E3D077,
|
||||||
|
0xB3166C2B, 0x70B999A9, 0x9448FA11, 0xE9642247, 0xFC8CC4A8, 0xF03F1AA0, 0x7D2CD856, 0x3390EF22,
|
||||||
|
0x494EC787, 0x38D1C1D9, 0xCAA2FE8C, 0xD40B3698, 0xF581CFA6, 0x7ADE28A5, 0xB78E26DA, 0xADBFA43F,
|
||||||
|
0x3A9DE42C, 0x78920D50, 0x5FCC9B6A, 0x7E466254, 0x8D13C2F6, 0xD8B8E890, 0x39F75E2E, 0xC3AFF582,
|
||||||
|
0x5D80BE9F, 0xD0937C69, 0xD52DA96F, 0x2512B3CF, 0xAC993BC8, 0x187DA710, 0x9C636EE8, 0x3BBB7BDB,
|
||||||
|
0x267809CD, 0x5918F46E, 0x9AB701EC, 0x4F9AA883, 0x956E65E6, 0xFFE67EAA, 0xBCCF0821, 0x15E8E6EF,
|
||||||
|
0xE79BD9BA, 0x6F36CE4A, 0x9F09D4EA, 0xB07CD629, 0xA4B2AF31, 0x3F23312A, 0xA59430C6, 0xA266C035,
|
||||||
|
0x4EBC3774, 0x82CAA6FC, 0x90D0B0E0, 0xA7D81533, 0x04984AF1, 0xECDAF741, 0xCD500E7F, 0x91F62F17,
|
||||||
|
0x4DD68D76, 0xEFB04D43, 0xAA4D54CC, 0x9604DFE4, 0xD1B5E39E, 0x6A881B4C, 0x2C1FB8C1, 0x65517F46,
|
||||||
|
0x5EEA049D, 0x8C355D01, 0x877473FA, 0x0B412EFB, 0x671D5AB3, 0xDBD25292, 0x105633E9, 0xD647136D,
|
||||||
|
0xD7618C9A, 0xA10C7A37, 0xF8148E59, 0x133C89EB, 0xA927EECE, 0x61C935B7, 0x1CE5EDE1, 0x47B13C7A,
|
||||||
|
0xD2DF599C, 0xF2733F55, 0x14CE7918, 0xC737BF73, 0xF7CDEA53, 0xFDAA5B5F, 0x3D6F14DF, 0x44DB8678,
|
||||||
|
0xAFF381CA, 0x68C43EB9, 0x24342C38, 0xA3405FC2, 0x1DC37216, 0xE2250CBC, 0x3C498B28, 0x0D9541FF,
|
||||||
|
0xA8017139, 0x0CB3DE08, 0xB4E49CD8, 0x56C19064, 0xCB84617B, 0x32B670D5, 0x6C5C7448, 0xB85742D0
|
||||||
|
));
|
||||||
|
|
||||||
|
foreach ($dt3 as $dt3i) {
|
||||||
|
$dt0[] = (($dt3i << 24) & 0xFF000000) | (($dt3i >> 8) & 0x00FFFFFF);
|
||||||
|
$dt1[] = (($dt3i << 16) & 0xFFFF0000) | (($dt3i >> 16) & 0x0000FFFF);
|
||||||
|
$dt2[] = (($dt3i << 8) & 0xFFFFFF00) | (($dt3i >> 24) & 0x000000FF);
|
||||||
|
};
|
||||||
|
|
||||||
|
$tables = array(
|
||||||
|
// The Precomputed inverse mixColumns tables dt0 - dt3
|
||||||
|
$dt0,
|
||||||
|
$dt1,
|
||||||
|
$dt2,
|
||||||
|
$dt3,
|
||||||
|
// The inverse SubByte S-Box
|
||||||
|
array(
|
||||||
|
0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
|
||||||
|
0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
|
||||||
|
0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
|
||||||
|
0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
|
||||||
|
0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
|
||||||
|
0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
|
||||||
|
0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
|
||||||
|
0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
|
||||||
|
0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
|
||||||
|
0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
|
||||||
|
0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
|
||||||
|
0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
|
||||||
|
0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
|
||||||
|
0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
|
||||||
|
0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
|
||||||
|
0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return $tables;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Setup the performance-optimized function for de/encrypt()
|
* Setup the performance-optimized function for de/encrypt()
|
||||||
*
|
*
|
||||||
@ -1117,15 +876,27 @@ class Rijndael extends Base
|
|||||||
|
|
||||||
$lambda_functions =& self::_getLambdaFunctions();
|
$lambda_functions =& self::_getLambdaFunctions();
|
||||||
|
|
||||||
// The first 10 generated $lambda_functions will use the key-words hardcoded for better performance.
|
// We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function.
|
||||||
// For memory reason we limit those ultra-optimized functions.
|
// (Currently, for Crypt_Rijndael/AES, one generated $lambda_function cost on php5.5@32bit ~80kb unfreeable mem and ~130kb on php5.5@64bit)
|
||||||
// After that, we use pure (extracted) integer vars for the key-words which is faster than accessing them via array.
|
// After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one.
|
||||||
if (count($lambda_functions) < 10) {
|
$gen_hi_opt_code = (bool)( count($lambda_functions) < 10 );
|
||||||
|
|
||||||
|
// Generation of a uniqe hash for our generated code
|
||||||
|
$code_hash = "Crypt_Rijndael, {$this->mode}, {$this->Nr}, {$this->Nb}";
|
||||||
|
if ($gen_hi_opt_code) {
|
||||||
|
$code_hash = str_pad($code_hash, 32) . $this->_hashInlineCryptFunction($this->key);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($lambda_functions[$code_hash])) {
|
||||||
|
switch (true) {
|
||||||
|
case $gen_hi_opt_code:
|
||||||
|
// The hi-optimized $lambda_functions will use the key-words hardcoded for better performance.
|
||||||
$w = $this->w;
|
$w = $this->w;
|
||||||
$dw = $this->dw;
|
$dw = $this->dw;
|
||||||
$init_encrypt = '';
|
$init_encrypt = '';
|
||||||
$init_decrypt = '';
|
$init_decrypt = '';
|
||||||
} else {
|
break;
|
||||||
|
default:
|
||||||
for ($i = 0, $cw = count($this->w); $i < $cw; ++$i) {
|
for ($i = 0, $cw = count($this->w); $i < $cw; ++$i) {
|
||||||
$w[] = '$w[' . $i . ']';
|
$w[] = '$w[' . $i . ']';
|
||||||
$dw[] = '$dw[' . $i . ']';
|
$dw[] = '$dw[' . $i . ']';
|
||||||
@ -1134,25 +905,21 @@ class Rijndael extends Base
|
|||||||
$init_decrypt = '$dw = $self->dw;';
|
$init_decrypt = '$dw = $self->dw;';
|
||||||
}
|
}
|
||||||
|
|
||||||
$code_hash = md5(str_pad("Rijndael, {$this->mode}, {$this->block_size}, ", 32, "\0") . implode(',', $w));
|
|
||||||
|
|
||||||
if (!isset($lambda_functions[$code_hash])) {
|
|
||||||
$Nr = $this->Nr;
|
$Nr = $this->Nr;
|
||||||
$Nb = $this->Nb;
|
$Nb = $this->Nb;
|
||||||
$c = $this->c;
|
$c = $this->c;
|
||||||
|
|
||||||
// Generating encrypt code:
|
// Generating encrypt code:
|
||||||
$init_encrypt.= '
|
$init_encrypt.= '
|
||||||
static $t0, $t1, $t2, $t3, $sbox;
|
static $tables;
|
||||||
if (!$t0) {
|
if (empty($tables)) {
|
||||||
for ($i = 0; $i < 256; ++$i) {
|
$tables = &$self->_getTables();
|
||||||
$t0[$i] = (int)$self->t0[$i];
|
|
||||||
$t1[$i] = (int)$self->t1[$i];
|
|
||||||
$t2[$i] = (int)$self->t2[$i];
|
|
||||||
$t3[$i] = (int)$self->t3[$i];
|
|
||||||
$sbox[$i] = (int)$self->sbox[$i];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
$t0 = $tables[0];
|
||||||
|
$t1 = $tables[1];
|
||||||
|
$t2 = $tables[2];
|
||||||
|
$t3 = $tables[3];
|
||||||
|
$sbox = $tables[4];
|
||||||
';
|
';
|
||||||
|
|
||||||
$s = 'e';
|
$s = 'e';
|
||||||
@ -1191,7 +958,7 @@ class Rijndael extends Base
|
|||||||
$encrypt_block .= '$in = pack("N*"'."\n";
|
$encrypt_block .= '$in = pack("N*"'."\n";
|
||||||
for ($i = 0; $i < $Nb; ++$i) {
|
for ($i = 0; $i < $Nb; ++$i) {
|
||||||
$encrypt_block.= ',
|
$encrypt_block.= ',
|
||||||
($'.$e.$i .' & 0xFF000000) ^
|
($'.$e.$i .' & '.((int)0xFF000000).') ^
|
||||||
($'.$e.(($i + $c[1]) % $Nb).' & 0x00FF0000 ) ^
|
($'.$e.(($i + $c[1]) % $Nb).' & 0x00FF0000 ) ^
|
||||||
($'.$e.(($i + $c[2]) % $Nb).' & 0x0000FF00 ) ^
|
($'.$e.(($i + $c[2]) % $Nb).' & 0x0000FF00 ) ^
|
||||||
($'.$e.(($i + $c[3]) % $Nb).' & 0x000000FF ) ^
|
($'.$e.(($i + $c[3]) % $Nb).' & 0x000000FF ) ^
|
||||||
@ -1201,16 +968,15 @@ class Rijndael extends Base
|
|||||||
|
|
||||||
// Generating decrypt code:
|
// Generating decrypt code:
|
||||||
$init_decrypt.= '
|
$init_decrypt.= '
|
||||||
static $dt0, $dt1, $dt2, $dt3, $isbox;
|
static $invtables;
|
||||||
if (!$dt0) {
|
if (empty($invtables)) {
|
||||||
for ($i = 0; $i < 256; ++$i) {
|
$invtables = &$self->_getInvTables();
|
||||||
$dt0[$i] = (int)$self->dt0[$i];
|
|
||||||
$dt1[$i] = (int)$self->dt1[$i];
|
|
||||||
$dt2[$i] = (int)$self->dt2[$i];
|
|
||||||
$dt3[$i] = (int)$self->dt3[$i];
|
|
||||||
$isbox[$i] = (int)$self->isbox[$i];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
$dt0 = $invtables[0];
|
||||||
|
$dt1 = $invtables[1];
|
||||||
|
$dt2 = $invtables[2];
|
||||||
|
$dt3 = $invtables[3];
|
||||||
|
$isbox = $invtables[4];
|
||||||
';
|
';
|
||||||
|
|
||||||
$s = 'e';
|
$s = 'e';
|
||||||
@ -1249,7 +1015,7 @@ class Rijndael extends Base
|
|||||||
$decrypt_block .= '$in = pack("N*"'."\n";
|
$decrypt_block .= '$in = pack("N*"'."\n";
|
||||||
for ($i = 0; $i < $Nb; ++$i) {
|
for ($i = 0; $i < $Nb; ++$i) {
|
||||||
$decrypt_block.= ',
|
$decrypt_block.= ',
|
||||||
($'.$e.$i. ' & 0xFF000000) ^
|
($'.$e.$i. ' & '.((int)0xFF000000).') ^
|
||||||
($'.$e.(($Nb + $i - $c[1]) % $Nb).' & 0x00FF0000 ) ^
|
($'.$e.(($Nb + $i - $c[1]) % $Nb).' & 0x00FF0000 ) ^
|
||||||
($'.$e.(($Nb + $i - $c[2]) % $Nb).' & 0x0000FF00 ) ^
|
($'.$e.(($Nb + $i - $c[2]) % $Nb).' & 0x0000FF00 ) ^
|
||||||
($'.$e.(($Nb + $i - $c[3]) % $Nb).' & 0x000000FF ) ^
|
($'.$e.(($Nb + $i - $c[3]) % $Nb).' & 0x000000FF ) ^
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
*
|
*
|
||||||
* Uses mcrypt, if available, and an internal implementation, otherwise. Operates in the EDE3 mode (encrypt-decrypt-encrypt).
|
* Uses mcrypt, if available, and an internal implementation, otherwise. Operates in the EDE3 mode (encrypt-decrypt-encrypt).
|
||||||
*
|
*
|
||||||
* PHP versions 4 and 5
|
* PHP version 5
|
||||||
*
|
*
|
||||||
* Here's a short example of how to use this library:
|
* Here's a short example of how to use this library:
|
||||||
* <code>
|
* <code>
|
||||||
@ -84,16 +84,6 @@ class TripleDES extends DES
|
|||||||
*/
|
*/
|
||||||
var $password_default_salt = 'phpseclib';
|
var $password_default_salt = 'phpseclib';
|
||||||
|
|
||||||
/**
|
|
||||||
* The namespace used by the cipher for its constants.
|
|
||||||
*
|
|
||||||
* @see \phpseclib\Crypt\DES::const_namespace
|
|
||||||
* @see \phpseclib\Crypt\Base::const_namespace
|
|
||||||
* @var String
|
|
||||||
* @access private
|
|
||||||
*/
|
|
||||||
var $const_namespace = 'DES';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The mcrypt specific name of the cipher
|
* The mcrypt specific name of the cipher
|
||||||
*
|
*
|
||||||
@ -194,6 +184,27 @@ class TripleDES extends DES
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for engine validity
|
||||||
|
*
|
||||||
|
* This is mainly just a wrapper to set things up for \phpseclib\Crypt\Base::isValidEngine()
|
||||||
|
*
|
||||||
|
* @see \phpseclib\Crypt\Base::Crypt_Base()
|
||||||
|
* @param Integer $engine
|
||||||
|
* @access public
|
||||||
|
* @return Boolean
|
||||||
|
*/
|
||||||
|
function isValidEngine($engine)
|
||||||
|
{
|
||||||
|
if ($engine == self::ENGINE_OPENSSL) {
|
||||||
|
$this->cipher_name_openssl_ecb = 'des-ede3';
|
||||||
|
$mode = $this->_openssl_translate_mode();
|
||||||
|
$this->cipher_name_openssl = $mode == 'ecb' ? 'des-ede3' : 'des-ede3-' . $mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent::isValidEngine($engine);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the initialization vector. (optional)
|
* Sets the initialization vector. (optional)
|
||||||
*
|
*
|
||||||
@ -236,7 +247,7 @@ class TripleDES extends DES
|
|||||||
$key = str_pad(substr($key, 0, 24), 24, chr(0));
|
$key = str_pad(substr($key, 0, 24), 24, chr(0));
|
||||||
// if $key is between 64 and 128-bits, use the first 64-bits as the last, per this:
|
// if $key is between 64 and 128-bits, use the first 64-bits as the last, per this:
|
||||||
// http://php.net/function.mcrypt-encrypt#47973
|
// http://php.net/function.mcrypt-encrypt#47973
|
||||||
//$key = $length <= 16 ? substr_replace($key, substr($key, 0, 8), 16) : substr($key, 0, 24);
|
$key = $length <= 16 ? substr_replace($key, substr($key, 0, 8), 16) : substr($key, 0, 24);
|
||||||
} else {
|
} else {
|
||||||
$key = str_pad($key, 8, chr(0));
|
$key = str_pad($key, 8, chr(0));
|
||||||
}
|
}
|
||||||
@ -406,4 +417,24 @@ class TripleDES extends DES
|
|||||||
// setup our key
|
// setup our key
|
||||||
parent::_setupKey();
|
parent::_setupKey();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the internal crypt engine
|
||||||
|
*
|
||||||
|
* @see \phpseclib\Crypt\Base::Crypt_Base()
|
||||||
|
* @see \phpseclib\Crypt\Base::setPreferredEngine()
|
||||||
|
* @param Integer $engine
|
||||||
|
* @access public
|
||||||
|
* @return Integer
|
||||||
|
*/
|
||||||
|
function setPreferredEngine($engine)
|
||||||
|
{
|
||||||
|
if ($this->mode_3cbc) {
|
||||||
|
$this->des[0]->setPreferredEngine($engine);
|
||||||
|
$this->des[1]->setPreferredEngine($engine);
|
||||||
|
$this->des[2]->setPreferredEngine($engine);
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent::setPreferredEngine($engine);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
*
|
*
|
||||||
* Uses mcrypt, if available, and an internal implementation, otherwise.
|
* Uses mcrypt, if available, and an internal implementation, otherwise.
|
||||||
*
|
*
|
||||||
* PHP versions 4 and 5
|
* PHP version 5
|
||||||
*
|
*
|
||||||
* Useful resources are as follows:
|
* Useful resources are as follows:
|
||||||
*
|
*
|
||||||
@ -49,15 +49,6 @@ use phpseclib\Crypt\Base;
|
|||||||
*/
|
*/
|
||||||
class Twofish extends Base
|
class Twofish extends Base
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* The namespace used by the cipher for its constants.
|
|
||||||
*
|
|
||||||
* @see \phpseclib\Crypt\Base::const_namespace
|
|
||||||
* @var String
|
|
||||||
* @access private
|
|
||||||
*/
|
|
||||||
var $const_namespace = 'TWOFISH';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The mcrypt specific name of the cipher
|
* The mcrypt specific name of the cipher
|
||||||
*
|
*
|
||||||
@ -678,21 +669,19 @@ class Twofish extends Base
|
|||||||
$lambda_functions =& self::_getLambdaFunctions();
|
$lambda_functions =& self::_getLambdaFunctions();
|
||||||
|
|
||||||
// Max. 10 Ultra-Hi-optimized inline-crypt functions. After that, we'll (still) create very fast code, but not the ultimate fast one.
|
// Max. 10 Ultra-Hi-optimized inline-crypt functions. After that, we'll (still) create very fast code, but not the ultimate fast one.
|
||||||
|
// (Currently, for Crypt_Twofish, one generated $lambda_function cost on php5.5@32bit ~140kb unfreeable mem and ~240kb on php5.5@64bit)
|
||||||
$gen_hi_opt_code = (bool)( count($lambda_functions) < 10 );
|
$gen_hi_opt_code = (bool)( count($lambda_functions) < 10 );
|
||||||
|
|
||||||
switch (true) {
|
// Generation of a uniqe hash for our generated code
|
||||||
case $gen_hi_opt_code:
|
$code_hash = "Crypt_Twofish, {$this->mode}";
|
||||||
$code_hash = md5(str_pad("Twofish, {$this->mode}, ", 32, "\0") . $this->key);
|
if ($gen_hi_opt_code) {
|
||||||
break;
|
$code_hash = str_pad($code_hash, 32) . $this->_hashInlineCryptFunction($this->key);
|
||||||
default:
|
|
||||||
$code_hash = "Twofish, {$this->mode}";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isset($lambda_functions[$code_hash])) {
|
if (!isset($lambda_functions[$code_hash])) {
|
||||||
switch (true) {
|
switch (true) {
|
||||||
case $gen_hi_opt_code:
|
case $gen_hi_opt_code:
|
||||||
$K = $this->K;
|
$K = $this->K;
|
||||||
|
|
||||||
$init_crypt = '
|
$init_crypt = '
|
||||||
static $S0, $S1, $S2, $S3;
|
static $S0, $S1, $S2, $S3;
|
||||||
if (!$S0) {
|
if (!$S0) {
|
||||||
@ -710,7 +699,6 @@ class Twofish extends Base
|
|||||||
for ($i = 0; $i < 40; ++$i) {
|
for ($i = 0; $i < 40; ++$i) {
|
||||||
$K[] = '$K_' . $i;
|
$K[] = '$K_' . $i;
|
||||||
}
|
}
|
||||||
|
|
||||||
$init_crypt = '
|
$init_crypt = '
|
||||||
$S0 = $self->S0;
|
$S0 = $self->S0;
|
||||||
$S1 = $self->S1;
|
$S1 = $self->S1;
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
/**
|
/**
|
||||||
* Pure-PHP ANSI Decoder
|
* Pure-PHP ANSI Decoder
|
||||||
*
|
*
|
||||||
* PHP versions 4 and 5
|
* PHP version 5
|
||||||
*
|
*
|
||||||
* If you call read() in \phpseclib\Net\SSH2 you may get {@link http://en.wikipedia.org/wiki/ANSI_escape_code ANSI escape codes} back.
|
* If you call read() in \phpseclib\Net\SSH2 you may get {@link http://en.wikipedia.org/wiki/ANSI_escape_code ANSI escape codes} back.
|
||||||
* They'd look like chr(0x1B) . '[00m' or whatever (0x1B = ESC). They tell a
|
* They'd look like chr(0x1B) . '[00m' or whatever (0x1B = ESC). They tell a
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
/**
|
/**
|
||||||
* Pure-PHP ASN.1 Parser
|
* Pure-PHP ASN.1 Parser
|
||||||
*
|
*
|
||||||
* PHP versions 4 and 5
|
* PHP version 5
|
||||||
*
|
*
|
||||||
* ASN.1 provides the semantics for data encoded using various schemes. The most commonly
|
* ASN.1 provides the semantics for data encoded using various schemes. The most commonly
|
||||||
* utilized scheme is DER or the "Distinguished Encoding Rules". PEM's are base64 encoded
|
* utilized scheme is DER or the "Distinguished Encoding Rules". PEM's are base64 encoded
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
/**
|
/**
|
||||||
* Pure-PHP ASN.1 Parser
|
* Pure-PHP ASN.1 Parser
|
||||||
*
|
*
|
||||||
* PHP versions 4 and 5
|
* PHP version 5
|
||||||
*
|
*
|
||||||
* @category File
|
* @category File
|
||||||
* @package ASN1
|
* @package ASN1
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
/**
|
/**
|
||||||
* Pure-PHP X.509 Parser
|
* Pure-PHP X.509 Parser
|
||||||
*
|
*
|
||||||
* PHP versions 4 and 5
|
* PHP version 5
|
||||||
*
|
*
|
||||||
* Encode and decode X.509 certificates.
|
* Encode and decode X.509 certificates.
|
||||||
*
|
*
|
||||||
@ -1568,7 +1568,7 @@ class X509
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} elseif ($map) {
|
} else {
|
||||||
$value = base64_encode($value);
|
$value = base64_encode($value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1591,6 +1591,10 @@ class X509
|
|||||||
if (is_array($extensions)) {
|
if (is_array($extensions)) {
|
||||||
$size = count($extensions);
|
$size = count($extensions);
|
||||||
for ($i = 0; $i < $size; $i++) {
|
for ($i = 0; $i < $size; $i++) {
|
||||||
|
if ($extensions[$i] instanceof Element) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
$id = $extensions[$i]['extnId'];
|
$id = $extensions[$i]['extnId'];
|
||||||
$value = &$extensions[$i]['extnValue'];
|
$value = &$extensions[$i]['extnValue'];
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* Supports base-2, base-10, base-16, and base-256 numbers. Uses the GMP or BCMath extensions, if available,
|
* Supports base-2, base-10, base-16, and base-256 numbers. Uses the GMP or BCMath extensions, if available,
|
||||||
* and an internal implementation, otherwise.
|
* and an internal implementation, otherwise.
|
||||||
*
|
*
|
||||||
* PHP versions 4 and 5
|
* PHP version 5
|
||||||
*
|
*
|
||||||
* {@internal (all DocBlock comments regarding implementation - such as the one that follows - refer to the
|
* {@internal (all DocBlock comments regarding implementation - such as the one that follows - refer to the
|
||||||
* {@link self::MODE_INTERNAL self::MODE_INTERNAL} mode)
|
* {@link self::MODE_INTERNAL self::MODE_INTERNAL} mode)
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
/**
|
/**
|
||||||
* Pure-PHP implementation of SCP.
|
* Pure-PHP implementation of SCP.
|
||||||
*
|
*
|
||||||
* PHP versions 4 and 5
|
* PHP version 5
|
||||||
*
|
*
|
||||||
* The API for this library is modeled after the API from PHP's {@link http://php.net/book.ftp FTP extension}.
|
* The API for this library is modeled after the API from PHP's {@link http://php.net/book.ftp FTP extension}.
|
||||||
*
|
*
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
/**
|
/**
|
||||||
* Pure-PHP implementation of SFTP.
|
* Pure-PHP implementation of SFTP.
|
||||||
*
|
*
|
||||||
* PHP versions 4 and 5
|
* PHP version 5
|
||||||
*
|
*
|
||||||
* Currently only supports SFTPv2 and v3, which, according to wikipedia.org, "is the most widely used version,
|
* Currently only supports SFTPv2 and v3, which, according to wikipedia.org, "is the most widely used version,
|
||||||
* implemented by the popular OpenSSH SFTP server". If you want SFTPv4/5/6 support, provide me with access
|
* implemented by the popular OpenSSH SFTP server". If you want SFTPv4/5/6 support, provide me with access
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
/**
|
/**
|
||||||
* Pure-PHP implementation of SSHv1.
|
* Pure-PHP implementation of SSHv1.
|
||||||
*
|
*
|
||||||
* PHP versions 4 and 5
|
* PHP version 5
|
||||||
*
|
*
|
||||||
* Here's a short example of how to use this library:
|
* Here's a short example of how to use this library:
|
||||||
* <code>
|
* <code>
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
/**
|
/**
|
||||||
* Pure-PHP implementation of SSHv2.
|
* Pure-PHP implementation of SSHv2.
|
||||||
*
|
*
|
||||||
* PHP versions 4 and 5
|
* PHP version 5
|
||||||
*
|
*
|
||||||
* Here are some examples of how to use this library:
|
* Here are some examples of how to use this library:
|
||||||
* <code>
|
* <code>
|
||||||
@ -103,6 +103,7 @@ class SSH2
|
|||||||
const CHANNEL_EXEC = 0; // PuTTy uses 0x100
|
const CHANNEL_EXEC = 0; // PuTTy uses 0x100
|
||||||
const CHANNEL_SHELL = 1;
|
const CHANNEL_SHELL = 1;
|
||||||
const CHANNEL_SUBSYSTEM = 2;
|
const CHANNEL_SUBSYSTEM = 2;
|
||||||
|
const CHANNEL_AGENT_FORWARD = 3;
|
||||||
/**#@-*/
|
/**#@-*/
|
||||||
|
|
||||||
/**#@+
|
/**#@+
|
||||||
@ -798,21 +799,6 @@ class SSH2
|
|||||||
*/
|
*/
|
||||||
var $port;
|
var $port;
|
||||||
|
|
||||||
/**
|
|
||||||
* Timeout for initial connection
|
|
||||||
*
|
|
||||||
* Set by the constructor call. Calling setTimeout() is optional. If it's not called functions like
|
|
||||||
* exec() won't timeout unless some PHP setting forces it too. The timeout specified in the constructor,
|
|
||||||
* however, is non-optional. There will be a timeout, whether or not you set it. If you don't it'll be
|
|
||||||
* 10 seconds. It is used by fsockopen() and the initial stream_select in that function.
|
|
||||||
*
|
|
||||||
* @see \phpseclib\Net\SSH2::__construct()
|
|
||||||
* @see \phpseclib\Net\SSH2::_connect()
|
|
||||||
* @var Integer
|
|
||||||
* @access private
|
|
||||||
*/
|
|
||||||
var $connectionTimeout;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Number of columns for terminal window size
|
* Number of columns for terminal window size
|
||||||
*
|
*
|
||||||
@ -835,6 +821,24 @@ class SSH2
|
|||||||
*/
|
*/
|
||||||
var $windowRows = 24;
|
var $windowRows = 24;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Crypto Engine
|
||||||
|
*
|
||||||
|
* @see Net_SSH2::setCryptoEngine()
|
||||||
|
* @see Net_SSH2::_key_exchange()
|
||||||
|
* @var Integer
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $crypto_engine = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A System_SSH_Agent for use in the SSH2 Agent Forwarding scenario
|
||||||
|
*
|
||||||
|
* @var System_SSH_Agent
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $agent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default Constructor.
|
* Default Constructor.
|
||||||
*
|
*
|
||||||
@ -919,7 +923,21 @@ class SSH2
|
|||||||
|
|
||||||
$this->host = $host;
|
$this->host = $host;
|
||||||
$this->port = $port;
|
$this->port = $port;
|
||||||
$this->connectionTimeout = $timeout;
|
$this->timeout = $timeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Crypto Engine Mode
|
||||||
|
*
|
||||||
|
* Possible $engine values:
|
||||||
|
* CRYPT_MODE_INTERNAL, CRYPT_MODE_MCRYPT
|
||||||
|
*
|
||||||
|
* @param Integer $engine
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function setCryptoEngine($engine)
|
||||||
|
{
|
||||||
|
$this->crypto_engine = $engine;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -936,36 +954,24 @@ class SSH2
|
|||||||
|
|
||||||
$this->bitmap |= self::MASK_CONSTRUCTOR;
|
$this->bitmap |= self::MASK_CONSTRUCTOR;
|
||||||
|
|
||||||
$timeout = $this->connectionTimeout;
|
$this->curTimeout = $this->timeout;
|
||||||
|
|
||||||
$host = $this->host . ':' . $this->port;
|
$host = $this->host . ':' . $this->port;
|
||||||
|
|
||||||
$this->last_packet = microtime(true);
|
$this->last_packet = microtime(true);
|
||||||
|
|
||||||
$start = microtime(true);
|
$start = microtime(true);
|
||||||
$this->fsock = @fsockopen($this->host, $this->port, $errno, $errstr, $timeout);
|
$this->fsock = @fsockopen($this->host, $this->port, $errno, $errstr, $this->curTimeout);
|
||||||
if (!$this->fsock) {
|
if (!$this->fsock) {
|
||||||
user_error(rtrim("Cannot connect to $host. Error $errno. $errstr"));
|
user_error(rtrim("Cannot connect to $host. Error $errno. $errstr"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$elapsed = microtime(true) - $start;
|
$elapsed = microtime(true) - $start;
|
||||||
|
|
||||||
$timeout-= $elapsed;
|
$this->curTimeout-= $elapsed;
|
||||||
|
|
||||||
if ($timeout <= 0) {
|
if ($this->curTimeout <= 0) {
|
||||||
user_error("Cannot connect to $host. Timeout error");
|
$this->is_timeout = true;
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$read = array($this->fsock);
|
|
||||||
$write = $except = null;
|
|
||||||
|
|
||||||
$sec = floor($timeout);
|
|
||||||
$usec = 1000000 * ($timeout - $sec);
|
|
||||||
|
|
||||||
// on windows this returns a "Warning: Invalid CRT parameters detected" error
|
|
||||||
// the !count() is done as a workaround for <https://bugs.php.net/42682>
|
|
||||||
if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) {
|
|
||||||
user_error("Cannot connect to $host. Banner timeout");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -983,6 +989,27 @@ class SSH2
|
|||||||
$extra.= $temp;
|
$extra.= $temp;
|
||||||
$temp = '';
|
$temp = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($this->curTimeout) {
|
||||||
|
if ($this->curTimeout < 0) {
|
||||||
|
$this->is_timeout = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$read = array($this->fsock);
|
||||||
|
$write = $except = null;
|
||||||
|
$start = microtime(true);
|
||||||
|
$sec = floor($this->curTimeout);
|
||||||
|
$usec = 1000000 * ($this->curTimeout - $sec);
|
||||||
|
// on windows this returns a "Warning: Invalid CRT parameters detected" error
|
||||||
|
// the !count() is done as a workaround for <https://bugs.php.net/42682>
|
||||||
|
if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) {
|
||||||
|
$this->is_timeout = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$elapsed = microtime(true) - $start;
|
||||||
|
$this->curTimeout-= $elapsed;
|
||||||
|
}
|
||||||
|
|
||||||
$temp.= fgets($this->fsock, 255);
|
$temp.= fgets($this->fsock, 255);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1043,7 +1070,9 @@ class SSH2
|
|||||||
$identifier = 'SSH-2.0-phpseclib_0.3';
|
$identifier = 'SSH-2.0-phpseclib_0.3';
|
||||||
|
|
||||||
$ext = array();
|
$ext = array();
|
||||||
if (extension_loaded('mcrypt')) {
|
if (extension_loaded('openssl')) {
|
||||||
|
$ext[] = 'openssl';
|
||||||
|
} elseif (extension_loaded('mcrypt')) {
|
||||||
$ext[] = 'mcrypt';
|
$ext[] = 'mcrypt';
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1116,6 +1145,15 @@ class SSH2
|
|||||||
//'none' // OPTIONAL no encryption; NOT RECOMMENDED
|
//'none' // OPTIONAL no encryption; NOT RECOMMENDED
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (extension_loaded('openssl') && !extension_loaded('mcrypt')) {
|
||||||
|
// OpenSSL does not support arcfour256 in any capacity and arcfour128 / arcfour support is limited to
|
||||||
|
// instances that do not use continuous buffers
|
||||||
|
$encryption_algorithms = array_diff(
|
||||||
|
$encryption_algorithms,
|
||||||
|
array('arcfour256', 'arcfour128', 'arcfour')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (class_exists('\phpseclib\Crypt\RC4') === false) {
|
if (class_exists('\phpseclib\Crypt\RC4') === false) {
|
||||||
$encryption_algorithms = array_diff(
|
$encryption_algorithms = array_diff(
|
||||||
$encryption_algorithms,
|
$encryption_algorithms,
|
||||||
@ -1573,6 +1611,9 @@ class SSH2
|
|||||||
$keyBytes = pack('Na*', strlen($keyBytes), $keyBytes);
|
$keyBytes = pack('Na*', strlen($keyBytes), $keyBytes);
|
||||||
|
|
||||||
if ($this->encrypt) {
|
if ($this->encrypt) {
|
||||||
|
if ($this->crypto_engine) {
|
||||||
|
$this->encrypt->setEngine($this->crypto_engine);
|
||||||
|
}
|
||||||
$this->encrypt->enableContinuousBuffer();
|
$this->encrypt->enableContinuousBuffer();
|
||||||
$this->encrypt->disablePadding();
|
$this->encrypt->disablePadding();
|
||||||
|
|
||||||
@ -1590,6 +1631,9 @@ class SSH2
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($this->decrypt) {
|
if ($this->decrypt) {
|
||||||
|
if ($this->crypto_engine) {
|
||||||
|
$this->decrypt->setEngine($this->crypto_engine);
|
||||||
|
}
|
||||||
$this->decrypt->enableContinuousBuffer();
|
$this->decrypt->enableContinuousBuffer();
|
||||||
$this->decrypt->disablePadding();
|
$this->decrypt->disablePadding();
|
||||||
|
|
||||||
@ -2055,6 +2099,7 @@ class SSH2
|
|||||||
*/
|
*/
|
||||||
function _ssh_agent_login($username, $agent)
|
function _ssh_agent_login($username, $agent)
|
||||||
{
|
{
|
||||||
|
$this->agent = $agent;
|
||||||
$keys = $agent->requestIdentities();
|
$keys = $agent->requestIdentities();
|
||||||
foreach ($keys as $key) {
|
foreach ($keys as $key) {
|
||||||
if ($this->_privatekey_login($username, $key)) {
|
if ($this->_privatekey_login($username, $key)) {
|
||||||
@ -2234,6 +2279,7 @@ class SSH2
|
|||||||
if (!$this->_send_binary_packet($packet)) {
|
if (!$this->_send_binary_packet($packet)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$response = $this->_get_binary_packet();
|
$response = $this->_get_binary_packet();
|
||||||
if ($response === false) {
|
if ($response === false) {
|
||||||
user_error('Connection closed by server');
|
user_error('Connection closed by server');
|
||||||
@ -2400,6 +2446,24 @@ class SSH2
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return an available open channel
|
||||||
|
*
|
||||||
|
* @return Integer
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function _get_open_channel()
|
||||||
|
{
|
||||||
|
$channel = self::CHANNEL_EXEC;
|
||||||
|
do {
|
||||||
|
if (isset($this->channel_status[$channel]) && $this->channel_status[$channel] == NET_SSH2_MSG_CHANNEL_OPEN) {
|
||||||
|
return $channel;
|
||||||
|
}
|
||||||
|
} while ($channel++ < self::CHANNEL_SUBSYSTEM);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the output of an interactive shell
|
* Returns the output of an interactive shell
|
||||||
*
|
*
|
||||||
@ -2758,18 +2822,41 @@ class SSH2
|
|||||||
case NET_SSH2_MSG_CHANNEL_OPEN: // see http://tools.ietf.org/html/rfc4254#section-5.1
|
case NET_SSH2_MSG_CHANNEL_OPEN: // see http://tools.ietf.org/html/rfc4254#section-5.1
|
||||||
$this->_string_shift($payload, 1);
|
$this->_string_shift($payload, 1);
|
||||||
extract(unpack('Nlength', $this->_string_shift($payload, 4)));
|
extract(unpack('Nlength', $this->_string_shift($payload, 4)));
|
||||||
$this->errors[] = 'SSH_MSG_CHANNEL_OPEN: ' . utf8_decode($this->_string_shift($payload, $length));
|
$data = $this->_string_shift($payload, $length);
|
||||||
|
|
||||||
$this->_string_shift($payload, 4); // skip over client channel
|
|
||||||
extract(unpack('Nserver_channel', $this->_string_shift($payload, 4)));
|
extract(unpack('Nserver_channel', $this->_string_shift($payload, 4)));
|
||||||
|
switch($data) {
|
||||||
|
case 'auth-agent':
|
||||||
|
case 'auth-agent@openssh.com':
|
||||||
|
if (isset($this->agent)) {
|
||||||
|
$new_channel = self::CHANNEL_AGENT_FORWARD;
|
||||||
|
|
||||||
|
extract(unpack('Nremote_window_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->window_size_server_to_client[$new_channel] = $remote_maximum_packet_size;
|
||||||
|
$this->window_size_client_to_server[$new_channel] = $this->window_size;
|
||||||
|
|
||||||
|
$packet_size = 0x4000;
|
||||||
|
|
||||||
|
$packet = pack('CN4',
|
||||||
|
NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION, $server_channel, $new_channel, $packet_size, $packet_size);
|
||||||
|
|
||||||
|
$this->server_channels[$new_channel] = $server_channel;
|
||||||
|
$this->channel_status[$new_channel] = NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION;
|
||||||
|
if (!$this->_send_binary_packet($packet)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
$packet = pack('CN3a*Na*',
|
$packet = pack('CN3a*Na*',
|
||||||
NET_SSH2_MSG_REQUEST_FAILURE, $server_channel, NET_SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED, 0, '', 0, '');
|
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);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
$payload = $this->_get_binary_packet();
|
$payload = $this->_get_binary_packet();
|
||||||
break;
|
break;
|
||||||
case NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST:
|
case NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST:
|
||||||
@ -2906,8 +2993,16 @@ class SSH2
|
|||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
extract(unpack('Ctype/Nchannel', $this->_string_shift($response, 5)));
|
extract(unpack('Ctype', $this->_string_shift($response, 1)));
|
||||||
|
|
||||||
|
if ($type == NET_SSH2_MSG_CHANNEL_OPEN) {
|
||||||
|
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
||||||
|
} else {
|
||||||
|
extract(unpack('Nchannel', $this->_string_shift($response, 4)));
|
||||||
|
}
|
||||||
|
|
||||||
|
// will not be setup yet on incoming channel open request
|
||||||
|
if (isset($channel) && isset($this->channel_status[$channel]) && isset($this->window_size_server_to_client[$channel])) {
|
||||||
$this->window_size_server_to_client[$channel]-= strlen($response);
|
$this->window_size_server_to_client[$channel]-= strlen($response);
|
||||||
|
|
||||||
// resize the window, if appropriate
|
// resize the window, if appropriate
|
||||||
@ -2929,7 +3024,9 @@ class SSH2
|
|||||||
$this->window_size_client_to_server[$channel] = $window_size;
|
$this->window_size_client_to_server[$channel] = $window_size;
|
||||||
$temp = unpack('Npacket_size_client_to_server', $this->_string_shift($response, 4));
|
$temp = unpack('Npacket_size_client_to_server', $this->_string_shift($response, 4));
|
||||||
$this->packet_size_client_to_server[$channel] = $temp['packet_size_client_to_server'];
|
$this->packet_size_client_to_server[$channel] = $temp['packet_size_client_to_server'];
|
||||||
return $client_channel == $channel ? true : $this->_get_channel_packet($client_channel, $skip_extended);
|
$result = $client_channel == $channel ? true : $this->_get_channel_packet($client_channel, $skip_extended);
|
||||||
|
$this->_on_channel_open();
|
||||||
|
return $result;
|
||||||
//case NET_SSH2_MSG_CHANNEL_OPEN_FAILURE:
|
//case NET_SSH2_MSG_CHANNEL_OPEN_FAILURE:
|
||||||
default:
|
default:
|
||||||
user_error('Unable to open channel');
|
user_error('Unable to open channel');
|
||||||
@ -2949,6 +3046,7 @@ class SSH2
|
|||||||
case NET_SSH2_MSG_CHANNEL_CLOSE:
|
case NET_SSH2_MSG_CHANNEL_CLOSE:
|
||||||
return $type == NET_SSH2_MSG_CHANNEL_CLOSE ? true : $this->_get_channel_packet($client_channel, $skip_extended);
|
return $type == NET_SSH2_MSG_CHANNEL_CLOSE ? true : $this->_get_channel_packet($client_channel, $skip_extended);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ie. $this->channel_status[$channel] == NET_SSH2_MSG_CHANNEL_DATA
|
// ie. $this->channel_status[$channel] == NET_SSH2_MSG_CHANNEL_DATA
|
||||||
|
|
||||||
@ -2965,6 +3063,15 @@ class SSH2
|
|||||||
*/
|
*/
|
||||||
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
extract(unpack('Nlength', $this->_string_shift($response, 4)));
|
||||||
$data = $this->_string_shift($response, $length);
|
$data = $this->_string_shift($response, $length);
|
||||||
|
|
||||||
|
if ($channel == self::CHANNEL_AGENT_FORWARD) {
|
||||||
|
$agent_response = $this->agent->_forward_data($data);
|
||||||
|
if (!is_bool($agent_response)) {
|
||||||
|
$this->_send_channel_packet($channel, $agent_response);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if ($client_channel == $channel) {
|
if ($client_channel == $channel) {
|
||||||
return $data;
|
return $data;
|
||||||
}
|
}
|
||||||
@ -3203,7 +3310,7 @@ class SSH2
|
|||||||
$this->bitmap^= self::MASK_WINDOW_ADJUST;
|
$this->bitmap^= self::MASK_WINDOW_ADJUST;
|
||||||
// using an invalid channel will let the buffers be built up for the valid channels
|
// using an invalid channel will let the buffers be built up for the valid channels
|
||||||
$this->_get_channel_packet(-1);
|
$this->_get_channel_packet(-1);
|
||||||
$this->bitmap^= NET_SSH2_MASK_WINDOW_ADJUST;
|
$this->bitmap^= self::MASK_WINDOW_ADJUST;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The maximum amount of data allowed is determined by the maximum
|
/* The maximum amount of data allowed is determined by the maximum
|
||||||
@ -3401,6 +3508,22 @@ class SSH2
|
|||||||
return $this->log_boundary . str_pad(dechex(ord($matches[0])), 2, '0', STR_PAD_LEFT);
|
return $this->log_boundary . str_pad(dechex(ord($matches[0])), 2, '0', STR_PAD_LEFT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper function for agent->_on_channel_open()
|
||||||
|
*
|
||||||
|
* Used when channels are created to inform agent
|
||||||
|
* of said channel opening. Must be called after
|
||||||
|
* channel open confirmation received
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _on_channel_open()
|
||||||
|
{
|
||||||
|
if (isset($this->agent)) {
|
||||||
|
$this->agent->_on_channel_open($this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns all errors
|
* Returns all errors
|
||||||
*
|
*
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pure-PHP ssh-agent client.
|
* Pure-PHP ssh-agent client.
|
||||||
*
|
*
|
||||||
* PHP versions 4 and 5
|
* PHP version 5
|
||||||
*
|
*
|
||||||
* Here are some examples of how to use this library:
|
* Here are some examples of how to use this library:
|
||||||
* <code>
|
* <code>
|
||||||
@ -61,6 +62,19 @@ class Agent
|
|||||||
const SSH_AGENT_SIGN_RESPONSE = 14;
|
const SSH_AGENT_SIGN_RESPONSE = 14;
|
||||||
/**#@-*/
|
/**#@-*/
|
||||||
|
|
||||||
|
/**@+
|
||||||
|
* Agent forwarding status
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
// no forwarding requested and not active
|
||||||
|
const FORWARD_NONE = 0;
|
||||||
|
// request agent forwarding when opportune
|
||||||
|
const FORWARD_REQUEST = 1;
|
||||||
|
// forwarding has been request and is active
|
||||||
|
const FORWARD_ACTIVE = 2;
|
||||||
|
/**#@-*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unused
|
* Unused
|
||||||
*/
|
*/
|
||||||
@ -74,6 +88,29 @@ class Agent
|
|||||||
*/
|
*/
|
||||||
var $fsock;
|
var $fsock;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Agent forwarding status
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $forward_status = self::FORWARD_NONE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Buffer for accumulating forwarded authentication
|
||||||
|
* agent data arriving on SSH data channel destined
|
||||||
|
* for agent unix socket
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $socket_buffer = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tracking the number of bytes we are expecting
|
||||||
|
* to arrive for the agent socket on the SSH data
|
||||||
|
* channel
|
||||||
|
*/
|
||||||
|
var $expected_bytes = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default Constructor
|
* Default Constructor
|
||||||
*
|
*
|
||||||
@ -156,4 +193,107 @@ class Agent
|
|||||||
|
|
||||||
return $identities;
|
return $identities;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Signal that agent forwarding should
|
||||||
|
* be requested when a channel is opened
|
||||||
|
*
|
||||||
|
* @param Net_SSH2 $ssh
|
||||||
|
* @return Boolean
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function startSSHForwarding($ssh)
|
||||||
|
{
|
||||||
|
if ($this->forward_status == self::FORWARD_NONE) {
|
||||||
|
$this->forward_status = self::FORWARD_REQUEST;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Request agent forwarding of remote server
|
||||||
|
*
|
||||||
|
* @param Net_SSH2 $ssh
|
||||||
|
* @return Boolean
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _request_forwarding($ssh)
|
||||||
|
{
|
||||||
|
$request_channel = $ssh->_get_open_channel();
|
||||||
|
if ($request_channel === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$packet = pack('CNNa*C',
|
||||||
|
NET_SSH2_MSG_CHANNEL_REQUEST, $ssh->server_channels[$request_channel], strlen('auth-agent-req@openssh.com'), 'auth-agent-req@openssh.com', 1);
|
||||||
|
|
||||||
|
$ssh->channel_status[$request_channel] = NET_SSH2_MSG_CHANNEL_REQUEST;
|
||||||
|
|
||||||
|
if (!$ssh->_send_binary_packet($packet)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$response = $ssh->_get_channel_packet($request_channel);
|
||||||
|
if ($response === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$ssh->channel_status[$request_channel] = NET_SSH2_MSG_CHANNEL_OPEN;
|
||||||
|
$this->forward_status = self::FORWARD_ACTIVE;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* On successful channel open
|
||||||
|
*
|
||||||
|
* This method is called upon successful channel
|
||||||
|
* open to give the SSH Agent an opportunity
|
||||||
|
* to take further action. i.e. request agent forwarding
|
||||||
|
*
|
||||||
|
* @param Net_SSH2 $ssh
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _on_channel_open($ssh)
|
||||||
|
{
|
||||||
|
if ($this->forward_status == self::FORWARD_REQUEST) {
|
||||||
|
$this->_request_forwarding($ssh);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Forward data to SSH Agent and return data reply
|
||||||
|
*
|
||||||
|
* @param String $data
|
||||||
|
* @return data from SSH Agent
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _forward_data($data)
|
||||||
|
{
|
||||||
|
if ($this->expected_bytes > 0) {
|
||||||
|
$this->socket_buffer.= $data;
|
||||||
|
$this->expected_bytes -= strlen($data);
|
||||||
|
} else {
|
||||||
|
$agent_data_bytes = current(unpack('N', $data));
|
||||||
|
$current_data_bytes = strlen($data);
|
||||||
|
$this->socket_buffer = $data;
|
||||||
|
if ($current_data_bytes != $agent_data_bytes + 4) {
|
||||||
|
$this->expected_bytes = ($agent_data_bytes + 4) - $current_data_bytes;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strlen($this->socket_buffer) != fwrite($this->fsock, $this->socket_buffer)) {
|
||||||
|
user_error('Connection closed attempting to forward data to SSH agent');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->socket_buffer = '';
|
||||||
|
$this->expected_bytes = 0;
|
||||||
|
|
||||||
|
$agent_reply_bytes = current(unpack('N', fread($this->fsock, 4)));
|
||||||
|
|
||||||
|
$agent_reply_data = fread($this->fsock, $agent_reply_bytes);
|
||||||
|
$agent_reply_data = current(unpack('a*', $agent_reply_data));
|
||||||
|
|
||||||
|
return pack('Na*', $agent_reply_bytes, $agent_reply_data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
/**
|
/**
|
||||||
* Pure-PHP ssh-agent client.
|
* Pure-PHP ssh-agent client.
|
||||||
*
|
*
|
||||||
* PHP versions 4 and 5
|
* PHP version 5
|
||||||
*
|
*
|
||||||
* @category System
|
* @category System
|
||||||
* @package SSH\Agent
|
* @package SSH\Agent
|
||||||
|
@ -16,17 +16,10 @@ class Functional_Net_SFTPLargeFileTest extends PhpseclibFunctionalTestCase
|
|||||||
|
|
||||||
static public function setUpBeforeClass()
|
static public function setUpBeforeClass()
|
||||||
{
|
{
|
||||||
if (!extension_loaded('mcrypt')) {
|
if (!extension_loaded('mcrypt') && !extension_loaded('openssl')) {
|
||||||
self::markTestSkipped('This test depends on mcrypt for performance.');
|
self::markTestSkipped('This test depends on mcrypt or openssl for performance.');
|
||||||
}
|
}
|
||||||
parent::setUpBeforeClass();
|
parent::setUpBeforeClass();
|
||||||
self::ensureConstant('CRYPT_AES_MODE', Base::ENGINE_MCRYPT);
|
|
||||||
self::ensureConstant('CRYPT_BLOWFISH_MODE', Base::ENGINE_MCRYPT);
|
|
||||||
self::ensureConstant('CRYPT_DES_MODE', Base::ENGINE_MCRYPT);
|
|
||||||
self::ensureConstant('CRYPT_RC2_MODE', Base::ENGINE_MCRYPT);
|
|
||||||
self::ensureConstant('CRYPT_RC4_MODE', Base::ENGINE_MCRYPT);
|
|
||||||
self::ensureConstant('CRYPT_RIJNDAEL_MODE', Base::ENGINE_MCRYPT);
|
|
||||||
self::ensureConstant('CRYPT_TWOFISH_MODE', Base::ENGINE_MCRYPT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setUp()
|
public function setUp()
|
||||||
|
@ -30,5 +30,26 @@ class Functional_Net_SSH2AgentTest extends PhpseclibFunctionalTestCase
|
|||||||
$ssh->login($this->getEnv('SSH_USERNAME'), $agent),
|
$ssh->login($this->getEnv('SSH_USERNAME'), $agent),
|
||||||
'SSH2 login using Agent failed.'
|
'SSH2 login using Agent failed.'
|
||||||
);
|
);
|
||||||
|
|
||||||
|
return array('ssh' => $ssh, 'ssh-agent' => $agent);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testAgentLogin
|
||||||
|
*/
|
||||||
|
public function testAgentForward($args)
|
||||||
|
{
|
||||||
|
$ssh = $args['ssh'];
|
||||||
|
$agent = $args['ssh-agent'];
|
||||||
|
|
||||||
|
$hostname = $this->getEnv('SSH_HOSTNAME');
|
||||||
|
$username = $this->getEnv('SSH_USERNAME');
|
||||||
|
|
||||||
|
$this->assertEquals($username, trim($ssh->exec('whoami')));
|
||||||
|
|
||||||
|
$agent->startSSHForwarding($ssh);
|
||||||
|
$this->assertEquals($username, trim($ssh->exec("ssh " . $username . "@" . $hostname . ' \'whoami\'')));
|
||||||
|
|
||||||
|
return $args;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,11 +9,8 @@ use phpseclib\Crypt\Base;
|
|||||||
|
|
||||||
class Unit_Crypt_AES_InternalTest extends Unit_Crypt_AES_TestCase
|
class Unit_Crypt_AES_InternalTest extends Unit_Crypt_AES_TestCase
|
||||||
{
|
{
|
||||||
static public function setUpBeforeClass()
|
protected function setUp()
|
||||||
{
|
{
|
||||||
parent::setUpBeforeClass();
|
$this->engine = Base::ENGINE_INTERNAL;
|
||||||
|
|
||||||
self::ensureConstant('CRYPT_AES_MODE', Base::ENGINE_INTERNAL);
|
|
||||||
self::ensureConstant('CRYPT_RIJNDAEL_MODE', Base::ENGINE_INTERNAL);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,15 +9,8 @@ use phpseclib\Crypt\Base;
|
|||||||
|
|
||||||
class Unit_Crypt_AES_McryptTest extends Unit_Crypt_AES_TestCase
|
class Unit_Crypt_AES_McryptTest extends Unit_Crypt_AES_TestCase
|
||||||
{
|
{
|
||||||
static public function setUpBeforeClass()
|
protected function setUp()
|
||||||
{
|
{
|
||||||
if (!extension_loaded('mcrypt')) {
|
$this->engine = Base::ENGINE_MCRYPT;
|
||||||
self::markTestSkipped('mcrypt extension is not available.');
|
|
||||||
}
|
|
||||||
|
|
||||||
parent::setUpBeforeClass();
|
|
||||||
|
|
||||||
self::ensureConstant('CRYPT_AES_MODE', Base::ENGINE_MCRYPT);
|
|
||||||
self::ensureConstant('CRYPT_RIJNDAEL_MODE', Base::ENGINE_MCRYPT);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
16
tests/Unit/Crypt/AES/OpenSSLTest.php
Normal file
16
tests/Unit/Crypt/AES/OpenSSLTest.php
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @author Andreas Fischer <bantu@phpbb.com>
|
||||||
|
* @copyright 2013 Andreas Fischer
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
use phpseclib\Crypt\Base;
|
||||||
|
|
||||||
|
class Unit_Crypt_AES_OpenSSLTest extends Unit_Crypt_AES_TestCase
|
||||||
|
{
|
||||||
|
protected function setUp()
|
||||||
|
{
|
||||||
|
$this->engine = Base::ENGINE_OPENSSL;
|
||||||
|
}
|
||||||
|
}
|
@ -11,14 +11,21 @@ use phpseclib\Crypt\Rijndael;
|
|||||||
|
|
||||||
abstract class Unit_Crypt_AES_TestCase extends PhpseclibTestCase
|
abstract class Unit_Crypt_AES_TestCase extends PhpseclibTestCase
|
||||||
{
|
{
|
||||||
static public function setUpBeforeClass()
|
protected $engine;
|
||||||
|
|
||||||
|
private function _checkEngine($aes)
|
||||||
{
|
{
|
||||||
include_once 'Crypt/AES.php';
|
if ($aes->getEngine() != $this->engine) {
|
||||||
|
$engine = 'internal';
|
||||||
parent::setUpBeforeClass();
|
switch ($this->engine) {
|
||||||
|
case Base::ENGINE_OPENSSL:
|
||||||
self::reRequireFile('Crypt/Rijndael.php');
|
$engine = 'OpenSSL';
|
||||||
self::reRequireFile('Crypt/AES.php');
|
break;
|
||||||
|
case Base::ENGINE_MCRYPT:
|
||||||
|
$engine = 'mcrypt';
|
||||||
|
}
|
||||||
|
self::markTestSkipped('Unable to initialize ' . $engine . ' engine');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -68,10 +75,13 @@ abstract class Unit_Crypt_AES_TestCase extends PhpseclibTestCase
|
|||||||
public function testEncryptDecryptWithContinuousBuffer($mode, $plaintext, $iv, $key)
|
public function testEncryptDecryptWithContinuousBuffer($mode, $plaintext, $iv, $key)
|
||||||
{
|
{
|
||||||
$aes = new AES($mode);
|
$aes = new AES($mode);
|
||||||
|
$aes->setPreferredEngine($this->engine);
|
||||||
$aes->enableContinuousBuffer();
|
$aes->enableContinuousBuffer();
|
||||||
$aes->setIV($iv);
|
$aes->setIV($iv);
|
||||||
$aes->setKey($key);
|
$aes->setKey($key);
|
||||||
|
|
||||||
|
$this->_checkEngine($aes);
|
||||||
|
|
||||||
$actual = '';
|
$actual = '';
|
||||||
for ($i = 0, $strlen = strlen($plaintext); $i < $strlen; ++$i) {
|
for ($i = 0, $strlen = strlen($plaintext); $i < $strlen; ++$i) {
|
||||||
$actual .= $aes->decrypt($aes->encrypt($plaintext[$i]));
|
$actual .= $aes->decrypt($aes->encrypt($plaintext[$i]));
|
||||||
@ -89,8 +99,10 @@ abstract class Unit_Crypt_AES_TestCase extends PhpseclibTestCase
|
|||||||
// https://web.archive.org/web/20070209120224/http://fp.gladman.plus.com/cryptography_technology/rijndael/aesdvec.zip
|
// https://web.archive.org/web/20070209120224/http://fp.gladman.plus.com/cryptography_technology/rijndael/aesdvec.zip
|
||||||
|
|
||||||
$aes = new Rijndael();
|
$aes = new Rijndael();
|
||||||
|
$aes->setPreferredEngine($this->engine);
|
||||||
$aes->disablePadding();
|
$aes->disablePadding();
|
||||||
$aes->setKey(pack('H*', '2b7e151628aed2a6abf7158809cf4f3c762e7160')); // 160-bit key. Valid in Rijndael.
|
$aes->setKey(pack('H*', '2b7e151628aed2a6abf7158809cf4f3c762e7160')); // 160-bit key. Valid in Rijndael.
|
||||||
|
//$this->_checkEngine($aes); // should only work in internal mode
|
||||||
$ciphertext = $aes->encrypt(pack('H*', '3243f6a8885a308d313198a2e0370734'));
|
$ciphertext = $aes->encrypt(pack('H*', '3243f6a8885a308d313198a2e0370734'));
|
||||||
$this->assertEquals($ciphertext, pack('H*', '231d844639b31b412211cfe93712b880'));
|
$this->assertEquals($ciphertext, pack('H*', '231d844639b31b412211cfe93712b880'));
|
||||||
}
|
}
|
||||||
@ -103,9 +115,221 @@ abstract class Unit_Crypt_AES_TestCase extends PhpseclibTestCase
|
|||||||
// same as the above - just with a different ciphertext
|
// same as the above - just with a different ciphertext
|
||||||
|
|
||||||
$aes = new AES();
|
$aes = new AES();
|
||||||
|
$aes->setPreferredEngine($this->engine);
|
||||||
$aes->disablePadding();
|
$aes->disablePadding();
|
||||||
$aes->setKey(pack('H*', '2b7e151628aed2a6abf7158809cf4f3c762e7160')); // 160-bit key. AES should null pad to 192-bits
|
$aes->setKey(pack('H*', '2b7e151628aed2a6abf7158809cf4f3c762e7160')); // 160-bit key. AES should null pad to 192-bits
|
||||||
|
$this->_checkEngine($aes);
|
||||||
$ciphertext = $aes->encrypt(pack('H*', '3243f6a8885a308d313198a2e0370734'));
|
$ciphertext = $aes->encrypt(pack('H*', '3243f6a8885a308d313198a2e0370734'));
|
||||||
$this->assertEquals($ciphertext, pack('H*', 'c109292b173f841b88e0ee49f13db8c0'));
|
$this->assertEquals($ciphertext, pack('H*', 'c109292b173f841b88e0ee49f13db8c0'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Produces all combinations of test values.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function continuousBufferBatteryCombos()
|
||||||
|
{
|
||||||
|
$modes = array(
|
||||||
|
Base::MODE_CTR,
|
||||||
|
Base::MODE_OFB,
|
||||||
|
Base::MODE_CFB,
|
||||||
|
);
|
||||||
|
|
||||||
|
$combos = array(
|
||||||
|
array(16),
|
||||||
|
array(17),
|
||||||
|
array(1, 16),
|
||||||
|
array(3, 6, 7), // (3 to test the openssl_encrypt call and the buffer creation, 6 to test the exclusive use of the buffer and 7 to test the buffer's exhaustion and recreation)
|
||||||
|
array(15, 4), // (15 to test openssl_encrypt call and buffer creation and 4 to test something that spans multpile bloc
|
||||||
|
array(3, 6, 10, 16), // this is why the strlen check in the buffer-only code was needed
|
||||||
|
array(16, 16), // two full size blocks
|
||||||
|
array(3, 6, 7, 16), // partial block + full size block
|
||||||
|
array(16, 3, 6, 7),
|
||||||
|
// a few others just for fun
|
||||||
|
array(32,32),
|
||||||
|
array(31,31),
|
||||||
|
array(17,17),
|
||||||
|
array(99, 99)
|
||||||
|
);
|
||||||
|
|
||||||
|
$result = array();
|
||||||
|
|
||||||
|
// @codingStandardsIgnoreStart
|
||||||
|
foreach ($modes as $mode)
|
||||||
|
foreach ($combos as $combo)
|
||||||
|
foreach (array('encrypt', 'decrypt') as $op)
|
||||||
|
$result[] = array($op, $mode, $combo);
|
||||||
|
// @codingStandardsIgnoreEnd
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider continuousBufferBatteryCombos
|
||||||
|
*/
|
||||||
|
public function testContinuousBufferBattery($op, $mode, $test)
|
||||||
|
{
|
||||||
|
$iv = str_repeat('x', 16);
|
||||||
|
$key = str_repeat('a', 16);
|
||||||
|
|
||||||
|
$aes = new AES($mode);
|
||||||
|
$aes->setPreferredEngine($this->engine);
|
||||||
|
$aes->setKey($key);
|
||||||
|
$aes->setIV($iv);
|
||||||
|
|
||||||
|
$this->_checkEngine($aes);
|
||||||
|
|
||||||
|
$str = '';
|
||||||
|
$result = '';
|
||||||
|
foreach ($test as $len) {
|
||||||
|
$temp = str_repeat('d', $len);
|
||||||
|
$str.= $temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
$c1 = $aes->$op($str);
|
||||||
|
|
||||||
|
$aes = new AES($mode);
|
||||||
|
$aes->setPreferredEngine($this->engine);
|
||||||
|
$aes->enableContinuousBuffer();
|
||||||
|
$aes->setKey($key);
|
||||||
|
$aes->setIV($iv);
|
||||||
|
|
||||||
|
if (!$this->_checkEngine($aes)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($test as $len) {
|
||||||
|
$temp = str_repeat('d', $len);
|
||||||
|
$output = $aes->$op($temp);
|
||||||
|
$result.= $output;
|
||||||
|
}
|
||||||
|
|
||||||
|
$c2 = $result;
|
||||||
|
|
||||||
|
$this->assertSame(bin2hex($c1), bin2hex($c2));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider continuousBufferBatteryCombos
|
||||||
|
*/
|
||||||
|
// pretty much the same as testContinuousBufferBattery with the caveat that continuous mode is not enabled
|
||||||
|
public function testNonContinuousBufferBattery($op, $mode, $test)
|
||||||
|
{
|
||||||
|
if (count($test) == 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$iv = str_repeat('x', 16);
|
||||||
|
$key = str_repeat('a', 16);
|
||||||
|
|
||||||
|
$aes = new AES($mode);
|
||||||
|
$aes->setPreferredEngine($this->engine);
|
||||||
|
$aes->setKey($key);
|
||||||
|
$aes->setIV($iv);
|
||||||
|
|
||||||
|
$this->_checkEngine($aes);
|
||||||
|
|
||||||
|
$str = '';
|
||||||
|
$result = '';
|
||||||
|
foreach ($test as $len) {
|
||||||
|
$temp = str_repeat('d', $len);
|
||||||
|
$str.= $temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
$c1 = $aes->$op($str);
|
||||||
|
|
||||||
|
$aes = new AES($mode);
|
||||||
|
$aes->setPreferredEngine($this->engine);
|
||||||
|
$aes->setKey($key);
|
||||||
|
$aes->setIV($iv);
|
||||||
|
|
||||||
|
$this->_checkEngine($aes);
|
||||||
|
|
||||||
|
foreach ($test as $len) {
|
||||||
|
$temp = str_repeat('d', $len);
|
||||||
|
$output = $aes->$op($temp);
|
||||||
|
$result.= $output;
|
||||||
|
}
|
||||||
|
|
||||||
|
$c2 = $result;
|
||||||
|
|
||||||
|
$this->assertNotSame(bin2hex($c1), bin2hex($c2));
|
||||||
|
}
|
||||||
|
|
||||||
|
// from http://csrc.nist.gov/groups/STM/cavp/documents/aes/AESAVS.pdf#page=16
|
||||||
|
public function testGFSBox128()
|
||||||
|
{
|
||||||
|
$aes = new AES();
|
||||||
|
|
||||||
|
$aes->setKey(pack('H*', '00000000000000000000000000000000'));
|
||||||
|
$aes->setIV(pack('H*', '00000000000000000000000000000000'));
|
||||||
|
$aes->disablePadding();
|
||||||
|
|
||||||
|
$aes->setPreferredEngine($this->engine);
|
||||||
|
$this->_checkEngine($aes);
|
||||||
|
|
||||||
|
$result = bin2hex($aes->encrypt(pack('H*', 'f34481ec3cc627bacd5dc3fb08f273e6')));
|
||||||
|
$this->assertSame($result, '0336763e966d92595a567cc9ce537f5e');
|
||||||
|
$result = bin2hex($aes->encrypt(pack('H*', '9798c4640bad75c7c3227db910174e72')));
|
||||||
|
$this->assertSame($result, 'a9a1631bf4996954ebc093957b234589');
|
||||||
|
$result = bin2hex($aes->encrypt(pack('H*', '96ab5c2ff612d9dfaae8c31f30c42168')));
|
||||||
|
$this->assertSame($result, 'ff4f8391a6a40ca5b25d23bedd44a597');
|
||||||
|
$result = bin2hex($aes->encrypt(pack('H*', '6a118a874519e64e9963798a503f1d35')));
|
||||||
|
$this->assertSame($result, 'dc43be40be0e53712f7e2bf5ca707209');
|
||||||
|
$result = bin2hex($aes->encrypt(pack('H*', 'cb9fceec81286ca3e989bd979b0cb284')));
|
||||||
|
$this->assertSame($result, '92beedab1895a94faa69b632e5cc47ce');
|
||||||
|
$result = bin2hex($aes->encrypt(pack('H*', 'b26aeb1874e47ca8358ff22378f09144')));
|
||||||
|
$this->assertSame($result, '459264f4798f6a78bacb89c15ed3d601');
|
||||||
|
$result = bin2hex($aes->encrypt(pack('H*', '58c8e00b2631686d54eab84b91f0aca1')));
|
||||||
|
$this->assertSame($result, '08a4e2efec8a8e3312ca7460b9040bbf');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGFSBox192()
|
||||||
|
{
|
||||||
|
$aes = new AES();
|
||||||
|
|
||||||
|
$aes->setKey(pack('H*', '000000000000000000000000000000000000000000000000'));
|
||||||
|
$aes->setIV(pack('H*', '00000000000000000000000000000000'));
|
||||||
|
$aes->disablePadding();
|
||||||
|
|
||||||
|
$aes->setPreferredEngine($this->engine);
|
||||||
|
$this->_checkEngine($aes);
|
||||||
|
|
||||||
|
$result = bin2hex($aes->encrypt(pack('H*', '1b077a6af4b7f98229de786d7516b639')));
|
||||||
|
$this->assertSame($result, '275cfc0413d8ccb70513c3859b1d0f72');
|
||||||
|
$result = bin2hex($aes->encrypt(pack('H*', '9c2d8842e5f48f57648205d39a239af1')));
|
||||||
|
$this->assertSame($result, 'c9b8135ff1b5adc413dfd053b21bd96d');
|
||||||
|
$result = bin2hex($aes->encrypt(pack('H*', 'bff52510095f518ecca60af4205444bb')));
|
||||||
|
$this->assertSame($result, '4a3650c3371ce2eb35e389a171427440');
|
||||||
|
$result = bin2hex($aes->encrypt(pack('H*', '51719783d3185a535bd75adc65071ce1')));
|
||||||
|
$this->assertSame($result, '4f354592ff7c8847d2d0870ca9481b7c');
|
||||||
|
$result = bin2hex($aes->encrypt(pack('H*', '26aa49dcfe7629a8901a69a9914e6dfd')));
|
||||||
|
$this->assertSame($result, 'd5e08bf9a182e857cf40b3a36ee248cc');
|
||||||
|
$result = bin2hex($aes->encrypt(pack('H*', '941a4773058224e1ef66d10e0a6ee782')));
|
||||||
|
$this->assertSame($result, '067cd9d3749207791841562507fa9626');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGFSBox256()
|
||||||
|
{
|
||||||
|
$aes = new AES();
|
||||||
|
|
||||||
|
$aes->setKey(pack('H*', '00000000000000000000000000000000' . '00000000000000000000000000000000'));
|
||||||
|
$aes->setIV(pack('H*', '00000000000000000000000000000000'));
|
||||||
|
$aes->disablePadding();
|
||||||
|
|
||||||
|
$aes->setPreferredEngine($this->engine);
|
||||||
|
$this->_checkEngine($aes);
|
||||||
|
|
||||||
|
$result = bin2hex($aes->encrypt(pack('H*', '014730f80ac625fe84f026c60bfd547d')));
|
||||||
|
$this->assertSame($result, '5c9d844ed46f9885085e5d6a4f94c7d7');
|
||||||
|
$result = bin2hex($aes->encrypt(pack('H*', '0b24af36193ce4665f2825d7b4749c98')));
|
||||||
|
$this->assertSame($result, 'a9ff75bd7cf6613d3731c77c3b6d0c04');
|
||||||
|
$result = bin2hex($aes->encrypt(pack('H*', '761c1fe41a18acf20d241650611d90f1')));
|
||||||
|
$this->assertSame($result, '623a52fcea5d443e48d9181ab32c7421');
|
||||||
|
$result = bin2hex($aes->encrypt(pack('H*', '8a560769d605868ad80d819bdba03771')));
|
||||||
|
$this->assertSame($result, '38f2c7ae10612415d27ca190d27da8b4');
|
||||||
|
$result = bin2hex($aes->encrypt(pack('H*', '91fbef2d15a97816060bee1feaa49afe')));
|
||||||
|
$this->assertSame($result, '1bc704f1bce135ceb810341b216d7abe');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
84
tests/Unit/Crypt/BlowfishTest.php
Normal file
84
tests/Unit/Crypt/BlowfishTest.php
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @author Andreas Fischer <bantu@phpbb.com>
|
||||||
|
* @copyright MMXIII Andreas Fischer
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
use phpseclib\Crypt\Base;
|
||||||
|
use phpseclib\Crypt\Blowfish;
|
||||||
|
|
||||||
|
class Unit_Crypt_BlowfishTest extends PhpseclibTestCase
|
||||||
|
{
|
||||||
|
public function engineVectors()
|
||||||
|
{
|
||||||
|
$engines = array(
|
||||||
|
Base::ENGINE_INTERNAL => 'internal',
|
||||||
|
Base::ENGINE_MCRYPT => 'mcrypt',
|
||||||
|
Base::ENGINE_OPENSSL => 'OpenSSL',
|
||||||
|
);
|
||||||
|
|
||||||
|
// tests from https://www.schneier.com/code/vectors.txt
|
||||||
|
$tests = array(
|
||||||
|
// key, plaintext, ciphertext
|
||||||
|
array(pack('H*', '0000000000000000'), pack('H*', '0000000000000000'), pack('H*', '4EF997456198DD78')),
|
||||||
|
array(pack('H*', 'FFFFFFFFFFFFFFFF'), pack('H*', 'FFFFFFFFFFFFFFFF'), pack('H*', '51866FD5B85ECB8A')),
|
||||||
|
array(pack('H*', '3000000000000000'), pack('H*', '1000000000000001'), pack('H*', '7D856F9A613063F2')),
|
||||||
|
array(pack('H*', '1111111111111111'), pack('H*', '1111111111111111'), pack('H*', '2466DD878B963C9D')),
|
||||||
|
array(pack('H*', '0123456789ABCDEF'), pack('H*', '1111111111111111'), pack('H*', '61F9C3802281B096')),
|
||||||
|
array(pack('H*', '1111111111111111'), pack('H*', '0123456789ABCDEF'), pack('H*', '7D0CC630AFDA1EC7')),
|
||||||
|
array(pack('H*', '0000000000000000'), pack('H*', '0000000000000000'), pack('H*', '4EF997456198DD78')),
|
||||||
|
array(pack('H*', 'FEDCBA9876543210'), pack('H*', '0123456789ABCDEF'), pack('H*', '0ACEAB0FC6A0A28D')),
|
||||||
|
array(pack('H*', '7CA110454A1A6E57'), pack('H*', '01A1D6D039776742'), pack('H*', '59C68245EB05282B')),
|
||||||
|
array(pack('H*', '0131D9619DC1376E'), pack('H*', '5CD54CA83DEF57DA'), pack('H*', 'B1B8CC0B250F09A0')),
|
||||||
|
array(pack('H*', '07A1133E4A0B2686'), pack('H*', '0248D43806F67172'), pack('H*', '1730E5778BEA1DA4')),
|
||||||
|
array(pack('H*', '3849674C2602319E'), pack('H*', '51454B582DDF440A'), pack('H*', 'A25E7856CF2651EB')),
|
||||||
|
array(pack('H*', '04B915BA43FEB5B6'), pack('H*', '42FD443059577FA2'), pack('H*', '353882B109CE8F1A')),
|
||||||
|
array(pack('H*', '0113B970FD34F2CE'), pack('H*', '059B5E0851CF143A'), pack('H*', '48F4D0884C379918')),
|
||||||
|
array(pack('H*', '0170F175468FB5E6'), pack('H*', '0756D8E0774761D2'), pack('H*', '432193B78951FC98')),
|
||||||
|
array(pack('H*', '43297FAD38E373FE'), pack('H*', '762514B829BF486A'), pack('H*', '13F04154D69D1AE5')),
|
||||||
|
array(pack('H*', '07A7137045DA2A16'), pack('H*', '3BDD119049372802'), pack('H*', '2EEDDA93FFD39C79')),
|
||||||
|
array(pack('H*', '04689104C2FD3B2F'), pack('H*', '26955F6835AF609A'), pack('H*', 'D887E0393C2DA6E3')),
|
||||||
|
array(pack('H*', '37D06BB516CB7546'), pack('H*', '164D5E404F275232'), pack('H*', '5F99D04F5B163969')),
|
||||||
|
array(pack('H*', '1F08260D1AC2465E'), pack('H*', '6B056E18759F5CCA'), pack('H*', '4A057A3B24D3977B')),
|
||||||
|
array(pack('H*', '584023641ABA6176'), pack('H*', '004BD6EF09176062'), pack('H*', '452031C1E4FADA8E')),
|
||||||
|
array(pack('H*', '025816164629B007'), pack('H*', '480D39006EE762F2'), pack('H*', '7555AE39F59B87BD')),
|
||||||
|
array(pack('H*', '49793EBC79B3258F'), pack('H*', '437540C8698F3CFA'), pack('H*', '53C55F9CB49FC019')),
|
||||||
|
array(pack('H*', '4FB05E1515AB73A7'), pack('H*', '072D43A077075292'), pack('H*', '7A8E7BFA937E89A3')),
|
||||||
|
array(pack('H*', '49E95D6D4CA229BF'), pack('H*', '02FE55778117F12A'), pack('H*', 'CF9C5D7A4986ADB5')),
|
||||||
|
array(pack('H*', '018310DC409B26D6'), pack('H*', '1D9D5C5018F728C2'), pack('H*', 'D1ABB290658BC778')),
|
||||||
|
array(pack('H*', '1C587F1C13924FEF'), pack('H*', '305532286D6F295A'), pack('H*', '55CB3774D13EF201')),
|
||||||
|
array(pack('H*', '0101010101010101'), pack('H*', '0123456789ABCDEF'), pack('H*', 'FA34EC4847B268B2')),
|
||||||
|
array(pack('H*', '1F1F1F1F0E0E0E0E'), pack('H*', '0123456789ABCDEF'), pack('H*', 'A790795108EA3CAE')),
|
||||||
|
array(pack('H*', 'E0FEE0FEF1FEF1FE'), pack('H*', '0123456789ABCDEF'), pack('H*', 'C39E072D9FAC631D')),
|
||||||
|
array(pack('H*', '0000000000000000'), pack('H*', 'FFFFFFFFFFFFFFFF'), pack('H*', '014933E0CDAFF6E4')),
|
||||||
|
array(pack('H*', 'FFFFFFFFFFFFFFFF'), pack('H*', '0000000000000000'), pack('H*', 'F21E9A77B71C49BC')),
|
||||||
|
array(pack('H*', '0123456789ABCDEF'), pack('H*', '0000000000000000'), pack('H*', '245946885754369A')),
|
||||||
|
array(pack('H*', 'FEDCBA9876543210'), pack('H*', 'FFFFFFFFFFFFFFFF'), pack('H*', '6B5C5A9C5D9E0A5A'))
|
||||||
|
);
|
||||||
|
$result = array();
|
||||||
|
// @codingStandardsIgnoreStart
|
||||||
|
foreach ($engines as $engine => $engineName)
|
||||||
|
foreach ($tests as $test)
|
||||||
|
$result[] = array($engine, $engineName, $test[0], $test[1], $test[2]);
|
||||||
|
// @codingStandardsIgnoreEnd
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider engineVectors
|
||||||
|
*/
|
||||||
|
public function testVectors($engine, $engineName, $key, $plaintext, $expected)
|
||||||
|
{
|
||||||
|
$bf = new Blowfish();
|
||||||
|
$bf->setKey($key);
|
||||||
|
if (!$bf->isValidEngine($engine)) {
|
||||||
|
self::markTestSkipped('Unable to initialize ' . $engineName . ' engine');
|
||||||
|
}
|
||||||
|
$bf->setPreferredEngine($engine);
|
||||||
|
$bf->disablePadding();
|
||||||
|
$result = $bf->encrypt($plaintext);
|
||||||
|
$plaintext = bin2hex($plaintext);
|
||||||
|
$this->assertEquals($result, $expected, "Failed asserting that $plaintext yielded expected output in $engineName engine");
|
||||||
|
}
|
||||||
|
}
|
78
tests/Unit/Crypt/DESTest.php
Normal file
78
tests/Unit/Crypt/DESTest.php
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @author Andreas Fischer <bantu@phpbb.com>
|
||||||
|
* @copyright MMXIII Andreas Fischer
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
use phpseclib\Crypt\Base;
|
||||||
|
use phpseclib\Crypt\DES;
|
||||||
|
|
||||||
|
// the AES tests establish the correctness of the modes of operation. this test is inteded to establish the consistency of
|
||||||
|
// key and iv padding between the multiple engines
|
||||||
|
class Unit_Crypt_DESTest extends PhpseclibTestCase
|
||||||
|
{
|
||||||
|
public function testEncryptPadding()
|
||||||
|
{
|
||||||
|
$des = new DES(Base::MODE_CBC);
|
||||||
|
$des->setKey('d');
|
||||||
|
$des->setIV('d');
|
||||||
|
|
||||||
|
$des->setPreferredEngine(Base::ENGINE_INTERNAL);
|
||||||
|
|
||||||
|
$result = pack('H*', '3e7613642049af1e');
|
||||||
|
|
||||||
|
$internal = $des->encrypt('d');
|
||||||
|
$this->assertEquals($result, $internal, 'Failed asserting that the internal engine produced the correct result');
|
||||||
|
|
||||||
|
$des->setPreferredEngine(Base::ENGINE_MCRYPT);
|
||||||
|
if ($des->getEngine() == Base::ENGINE_MCRYPT) {
|
||||||
|
$mcrypt = $des->encrypt('d');
|
||||||
|
$this->assertEquals($result, $mcrypt, 'Failed asserting that the mcrypt engine produced the correct result');
|
||||||
|
} else {
|
||||||
|
self::markTestSkipped('Unable to initialize mcrypt engine');
|
||||||
|
}
|
||||||
|
|
||||||
|
$des->setPreferredEngine(Base::ENGINE_OPENSSL);
|
||||||
|
if ($des->getEngine() == Base::ENGINE_OPENSSL) {
|
||||||
|
$openssl = $des->encrypt('d');
|
||||||
|
$this->assertEquals($result, $openssl, 'Failed asserting that the OpenSSL engine produced the correct result');
|
||||||
|
} else {
|
||||||
|
self::markTestSkipped('Unable to initialize OpenSSL engine');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// phpseclib null pads ciphertext's if they're not long enough and you're in ecb / cbc mode. this silent failure mode is consistent
|
||||||
|
// with mcrypt's behavior. maybe throwing an exception would be better but whatever. this test is more intended to establish consistent
|
||||||
|
// behavior between the various engine's
|
||||||
|
public function testDecryptPadding()
|
||||||
|
{
|
||||||
|
$des = new DES(Base::MODE_CBC);
|
||||||
|
$des->disablePadding();
|
||||||
|
// when the key and iv are not specified they should be null padded
|
||||||
|
//$des->setKey();
|
||||||
|
//$des->setIV();
|
||||||
|
|
||||||
|
$des->setPreferredEngine(Base::ENGINE_INTERNAL);
|
||||||
|
$internal = $des->decrypt('d');
|
||||||
|
|
||||||
|
$result = pack('H*', '79b305d1ce555221');
|
||||||
|
$this->assertEquals($result, $internal, 'Failed asserting that the internal engine produced the correct result');
|
||||||
|
|
||||||
|
$des->setPreferredEngine(Base::ENGINE_MCRYPT);
|
||||||
|
if ($des->getEngine() == Base::ENGINE_MCRYPT) {
|
||||||
|
$mcrypt = $des->decrypt('d');
|
||||||
|
$this->assertEquals($result, $mcrypt, 'Failed asserting that the mcrypt engine produced the correct result');
|
||||||
|
} else {
|
||||||
|
self::markTestSkipped('Unable to initialize mcrypt engine');
|
||||||
|
}
|
||||||
|
|
||||||
|
$des->setPreferredEngine(Base::ENGINE_OPENSSL);
|
||||||
|
if ($des->getEngine() == Base::ENGINE_OPENSSL) {
|
||||||
|
$openssl = $des->decrypt('d');
|
||||||
|
$this->assertEquals($result, $openssl, 'Failed asserting that the OpenSSL engine produced the correct result');
|
||||||
|
} else {
|
||||||
|
self::markTestSkipped('Unable to initialize OpenSSL engine');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
122
tests/Unit/Crypt/RC2Test.php
Normal file
122
tests/Unit/Crypt/RC2Test.php
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @author Andreas Fischer <bantu@phpbb.com>
|
||||||
|
* @copyright MMXIII Andreas Fischer
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
use phpseclib\Crypt\Base;
|
||||||
|
use phpseclib\Crypt\RC2;
|
||||||
|
|
||||||
|
class Unit_Crypt_RC2Test extends PhpseclibTestCase
|
||||||
|
{
|
||||||
|
var $engines = array(
|
||||||
|
Base::ENGINE_INTERNAL => 'internal',
|
||||||
|
Base::ENGINE_MCRYPT => 'mcrypt',
|
||||||
|
Base::ENGINE_OPENSSL => 'OpenSSL',
|
||||||
|
);
|
||||||
|
|
||||||
|
public function engineVectors()
|
||||||
|
{
|
||||||
|
// tests from https://tools.ietf.org/html/rfc2268#page-8
|
||||||
|
$tests = array(
|
||||||
|
// key, effective key length, plaintext, ciphertext
|
||||||
|
array('0000000000000000', 63, '0000000000000000', 'ebb773f993278eff'),
|
||||||
|
array('ffffffffffffffff', 64, 'ffffffffffffffff', '278b27e42e2f0d49'),
|
||||||
|
array('3000000000000000', 64, '1000000000000001', '30649edf9be7d2c2'),
|
||||||
|
array('88', 64, '0000000000000000', '61a8a244adacccf0'),
|
||||||
|
array('88bca90e90875a', 64, '0000000000000000', '6ccf4308974c267f'),
|
||||||
|
array('88bca90e90875a7f0f79c384627bafb2', 64, '0000000000000000', '1a807d272bbe5db1'),
|
||||||
|
array('88bca90e90875a7f0f79c384627bafb2', 128, '0000000000000000', '2269552ab0f85ca6'),
|
||||||
|
array('88bca90e90875a7f0f79c384627bafb216f80a6f85920584c42fceb0be255daf1e', 129, '0000000000000000', '5b78d3a43dfff1f1')
|
||||||
|
);
|
||||||
|
$result = array();
|
||||||
|
// @codingStandardsIgnoreStart
|
||||||
|
foreach ($this->engines as $engine => $engineName)
|
||||||
|
foreach ($tests as $test)
|
||||||
|
$result[] = array($engine, $engineName, $test[0], $test[1], $test[2], $test[3]);
|
||||||
|
// @codingStandardsIgnoreEnd
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// this test is just confirming RC2's key expansion
|
||||||
|
public function testEncryptPadding()
|
||||||
|
{
|
||||||
|
$rc2 = new RC2(Base::MODE_ECB);
|
||||||
|
|
||||||
|
// unlike Crypt_AES / Crypt_Rijndael, when you tell Crypt_RC2 that the key length is 128-bits the key isn't null padded to that length.
|
||||||
|
// instead, RC2 key expansion is used to extend it out to that length. this isn't done for AES / Rijndael since that doesn't define any
|
||||||
|
// sort of key expansion algorithm.
|
||||||
|
|
||||||
|
// admittedly, phpseclib is inconsistent in this regard. RC4 and Blowfish support arbitrary key lengths between a certain range, as well,
|
||||||
|
// and they don't have any way to set the key length. but then again, neither do those algorithms have their own key expansion algorithm,
|
||||||
|
// whereas RC2 does. and technically, AES / Rijndael (and even Twofish) don't support arbitrary key lengths - they support variable key
|
||||||
|
// lengths. so in some ways, i suppose this inconsistency somewhat makes sense, although the fact that Crypt_Twofish doesn't have a
|
||||||
|
// setKeyLength() function whereas Crypt_AES / Crypt_Rijndael do not is, itself, an inconsistency.
|
||||||
|
|
||||||
|
// but that said, Crypt_RC2 is inconsistent in other ways: if you pass a 128-bit (16-byte) key to it via setKey() the key is not treated
|
||||||
|
// as a 128-bit key but rather as a 1024-bit key and is expanded accordingly, not via null padding, but via RC2's key expansion algorithm.
|
||||||
|
|
||||||
|
// this behavior is in contrast to mcrypt, which extends keys via null padding to 1024 bits. it is also in contrast to OpenSSL, which
|
||||||
|
// extends keys, via null padding, to 128 bits. mcrypt's approach seems preferable as one can simulate 128 bit keys by using RC2's
|
||||||
|
// key expansion algorithm to extend the key to 1024 bits and then changing the first byte of the new key with an inverse pitable mapping.
|
||||||
|
// in contrast, to my knowledge, there is no technique for expanding a key less than 128 bits to 128 bits, via RC2 key expansion. the only
|
||||||
|
// scenario in that regard is null padding.
|
||||||
|
|
||||||
|
// simple truncation is insufficient, since, quoting RFC2268, "the purpose of the key-expansion algorithm [in RC2] is to modify the key buffer
|
||||||
|
// so that each bit of the expanded key depends in a complicated way on every bit of the supplied input key".
|
||||||
|
|
||||||
|
// now, to OpenSSL's credit, null padding is internally consistent with OpenSSL. OpenSSL only supports fixed length keys. For rc2, rc4 and
|
||||||
|
// bf (blowfish), all keys are 128 bits (or are null padded / truncated accordingly). to use 40-bit or 64-bit keys with RC4 with OpenSSL you
|
||||||
|
// don't use the rc4 algorithm - you use the rc4-40 or rc4-64 algorithm. and similarily, it's not aes-cbc that you use - it's either aes-128-cbc
|
||||||
|
// or aes-192-cbc or aes-256-cbc. this is in contrast to mcrypt, which (with the exception of RC2) actually supports variable and arbitrary
|
||||||
|
// length keys.
|
||||||
|
|
||||||
|
// superficially, it seens like Rijndael would be another exception to mcrypt's key length handling, but it in fact is not. the reason being that,
|
||||||
|
// with mcrypt, when you specify MCRYPT_RIJNDAEL_128 or MCRYPT_RIJNDAEL_192 or MCRYPT_RIJNDAEL_256 the numbers at the end aren't referring to the
|
||||||
|
// key length, but rather, the block length. ie. Rijndael, unlike most block ciphers, doesn't just have a variable (but not arbitrary) key length -
|
||||||
|
// it also has a variable block length. AES's block length, however, is not variable, so technically, only MCRYPT_RIJNDAEL_128 is AES.
|
||||||
|
|
||||||
|
$rc2->setKey(str_repeat('d', 16), 128);
|
||||||
|
|
||||||
|
$rc2->setPreferredEngine(Base::ENGINE_INTERNAL);
|
||||||
|
$internal = $rc2->encrypt('d');
|
||||||
|
|
||||||
|
$result = pack('H*', 'e3b36057f4821346');
|
||||||
|
$this->assertEquals($result, $internal, 'Failed asserting that the internal engine produced the correct result');
|
||||||
|
|
||||||
|
$rc2->setPreferredEngine(Base::ENGINE_MCRYPT);
|
||||||
|
if ($rc2->getEngine() == Base::ENGINE_MCRYPT) {
|
||||||
|
$mcrypt = $rc2->encrypt('d');
|
||||||
|
$this->assertEquals($result, $mcrypt, 'Failed asserting that the mcrypt engine produced the correct result');
|
||||||
|
} else {
|
||||||
|
self::markTestSkipped('Unable to initialize mcrypt engine');
|
||||||
|
}
|
||||||
|
|
||||||
|
$rc2->setPreferredEngine(Base::ENGINE_OPENSSL);
|
||||||
|
if ($rc2->getEngine() == Base::ENGINE_OPENSSL) {
|
||||||
|
$openssl = $rc2->encrypt('d');
|
||||||
|
$this->assertEquals($result, $openssl, 'Failed asserting that the OpenSSL engine produced the correct result');
|
||||||
|
} else {
|
||||||
|
self::markTestSkipped('Unable to initialize OpenSSL engine');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider engineVectors
|
||||||
|
*/
|
||||||
|
public function testVectors($engine, $engineName, $key, $keyLen, $plaintext, $ciphertext)
|
||||||
|
{
|
||||||
|
$rc2 = new RC2();
|
||||||
|
$rc2->disablePadding();
|
||||||
|
$rc2->setKeyLength($keyLen);
|
||||||
|
$rc2->setKey(pack('H*', $key)); // could also do $rc2->setKey(pack('H*', $key), $keyLen)
|
||||||
|
if (!$rc2->isValidEngine($engine)) {
|
||||||
|
self::markTestSkipped('Unable to initialize ' . $engineName . ' engine');
|
||||||
|
}
|
||||||
|
$rc2->setPreferredEngine($engine);
|
||||||
|
|
||||||
|
$result = bin2hex($rc2->encrypt(pack('H*', $plaintext)));
|
||||||
|
$this->assertEquals($result, $ciphertext, "Failed asserting that $plaintext yielded expected output in $engineName engine");
|
||||||
|
}
|
||||||
|
}
|
208
tests/Unit/Crypt/RC4Test.php
Normal file
208
tests/Unit/Crypt/RC4Test.php
Normal file
@ -0,0 +1,208 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @author Jim Wigginton <terrafrost@php.net>
|
||||||
|
* @copyright 2014 Jim Wigginton
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
use phpseclib\Crypt\Base;
|
||||||
|
use phpseclib\Crypt\RC4;
|
||||||
|
|
||||||
|
class Unit_Crypt_RC4Test extends PhpseclibTestCase
|
||||||
|
{
|
||||||
|
public function engineVectors()
|
||||||
|
{
|
||||||
|
$engines = array(
|
||||||
|
Base::ENGINE_INTERNAL => 'internal',
|
||||||
|
Base::ENGINE_MCRYPT => 'mcrypt',
|
||||||
|
Base::ENGINE_OPENSSL => 'OpenSSL',
|
||||||
|
);
|
||||||
|
// tests from https://tools.ietf.org/html/rfc6229
|
||||||
|
$tests = array(
|
||||||
|
array(
|
||||||
|
'key' => pack('H*', '0102030405'), // 40-bit key
|
||||||
|
'output' => array(
|
||||||
|
array('offset' => 0, 'result' => 'b2396305f03dc027ccc3524a0a1118a8'),
|
||||||
|
array('offset' => 16, 'result' => '6982944f18fc82d589c403a47a0d0919'),
|
||||||
|
array('offset' => 240, 'result' => '28cb1132c96ce286421dcaadb8b69eae'),
|
||||||
|
array('offset' => 256, 'result' => '1cfcf62b03eddb641d77dfcf7f8d8c93'),
|
||||||
|
array('offset' => 496, 'result' => '42b7d0cdd918a8a33dd51781c81f4041'),
|
||||||
|
array('offset' => 512, 'result' => '6459844432a7da923cfb3eb4980661f6'),
|
||||||
|
array('offset' => 752, 'result' => 'ec10327bde2beefd18f9277680457e22'),
|
||||||
|
array('offset' => 768, 'result' => 'eb62638d4f0ba1fe9fca20e05bf8ff2b'),
|
||||||
|
array('offset' => 1008, 'result' => '45129048e6a0ed0b56b490338f078da5'),
|
||||||
|
array('offset' => 1024, 'result' => '30abbcc7c20b01609f23ee2d5f6bb7df'),
|
||||||
|
array('offset' => 1520, 'result' => '3294f744d8f9790507e70f62e5bbceea'),
|
||||||
|
array('offset' => 1536, 'result' => 'd8729db41882259bee4f825325f5a130'),
|
||||||
|
array('offset' => 2032, 'result' => '1eb14a0c13b3bf47fa2a0ba93ad45b8b'),
|
||||||
|
array('offset' => 2048, 'result' => 'cc582f8ba9f265e2b1be9112e975d2d7'),
|
||||||
|
array('offset' => 3056, 'result' => 'f2e30f9bd102ecbf75aaade9bc35c43c'),
|
||||||
|
array('offset' => 3072, 'result' => 'ec0e11c479dc329dc8da7968fe965681'),
|
||||||
|
array('offset' => 4080, 'result' => '068326a2118416d21f9d04b2cd1ca050'),
|
||||||
|
array('offset' => 4096, 'result' => 'ff25b58995996707e51fbdf08b34d875')
|
||||||
|
)
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'key' => pack('H*', '01020304050607'), // 56-bit key
|
||||||
|
'output' => array(
|
||||||
|
array('offset' => 0, 'result' => '293f02d47f37c9b633f2af5285feb46b'),
|
||||||
|
array('offset' => 16, 'result' => 'e620f1390d19bd84e2e0fd752031afc1'),
|
||||||
|
array('offset' => 240, 'result' => '914f02531c9218810df60f67e338154c'),
|
||||||
|
array('offset' => 256, 'result' => 'd0fdb583073ce85ab83917740ec011d5'),
|
||||||
|
array('offset' => 496, 'result' => '75f81411e871cffa70b90c74c592e454'),
|
||||||
|
array('offset' => 512, 'result' => '0bb87202938dad609e87a5a1b079e5e4'),
|
||||||
|
array('offset' => 752, 'result' => 'c2911246b612e7e7b903dfeda1dad866'),
|
||||||
|
array('offset' => 768, 'result' => '32828f91502b6291368de8081de36fc2'),
|
||||||
|
array('offset' => 1008, 'result' => 'f3b9a7e3b297bf9ad804512f9063eff1'),
|
||||||
|
array('offset' => 1024, 'result' => '8ecb67a9ba1f55a5a067e2b026a3676f'),
|
||||||
|
array('offset' => 1520, 'result' => 'd2aa902bd42d0d7cfd340cd45810529f'),
|
||||||
|
array('offset' => 1536, 'result' => '78b272c96e42eab4c60bd914e39d06e3'),
|
||||||
|
array('offset' => 2032, 'result' => 'f4332fd31a079396ee3cee3f2a4ff049'),
|
||||||
|
array('offset' => 2048, 'result' => '05459781d41fda7f30c1be7e1246c623'),
|
||||||
|
array('offset' => 3056, 'result' => 'adfd3868b8e51485d5e610017e3dd609'),
|
||||||
|
array('offset' => 3072, 'result' => 'ad26581c0c5be45f4cea01db2f3805d5'),
|
||||||
|
array('offset' => 4080, 'result' => 'f3172ceffc3b3d997c85ccd5af1a950c'),
|
||||||
|
array('offset' => 4096, 'result' => 'e74b0b9731227fd37c0ec08a47ddd8b8')
|
||||||
|
)
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'key' => pack('H*', '0102030405060708'), // 64-bit key
|
||||||
|
'output' => array(
|
||||||
|
array('offset' => 0, 'result' => '97ab8a1bf0afb96132f2f67258da15a8'),
|
||||||
|
array('offset' => 16, 'result' => '8263efdb45c4a18684ef87e6b19e5b09'),
|
||||||
|
array('offset' => 240, 'result' => '9636ebc9841926f4f7d1f362bddf6e18'),
|
||||||
|
array('offset' => 256, 'result' => 'd0a990ff2c05fef5b90373c9ff4b870a'),
|
||||||
|
array('offset' => 496, 'result' => '73239f1db7f41d80b643c0c52518ec63'),
|
||||||
|
array('offset' => 512, 'result' => '163b319923a6bdb4527c626126703c0f'),
|
||||||
|
array('offset' => 752, 'result' => '49d6c8af0f97144a87df21d91472f966'),
|
||||||
|
array('offset' => 768, 'result' => '44173a103b6616c5d5ad1cee40c863d0'),
|
||||||
|
array('offset' => 1008, 'result' => '273c9c4b27f322e4e716ef53a47de7a4'),
|
||||||
|
array('offset' => 1024, 'result' => 'c6d0e7b226259fa9023490b26167ad1d'),
|
||||||
|
array('offset' => 1520, 'result' => '1fe8986713f07c3d9ae1c163ff8cf9d3'),
|
||||||
|
array('offset' => 1536, 'result' => '8369e1a965610be887fbd0c79162aafb'),
|
||||||
|
array('offset' => 2032, 'result' => '0a0127abb44484b9fbef5abcae1b579f'),
|
||||||
|
array('offset' => 2048, 'result' => 'c2cdadc6402e8ee866e1f37bdb47e42c'),
|
||||||
|
array('offset' => 3056, 'result' => '26b51ea37df8e1d6f76fc3b66a7429b3'),
|
||||||
|
array('offset' => 3072, 'result' => 'bc7683205d4f443dc1f29dda3315c87b'),
|
||||||
|
array('offset' => 4080, 'result' => 'd5fa5a3469d29aaaf83d23589db8c85b'),
|
||||||
|
array('offset' => 4096, 'result' => '3fb46e2c8f0f068edce8cdcd7dfc5862')
|
||||||
|
)
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'key' => pack('H*', '0102030405060708090a'), // 80-bit key
|
||||||
|
'output' => array(
|
||||||
|
array('offset' => 0, 'result' => 'ede3b04643e586cc907dc21851709902'),
|
||||||
|
array('offset' => 16, 'result' => '03516ba78f413beb223aa5d4d2df6711'),
|
||||||
|
array('offset' => 240, 'result' => '3cfd6cb58ee0fdde640176ad0000044d'),
|
||||||
|
array('offset' => 256, 'result' => '48532b21fb6079c9114c0ffd9c04a1ad'),
|
||||||
|
array('offset' => 496, 'result' => '3e8cea98017109979084b1ef92f99d86'),
|
||||||
|
array('offset' => 512, 'result' => 'e20fb49bdb337ee48b8d8dc0f4afeffe'),
|
||||||
|
array('offset' => 752, 'result' => '5c2521eacd7966f15e056544bea0d315'),
|
||||||
|
array('offset' => 768, 'result' => 'e067a7031931a246a6c3875d2f678acb'),
|
||||||
|
array('offset' => 1008, 'result' => 'a64f70af88ae56b6f87581c0e23e6b08'),
|
||||||
|
array('offset' => 1024, 'result' => 'f449031de312814ec6f319291f4a0516'),
|
||||||
|
array('offset' => 1520, 'result' => 'bdae85924b3cb1d0a2e33a30c6d79599'),
|
||||||
|
array('offset' => 1536, 'result' => '8a0feddbac865a09bcd127fb562ed60a'),
|
||||||
|
array('offset' => 2032, 'result' => 'b55a0a5b51a12a8be34899c3e047511a'),
|
||||||
|
array('offset' => 2048, 'result' => 'd9a09cea3ce75fe39698070317a71339'),
|
||||||
|
array('offset' => 3056, 'result' => '552225ed1177f44584ac8cfa6c4eb5fc'),
|
||||||
|
array('offset' => 3072, 'result' => '7e82cbabfc95381b080998442129c2f8'),
|
||||||
|
array('offset' => 4080, 'result' => '1f135ed14ce60a91369d2322bef25e3c'),
|
||||||
|
array('offset' => 4096, 'result' => '08b6be45124a43e2eb77953f84dc8553')
|
||||||
|
)
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'key' => pack('H*', '0102030405060708090a0b0c0d0e0f10'), // 128-bit key
|
||||||
|
'output' => array(
|
||||||
|
array('offset' => 0, 'result' => '9ac7cc9a609d1ef7b2932899cde41b97'),
|
||||||
|
array('offset' => 16, 'result' => '5248c4959014126a6e8a84f11d1a9e1c'),
|
||||||
|
array('offset' => 240, 'result' => '065902e4b620f6cc36c8589f66432f2b'),
|
||||||
|
array('offset' => 256, 'result' => 'd39d566bc6bce3010768151549f3873f'),
|
||||||
|
array('offset' => 496, 'result' => 'b6d1e6c4a5e4771cad79538df295fb11'),
|
||||||
|
array('offset' => 512, 'result' => 'c68c1d5c559a974123df1dbc52a43b89'),
|
||||||
|
array('offset' => 752, 'result' => 'c5ecf88de897fd57fed301701b82a259'),
|
||||||
|
array('offset' => 768, 'result' => 'eccbe13de1fcc91c11a0b26c0bc8fa4d'),
|
||||||
|
array('offset' => 1008, 'result' => 'e7a72574f8782ae26aabcf9ebcd66065'),
|
||||||
|
array('offset' => 1024, 'result' => 'bdf0324e6083dcc6d3cedd3ca8c53c16'),
|
||||||
|
array('offset' => 1520, 'result' => 'b40110c4190b5622a96116b0017ed297'),
|
||||||
|
array('offset' => 1536, 'result' => 'ffa0b514647ec04f6306b892ae661181'),
|
||||||
|
array('offset' => 2032, 'result' => 'd03d1bc03cd33d70dff9fa5d71963ebd'),
|
||||||
|
array('offset' => 2048, 'result' => '8a44126411eaa78bd51e8d87a8879bf5'),
|
||||||
|
array('offset' => 3056, 'result' => 'fabeb76028ade2d0e48722e46c4615a3'),
|
||||||
|
array('offset' => 3072, 'result' => 'c05d88abd50357f935a63c59ee537623'),
|
||||||
|
array('offset' => 4080, 'result' => 'ff38265c1642c1abe8d3c2fe5e572bf8'),
|
||||||
|
array('offset' => 4096, 'result' => 'a36a4c301ae8ac13610ccbc12256cacc')
|
||||||
|
)
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'key' => pack('H*', '0102030405060708090a0b0c0d0e0f101112131415161718'), // 192-bit key
|
||||||
|
'output' => array(
|
||||||
|
array('offset' => 0, 'result' => '0595e57fe5f0bb3c706edac8a4b2db11'),
|
||||||
|
array('offset' => 16, 'result' => 'dfde31344a1af769c74f070aee9e2326'),
|
||||||
|
array('offset' => 240, 'result' => 'b06b9b1e195d13d8f4a7995c4553ac05'),
|
||||||
|
array('offset' => 256, 'result' => '6bd2378ec341c9a42f37ba79f88a32ff'),
|
||||||
|
array('offset' => 496, 'result' => 'e70bce1df7645adb5d2c4130215c3522'),
|
||||||
|
array('offset' => 512, 'result' => '9a5730c7fcb4c9af51ffda89c7f1ad22'),
|
||||||
|
array('offset' => 752, 'result' => '0485055fd4f6f0d963ef5ab9a5476982'),
|
||||||
|
array('offset' => 768, 'result' => '591fc66bcda10e452b03d4551f6b62ac'),
|
||||||
|
array('offset' => 1008, 'result' => '2753cc83988afa3e1688a1d3b42c9a02'),
|
||||||
|
array('offset' => 1024, 'result' => '93610d523d1d3f0062b3c2a3bbc7c7f0'),
|
||||||
|
array('offset' => 1520, 'result' => '96c248610aadedfeaf8978c03de8205a'),
|
||||||
|
array('offset' => 1536, 'result' => '0e317b3d1c73b9e9a4688f296d133a19'),
|
||||||
|
array('offset' => 2032, 'result' => 'bdf0e6c3cca5b5b9d533b69c56ada120'),
|
||||||
|
array('offset' => 2048, 'result' => '88a218b6e2ece1e6246d44c759d19b10'),
|
||||||
|
array('offset' => 3056, 'result' => '6866397e95c140534f94263421006e40'),
|
||||||
|
array('offset' => 3072, 'result' => '32cb0a1e9542c6b3b8b398abc3b0f1d5'),
|
||||||
|
array('offset' => 4080, 'result' => '29a0b8aed54a132324c62e423f54b4c8'),
|
||||||
|
array('offset' => 4096, 'result' => '3cb0f3b5020a98b82af9fe154484a168')
|
||||||
|
)
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'key' => pack('H*', '0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20'), // 256-bit key
|
||||||
|
'output' => array(
|
||||||
|
array('offset' => 0, 'result' => 'eaa6bd25880bf93d3f5d1e4ca2611d91'),
|
||||||
|
array('offset' => 16, 'result' => 'cfa45c9f7e714b54bdfa80027cb14380'),
|
||||||
|
array('offset' => 240, 'result' => '114ae344ded71b35f2e60febad727fd8'),
|
||||||
|
array('offset' => 256, 'result' => '02e1e7056b0f623900496422943e97b6'),
|
||||||
|
array('offset' => 496, 'result' => '91cb93c787964e10d9527d999c6f936b'),
|
||||||
|
array('offset' => 512, 'result' => '49b18b42f8e8367cbeb5ef104ba1c7cd'),
|
||||||
|
array('offset' => 752, 'result' => '87084b3ba700bade955610672745b374'),
|
||||||
|
array('offset' => 768, 'result' => 'e7a7b9e9ec540d5ff43bdb12792d1b35'),
|
||||||
|
array('offset' => 1008, 'result' => 'c799b596738f6b018c76c74b1759bd90'),
|
||||||
|
array('offset' => 1024, 'result' => '7fec5bfd9f9b89ce6548309092d7e958'),
|
||||||
|
array('offset' => 1520, 'result' => '40f250b26d1f096a4afd4c340a588815'),
|
||||||
|
array('offset' => 1536, 'result' => '3e34135c79db010200767651cf263073'),
|
||||||
|
array('offset' => 2032, 'result' => 'f656abccf88dd827027b2ce917d464ec'),
|
||||||
|
array('offset' => 2048, 'result' => '18b62503bfbc077fbabb98f20d98ab34'),
|
||||||
|
array('offset' => 3056, 'result' => '8aed95ee5b0dcbfbef4eb21d3a3f52f9'),
|
||||||
|
array('offset' => 3072, 'result' => '625a1ab00ee39a5327346bddb01a9c18'),
|
||||||
|
array('offset' => 4080, 'result' => 'a13a7c79c7e119b5ab0296ab28c300b9'),
|
||||||
|
array('offset' => 4096, 'result' => 'f3e4c0a2e02d1d01f7f0a74618af2b48')
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$result = array();
|
||||||
|
// @codingStandardsIgnoreStart
|
||||||
|
foreach ($engines as $engine => $engineName)
|
||||||
|
foreach ($tests as $test)
|
||||||
|
foreach ($test['output'] as $output)
|
||||||
|
$result[] = array($engine, $engineName, $test['key'], $output['offset'], $output['result']);
|
||||||
|
// @codingStandardsIgnoreEnd
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider engineVectors
|
||||||
|
*/
|
||||||
|
public function testVectors($engine, $engineName, $key, $offset, $expected)
|
||||||
|
{
|
||||||
|
$rc4 = new RC4();
|
||||||
|
$rc4->setPreferredEngine($engine);
|
||||||
|
$rc4->setKey($key);
|
||||||
|
if ($rc4->getEngine() != $engine) {
|
||||||
|
self::markTestSkipped('Unable to initialize ' . $engineName . ' engine for ' . (strlen($key) * 8) . '-bit key');
|
||||||
|
}
|
||||||
|
$result = $rc4->encrypt(str_repeat("\0", $offset + 16));
|
||||||
|
$this->assertEquals(bin2hex(substr($result, -16)), $expected, "Failed asserting that key $key yielded expected output at offset $offset in $engineName engine");
|
||||||
|
}
|
||||||
|
}
|
183
tests/Unit/Crypt/TripleDESTest.php
Normal file
183
tests/Unit/Crypt/TripleDESTest.php
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @author Jim Wigginton <terrafrost@php.net>
|
||||||
|
* @copyright 2014 Jim Wigginton
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
use phpseclib\Crypt\Base;
|
||||||
|
use phpseclib\Crypt\TripleDES;
|
||||||
|
|
||||||
|
class Unit_Crypt_TripleDESTest extends PhpseclibTestCase
|
||||||
|
{
|
||||||
|
var $engines = array(
|
||||||
|
Base::ENGINE_INTERNAL => 'internal',
|
||||||
|
Base::ENGINE_MCRYPT => 'mcrypt',
|
||||||
|
Base::ENGINE_OPENSSL => 'OpenSSL',
|
||||||
|
);
|
||||||
|
|
||||||
|
public function engineVectors()
|
||||||
|
{
|
||||||
|
// tests from http://csrc.nist.gov/publications/nistpubs/800-20/800-20.pdf#page=273
|
||||||
|
$tests = array(
|
||||||
|
// Table A.1
|
||||||
|
// key, plaintext, ciphertext
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '8000000000000000'), pack('H*', '95F8A5E5DD31D900')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '4000000000000000'), pack('H*', 'DD7F121CA5015619')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '2000000000000000'), pack('H*', '2E8653104F3834EA')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '1000000000000000'), pack('H*', '4BD388FF6CD81D4F')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0800000000000000'), pack('H*', '20B9E767B2FB1456')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0400000000000000'), pack('H*', '55579380D77138EF')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0200000000000000'), pack('H*', '6CC5DEFAAF04512F')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0100000000000000'), pack('H*', '0D9F279BA5D87260')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0080000000000000'), pack('H*', 'D9031B0271BD5A0A')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0040000000000000'), pack('H*', '424250B37C3DD951')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0020000000000000'), pack('H*', 'B8061B7ECD9A21E5')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0010000000000000'), pack('H*', 'F15D0F286B65BD28')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0008000000000000'), pack('H*', 'ADD0CC8D6E5DEBA1')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0004000000000000'), pack('H*', 'E6D5F82752AD63D1')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0002000000000000'), pack('H*', 'ECBFE3BD3F591A5E')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0001000000000000'), pack('H*', 'F356834379D165CD')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000800000000000'), pack('H*', '2B9F982F20037FA9')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000400000000000'), pack('H*', '889DE068A16F0BE6')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000200000000000'), pack('H*', 'E19E275D846A1298')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000100000000000'), pack('H*', '329A8ED523D71AEC')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000080000000000'), pack('H*', 'E7FCE22557D23C97')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000040000000000'), pack('H*', '12A9F5817FF2D65D')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000020000000000'), pack('H*', 'A484C3AD38DC9C19')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000010000000000'), pack('H*', 'FBE00A8A1EF8AD72')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000008000000000'), pack('H*', '750D079407521363')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000004000000000'), pack('H*', '64FEED9C724C2FAF')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000002000000000'), pack('H*', 'F02B263B328E2B60')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000001000000000'), pack('H*', '9D64555A9A10B852')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000800000000'), pack('H*', 'D106FF0BED5255D7')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000400000000'), pack('H*', 'E1652C6B138C64A5')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000200000000'), pack('H*', 'E428581186EC8F46')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000100000000'), pack('H*', 'AEB5F5EDE22D1A36')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000080000000'), pack('H*', 'E943D7568AEC0C5C')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000040000000'), pack('H*', 'DF98C8276F54B04B')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000020000000'), pack('H*', 'B160E4680F6C696F')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000010000000'), pack('H*', 'FA0752B07D9C4AB8')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000008000000'), pack('H*', 'CA3A2B036DBC8502')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000004000000'), pack('H*', '5E0905517BB59BCF')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000002000000'), pack('H*', '814EEB3B91D90726')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000001000000'), pack('H*', '4D49DB1532919C9F')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000000800000'), pack('H*', '25EB5FC3F8CF0621')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000000400000'), pack('H*', 'AB6A20C0620D1C6F')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000000200000'), pack('H*', '79E90DBC98F92CCA')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000000100000'), pack('H*', '866ECEDD8072BB0E')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000000080000'), pack('H*', '8B54536F2F3E64A8')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000000040000'), pack('H*', 'EA51D3975595B86B')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000000020000'), pack('H*', 'CAFFC6AC4542DE31')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000000010000'), pack('H*', '8DD45A2DDF90796C')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000000008000'), pack('H*', '1029D55E880EC2D0')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000000004000'), pack('H*', '5D86CB23639DBEA9')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000000002000'), pack('H*', '1D1CA853AE7C0C5F')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000000001000'), pack('H*', 'CE332329248F3228')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000000000800'), pack('H*', '8405D1ABE24FB942')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000000000400'), pack('H*', 'E643D78090CA4207')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000000000200'), pack('H*', '48221B9937748A23')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000000000100'), pack('H*', 'DD7C0BBD61FAFD54')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000000000080'), pack('H*', '2FBC291A570DB5C4')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000000000040'), pack('H*', 'E07C30D7E4E26E12')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000000000020'), pack('H*', '0953E2258E8E90A1')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000000000010'), pack('H*', '5B711BC4CEEBF2EE')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000000000008'), pack('H*', 'CC083F1E6D9E85F6')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000000000004'), pack('H*', 'D2FD8867D50D2DFE')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000000000002'), pack('H*', '06E7EA22CE92708F')),
|
||||||
|
array(str_repeat("\x01", 24), pack('H*', '0000000000000001'), pack('H*', '166B40B44ABA4BD6'))
|
||||||
|
);
|
||||||
|
$result = array();
|
||||||
|
// @codingStandardsIgnoreStart
|
||||||
|
foreach ($this->engines as $engine => $engineName)
|
||||||
|
foreach ($tests as $test)
|
||||||
|
$result[] = array($engine, $engineName, $test[0], $test[1], $test[2]);
|
||||||
|
// @codingStandardsIgnoreEnd
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider engineVectors
|
||||||
|
*/
|
||||||
|
public function testVectors($engine, $engineName, $key, $plaintext, $expected)
|
||||||
|
{
|
||||||
|
$des = new TripleDES();
|
||||||
|
if (!$des->isValidEngine($engine)) {
|
||||||
|
self::markTestSkipped('Unable to initialize ' . $engineName . ' engine');
|
||||||
|
}
|
||||||
|
$des->setPreferredEngine($engine);
|
||||||
|
$des->setKey($key);
|
||||||
|
$des->disablePadding();
|
||||||
|
$result = $des->encrypt($plaintext);
|
||||||
|
$plaintext = bin2hex($plaintext);
|
||||||
|
$this->assertEquals($result, $expected, "Failed asserting that $plaintext yielded expected output in $engineName engine");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function engineIVVectors()
|
||||||
|
{
|
||||||
|
$engines = array(
|
||||||
|
Base::ENGINE_INTERNAL => 'internal',
|
||||||
|
Base::ENGINE_MCRYPT => 'mcrypt',
|
||||||
|
Base::ENGINE_OPENSSL => 'OpenSSL',
|
||||||
|
);
|
||||||
|
|
||||||
|
// tests from http://csrc.nist.gov/groups/STM/cavp/documents/des/DESMMT.pdf
|
||||||
|
$tests = array(
|
||||||
|
// key, iv, plaintext, ciphertext
|
||||||
|
array(
|
||||||
|
pack('H*', '627f460e08104a10' . '43cd265d5840eaf1' . '313edf97df2a8a8c'),
|
||||||
|
pack('H*', '8e29f75ea77e5475'),
|
||||||
|
pack('H*', '326a494cd33fe756'),
|
||||||
|
pack('H*', 'b22b8d66de970692')),
|
||||||
|
array(
|
||||||
|
pack('H*', '37ae5ebf46dff2dc' . '0754b94f31cbb385' . '5e7fd36dc870bfae'),
|
||||||
|
pack('H*', '3d1de3cc132e3b65'),
|
||||||
|
pack('H*', '84401f78fe6c10876d8ea23094ea5309'),
|
||||||
|
pack('H*', '7b1f7c7e3b1c948ebd04a75ffba7d2f5'))
|
||||||
|
);
|
||||||
|
$result = array();
|
||||||
|
// @codingStandardsIgnoreStart
|
||||||
|
foreach ($engines as $engine => $engineName)
|
||||||
|
foreach ($tests as $test)
|
||||||
|
$result[] = array($engine, $engineName, $test[0], $test[1], $test[2], $test[3]);
|
||||||
|
// @codingStandardsIgnoreEnd
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider engineIVVectors
|
||||||
|
*/
|
||||||
|
public function testVectorsWithIV($engine, $engineName, $key, $iv, $plaintext, $expected)
|
||||||
|
{
|
||||||
|
$des = new TripleDES();
|
||||||
|
if (!$des->isValidEngine($engine)) {
|
||||||
|
self::markTestSkipped('Unable to initialize ' . $engineName . ' engine');
|
||||||
|
}
|
||||||
|
$des->setPreferredEngine($engine);
|
||||||
|
$des->setKey($key);
|
||||||
|
$des->setIV($iv);
|
||||||
|
$des->disablePadding();
|
||||||
|
$result = $des->encrypt($plaintext);
|
||||||
|
$plaintext = bin2hex($plaintext);
|
||||||
|
$this->assertEquals($result, $expected, "Failed asserting that $plaintext yielded expected output in $engineName engine");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testInnerChaining()
|
||||||
|
{
|
||||||
|
// regular CBC returns
|
||||||
|
// e089b6d84708c6bc80be6c2da82bd19a79ffe11f02933ac1
|
||||||
|
$expected = 'e089b6d84708c6bc6f04c8971121603d7be2861efae0f3f5';
|
||||||
|
|
||||||
|
$des = new TripleDES(TripleDES::MODE_3CBC);
|
||||||
|
$des->setKey('abcdefghijklmnopqrstuvwx');
|
||||||
|
|
||||||
|
foreach ($this->engines as $engine => $engineName) {
|
||||||
|
$des->setPreferredEngine($engine);
|
||||||
|
if (!$des->isValidEngine($engine)) {
|
||||||
|
self::markTestSkipped('Unable to initialize ' . $engineName . ' engine');
|
||||||
|
}
|
||||||
|
$result = bin2hex($des->encrypt(str_repeat('a', 16)));
|
||||||
|
$this->assertEquals($result, $expected, "Failed asserting inner chainin worked correctly in $engineName engine");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
74
tests/Unit/Crypt/TwofishTest.php
Normal file
74
tests/Unit/Crypt/TwofishTest.php
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @author Andreas Fischer <bantu@phpbb.com>
|
||||||
|
* @copyright MMXIII Andreas Fischer
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
use phpseclib\Crypt\Base;
|
||||||
|
use phpseclib\Crypt\Twofish;
|
||||||
|
|
||||||
|
class Unit_Crypt_TwofishTest extends PhpseclibTestCase
|
||||||
|
{
|
||||||
|
public function testVectors()
|
||||||
|
{
|
||||||
|
$engines = array(
|
||||||
|
Base::ENGINE_INTERNAL => 'internal',
|
||||||
|
Base::ENGINE_MCRYPT => 'mcrypt',
|
||||||
|
Base::ENGINE_OPENSSL => 'OpenSSL',
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach ($engines as $engine=>$name) {
|
||||||
|
$tf = new Twofish();
|
||||||
|
$tf->disablePadding();
|
||||||
|
|
||||||
|
// tests from https://www.schneier.com/code/ecb_ival.txt
|
||||||
|
|
||||||
|
// key size = 128
|
||||||
|
$key = pack('H*', '00000000000000000000000000000000');
|
||||||
|
$tf->setKey($key);
|
||||||
|
if (!$tf->isValidEngine($engine)) {
|
||||||
|
self::markTestSkipped('Unable to initialize ' . $name . ' engine');
|
||||||
|
}
|
||||||
|
|
||||||
|
$plaintext = pack('H*', '00000000000000000000000000000000');
|
||||||
|
$ciphertext = $tf->encrypt($plaintext);
|
||||||
|
$expected = strtolower('9F589F5CF6122C32B6BFEC2F2AE8C35A');
|
||||||
|
$this->assertEquals(bin2hex($ciphertext), $expected, "Failed asserting that $plaintext yielded expected output in $name engine");
|
||||||
|
|
||||||
|
$expected = bin2hex($plaintext);
|
||||||
|
$plaintext = bin2hex($tf->decrypt($ciphertext));
|
||||||
|
$this->assertEquals($plaintext, $expected, "Failed asserting that $plaintext yielded expected output in $name engine");
|
||||||
|
|
||||||
|
// key size = 192
|
||||||
|
$key = pack('H*', '0123456789ABCDEFFEDCBA98765432100011223344556677');
|
||||||
|
$tf->setKey($key);
|
||||||
|
if (!$tf->isValidEngine($engine)) {
|
||||||
|
self::markTestSkipped('Unable to initialize ' . $name . ' engine');
|
||||||
|
}
|
||||||
|
$plaintext = pack('H*', '00000000000000000000000000000000');
|
||||||
|
$ciphertext = $tf->encrypt($plaintext);
|
||||||
|
$expected = strtolower('CFD1D2E5A9BE9CDF501F13B892BD2248');
|
||||||
|
$this->assertEquals(bin2hex($ciphertext), $expected, "Failed asserting that $plaintext yielded expected output in $name engine");
|
||||||
|
|
||||||
|
$expected = bin2hex($plaintext);
|
||||||
|
$plaintext = bin2hex($tf->decrypt($ciphertext));
|
||||||
|
$this->assertEquals($plaintext, $expected, "Failed asserting that $plaintext yielded expected output in $name engine");
|
||||||
|
|
||||||
|
// key size = 256
|
||||||
|
$key = pack('H*', '0123456789ABCDEFFEDCBA987654321000112233445566778899AABBCCDDEEFF');
|
||||||
|
$tf->setKey($key);
|
||||||
|
if (!$tf->isValidEngine($engine)) {
|
||||||
|
self::markTestSkipped('Unable to initialize ' . $name . ' engine');
|
||||||
|
}
|
||||||
|
$plaintext = pack('H*', '00000000000000000000000000000000');
|
||||||
|
$ciphertext = $tf->encrypt($plaintext);
|
||||||
|
$expected = strtolower('37527BE0052334B89F0CFCCAE87CFA20');
|
||||||
|
$this->assertEquals(bin2hex($ciphertext), $expected, "Failed asserting that $plaintext yielded expected output in $name engine");
|
||||||
|
|
||||||
|
$expected = bin2hex($plaintext);
|
||||||
|
$plaintext = bin2hex($tf->decrypt($ciphertext));
|
||||||
|
$this->assertEquals($plaintext, $expected, "Failed asserting that $plaintext yielded expected output in $name engine");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
125
tests/Unit/File/X509/X509Test.php
Normal file
125
tests/Unit/File/X509/X509Test.php
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @author Jim Wigginton <terrafrost@php.net>
|
||||||
|
* @copyright 2014 Jim Wigginton
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||||
|
*/
|
||||||
|
|
||||||
|
use phpseclib\File\ASN1;
|
||||||
|
use phpseclib\File\ASN1\Element;
|
||||||
|
use phpseclib\File\X509;
|
||||||
|
|
||||||
|
class Unit_File_X509_X509Test extends PhpseclibTestCase
|
||||||
|
{
|
||||||
|
public function testLoadUnsupportedExtension()
|
||||||
|
{
|
||||||
|
$test = '-----BEGIN CERTIFICATE-----
|
||||||
|
MIIG1jCCBL6gAwIBAgITUAAAAA0qg8bE6DhrLAAAAAAADTANBgkqhkiG9w0BAQsF
|
||||||
|
ADAiMSAwHgYDVQQDExcuU2VjdXJlIEVudGVycHJpc2UgQ0EgMTAeFw0xNTAyMjMx
|
||||||
|
NTE1MDdaFw0xNjAyMjMxNTE1MDdaMD8xFjAUBgoJkiaJk/IsZAEZFgZzZWN1cmUx
|
||||||
|
DjAMBgNVBAMTBVVzZXJzMRUwEwYDVQQDEwxtZXRhY2xhc3NpbmcwggEiMA0GCSqG
|
||||||
|
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDMdG1CzR/gTalbLN9J+2cvMGeD7wsR7S78
|
||||||
|
HU5hdwE+kECROjRAcjFBOR57ezSDrkmhkTzo28tj0oAHjOh8N9vuXtASfZSCXugx
|
||||||
|
H+ImJ+E7PA4aXBp+0H2hohW9sXNNCFiVNmJLX66O4bxIeKtVRq/+eSNijV4OOEkC
|
||||||
|
zMyTHAUbOFP0t6KoJtM1syNoQ1+fKdfcjz5XtiEzSVcp2zf0MwNFSeZSgGQ0jh8A
|
||||||
|
Kd6YVKA8ZnrqOWZxKETT+bBNTjIT0ggjQfzcE4zW2RzrN7zWabUowoU92+DAp4s3
|
||||||
|
sAEywX9ISSge62DEzTnZZSf9bpoScAfT8raRFA3BkoJ/s4c4CgfPAgMBAAGjggLm
|
||||||
|
MIIC4jAdBgNVHQ4EFgQULlIyJL9+ZwAI/SkVdsJMxFOVp+EwHwYDVR0jBBgwFoAU
|
||||||
|
5nEIMEUT5mMd1WepmviwgK7dIzwwggEKBgNVHR8EggEBMIH+MIH7oIH4oIH1hoG5
|
||||||
|
bGRhcDovLy9DTj0uU2VjdXJlJTIwRW50ZXJwcmlzZSUyMENBJTIwMSxDTj1hdXRo
|
||||||
|
LENOPUNEUCxDTj1QdWJsaWMlMjBLZXklMjBTZXJ2aWNlcyxDTj1TZXJ2aWNlcyxD
|
||||||
|
Tj1Db25maWd1cmF0aW9uLERDPXNlY3VyZT9jZXJ0aWZpY2F0ZVJldm9jYXRpb25M
|
||||||
|
aXN0P2Jhc2U/b2JqZWN0Q2xhc3M9Y1JMRGlzdHJpYnV0aW9uUG9pbnSGN2h0dHA6
|
||||||
|
Ly9jcmwuc2VjdXJlb2JzY3VyZS5jb20vP2FjdGlvbj1jcmwmY2E9ZW50ZXJwcmlz
|
||||||
|
ZTEwgccGCCsGAQUFBwEBBIG6MIG3MIG0BggrBgEFBQcwAoaBp2xkYXA6Ly8vQ049
|
||||||
|
LlNlY3VyZSUyMEVudGVycHJpc2UlMjBDQSUyMDEsQ049QUlBLENOPVB1YmxpYyUy
|
||||||
|
MEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRpb24sREM9
|
||||||
|
c2VjdXJlP2NBQ2VydGlmaWNhdGU/YmFzZT9vYmplY3RDbGFzcz1jZXJ0aWZpY2F0
|
||||||
|
aW9uQXV0aG9yaXR5MBcGCSsGAQQBgjcUAgQKHggAVQBzAGUAcjAOBgNVHQ8BAf8E
|
||||||
|
BAMCBaAwKQYDVR0lBCIwIAYKKwYBBAGCNwoDBAYIKwYBBQUHAwQGCCsGAQUFBwMC
|
||||||
|
MC4GA1UdEQQnMCWgIwYKKwYBBAGCNxQCA6AVDBNtZXRhY2xhc3NpbmdAc2VjdXJl
|
||||||
|
MEQGCSqGSIb3DQEJDwQ3MDUwDgYIKoZIhvcNAwICAgCAMA4GCCqGSIb3DQMEAgIA
|
||||||
|
gDAHBgUrDgMCBzAKBggqhkiG9w0DBzANBgkqhkiG9w0BAQsFAAOCAgEAKNmjYh+h
|
||||||
|
cObJEM0CWgz50jOYKZ4M5iIxoAWgrYY9Pv+0O9aPjvPLzjd5bY322L8lxh5wy5my
|
||||||
|
DKmip+irzjdVdxzQfoyy+ceODmCbX9L6MfEDn0RBzdwjLe1/eOxE1na0sZztrVCc
|
||||||
|
yt5nI91NNGZJUcVqVQsIA/25FWlkvo/FTfuqTuXdQiEVM5MCKJI915anmTdugy+G
|
||||||
|
0CmBJALIxtyz5P7sZhaHZFNdpKnx82QsauErqjP9H0RXc6VXX5qt+tEDvYfSlFcc
|
||||||
|
0lv3aQnV/eIdfm7APJkQ3lmNWWQwdkVf7adXJ7KAAPHSt1yvSbVxThJR/jmIkyeQ
|
||||||
|
XW/TOP5m7JI/GrmvdlzI1AgwJ+zO8fOmCDuif99pDb1CvkzQ65RZ8p5J1ZV6hzlb
|
||||||
|
VvOhn4LDnT1jnTcEqigmx1gxM/5ifvMorXn/ItMjKPlb72vHpeF7OeKE8GHsvZAm
|
||||||
|
osHcKyJXbTIcXchmpZX1efbmCMJBqHgJ/qBTBMl9BX0+YqbTZyabRJSs9ezbTRn0
|
||||||
|
oRYl21Q8EnvS71CemxEUkSsKJmfJKkQNCsOjc8AbX/V/X9R7LJkH3UEx6K2zQQKK
|
||||||
|
k6m17mi63YW/+iPCGOWZ2qXmY5HPEyyF2L4L4IDryFJ+8xLyw3pH9/yp5aHZDtp6
|
||||||
|
833K6qyjgHJT+fUzSEYpiwF5rSBJIGClOCY=
|
||||||
|
-----END CERTIFICATE-----';
|
||||||
|
|
||||||
|
$x509 = new X509();
|
||||||
|
|
||||||
|
$cert = $x509->loadX509($test);
|
||||||
|
|
||||||
|
$this->assertEquals('MDUwDgYIKoZIhvcNAwICAgCAMA4GCCqGSIb3DQMEAgIAgDAHBgUrDgMCBzAKBggqhkiG9w0DBw==', $cert['tbsCertificate']['extensions'][8]['extnValue']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSaveUnsupportedExtension()
|
||||||
|
{
|
||||||
|
$x509 = new X509();
|
||||||
|
$cert = $x509->loadX509('-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDITCCAoqgAwIBAgIQT52W2WawmStUwpV8tBV9TTANBgkqhkiG9w0BAQUFADBM
|
||||||
|
MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg
|
||||||
|
THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0xMTEwMjYwMDAwMDBaFw0x
|
||||||
|
MzA5MzAyMzU5NTlaMGgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlh
|
||||||
|
MRYwFAYDVQQHFA1Nb3VudGFpbiBWaWV3MRMwEQYDVQQKFApHb29nbGUgSW5jMRcw
|
||||||
|
FQYDVQQDFA53d3cuZ29vZ2xlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
|
||||||
|
gYEA3rcmQ6aZhc04pxUJuc8PycNVjIjujI0oJyRLKl6g2Bb6YRhLz21ggNM1QDJy
|
||||||
|
wI8S2OVOj7my9tkVXlqGMaO6hqpryNlxjMzNJxMenUJdOPanrO/6YvMYgdQkRn8B
|
||||||
|
d3zGKokUmbuYOR2oGfs5AER9G5RqeC1prcB6LPrQ2iASmNMCAwEAAaOB5zCB5DAM
|
||||||
|
BgNVHRMBAf8EAjAAMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwudGhhd3Rl
|
||||||
|
LmNvbS9UaGF3dGVTR0NDQS5jcmwwKAYDVR0lBCEwHwYIKwYBBQUHAwEGCCsGAQUF
|
||||||
|
BwMCBglghkgBhvhCBAEwcgYIKwYBBQUHAQEEZjBkMCIGCCsGAQUFBzABhhZodHRw
|
||||||
|
Oi8vb2NzcC50aGF3dGUuY29tMD4GCCsGAQUFBzAChjJodHRwOi8vd3d3LnRoYXd0
|
||||||
|
ZS5jb20vcmVwb3NpdG9yeS9UaGF3dGVfU0dDX0NBLmNydDANBgkqhkiG9w0BAQUF
|
||||||
|
AAOBgQAhrNWuyjSJWsKrUtKyNGadeqvu5nzVfsJcKLt0AMkQH0IT/GmKHiSgAgDp
|
||||||
|
ulvKGQSy068Bsn5fFNum21K5mvMSf3yinDtvmX3qUA12IxL/92ZzKbeVCq3Yi7Le
|
||||||
|
IOkKcGQRCMha8X2e7GmlpdWC1ycenlbN0nbVeSv3JUMcafC4+Q==
|
||||||
|
-----END CERTIFICATE-----');
|
||||||
|
|
||||||
|
$asn1 = new ASN1();
|
||||||
|
|
||||||
|
$value = $this->encodeOID('1.2.3.4');
|
||||||
|
$ext = chr(ASN1::TYPE_OBJECT_IDENTIFIER) . $asn1->_encodeLength(strlen($value)) . $value;
|
||||||
|
$value = 'zzzzzzzzz';
|
||||||
|
$ext.= chr(ASN1::TYPE_OCTET_STRING) . $asn1->_encodeLength(strlen($value)) . $value;
|
||||||
|
$ext = chr(ASN1::TYPE_SEQUENCE | 0x20) . $asn1->_encodeLength(strlen($ext)) . $ext;
|
||||||
|
|
||||||
|
$cert['tbsCertificate']['extensions'][4] = new Element($ext);
|
||||||
|
|
||||||
|
$result = $x509->loadX509($x509->saveX509($cert));
|
||||||
|
|
||||||
|
$this->assertCount(5, $result['tbsCertificate']['extensions']);
|
||||||
|
}
|
||||||
|
|
||||||
|
function encodeOID($oid)
|
||||||
|
{
|
||||||
|
if ($oid === false) {
|
||||||
|
user_error('Invalid OID');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$value = '';
|
||||||
|
$parts = explode('.', $oid);
|
||||||
|
$value = chr(40 * $parts[0] + $parts[1]);
|
||||||
|
for ($i = 2; $i < count($parts); $i++) {
|
||||||
|
$temp = '';
|
||||||
|
if (!$parts[$i]) {
|
||||||
|
$temp = "\0";
|
||||||
|
} else {
|
||||||
|
while ($parts[$i]) {
|
||||||
|
$temp = chr(0x80 | ($parts[$i] & 0x7F)) . $temp;
|
||||||
|
$parts[$i] >>= 7;
|
||||||
|
}
|
||||||
|
$temp[strlen($temp) - 1] = $temp[strlen($temp) - 1] & chr(0x7F);
|
||||||
|
}
|
||||||
|
$value.= $temp;
|
||||||
|
}
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
}
|
@ -41,9 +41,14 @@ class Unit_Net_SSH2Test extends PhpseclibTestCase
|
|||||||
$identifier = $this->createSSHMock()->_generate_identifier();
|
$identifier = $this->createSSHMock()->_generate_identifier();
|
||||||
$this->assertStringStartsWith('SSH-2.0-phpseclib_0.3', $identifier);
|
$this->assertStringStartsWith('SSH-2.0-phpseclib_0.3', $identifier);
|
||||||
|
|
||||||
if (extension_loaded('mcrypt')) {
|
if (extension_loaded('openssl')) {
|
||||||
|
$this->assertContains('openssl', $identifier);
|
||||||
|
$this->assertNotContains('mcrypt', $identifier);
|
||||||
|
} else if (extension_loaded('mcrypt')) {
|
||||||
|
$this->assertNotContains('openssl', $identifier);
|
||||||
$this->assertContains('mcrypt', $identifier);
|
$this->assertContains('mcrypt', $identifier);
|
||||||
} else {
|
} else {
|
||||||
|
$this->assertNotContains('openssl', $identifier);
|
||||||
$this->assertNotContains('mcrypt', $identifier);
|
$this->assertNotContains('mcrypt', $identifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,4 +28,6 @@ ssh-add "$HOME/.ssh/id_rsa"
|
|||||||
# Allow the private key of the travis user to log in as phpseclib user
|
# Allow the private key of the travis user to log in as phpseclib user
|
||||||
sudo mkdir -p "/home/$USERNAME/.ssh/"
|
sudo mkdir -p "/home/$USERNAME/.ssh/"
|
||||||
sudo cp "$HOME/.ssh/id_rsa.pub" "/home/$USERNAME/.ssh/authorized_keys"
|
sudo cp "$HOME/.ssh/id_rsa.pub" "/home/$USERNAME/.ssh/authorized_keys"
|
||||||
|
sudo ssh-keyscan -t rsa localhost > "/tmp/known_hosts"
|
||||||
|
sudo cp "/tmp/known_hosts" "/home/$USERNAME/.ssh/known_hosts"
|
||||||
sudo chown "$USERNAME:$USERNAME" "/home/$USERNAME/.ssh/" -R
|
sudo chown "$USERNAME:$USERNAME" "/home/$USERNAME/.ssh/" -R
|
||||||
|
Loading…
Reference in New Issue
Block a user