25 changed files with 25518 additions and 0 deletions
-
3apps/files_external/3rdparty/phpseclib/AUTHORS
-
21apps/files_external/3rdparty/phpseclib/LICENSE
-
15apps/files_external/3rdparty/phpseclib/README.md
-
48apps/files_external/3rdparty/phpseclib/composer.json
-
611apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/AES.php
-
1313apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/DES.php
-
825apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Hash.php
-
531apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/RC4.php
-
2664apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/RSA.php
-
243apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Random.php
-
1496apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Rijndael.php
-
1061apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/TripleDES.php
-
558apps/files_external/3rdparty/phpseclib/phpseclib/File/ANSI.php
-
1295apps/files_external/3rdparty/phpseclib/phpseclib/File/ASN1.php
-
4341apps/files_external/3rdparty/phpseclib/phpseclib/File/X509.php
-
3633apps/files_external/3rdparty/phpseclib/phpseclib/Math/BigInteger.php
-
2029apps/files_external/3rdparty/phpseclib/phpseclib/Net/SFTP.php
-
1435apps/files_external/3rdparty/phpseclib/phpseclib/Net/SSH1.php
-
2997apps/files_external/3rdparty/phpseclib/phpseclib/Net/SSH2.php
-
6apps/files_external/3rdparty/phpseclib/phpseclib/openssl.cnf
-
18apps/files_external/3rdparty/phpseclib/phpunit.xml.dist
-
47apps/files_external/3rdparty/phpseclib/tests/Crypt/Hash/MD5Test.php
-
47apps/files_external/3rdparty/phpseclib/tests/Crypt/Hash/TestCase.php
-
259apps/files_external/3rdparty/phpseclib/tests/Math/BigIntegerTest.php
-
22apps/files_external/3rdparty/phpseclib/tests/bootstrap.php
@ -0,0 +1,3 @@ |
|||
phpseclib Lead Developer: TerraFrost (Jim Wigginton) |
|||
|
|||
phpseclib Developers: monnerat (Patrick Monnerat) |
|||
@ -0,0 +1,21 @@ |
|||
Copyright 2007-2012 TerraFrost and other contributors |
|||
http://phpseclib.sourceforge.net/ |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining |
|||
a copy of this software and associated documentation files (the |
|||
"Software"), to deal in the Software without restriction, including |
|||
without limitation the rights to use, copy, modify, merge, publish, |
|||
distribute, sublicense, and/or sell copies of the Software, and to |
|||
permit persons to whom the Software is furnished to do so, subject to |
|||
the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be |
|||
included in all copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
|||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
|||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE |
|||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
|||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
|||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
|||
@ -0,0 +1,15 @@ |
|||
# phpseclib - PHP Secure Communications Library |
|||
|
|||
[](http://travis-ci.org/phpseclib/phpseclib) |
|||
|
|||
MIT-licensed pure-PHP implementations of an arbitrary-precision integer |
|||
arithmetic library, fully PKCS#1 (v2.1) compliant RSA, DES, 3DES, RC4, Rijndael, |
|||
AES, SSH-1, SSH-2, SFTP, and X.509 |
|||
|
|||
* [Download (0.3.1)](http://sourceforge.net/projects/phpseclib/files/phpseclib0.3.1.zip/download) |
|||
* [Browse Git](https://github.com/phpseclib/phpseclib) |
|||
* [Documentation](http://phpseclib.sourceforge.net/) |
|||
* [Support](http://www.frostjedi.com/phpbb/viewforum.php?f=46) |
|||
|
|||
<img src="http://phpseclib.sourceforge.net/pear-icon.png" alt="PEAR Channel" width="16" height="16"> |
|||
PEAR Channel: [phpseclib.sourceforge.net](http://phpseclib.sourceforge.net/pear.htm) |
|||
@ -0,0 +1,48 @@ |
|||
{ |
|||
"name": "phpseclib/phpseclib", |
|||
"type": "library", |
|||
"description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", |
|||
"keywords": [ |
|||
"security", |
|||
"crypto", |
|||
"cryptography", |
|||
"encryption", |
|||
"signature", |
|||
"signing", |
|||
"rsa", |
|||
"aes", |
|||
"ssh", |
|||
"sftp", |
|||
"x509", |
|||
"x.509", |
|||
"asn1", |
|||
"asn.1", |
|||
"BigInteger" |
|||
], |
|||
"homepage": "http://phpseclib.sourceforge.net", |
|||
"license": "MIT", |
|||
"authors": [ |
|||
{ |
|||
"name": "Jim Wigginton", |
|||
"email": "terrafrost@php.net", |
|||
"role": "Developer" |
|||
} |
|||
], |
|||
"require": { |
|||
"php": ">=5.0.0" |
|||
}, |
|||
"suggest": { |
|||
"ext-mcrypt": "Install the Mcrypt extension in order to speed up a wide variety of cryptographic operations.", |
|||
"ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", |
|||
"pear-pear/PHP_Compat": "Install PHP_Compat to get phpseclib working on PHP >= 4.3.3." |
|||
}, |
|||
"include-path": ["phpseclib/"], |
|||
"autoload": { |
|||
"psr-0": { |
|||
"Crypt": "phpseclib/", |
|||
"File": "phpseclib/", |
|||
"Math": "phpseclib/", |
|||
"Net": "phpseclib/" |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,611 @@ |
|||
<?php |
|||
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ |
|||
|
|||
/** |
|||
* Pure-PHP implementation of AES. |
|||
* |
|||
* Uses mcrypt, if available, and an internal implementation, otherwise. |
|||
* |
|||
* PHP versions 4 and 5 |
|||
* |
|||
* If {@link Crypt_AES::setKeyLength() setKeyLength()} isn't called, it'll be calculated from |
|||
* {@link Crypt_AES::setKey() setKey()}. ie. if the key is 128-bits, the key length will be 128-bits. If it's 136-bits |
|||
* it'll be null-padded to 160-bits and 160 bits will be the key length until {@link Crypt_Rijndael::setKey() setKey()} |
|||
* is called, again, at which point, it'll be recalculated. |
|||
* |
|||
* Since Crypt_AES extends Crypt_Rijndael, some functions are available to be called that, in the context of AES, don't |
|||
* make a whole lot of sense. {@link Crypt_AES::setBlockLength() setBlockLength()}, for instance. Calling that function, |
|||
* however possible, won't do anything (AES has a fixed block length whereas Rijndael has a variable one). |
|||
* |
|||
* Here's a short example of how to use this library: |
|||
* <code> |
|||
* <?php |
|||
* include('Crypt/AES.php'); |
|||
* |
|||
* $aes = new Crypt_AES(); |
|||
* |
|||
* $aes->setKey('abcdefghijklmnop'); |
|||
* |
|||
* $size = 10 * 1024; |
|||
* $plaintext = ''; |
|||
* for ($i = 0; $i < $size; $i++) { |
|||
* $plaintext.= 'a'; |
|||
* } |
|||
* |
|||
* echo $aes->decrypt($aes->encrypt($plaintext)); |
|||
* ?>
|
|||
* </code> |
|||
* |
|||
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
* of this software and associated documentation files (the "Software"), to deal |
|||
* in the Software without restriction, including without limitation the rights |
|||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
* copies of the Software, and to permit persons to whom the Software is |
|||
* furnished to do so, subject to the following conditions: |
|||
* |
|||
* The above copyright notice and this permission notice shall be included in |
|||
* all copies or substantial portions of the Software. |
|||
* |
|||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
* THE SOFTWARE. |
|||
* |
|||
* @category Crypt |
|||
* @package Crypt_AES |
|||
* @author Jim Wigginton <terrafrost@php.net> |
|||
* @copyright MMVIII Jim Wigginton |
|||
* @license http://www.opensource.org/licenses/mit-license.html MIT License |
|||
* @version $Id: AES.php,v 1.7 2010/02/09 06:10:25 terrafrost Exp $ |
|||
* @link http://phpseclib.sourceforge.net |
|||
*/ |
|||
|
|||
/** |
|||
* Include Crypt_Rijndael |
|||
*/ |
|||
if (!class_exists('Crypt_Rijndael')) { |
|||
require_once 'Rijndael.php'; |
|||
} |
|||
|
|||
/**#@+
|
|||
* @access public |
|||
* @see Crypt_AES::encrypt() |
|||
* @see Crypt_AES::decrypt() |
|||
*/ |
|||
/** |
|||
* Encrypt / decrypt using the Counter mode. |
|||
* |
|||
* Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. |
|||
* |
|||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
|
|||
*/ |
|||
define('CRYPT_AES_MODE_CTR', -1); |
|||
/** |
|||
* Encrypt / decrypt using the Electronic Code Book mode. |
|||
* |
|||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
|
|||
*/ |
|||
define('CRYPT_AES_MODE_ECB', 1); |
|||
/** |
|||
* Encrypt / decrypt using the Code Book Chaining mode. |
|||
* |
|||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
|
|||
*/ |
|||
define('CRYPT_AES_MODE_CBC', 2); |
|||
/** |
|||
* Encrypt / decrypt using the Cipher Feedback mode. |
|||
* |
|||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29
|
|||
*/ |
|||
define('CRYPT_AES_MODE_CFB', 3); |
|||
/** |
|||
* Encrypt / decrypt using the Cipher Feedback mode. |
|||
* |
|||
* @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29
|
|||
*/ |
|||
define('CRYPT_AES_MODE_OFB', 4); |
|||
/**#@-*/ |
|||
|
|||
/**#@+
|
|||
* @access private |
|||
* @see Crypt_AES::Crypt_AES() |
|||
*/ |
|||
/** |
|||
* Toggles the internal implementation |
|||
*/ |
|||
define('CRYPT_AES_MODE_INTERNAL', 1); |
|||
/** |
|||
* Toggles the mcrypt implementation |
|||
*/ |
|||
define('CRYPT_AES_MODE_MCRYPT', 2); |
|||
/**#@-*/ |
|||
|
|||
/** |
|||
* Pure-PHP implementation of AES. |
|||
* |
|||
* @author Jim Wigginton <terrafrost@php.net> |
|||
* @version 0.1.0 |
|||
* @access public |
|||
* @package Crypt_AES |
|||
*/ |
|||
class Crypt_AES extends Crypt_Rijndael { |
|||
/** |
|||
* mcrypt resource for encryption |
|||
* |
|||
* The mcrypt resource can be recreated every time something needs to be created or it can be created just once. |
|||
* Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode. |
|||
* |
|||
* @see Crypt_AES::encrypt() |
|||
* @var String |
|||
* @access private |
|||
*/ |
|||
var $enmcrypt; |
|||
|
|||
/** |
|||
* mcrypt resource for decryption |
|||
* |
|||
* The mcrypt resource can be recreated every time something needs to be created or it can be created just once. |
|||
* Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode. |
|||
* |
|||
* @see Crypt_AES::decrypt() |
|||
* @var String |
|||
* @access private |
|||
*/ |
|||
var $demcrypt; |
|||
|
|||
/** |
|||
* mcrypt resource for CFB mode |
|||
* |
|||
* @see Crypt_AES::encrypt() |
|||
* @see Crypt_AES::decrypt() |
|||
* @var String |
|||
* @access private |
|||
*/ |
|||
var $ecb; |
|||
|
|||
/** |
|||
* Default Constructor. |
|||
* |
|||
* Determines whether or not the mcrypt extension should be used. $mode should only, at present, be |
|||
* CRYPT_AES_MODE_ECB or CRYPT_AES_MODE_CBC. If not explictly set, CRYPT_AES_MODE_CBC will be used. |
|||
* |
|||
* @param optional Integer $mode |
|||
* @return Crypt_AES |
|||
* @access public |
|||
*/ |
|||
function Crypt_AES($mode = CRYPT_AES_MODE_CBC) |
|||
{ |
|||
if ( !defined('CRYPT_AES_MODE') ) { |
|||
switch (true) { |
|||
case extension_loaded('mcrypt') && in_array('rijndael-128', mcrypt_list_algorithms()): |
|||
define('CRYPT_AES_MODE', CRYPT_AES_MODE_MCRYPT); |
|||
break; |
|||
default: |
|||
define('CRYPT_AES_MODE', CRYPT_AES_MODE_INTERNAL); |
|||
} |
|||
} |
|||
|
|||
switch ( CRYPT_AES_MODE ) { |
|||
case CRYPT_AES_MODE_MCRYPT: |
|||
switch ($mode) { |
|||
case CRYPT_AES_MODE_ECB: |
|||
$this->paddable = true; |
|||
$this->mode = MCRYPT_MODE_ECB; |
|||
break; |
|||
case CRYPT_AES_MODE_CTR: |
|||
// ctr doesn't have a constant associated with it even though it appears to be fairly widely
|
|||
// supported. in lieu of knowing just how widely supported it is, i've, for now, opted not to
|
|||
// include a compatibility layer. the layer has been implemented but, for now, is commented out.
|
|||
$this->mode = 'ctr'; |
|||
//$this->mode = in_array('ctr', mcrypt_list_modes()) ? 'ctr' : CRYPT_AES_MODE_CTR;
|
|||
break; |
|||
case CRYPT_AES_MODE_CFB: |
|||
$this->mode = 'ncfb'; |
|||
break; |
|||
case CRYPT_AES_MODE_OFB: |
|||
$this->mode = MCRYPT_MODE_NOFB; |
|||
break; |
|||
case CRYPT_AES_MODE_CBC: |
|||
default: |
|||
$this->paddable = true; |
|||
$this->mode = MCRYPT_MODE_CBC; |
|||
} |
|||
|
|||
$this->debuffer = $this->enbuffer = ''; |
|||
|
|||
break; |
|||
default: |
|||
switch ($mode) { |
|||
case CRYPT_AES_MODE_ECB: |
|||
$this->paddable = true; |
|||
$this->mode = CRYPT_RIJNDAEL_MODE_ECB; |
|||
break; |
|||
case CRYPT_AES_MODE_CTR: |
|||
$this->mode = CRYPT_RIJNDAEL_MODE_CTR; |
|||
break; |
|||
case CRYPT_AES_MODE_CFB: |
|||
$this->mode = CRYPT_RIJNDAEL_MODE_CFB; |
|||
break; |
|||
case CRYPT_AES_MODE_OFB: |
|||
$this->mode = CRYPT_RIJNDAEL_MODE_OFB; |
|||
break; |
|||
case CRYPT_AES_MODE_CBC: |
|||
default: |
|||
$this->paddable = true; |
|||
$this->mode = CRYPT_RIJNDAEL_MODE_CBC; |
|||
} |
|||
} |
|||
|
|||
if (CRYPT_AES_MODE == CRYPT_AES_MODE_INTERNAL) { |
|||
parent::Crypt_Rijndael($this->mode); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Dummy function
|
|||
* |
|||
* Since Crypt_AES extends Crypt_Rijndael, this function is, technically, available, but it doesn't do anything. |
|||
* |
|||
* @access public |
|||
* @param Integer $length |
|||
*/ |
|||
function setBlockLength($length) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
|
|||
/** |
|||
* Sets the initialization vector. (optional) |
|||
* |
|||
* SetIV is not required when CRYPT_RIJNDAEL_MODE_ECB is being used. If not explictly set, it'll be assumed |
|||
* to be all zero's. |
|||
* |
|||
* @access public |
|||
* @param String $iv |
|||
*/ |
|||
function setIV($iv) |
|||
{ |
|||
parent::setIV($iv); |
|||
if ( CRYPT_AES_MODE == CRYPT_AES_MODE_MCRYPT ) { |
|||
$this->changed = true; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Encrypts a message. |
|||
* |
|||
* $plaintext will be padded with up to 16 additional bytes. Other AES implementations may or may not pad in the |
|||
* same manner. Other common approaches to padding and the reasons why it's necessary are discussed in the following |
|||
* URL: |
|||
* |
|||
* {@link http://www.di-mgt.com.au/cryptopad.html http://www.di-mgt.com.au/cryptopad.html} |
|||
* |
|||
* An alternative to padding is to, separately, send the length of the file. This is what SSH, in fact, does. |
|||
* strlen($plaintext) will still need to be a multiple of 16, however, arbitrary values can be added to make it that |
|||
* length. |
|||
* |
|||
* @see Crypt_AES::decrypt() |
|||
* @access public |
|||
* @param String $plaintext |
|||
*/ |
|||
function encrypt($plaintext) |
|||
{ |
|||
if ( CRYPT_AES_MODE == CRYPT_AES_MODE_MCRYPT ) { |
|||
$changed = $this->changed; |
|||
$this->_mcryptSetup(); |
|||
/* |
|||
if ($this->mode == CRYPT_AES_MODE_CTR) { |
|||
$iv = $this->encryptIV; |
|||
$xor = mcrypt_generic($this->enmcrypt, $this->_generate_xor(strlen($plaintext), $iv)); |
|||
$ciphertext = $plaintext ^ $xor; |
|||
if ($this->continuousBuffer) { |
|||
$this->encryptIV = $iv; |
|||
} |
|||
return $ciphertext; |
|||
} |
|||
*/ |
|||
// re: http://phpseclib.sourceforge.net/cfb-demo.phps
|
|||
// using mcrypt's default handing of CFB the above would output two different things. using phpseclib's
|
|||
// rewritten CFB implementation the above outputs the same thing twice.
|
|||
if ($this->mode == 'ncfb') { |
|||
if ($changed) { |
|||
$this->ecb = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, ''); |
|||
mcrypt_generic_init($this->ecb, $this->key, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"); |
|||
} |
|||
|
|||
if (strlen($this->enbuffer)) { |
|||
$ciphertext = $plaintext ^ substr($this->encryptIV, strlen($this->enbuffer)); |
|||
$this->enbuffer.= $ciphertext; |
|||
if (strlen($this->enbuffer) == 16) { |
|||
$this->encryptIV = $this->enbuffer; |
|||
$this->enbuffer = ''; |
|||
mcrypt_generic_init($this->enmcrypt, $this->key, $this->encryptIV); |
|||
} |
|||
$plaintext = substr($plaintext, strlen($ciphertext)); |
|||
} else { |
|||
$ciphertext = ''; |
|||
} |
|||
|
|||
$last_pos = strlen($plaintext) & 0xFFFFFFF0; |
|||
$ciphertext.= $last_pos ? mcrypt_generic($this->enmcrypt, substr($plaintext, 0, $last_pos)) : ''; |
|||
|
|||
if (strlen($plaintext) & 0xF) { |
|||
if (strlen($ciphertext)) { |
|||
$this->encryptIV = substr($ciphertext, -16); |
|||
} |
|||
$this->encryptIV = mcrypt_generic($this->ecb, $this->encryptIV); |
|||
$this->enbuffer = substr($plaintext, $last_pos) ^ $this->encryptIV; |
|||
$ciphertext.= $this->enbuffer; |
|||
} |
|||
|
|||
return $ciphertext; |
|||
} |
|||
|
|||
if ($this->paddable) { |
|||
$plaintext = $this->_pad($plaintext); |
|||
} |
|||
|
|||
$ciphertext = mcrypt_generic($this->enmcrypt, $plaintext); |
|||
|
|||
if (!$this->continuousBuffer) { |
|||
mcrypt_generic_init($this->enmcrypt, $this->key, $this->iv); |
|||
} |
|||
|
|||
return $ciphertext; |
|||
} |
|||
|
|||
return parent::encrypt($plaintext); |
|||
} |
|||
|
|||
/** |
|||
* Decrypts a message. |
|||
* |
|||
* If strlen($ciphertext) is not a multiple of 16, null bytes will be added to the end of the string until it is. |
|||
* |
|||
* @see Crypt_AES::encrypt() |
|||
* @access public |
|||
* @param String $ciphertext |
|||
*/ |
|||
function decrypt($ciphertext) |
|||
{ |
|||
if ( CRYPT_AES_MODE == CRYPT_AES_MODE_MCRYPT ) { |
|||
$changed = $this->changed; |
|||
$this->_mcryptSetup(); |
|||
/* |
|||
if ($this->mode == CRYPT_AES_MODE_CTR) { |
|||
$iv = $this->decryptIV; |
|||
$xor = mcrypt_generic($this->enmcrypt, $this->_generate_xor(strlen($ciphertext), $iv)); |
|||
$plaintext = $ciphertext ^ $xor; |
|||
if ($this->continuousBuffer) { |
|||
$this->decryptIV = $iv; |
|||
} |
|||
return $plaintext; |
|||
} |
|||
*/ |
|||
if ($this->mode == 'ncfb') { |
|||
if ($changed) { |
|||
$this->ecb = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, ''); |
|||
mcrypt_generic_init($this->ecb, $this->key, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"); |
|||
} |
|||
|
|||
if (strlen($this->debuffer)) { |
|||
$plaintext = $ciphertext ^ substr($this->decryptIV, strlen($this->debuffer)); |
|||
|
|||
$this->debuffer.= substr($ciphertext, 0, strlen($plaintext)); |
|||
if (strlen($this->debuffer) == 16) { |
|||
$this->decryptIV = $this->debuffer; |
|||
$this->debuffer = ''; |
|||
mcrypt_generic_init($this->demcrypt, $this->key, $this->decryptIV); |
|||
} |
|||
$ciphertext = substr($ciphertext, strlen($plaintext)); |
|||
} else { |
|||
$plaintext = ''; |
|||
} |
|||
|
|||
$last_pos = strlen($ciphertext) & 0xFFFFFFF0; |
|||
$plaintext.= $last_pos ? mdecrypt_generic($this->demcrypt, substr($ciphertext, 0, $last_pos)) : ''; |
|||
|
|||
if (strlen($ciphertext) & 0xF) { |
|||
if (strlen($plaintext)) { |
|||
$this->decryptIV = substr($ciphertext, $last_pos - 16, 16); |
|||
} |
|||
$this->decryptIV = mcrypt_generic($this->ecb, $this->decryptIV); |
|||
$this->debuffer = substr($ciphertext, $last_pos); |
|||
$plaintext.= $this->debuffer ^ $this->decryptIV; |
|||
} |
|||
|
|||
return $plaintext; |
|||
} |
|||
|
|||
if ($this->paddable) { |
|||
// we pad with chr(0) since that's what mcrypt_generic does. to quote from http://php.net/function.mcrypt-generic :
|
|||
// "The data is padded with "\0" to make sure the length of the data is n * blocksize."
|
|||
$ciphertext = str_pad($ciphertext, (strlen($ciphertext) + 15) & 0xFFFFFFF0, chr(0)); |
|||
} |
|||
|
|||
$plaintext = mdecrypt_generic($this->demcrypt, $ciphertext); |
|||
|
|||
if (!$this->continuousBuffer) { |
|||
mcrypt_generic_init($this->demcrypt, $this->key, $this->iv); |
|||
} |
|||
|
|||
return $this->paddable ? $this->_unpad($plaintext) : $plaintext; |
|||
} |
|||
|
|||
return parent::decrypt($ciphertext); |
|||
} |
|||
|
|||
/** |
|||
* Setup mcrypt |
|||
* |
|||
* Validates all the variables. |
|||
* |
|||
* @access private |
|||
*/ |
|||
function _mcryptSetup() |
|||
{ |
|||
if (!$this->changed) { |
|||
return; |
|||
} |
|||
|
|||
if (!$this->explicit_key_length) { |
|||
// this just copied from Crypt_Rijndael::_setup()
|
|||
$length = strlen($this->key) >> 2; |
|||
if ($length > 8) { |
|||
$length = 8; |
|||
} else if ($length < 4) { |
|||
$length = 4; |
|||
} |
|||
$this->Nk = $length; |
|||
$this->key_size = $length << 2; |
|||
} |
|||
|
|||
switch ($this->Nk) { |
|||
case 4: // 128
|
|||
$this->key_size = 16; |
|||
break; |
|||
case 5: // 160
|
|||
case 6: // 192
|
|||
$this->key_size = 24; |
|||
break; |
|||
case 7: // 224
|
|||
case 8: // 256
|
|||
$this->key_size = 32; |
|||
} |
|||
|
|||
$this->key = str_pad(substr($this->key, 0, $this->key_size), $this->key_size, chr(0)); |
|||
$this->encryptIV = $this->decryptIV = $this->iv = str_pad(substr($this->iv, 0, 16), 16, chr(0)); |
|||
|
|||
if (!isset($this->enmcrypt)) { |
|||
$mode = $this->mode; |
|||
//$mode = $this->mode == CRYPT_AES_MODE_CTR ? MCRYPT_MODE_ECB : $this->mode;
|
|||
|
|||
$this->demcrypt = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', $mode, ''); |
|||
$this->enmcrypt = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', $mode, ''); |
|||
} // else should mcrypt_generic_deinit be called?
|
|||
|
|||
mcrypt_generic_init($this->demcrypt, $this->key, $this->iv); |
|||
mcrypt_generic_init($this->enmcrypt, $this->key, $this->iv); |
|||
|
|||
$this->changed = false; |
|||
} |
|||
|
|||
/** |
|||
* Encrypts a block |
|||
* |
|||
* Optimized over Crypt_Rijndael's implementation by means of loop unrolling. |
|||
* |
|||
* @see Crypt_Rijndael::_encryptBlock() |
|||
* @access private |
|||
* @param String $in |
|||
* @return String |
|||
*/ |
|||
function _encryptBlock($in) |
|||
{ |
|||
$state = unpack('N*word', $in); |
|||
|
|||
$Nr = $this->Nr; |
|||
$w = $this->w; |
|||
$t0 = $this->t0; |
|||
$t1 = $this->t1; |
|||
$t2 = $this->t2; |
|||
$t3 = $this->t3; |
|||
|
|||
// addRoundKey and reindex $state
|
|||
$state = array( |
|||
$state['word1'] ^ $w[0][0], |
|||
$state['word2'] ^ $w[0][1], |
|||
$state['word3'] ^ $w[0][2], |
|||
$state['word4'] ^ $w[0][3] |
|||
); |
|||
|
|||
// shiftRows + subWord + mixColumns + addRoundKey
|
|||
// we could loop unroll this and use if statements to do more rounds as necessary, but, in my tests, that yields
|
|||
// only a marginal improvement. since that also, imho, hinders the readability of the code, i've opted not to do it.
|
|||
for ($round = 1; $round < $this->Nr; $round++) { |
|||
$state = array( |
|||
$t0[$state[0] & 0xFF000000] ^ $t1[$state[1] & 0x00FF0000] ^ $t2[$state[2] & 0x0000FF00] ^ $t3[$state[3] & 0x000000FF] ^ $w[$round][0], |
|||
$t0[$state[1] & 0xFF000000] ^ $t1[$state[2] & 0x00FF0000] ^ $t2[$state[3] & 0x0000FF00] ^ $t3[$state[0] & 0x000000FF] ^ $w[$round][1], |
|||
$t0[$state[2] & 0xFF000000] ^ $t1[$state[3] & 0x00FF0000] ^ $t2[$state[0] & 0x0000FF00] ^ $t3[$state[1] & 0x000000FF] ^ $w[$round][2], |
|||
$t0[$state[3] & 0xFF000000] ^ $t1[$state[0] & 0x00FF0000] ^ $t2[$state[1] & 0x0000FF00] ^ $t3[$state[2] & 0x000000FF] ^ $w[$round][3] |
|||
); |
|||
|
|||
} |
|||
|
|||
// subWord
|
|||
$state = array( |
|||
$this->_subWord($state[0]), |
|||
$this->_subWord($state[1]), |
|||
$this->_subWord($state[2]), |
|||
$this->_subWord($state[3]) |
|||
); |
|||
|
|||
// shiftRows + addRoundKey
|
|||
$state = array( |
|||
($state[0] & 0xFF000000) ^ ($state[1] & 0x00FF0000) ^ ($state[2] & 0x0000FF00) ^ ($state[3] & 0x000000FF) ^ $this->w[$this->Nr][0], |
|||
($state[1] & 0xFF000000) ^ ($state[2] & 0x00FF0000) ^ ($state[3] & 0x0000FF00) ^ ($state[0] & 0x000000FF) ^ $this->w[$this->Nr][1], |
|||
($state[2] & 0xFF000000) ^ ($state[3] & 0x00FF0000) ^ ($state[0] & 0x0000FF00) ^ ($state[1] & 0x000000FF) ^ $this->w[$this->Nr][2], |
|||
($state[3] & 0xFF000000) ^ ($state[0] & 0x00FF0000) ^ ($state[1] & 0x0000FF00) ^ ($state[2] & 0x000000FF) ^ $this->w[$this->Nr][3] |
|||
); |
|||
|
|||
return pack('N*', $state[0], $state[1], $state[2], $state[3]); |
|||
} |
|||
|
|||
/** |
|||
* Decrypts a block |
|||
* |
|||
* Optimized over Crypt_Rijndael's implementation by means of loop unrolling. |
|||
* |
|||
* @see Crypt_Rijndael::_decryptBlock() |
|||
* @access private |
|||
* @param String $in |
|||
* @return String |
|||
*/ |
|||
function _decryptBlock($in) |
|||
{ |
|||
$state = unpack('N*word', $in); |
|||
|
|||
$Nr = $this->Nr; |
|||
$dw = $this->dw; |
|||
$dt0 = $this->dt0; |
|||
$dt1 = $this->dt1; |
|||
$dt2 = $this->dt2; |
|||
$dt3 = $this->dt3; |
|||
|
|||
// addRoundKey and reindex $state
|
|||
$state = array( |
|||
$state['word1'] ^ $dw[$this->Nr][0], |
|||
$state['word2'] ^ $dw[$this->Nr][1], |
|||
$state['word3'] ^ $dw[$this->Nr][2], |
|||
$state['word4'] ^ $dw[$this->Nr][3] |
|||
); |
|||
|
|||
|
|||
// invShiftRows + invSubBytes + invMixColumns + addRoundKey
|
|||
for ($round = $this->Nr - 1; $round > 0; $round--) { |
|||
$state = array( |
|||
$dt0[$state[0] & 0xFF000000] ^ $dt1[$state[3] & 0x00FF0000] ^ $dt2[$state[2] & 0x0000FF00] ^ $dt3[$state[1] & 0x000000FF] ^ $dw[$round][0], |
|||
$dt0[$state[1] & 0xFF000000] ^ $dt1[$state[0] & 0x00FF0000] ^ $dt2[$state[3] & 0x0000FF00] ^ $dt3[$state[2] & 0x000000FF] ^ $dw[$round][1], |
|||
$dt0[$state[2] & 0xFF000000] ^ $dt1[$state[1] & 0x00FF0000] ^ $dt2[$state[0] & 0x0000FF00] ^ $dt3[$state[3] & 0x000000FF] ^ $dw[$round][2], |
|||
$dt0[$state[3] & 0xFF000000] ^ $dt1[$state[2] & 0x00FF0000] ^ $dt2[$state[1] & 0x0000FF00] ^ $dt3[$state[0] & 0x000000FF] ^ $dw[$round][3] |
|||
); |
|||
} |
|||
|
|||
// invShiftRows + invSubWord + addRoundKey
|
|||
$state = array( |
|||
$this->_invSubWord(($state[0] & 0xFF000000) ^ ($state[3] & 0x00FF0000) ^ ($state[2] & 0x0000FF00) ^ ($state[1] & 0x000000FF)) ^ $dw[0][0], |
|||
$this->_invSubWord(($state[1] & 0xFF000000) ^ ($state[0] & 0x00FF0000) ^ ($state[3] & 0x0000FF00) ^ ($state[2] & 0x000000FF)) ^ $dw[0][1], |
|||
$this->_invSubWord(($state[2] & 0xFF000000) ^ ($state[1] & 0x00FF0000) ^ ($state[0] & 0x0000FF00) ^ ($state[3] & 0x000000FF)) ^ $dw[0][2], |
|||
$this->_invSubWord(($state[3] & 0xFF000000) ^ ($state[2] & 0x00FF0000) ^ ($state[1] & 0x0000FF00) ^ ($state[0] & 0x000000FF)) ^ $dw[0][3] |
|||
); |
|||
|
|||
return pack('N*', $state[0], $state[1], $state[2], $state[3]); |
|||
} |
|||
} |
|||
|
|||
// vim: ts=4:sw=4:et:
|
|||
// vim6: fdl=1:
|
|||
1313
apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/DES.php
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,825 @@ |
|||
<?php |
|||
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ |
|||
|
|||
/** |
|||
* Pure-PHP implementations of keyed-hash message authentication codes (HMACs) and various cryptographic hashing functions. |
|||
* |
|||
* Uses hash() or mhash() if available and an internal implementation, otherwise. Currently supports the following: |
|||
* |
|||
* md2, md5, md5-96, sha1, sha1-96, sha256, sha384, and sha512 |
|||
* |
|||
* If {@link Crypt_Hash::setKey() setKey()} is called, {@link Crypt_Hash::hash() hash()} will return the HMAC as opposed to |
|||
* the hash. If no valid algorithm is provided, sha1 will be used. |
|||
* |
|||
* PHP versions 4 and 5 |
|||
* |
|||
* {@internal The variable names are the same as those in |
|||
* {@link http://tools.ietf.org/html/rfc2104#section-2 RFC2104}.}}
|
|||
* |
|||
* Here's a short example of how to use this library: |
|||
* <code> |
|||
* <?php |
|||
* include('Crypt/Hash.php'); |
|||
* |
|||
* $hash = new Crypt_Hash('sha1'); |
|||
* |
|||
* $hash->setKey('abcdefg'); |
|||
* |
|||
* echo base64_encode($hash->hash('abcdefg')); |
|||
* ?>
|
|||
* </code> |
|||
* |
|||
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
* of this software and associated documentation files (the "Software"), to deal |
|||
* in the Software without restriction, including without limitation the rights |
|||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
* copies of the Software, and to permit persons to whom the Software is |
|||
* furnished to do so, subject to the following conditions: |
|||
* |
|||
* The above copyright notice and this permission notice shall be included in |
|||
* all copies or substantial portions of the Software. |
|||
* |
|||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
* THE SOFTWARE. |
|||
* |
|||
* @category Crypt |
|||
* @package Crypt_Hash |
|||
* @author Jim Wigginton <terrafrost@php.net> |
|||
* @copyright MMVII Jim Wigginton |
|||
* @license http://www.opensource.org/licenses/mit-license.html MIT License |
|||
* @version $Id: Hash.php,v 1.6 2009/11/23 23:37:07 terrafrost Exp $ |
|||
* @link http://phpseclib.sourceforge.net |
|||
*/ |
|||
|
|||
/**#@+
|
|||
* @access private |
|||
* @see Crypt_Hash::Crypt_Hash() |
|||
*/ |
|||
/** |
|||
* Toggles the internal implementation |
|||
*/ |
|||
define('CRYPT_HASH_MODE_INTERNAL', 1); |
|||
/** |
|||
* Toggles the mhash() implementation, which has been deprecated on PHP 5.3.0+. |
|||
*/ |
|||
define('CRYPT_HASH_MODE_MHASH', 2); |
|||
/** |
|||
* Toggles the hash() implementation, which works on PHP 5.1.2+. |
|||
*/ |
|||
define('CRYPT_HASH_MODE_HASH', 3); |
|||
/**#@-*/ |
|||
|
|||
/** |
|||
* Pure-PHP implementations of keyed-hash message authentication codes (HMACs) and various cryptographic hashing functions. |
|||
* |
|||
* @author Jim Wigginton <terrafrost@php.net> |
|||
* @version 0.1.0 |
|||
* @access public |
|||
* @package Crypt_Hash |
|||
*/ |
|||
class Crypt_Hash { |
|||
/** |
|||
* Byte-length of compression blocks / key (Internal HMAC) |
|||
* |
|||
* @see Crypt_Hash::setAlgorithm() |
|||
* @var Integer |
|||
* @access private |
|||
*/ |
|||
var $b; |
|||
|
|||
/** |
|||
* Byte-length of hash output (Internal HMAC) |
|||
* |
|||
* @see Crypt_Hash::setHash() |
|||
* @var Integer |
|||
* @access private |
|||
*/ |
|||
var $l = false; |
|||
|
|||
/** |
|||
* Hash Algorithm |
|||
* |
|||
* @see Crypt_Hash::setHash() |
|||
* @var String |
|||
* @access private |
|||
*/ |
|||
var $hash; |
|||
|
|||
/** |
|||
* Key |
|||
* |
|||
* @see Crypt_Hash::setKey() |
|||
* @var String |
|||
* @access private |
|||
*/ |
|||
var $key = false; |
|||
|
|||
/** |
|||
* Outer XOR (Internal HMAC) |
|||
* |
|||
* @see Crypt_Hash::setKey() |
|||
* @var String |
|||
* @access private |
|||
*/ |
|||
var $opad; |
|||
|
|||
/** |
|||
* Inner XOR (Internal HMAC) |
|||
* |
|||
* @see Crypt_Hash::setKey() |
|||
* @var String |
|||
* @access private |
|||
*/ |
|||
var $ipad; |
|||
|
|||
/** |
|||
* Default Constructor. |
|||
* |
|||
* @param optional String $hash |
|||
* @return Crypt_Hash |
|||
* @access public |
|||
*/ |
|||
function Crypt_Hash($hash = 'sha1') |
|||
{ |
|||
if ( !defined('CRYPT_HASH_MODE') ) { |
|||
switch (true) { |
|||
case extension_loaded('hash'): |
|||
define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_HASH); |
|||
break; |
|||
case extension_loaded('mhash'): |
|||
define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_MHASH); |
|||
break; |
|||
default: |
|||
define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_INTERNAL); |
|||
} |
|||
} |
|||
|
|||
$this->setHash($hash); |
|||
} |
|||
|
|||
/** |
|||
* Sets the key for HMACs |
|||
* |
|||
* Keys can be of any length. |
|||
* |
|||
* @access public |
|||
* @param String $key |
|||
*/ |
|||
function setKey($key = false) |
|||
{ |
|||
$this->key = $key; |
|||
} |
|||
|
|||
/** |
|||
* Sets the hash function. |
|||
* |
|||
* @access public |
|||
* @param String $hash |
|||
*/ |
|||
function setHash($hash) |
|||
{ |
|||
$hash = strtolower($hash); |
|||
switch ($hash) { |
|||
case 'md5-96': |
|||
case 'sha1-96': |
|||
$this->l = 12; // 96 / 8 = 12
|
|||
break; |
|||
case 'md2': |
|||
case 'md5': |
|||
$this->l = 16; |
|||
break; |
|||
case 'sha1': |
|||
$this->l = 20; |
|||
break; |
|||
case 'sha256': |
|||
$this->l = 32; |
|||
break; |
|||
case 'sha384': |
|||
$this->l = 48; |
|||
break; |
|||
case 'sha512': |
|||
$this->l = 64; |
|||
} |
|||
|
|||
switch ($hash) { |
|||
case 'md2': |
|||
$mode = CRYPT_HASH_MODE == CRYPT_HASH_MODE_HASH && in_array('md2', hash_algos()) ? |
|||
CRYPT_HASH_MODE_HASH : CRYPT_HASH_MODE_INTERNAL; |
|||
break; |
|||
case 'sha384': |
|||
case 'sha512': |
|||
$mode = CRYPT_HASH_MODE == CRYPT_HASH_MODE_MHASH ? CRYPT_HASH_MODE_INTERNAL : CRYPT_HASH_MODE; |
|||
break; |
|||
default: |
|||
$mode = CRYPT_HASH_MODE; |
|||
} |
|||
|
|||
switch ( $mode ) { |
|||
case CRYPT_HASH_MODE_MHASH: |
|||
switch ($hash) { |
|||
case 'md5': |
|||
case 'md5-96': |
|||
$this->hash = MHASH_MD5; |
|||
break; |
|||
case 'sha256': |
|||
$this->hash = MHASH_SHA256; |
|||
break; |
|||
case 'sha1': |
|||
case 'sha1-96': |
|||
default: |
|||
$this->hash = MHASH_SHA1; |
|||
} |
|||
return; |
|||
case CRYPT_HASH_MODE_HASH: |
|||
switch ($hash) { |
|||
case 'md5': |
|||
case 'md5-96': |
|||
$this->hash = 'md5'; |
|||
return; |
|||
case 'md2': |
|||
case 'sha256': |
|||
case 'sha384': |
|||
case 'sha512': |
|||
$this->hash = $hash; |
|||
return; |
|||
case 'sha1': |
|||
case 'sha1-96': |
|||
default: |
|||
$this->hash = 'sha1'; |
|||
} |
|||
return; |
|||
} |
|||
|
|||
switch ($hash) { |
|||
case 'md2': |
|||
$this->b = 16; |
|||
$this->hash = array($this, '_md2'); |
|||
break; |
|||
case 'md5': |
|||
case 'md5-96': |
|||
$this->b = 64; |
|||
$this->hash = array($this, '_md5'); |
|||
break; |
|||
case 'sha256': |
|||
$this->b = 64; |
|||
$this->hash = array($this, '_sha256'); |
|||
break; |
|||
case 'sha384': |
|||
case 'sha512': |
|||
$this->b = 128; |
|||
$this->hash = array($this, '_sha512'); |
|||
break; |
|||
case 'sha1': |
|||
case 'sha1-96': |
|||
default: |
|||
$this->b = 64; |
|||
$this->hash = array($this, '_sha1'); |
|||
} |
|||
|
|||
$this->ipad = str_repeat(chr(0x36), $this->b); |
|||
$this->opad = str_repeat(chr(0x5C), $this->b); |
|||
} |
|||
|
|||
/** |
|||
* Compute the HMAC. |
|||
* |
|||
* @access public |
|||
* @param String $text |
|||
* @return String |
|||
*/ |
|||
function hash($text) |
|||
{ |
|||
$mode = is_array($this->hash) ? CRYPT_HASH_MODE_INTERNAL : CRYPT_HASH_MODE; |
|||
|
|||
if (!empty($this->key) || is_string($this->key)) { |
|||
switch ( $mode ) { |
|||
case CRYPT_HASH_MODE_MHASH: |
|||
$output = mhash($this->hash, $text, $this->key); |
|||
break; |
|||
case CRYPT_HASH_MODE_HASH: |
|||
$output = hash_hmac($this->hash, $text, $this->key, true); |
|||
break; |
|||
case CRYPT_HASH_MODE_INTERNAL: |
|||
/* "Applications that use keys longer than B bytes will first hash the key using H and then use the
|
|||
resultant L byte string as the actual key to HMAC."
|
|||
|
|||
-- http://tools.ietf.org/html/rfc2104#section-2 */
|
|||
$key = strlen($this->key) > $this->b ? call_user_func($this->hash, $this->key) : $this->key; |
|||
|
|||
$key = str_pad($key, $this->b, chr(0)); // step 1
|
|||
$temp = $this->ipad ^ $key; // step 2
|
|||
$temp .= $text; // step 3
|
|||
$temp = call_user_func($this->hash, $temp); // step 4
|
|||
$output = $this->opad ^ $key; // step 5
|
|||
$output.= $temp; // step 6
|
|||
$output = call_user_func($this->hash, $output); // step 7
|
|||
} |
|||
} else { |
|||
switch ( $mode ) { |
|||
case CRYPT_HASH_MODE_MHASH: |
|||
$output = mhash($this->hash, $text); |
|||
break; |
|||
case CRYPT_HASH_MODE_HASH: |
|||
$output = hash($this->hash, $text, true); |
|||
break; |
|||
case CRYPT_HASH_MODE_INTERNAL: |
|||
$output = call_user_func($this->hash, $text); |
|||
} |
|||
} |
|||
|
|||
return substr($output, 0, $this->l); |
|||
} |
|||
|
|||
/** |
|||
* Returns the hash length (in bytes) |
|||
* |
|||
* @access public |
|||
* @return Integer |
|||
*/ |
|||
function getLength() |
|||
{ |
|||
return $this->l; |
|||
} |
|||
|
|||
/** |
|||
* Wrapper for MD5 |
|||
* |
|||
* @access private |
|||
* @param String $text |
|||
*/ |
|||
function _md5($m) |
|||
{ |
|||
return pack('H*', md5($m)); |
|||
} |
|||
|
|||
/** |
|||
* Wrapper for SHA1 |
|||
* |
|||
* @access private |
|||
* @param String $text |
|||
*/ |
|||
function _sha1($m) |
|||
{ |
|||
return pack('H*', sha1($m)); |
|||
} |
|||
|
|||
/** |
|||
* Pure-PHP implementation of MD2 |
|||
* |
|||
* See {@link http://tools.ietf.org/html/rfc1319 RFC1319}. |
|||
* |
|||
* @access private |
|||
* @param String $text |
|||
*/ |
|||
function _md2($m) |
|||
{ |
|||
static $s = array( |
|||
41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6, |
|||
19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188, |
|||
76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24, |
|||
138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251, |
|||
245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63, |
|||
148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50, |
|||
39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165, |
|||
181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210, |
|||
150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157, |
|||
112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27, |
|||
96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15, |
|||
85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197, |
|||
234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65, |
|||
129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123, |
|||
8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233, |
|||
203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228, |
|||
166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237, |
|||
31, 26, 219, 153, 141, 51, 159, 17, 131, 20 |
|||
); |
|||
|
|||
// Step 1. Append Padding Bytes
|
|||
$pad = 16 - (strlen($m) & 0xF); |
|||
$m.= str_repeat(chr($pad), $pad); |
|||
|
|||
$length = strlen($m); |
|||
|
|||
// Step 2. Append Checksum
|
|||
$c = str_repeat(chr(0), 16); |
|||
$l = chr(0); |
|||
for ($i = 0; $i < $length; $i+= 16) { |
|||
for ($j = 0; $j < 16; $j++) { |
|||
// RFC1319 incorrectly states that C[j] should be set to S[c xor L]
|
|||
//$c[$j] = chr($s[ord($m[$i + $j] ^ $l)]);
|
|||
// per <http://www.rfc-editor.org/errata_search.php?rfc=1319>, however, C[j] should be set to S[c xor L] xor C[j]
|
|||
$c[$j] = chr($s[ord($m[$i + $j] ^ $l)] ^ ord($c[$j])); |
|||
$l = $c[$j]; |
|||
} |
|||
} |
|||
$m.= $c; |
|||
|
|||
$length+= 16; |
|||
|
|||
// Step 3. Initialize MD Buffer
|
|||
$x = str_repeat(chr(0), 48); |
|||
|
|||
// Step 4. Process Message in 16-Byte Blocks
|
|||
for ($i = 0; $i < $length; $i+= 16) { |
|||
for ($j = 0; $j < 16; $j++) { |
|||
$x[$j + 16] = $m[$i + $j]; |
|||
$x[$j + 32] = $x[$j + 16] ^ $x[$j]; |
|||
} |
|||
$t = chr(0); |
|||
for ($j = 0; $j < 18; $j++) { |
|||
for ($k = 0; $k < 48; $k++) { |
|||
$x[$k] = $t = $x[$k] ^ chr($s[ord($t)]); |
|||
//$t = $x[$k] = $x[$k] ^ chr($s[ord($t)]);
|
|||
} |
|||
$t = chr(ord($t) + $j); |
|||
} |
|||
} |
|||
|
|||
// Step 5. Output
|
|||
return substr($x, 0, 16); |
|||
} |
|||
|
|||
/** |
|||
* Pure-PHP implementation of SHA256 |
|||
* |
|||
* See {@link http://en.wikipedia.org/wiki/SHA_hash_functions#SHA-256_.28a_SHA-2_variant.29_pseudocode SHA-256 (a SHA-2 variant) pseudocode - Wikipedia}.
|
|||
* |
|||
* @access private |
|||
* @param String $text |
|||
*/ |
|||
function _sha256($m) |
|||
{ |
|||
if (extension_loaded('suhosin')) { |
|||
return pack('H*', sha256($m)); |
|||
} |
|||
|
|||
// Initialize variables
|
|||
$hash = array( |
|||
0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 |
|||
); |
|||
// Initialize table of round constants
|
|||
// (first 32 bits of the fractional parts of the cube roots of the first 64 primes 2..311)
|
|||
static $k = array( |
|||
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, |
|||
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, |
|||
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, |
|||
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, |
|||
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, |
|||
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, |
|||
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, |
|||
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 |
|||
); |
|||
|
|||
// Pre-processing
|
|||
$length = strlen($m); |
|||
// to round to nearest 56 mod 64, we'll add 64 - (length + (64 - 56)) % 64
|
|||
$m.= str_repeat(chr(0), 64 - (($length + 8) & 0x3F)); |
|||
$m[$length] = chr(0x80); |
|||
// we don't support hashing strings 512MB long
|
|||
$m.= pack('N2', 0, $length << 3); |
|||
|
|||
// Process the message in successive 512-bit chunks
|
|||
$chunks = str_split($m, 64); |
|||
foreach ($chunks as $chunk) { |
|||
$w = array(); |
|||
for ($i = 0; $i < 16; $i++) { |
|||
extract(unpack('Ntemp', $this->_string_shift($chunk, 4))); |
|||
$w[] = $temp; |
|||
} |
|||
|
|||
// Extend the sixteen 32-bit words into sixty-four 32-bit words
|
|||
for ($i = 16; $i < 64; $i++) { |
|||
$s0 = $this->_rightRotate($w[$i - 15], 7) ^ |
|||
$this->_rightRotate($w[$i - 15], 18) ^ |
|||
$this->_rightShift( $w[$i - 15], 3); |
|||
$s1 = $this->_rightRotate($w[$i - 2], 17) ^ |
|||
$this->_rightRotate($w[$i - 2], 19) ^ |
|||
$this->_rightShift( $w[$i - 2], 10); |
|||
$w[$i] = $this->_add($w[$i - 16], $s0, $w[$i - 7], $s1); |
|||
|
|||
} |
|||
|
|||
// Initialize hash value for this chunk
|
|||
list($a, $b, $c, $d, $e, $f, $g, $h) = $hash; |
|||
|
|||
// Main loop
|
|||
for ($i = 0; $i < 64; $i++) { |
|||
$s0 = $this->_rightRotate($a, 2) ^ |
|||
$this->_rightRotate($a, 13) ^ |
|||
$this->_rightRotate($a, 22); |
|||
$maj = ($a & $b) ^ |
|||
($a & $c) ^ |
|||
($b & $c); |
|||
$t2 = $this->_add($s0, $maj); |
|||
|
|||
$s1 = $this->_rightRotate($e, 6) ^ |
|||
$this->_rightRotate($e, 11) ^ |
|||
$this->_rightRotate($e, 25); |
|||
$ch = ($e & $f) ^ |
|||
($this->_not($e) & $g); |
|||
$t1 = $this->_add($h, $s1, $ch, $k[$i], $w[$i]); |
|||
|
|||
$h = $g; |
|||
$g = $f; |
|||
$f = $e; |
|||
$e = $this->_add($d, $t1); |
|||
$d = $c; |
|||
$c = $b; |
|||
$b = $a; |
|||
$a = $this->_add($t1, $t2); |
|||
} |
|||
|
|||
// Add this chunk's hash to result so far
|
|||
$hash = array( |
|||
$this->_add($hash[0], $a), |
|||
$this->_add($hash[1], $b), |
|||
$this->_add($hash[2], $c), |
|||
$this->_add($hash[3], $d), |
|||
$this->_add($hash[4], $e), |
|||
$this->_add($hash[5], $f), |
|||
$this->_add($hash[6], $g), |
|||
$this->_add($hash[7], $h) |
|||
); |
|||
} |
|||
|
|||
// Produce the final hash value (big-endian)
|
|||
return pack('N8', $hash[0], $hash[1], $hash[2], $hash[3], $hash[4], $hash[5], $hash[6], $hash[7]); |
|||
} |
|||
|
|||
/** |
|||
* Pure-PHP implementation of SHA384 and SHA512 |
|||
* |
|||
* @access private |
|||
* @param String $text |
|||
*/ |
|||
function _sha512($m) |
|||
{ |
|||
if (!class_exists('Math_BigInteger')) { |
|||
require_once('Math/BigInteger.php'); |
|||
} |
|||
|
|||
static $init384, $init512, $k; |
|||
|
|||
if (!isset($k)) { |
|||
// Initialize variables
|
|||
$init384 = array( // initial values for SHA384
|
|||
'cbbb9d5dc1059ed8', '629a292a367cd507', '9159015a3070dd17', '152fecd8f70e5939', |
|||
'67332667ffc00b31', '8eb44a8768581511', 'db0c2e0d64f98fa7', '47b5481dbefa4fa4' |
|||
); |
|||
$init512 = array( // initial values for SHA512
|
|||
'6a09e667f3bcc908', 'bb67ae8584caa73b', '3c6ef372fe94f82b', 'a54ff53a5f1d36f1', |
|||
'510e527fade682d1', '9b05688c2b3e6c1f', '1f83d9abfb41bd6b', '5be0cd19137e2179' |
|||
); |
|||
|
|||
for ($i = 0; $i < 8; $i++) { |
|||
$init384[$i] = new Math_BigInteger($init384[$i], 16); |
|||
$init384[$i]->setPrecision(64); |
|||
$init512[$i] = new Math_BigInteger($init512[$i], 16); |
|||
$init512[$i]->setPrecision(64); |
|||
} |
|||
|
|||
// Initialize table of round constants
|
|||
// (first 64 bits of the fractional parts of the cube roots of the first 80 primes 2..409)
|
|||
$k = array( |
|||
'428a2f98d728ae22', '7137449123ef65cd', 'b5c0fbcfec4d3b2f', 'e9b5dba58189dbbc', |
|||
'3956c25bf348b538', '59f111f1b605d019', '923f82a4af194f9b', 'ab1c5ed5da6d8118', |
|||
'd807aa98a3030242', '12835b0145706fbe', '243185be4ee4b28c', '550c7dc3d5ffb4e2', |
|||
'72be5d74f27b896f', '80deb1fe3b1696b1', '9bdc06a725c71235', 'c19bf174cf692694', |
|||
'e49b69c19ef14ad2', 'efbe4786384f25e3', '0fc19dc68b8cd5b5', '240ca1cc77ac9c65', |
|||
'2de92c6f592b0275', '4a7484aa6ea6e483', '5cb0a9dcbd41fbd4', '76f988da831153b5', |
|||
'983e5152ee66dfab', 'a831c66d2db43210', 'b00327c898fb213f', 'bf597fc7beef0ee4', |
|||
'c6e00bf33da88fc2', 'd5a79147930aa725', '06ca6351e003826f', '142929670a0e6e70', |
|||
'27b70a8546d22ffc', '2e1b21385c26c926', '4d2c6dfc5ac42aed', '53380d139d95b3df', |
|||
'650a73548baf63de', '766a0abb3c77b2a8', '81c2c92e47edaee6', '92722c851482353b', |
|||
'a2bfe8a14cf10364', 'a81a664bbc423001', 'c24b8b70d0f89791', 'c76c51a30654be30', |
|||
'd192e819d6ef5218', 'd69906245565a910', 'f40e35855771202a', '106aa07032bbd1b8', |
|||
'19a4c116b8d2d0c8', '1e376c085141ab53', '2748774cdf8eeb99', '34b0bcb5e19b48a8', |
|||
'391c0cb3c5c95a63', '4ed8aa4ae3418acb', '5b9cca4f7763e373', '682e6ff3d6b2b8a3', |
|||
'748f82ee5defb2fc', '78a5636f43172f60', '84c87814a1f0ab72', '8cc702081a6439ec', |
|||
'90befffa23631e28', 'a4506cebde82bde9', 'bef9a3f7b2c67915', 'c67178f2e372532b', |
|||
'ca273eceea26619c', 'd186b8c721c0c207', 'eada7dd6cde0eb1e', 'f57d4f7fee6ed178', |
|||
'06f067aa72176fba', '0a637dc5a2c898a6', '113f9804bef90dae', '1b710b35131c471b', |
|||
'28db77f523047d84', '32caab7b40c72493', '3c9ebe0a15c9bebc', '431d67c49c100d4c', |
|||
'4cc5d4becb3e42b6', '597f299cfc657e2a', '5fcb6fab3ad6faec', '6c44198c4a475817' |
|||
); |
|||
|
|||
for ($i = 0; $i < 80; $i++) { |
|||
$k[$i] = new Math_BigInteger($k[$i], 16); |
|||
} |
|||
} |
|||
|
|||
$hash = $this->l == 48 ? $init384 : $init512; |
|||
|
|||
// Pre-processing
|
|||
$length = strlen($m); |
|||
// to round to nearest 112 mod 128, we'll add 128 - (length + (128 - 112)) % 128
|
|||
$m.= str_repeat(chr(0), 128 - (($length + 16) & 0x7F)); |
|||
$m[$length] = chr(0x80); |
|||
// we don't support hashing strings 512MB long
|
|||
$m.= pack('N4', 0, 0, 0, $length << 3); |
|||
|
|||
// Process the message in successive 1024-bit chunks
|
|||
$chunks = str_split($m, 128); |
|||
foreach ($chunks as $chunk) { |
|||
$w = array(); |
|||
for ($i = 0; $i < 16; $i++) { |
|||
$temp = new Math_BigInteger($this->_string_shift($chunk, 8), 256); |
|||
$temp->setPrecision(64); |
|||
$w[] = $temp; |
|||
} |
|||
|
|||
// Extend the sixteen 32-bit words into eighty 32-bit words
|
|||
for ($i = 16; $i < 80; $i++) { |
|||
$temp = array( |
|||
$w[$i - 15]->bitwise_rightRotate(1), |
|||
$w[$i - 15]->bitwise_rightRotate(8), |
|||
$w[$i - 15]->bitwise_rightShift(7) |
|||
); |
|||
$s0 = $temp[0]->bitwise_xor($temp[1]); |
|||
$s0 = $s0->bitwise_xor($temp[2]); |
|||
$temp = array( |
|||
$w[$i - 2]->bitwise_rightRotate(19), |
|||
$w[$i - 2]->bitwise_rightRotate(61), |
|||
$w[$i - 2]->bitwise_rightShift(6) |
|||
); |
|||
$s1 = $temp[0]->bitwise_xor($temp[1]); |
|||
$s1 = $s1->bitwise_xor($temp[2]); |
|||
$w[$i] = $w[$i - 16]->copy(); |
|||
$w[$i] = $w[$i]->add($s0); |
|||
$w[$i] = $w[$i]->add($w[$i - 7]); |
|||
$w[$i] = $w[$i]->add($s1); |
|||
} |
|||
|
|||
// Initialize hash value for this chunk
|
|||
$a = $hash[0]->copy(); |
|||
$b = $hash[1]->copy(); |
|||
$c = $hash[2]->copy(); |
|||
$d = $hash[3]->copy(); |
|||
$e = $hash[4]->copy(); |
|||
$f = $hash[5]->copy(); |
|||
$g = $hash[6]->copy(); |
|||
$h = $hash[7]->copy(); |
|||
|
|||
// Main loop
|
|||
for ($i = 0; $i < 80; $i++) { |
|||
$temp = array( |
|||
$a->bitwise_rightRotate(28), |
|||
$a->bitwise_rightRotate(34), |
|||
$a->bitwise_rightRotate(39) |
|||
); |
|||
$s0 = $temp[0]->bitwise_xor($temp[1]); |
|||
$s0 = $s0->bitwise_xor($temp[2]); |
|||
$temp = array( |
|||
$a->bitwise_and($b), |
|||
$a->bitwise_and($c), |
|||
$b->bitwise_and($c) |
|||
); |
|||
$maj = $temp[0]->bitwise_xor($temp[1]); |
|||
$maj = $maj->bitwise_xor($temp[2]); |
|||
$t2 = $s0->add($maj); |
|||
|
|||
$temp = array( |
|||
$e->bitwise_rightRotate(14), |
|||
$e->bitwise_rightRotate(18), |
|||
$e->bitwise_rightRotate(41) |
|||
); |
|||
$s1 = $temp[0]->bitwise_xor($temp[1]); |
|||
$s1 = $s1->bitwise_xor($temp[2]); |
|||
$temp = array( |
|||
$e->bitwise_and($f), |
|||
$g->bitwise_and($e->bitwise_not()) |
|||
); |
|||
$ch = $temp[0]->bitwise_xor($temp[1]); |
|||
$t1 = $h->add($s1); |
|||
$t1 = $t1->add($ch); |
|||
$t1 = $t1->add($k[$i]); |
|||
$t1 = $t1->add($w[$i]); |
|||
|
|||
$h = $g->copy(); |
|||
$g = $f->copy(); |
|||
$f = $e->copy(); |
|||
$e = $d->add($t1); |
|||
$d = $c->copy(); |
|||
$c = $b->copy(); |
|||
$b = $a->copy(); |
|||
$a = $t1->add($t2); |
|||
} |
|||
|
|||
// Add this chunk's hash to result so far
|
|||
$hash = array( |
|||
$hash[0]->add($a), |
|||
$hash[1]->add($b), |
|||
$hash[2]->add($c), |
|||
$hash[3]->add($d), |
|||
$hash[4]->add($e), |
|||
$hash[5]->add($f), |
|||
$hash[6]->add($g), |
|||
$hash[7]->add($h) |
|||
); |
|||
} |
|||
|
|||
// Produce the final hash value (big-endian)
|
|||
// (Crypt_Hash::hash() trims the output for hashes but not for HMACs. as such, we trim the output here)
|
|||
$temp = $hash[0]->toBytes() . $hash[1]->toBytes() . $hash[2]->toBytes() . $hash[3]->toBytes() . |
|||
$hash[4]->toBytes() . $hash[5]->toBytes(); |
|||
if ($this->l != 48) { |
|||
$temp.= $hash[6]->toBytes() . $hash[7]->toBytes(); |
|||
} |
|||
|
|||
return $temp; |
|||
} |
|||
|
|||
/** |
|||
* Right Rotate |
|||
* |
|||
* @access private |
|||
* @param Integer $int |
|||
* @param Integer $amt |
|||
* @see _sha256() |
|||
* @return Integer |
|||
*/ |
|||
function _rightRotate($int, $amt) |
|||
{ |
|||
$invamt = 32 - $amt; |
|||
$mask = (1 << $invamt) - 1; |
|||
return (($int << $invamt) & 0xFFFFFFFF) | (($int >> $amt) & $mask); |
|||
} |
|||
|
|||
/** |
|||
* Right Shift |
|||
* |
|||
* @access private |
|||
* @param Integer $int |
|||
* @param Integer $amt |
|||
* @see _sha256() |
|||
* @return Integer |
|||
*/ |
|||
function _rightShift($int, $amt) |
|||
{ |
|||
$mask = (1 << (32 - $amt)) - 1; |
|||
return ($int >> $amt) & $mask; |
|||
} |
|||
|
|||
/** |
|||
* Not |
|||
* |
|||
* @access private |
|||
* @param Integer $int |
|||
* @see _sha256() |
|||
* @return Integer |
|||
*/ |
|||
function _not($int) |
|||
{ |
|||
return ~$int & 0xFFFFFFFF; |
|||
} |
|||
|
|||
/** |
|||
* Add |
|||
* |
|||
* _sha256() adds multiple unsigned 32-bit integers. Since PHP doesn't support unsigned integers and since the |
|||
* possibility of overflow exists, care has to be taken. Math_BigInteger() could be used but this should be faster. |
|||
* |
|||
* @param String $string |
|||
* @param optional Integer $index |
|||
* @return String |
|||
* @see _sha256() |
|||
* @access private |
|||
*/ |
|||
function _add() |
|||
{ |
|||
static $mod; |
|||
if (!isset($mod)) { |
|||
$mod = pow(2, 32); |
|||
} |
|||
|
|||
$result = 0; |
|||
$arguments = func_get_args(); |
|||
foreach ($arguments as $argument) { |
|||
$result+= $argument < 0 ? ($argument & 0x7FFFFFFF) + 0x80000000 : $argument; |
|||
} |
|||
|
|||
return fmod($result, $mod); |
|||
} |
|||
|
|||
/** |
|||
* String Shift |
|||
* |
|||
* Inspired by array_shift |
|||
* |
|||
* @param String $string |
|||
* @param optional Integer $index |
|||
* @return String |
|||
* @access private |
|||
*/ |
|||
function _string_shift(&$string, $index = 1) |
|||
{ |
|||
$substr = substr($string, 0, $index); |
|||
$string = substr($string, $index); |
|||
return $substr; |
|||
} |
|||
} |
|||
@ -0,0 +1,531 @@ |
|||
<?php |
|||
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ |
|||
|
|||
/** |
|||
* Pure-PHP implementation of RC4. |
|||
* |
|||
* Uses mcrypt, if available, and an internal implementation, otherwise. |
|||
* |
|||
* PHP versions 4 and 5 |
|||
* |
|||
* Useful resources are as follows: |
|||
* |
|||
* - {@link http://www.mozilla.org/projects/security/pki/nss/draft-kaukonen-cipher-arcfour-03.txt ARCFOUR Algorithm} |
|||
* - {@link http://en.wikipedia.org/wiki/RC4 - Wikipedia: RC4} |
|||
* |
|||
* RC4 is also known as ARCFOUR or ARC4. The reason is elaborated upon at Wikipedia. This class is named RC4 and not |
|||
* ARCFOUR or ARC4 because RC4 is how it is refered to in the SSH1 specification. |
|||
* |
|||
* Here's a short example of how to use this library: |
|||
* <code> |
|||
* <?php |
|||
* include('Crypt/RC4.php'); |
|||
* |
|||
* $rc4 = new Crypt_RC4(); |
|||
* |
|||
* $rc4->setKey('abcdefgh'); |
|||
* |
|||
* $size = 10 * 1024; |
|||
* $plaintext = ''; |
|||
* for ($i = 0; $i < $size; $i++) { |
|||
* $plaintext.= 'a'; |
|||
* } |
|||
* |
|||
* echo $rc4->decrypt($rc4->encrypt($plaintext)); |
|||
* ?>
|
|||
* </code> |
|||
* |
|||
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
* of this software and associated documentation files (the "Software"), to deal |
|||
* in the Software without restriction, including without limitation the rights |
|||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
* copies of the Software, and to permit persons to whom the Software is |
|||
* furnished to do so, subject to the following conditions: |
|||
* |
|||
* The above copyright notice and this permission notice shall be included in |
|||
* all copies or substantial portions of the Software. |
|||
* |
|||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
* THE SOFTWARE. |
|||
* |
|||
* @category Crypt |
|||
* @package Crypt_RC4 |
|||
* @author Jim Wigginton <terrafrost@php.net> |
|||
* @copyright MMVII Jim Wigginton |
|||
* @license http://www.opensource.org/licenses/mit-license.html MIT License |
|||
* @version $Id: RC4.php,v 1.8 2009/06/09 04:00:38 terrafrost Exp $ |
|||
* @link http://phpseclib.sourceforge.net |
|||
*/ |
|||
|
|||
/**#@+
|
|||
* @access private |
|||
* @see Crypt_RC4::Crypt_RC4() |
|||
*/ |
|||
/** |
|||
* Toggles the internal implementation |
|||
*/ |
|||
define('CRYPT_RC4_MODE_INTERNAL', 1); |
|||
/** |
|||
* Toggles the mcrypt implementation |
|||
*/ |
|||
define('CRYPT_RC4_MODE_MCRYPT', 2); |
|||
/**#@-*/ |
|||
|
|||
/**#@+
|
|||
* @access private |
|||
* @see Crypt_RC4::_crypt() |
|||
*/ |
|||
define('CRYPT_RC4_ENCRYPT', 0); |
|||
define('CRYPT_RC4_DECRYPT', 1); |
|||
/**#@-*/ |
|||
|
|||
/** |
|||
* Pure-PHP implementation of RC4. |
|||
* |
|||
* @author Jim Wigginton <terrafrost@php.net> |
|||
* @version 0.1.0 |
|||
* @access public |
|||
* @package Crypt_RC4 |
|||
*/ |
|||
class Crypt_RC4 { |
|||
/** |
|||
* The Key |
|||
* |
|||
* @see Crypt_RC4::setKey() |
|||
* @var String |
|||
* @access private |
|||
*/ |
|||
var $key = "\0"; |
|||
|
|||
/** |
|||
* The Key Stream for encryption |
|||
* |
|||
* If CRYPT_RC4_MODE == CRYPT_RC4_MODE_MCRYPT, this will be equal to the mcrypt object |
|||
* |
|||
* @see Crypt_RC4::setKey() |
|||
* @var Array |
|||
* @access private |
|||
*/ |
|||
var $encryptStream = false; |
|||
|
|||
/** |
|||
* The Key Stream for decryption |
|||
* |
|||
* If CRYPT_RC4_MODE == CRYPT_RC4_MODE_MCRYPT, this will be equal to the mcrypt object |
|||
* |
|||
* @see Crypt_RC4::setKey() |
|||
* @var Array |
|||
* @access private |
|||
*/ |
|||
var $decryptStream = false; |
|||
|
|||
/** |
|||
* The $i and $j indexes for encryption |
|||
* |
|||
* @see Crypt_RC4::_crypt() |
|||
* @var Integer |
|||
* @access private |
|||
*/ |
|||
var $encryptIndex = 0; |
|||
|
|||
/** |
|||
* The $i and $j indexes for decryption |
|||
* |
|||
* @see Crypt_RC4::_crypt() |
|||
* @var Integer |
|||
* @access private |
|||
*/ |
|||
var $decryptIndex = 0; |
|||
|
|||
/** |
|||
* The Encryption Algorithm |
|||
* |
|||
* Only used if CRYPT_RC4_MODE == CRYPT_RC4_MODE_MCRYPT. Only possible values are MCRYPT_RC4 or MCRYPT_ARCFOUR. |
|||
* |
|||
* @see Crypt_RC4::Crypt_RC4() |
|||
* @var Integer |
|||
* @access private |
|||
*/ |
|||
var $mode; |
|||
|
|||
/** |
|||
* Continuous Buffer status |
|||
* |
|||
* @see Crypt_RC4::enableContinuousBuffer() |
|||
* @var Boolean |
|||
* @access private |
|||
*/ |
|||
var $continuousBuffer = false; |
|||
|
|||
/** |
|||
* Default Constructor. |
|||
* |
|||
* Determines whether or not the mcrypt extension should be used. |
|||
* |
|||
* @param optional Integer $mode |
|||
* @return Crypt_RC4 |
|||
* @access public |
|||
*/ |
|||
function Crypt_RC4() |
|||
{ |
|||
if ( !defined('CRYPT_RC4_MODE') ) { |
|||
switch (true) { |
|||
case extension_loaded('mcrypt') && (defined('MCRYPT_ARCFOUR') || defined('MCRYPT_RC4')) && in_array('arcfour', mcrypt_list_algorithms()): |
|||
define('CRYPT_RC4_MODE', CRYPT_RC4_MODE_MCRYPT); |
|||
break; |
|||
default: |
|||
define('CRYPT_RC4_MODE', CRYPT_RC4_MODE_INTERNAL); |
|||
} |
|||
} |
|||
|
|||
switch ( CRYPT_RC4_MODE ) { |
|||
case CRYPT_RC4_MODE_MCRYPT: |
|||
switch (true) { |
|||
case defined('MCRYPT_ARCFOUR'): |
|||
$this->mode = MCRYPT_ARCFOUR; |
|||
break; |
|||
case defined('MCRYPT_RC4'); |
|||
$this->mode = MCRYPT_RC4; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Sets the key. |
|||
* |
|||
* Keys can be between 1 and 256 bytes long. If they are longer then 256 bytes, the first 256 bytes will |
|||
* be used. If no key is explicitly set, it'll be assumed to be a single null byte. |
|||
* |
|||
* @access public |
|||
* @param String $key |
|||
*/ |
|||
function setKey($key) |
|||
{ |
|||
$this->key = $key; |
|||
|
|||
if ( CRYPT_RC4_MODE == CRYPT_RC4_MODE_MCRYPT ) { |
|||
return; |
|||
} |
|||
|
|||
$keyLength = strlen($key); |
|||
$keyStream = array(); |
|||
for ($i = 0; $i < 256; $i++) { |
|||
$keyStream[$i] = $i; |
|||
} |
|||
$j = 0; |
|||
for ($i = 0; $i < 256; $i++) { |
|||
$j = ($j + $keyStream[$i] + ord($key[$i % $keyLength])) & 255; |
|||
$temp = $keyStream[$i]; |
|||
$keyStream[$i] = $keyStream[$j]; |
|||
$keyStream[$j] = $temp; |
|||
} |
|||
|
|||
$this->encryptIndex = $this->decryptIndex = array(0, 0); |
|||
$this->encryptStream = $this->decryptStream = $keyStream; |
|||
} |
|||
|
|||
/** |
|||
* Sets the password. |
|||
* |
|||
* Depending on what $method is set to, setPassword()'s (optional) parameters are as follows: |
|||
* {@link http://en.wikipedia.org/wiki/PBKDF2 pbkdf2}: |
|||
* $hash, $salt, $count, $dkLen |
|||
* |
|||
* @param String $password |
|||
* @param optional String $method |
|||
* @access public |
|||
*/ |
|||
function setPassword($password, $method = 'pbkdf2') |
|||
{ |
|||
$key = ''; |
|||
|
|||
switch ($method) { |
|||
default: // 'pbkdf2'
|
|||
list(, , $hash, $salt, $count) = func_get_args(); |
|||
if (!isset($hash)) { |
|||
$hash = 'sha1'; |
|||
} |
|||
// WPA and WPA use the SSID as the salt
|
|||
if (!isset($salt)) { |
|||
$salt = 'phpseclib/salt'; |
|||
} |
|||
// RFC2898#section-4.2 uses 1,000 iterations by default
|
|||
// WPA and WPA2 use 4,096.
|
|||
if (!isset($count)) { |
|||
$count = 1000; |
|||
} |
|||
if (!isset($dkLen)) { |
|||
$dkLen = 128; |
|||
} |
|||
|
|||
if (!class_exists('Crypt_Hash')) { |
|||
require_once('Crypt/Hash.php'); |
|||
} |
|||
|
|||
$i = 1; |
|||
while (strlen($key) < $dkLen) { |
|||
//$dk.= $this->_pbkdf($password, $salt, $count, $i++);
|
|||
$hmac = new Crypt_Hash(); |
|||
$hmac->setHash($hash); |
|||
$hmac->setKey($password); |
|||
$f = $u = $hmac->hash($salt . pack('N', $i++)); |
|||
for ($j = 2; $j <= $count; $j++) { |
|||
$u = $hmac->hash($u); |
|||
$f^= $u; |
|||
} |
|||
$key.= $f; |
|||
} |
|||
} |
|||
|
|||
$this->setKey(substr($key, 0, $dkLen)); |
|||
} |
|||
|
|||
/** |
|||
* Dummy function. |
|||
* |
|||
* Some protocols, such as WEP, prepend an "initialization vector" to the key, effectively creating a new key [1]. |
|||
* If you need to use an initialization vector in this manner, feel free to prepend it to the key, yourself, before |
|||
* calling setKey(). |
|||
* |
|||
* [1] WEP's initialization vectors (IV's) are used in a somewhat insecure way. Since, in that protocol, |
|||
* the IV's are relatively easy to predict, an attack described by |
|||
* {@link http://www.drizzle.com/~aboba/IEEE/rc4_ksaproc.pdf Scott Fluhrer, Itsik Mantin, and Adi Shamir} |
|||
* can be used to quickly guess at the rest of the key. The following links elaborate: |
|||
* |
|||
* {@link http://www.rsa.com/rsalabs/node.asp?id=2009 http://www.rsa.com/rsalabs/node.asp?id=2009} |
|||
* {@link http://en.wikipedia.org/wiki/Related_key_attack http://en.wikipedia.org/wiki/Related_key_attack} |
|||
* |
|||
* @param String $iv |
|||
* @see Crypt_RC4::setKey() |
|||
* @access public |
|||
*/ |
|||
function setIV($iv) |
|||
{ |
|||
} |
|||
|
|||
/** |
|||
* Encrypts a message. |
|||
* |
|||
* @see Crypt_RC4::_crypt() |
|||
* @access public |
|||
* @param String $plaintext |
|||
*/ |
|||
function encrypt($plaintext) |
|||
{ |
|||
return $this->_crypt($plaintext, CRYPT_RC4_ENCRYPT); |
|||
} |
|||
|
|||
/** |
|||
* Decrypts a message. |
|||
* |
|||
* $this->decrypt($this->encrypt($plaintext)) == $this->encrypt($this->encrypt($plaintext)). |
|||
* Atleast if the continuous buffer is disabled. |
|||
* |
|||
* @see Crypt_RC4::_crypt() |
|||
* @access public |
|||
* @param String $ciphertext |
|||
*/ |
|||
function decrypt($ciphertext) |
|||
{ |
|||
return $this->_crypt($ciphertext, CRYPT_RC4_DECRYPT); |
|||
} |
|||
|
|||
/** |
|||
* Encrypts or decrypts a message. |
|||
* |
|||
* @see Crypt_RC4::encrypt() |
|||
* @see Crypt_RC4::decrypt() |
|||
* @access private |
|||
* @param String $text |
|||
* @param Integer $mode |
|||
*/ |
|||
function _crypt($text, $mode) |
|||
{ |
|||
if ( CRYPT_RC4_MODE == CRYPT_RC4_MODE_MCRYPT ) { |
|||
$keyStream = $mode == CRYPT_RC4_ENCRYPT ? 'encryptStream' : 'decryptStream'; |
|||
|
|||
if ($this->$keyStream === false) { |
|||
$this->$keyStream = mcrypt_module_open($this->mode, '', MCRYPT_MODE_STREAM, ''); |
|||
mcrypt_generic_init($this->$keyStream, $this->key, ''); |
|||
} else if (!$this->continuousBuffer) { |
|||
mcrypt_generic_init($this->$keyStream, $this->key, ''); |
|||
} |
|||
$newText = mcrypt_generic($this->$keyStream, $text); |
|||
if (!$this->continuousBuffer) { |
|||
mcrypt_generic_deinit($this->$keyStream); |
|||
} |
|||
|
|||
return $newText; |
|||
} |
|||
|
|||
if ($this->encryptStream === false) { |
|||
$this->setKey($this->key); |
|||
} |
|||
|
|||
switch ($mode) { |
|||
case CRYPT_RC4_ENCRYPT: |
|||
$keyStream = $this->encryptStream; |
|||
list($i, $j) = $this->encryptIndex; |
|||
break; |
|||
case CRYPT_RC4_DECRYPT: |
|||
$keyStream = $this->decryptStream; |
|||
list($i, $j) = $this->decryptIndex; |
|||
} |
|||
|
|||
$newText = ''; |
|||
for ($k = 0; $k < strlen($text); $k++) { |
|||
$i = ($i + 1) & 255; |
|||
$j = ($j + $keyStream[$i]) & 255; |
|||
$temp = $keyStream[$i]; |
|||
$keyStream[$i] = $keyStream[$j]; |
|||
$keyStream[$j] = $temp; |
|||
$temp = $keyStream[($keyStream[$i] + $keyStream[$j]) & 255]; |
|||
$newText.= chr(ord($text[$k]) ^ $temp); |
|||
} |
|||
|
|||
if ($this->continuousBuffer) { |
|||
switch ($mode) { |
|||
case CRYPT_RC4_ENCRYPT: |
|||
$this->encryptStream = $keyStream; |
|||
$this->encryptIndex = array($i, $j); |
|||
break; |
|||
case CRYPT_RC4_DECRYPT: |
|||
$this->decryptStream = $keyStream; |
|||
$this->decryptIndex = array($i, $j); |
|||
} |
|||
} |
|||
|
|||
return $newText; |
|||
} |
|||
|
|||
/** |
|||
* Treat consecutive "packets" as if they are a continuous buffer. |
|||
* |
|||
* Say you have a 16-byte plaintext $plaintext. Using the default behavior, the two following code snippets |
|||
* will yield different outputs: |
|||
* |
|||
* <code> |
|||
* echo $rc4->encrypt(substr($plaintext, 0, 8)); |
|||
* echo $rc4->encrypt(substr($plaintext, 8, 8)); |
|||
* </code> |
|||
* <code> |
|||
* echo $rc4->encrypt($plaintext); |
|||
* </code> |
|||
* |
|||
* The solution is to enable the continuous buffer. Although this will resolve the above discrepancy, it creates |
|||
* another, as demonstrated with the following: |
|||
* |
|||
* <code> |
|||
* $rc4->encrypt(substr($plaintext, 0, 8)); |
|||
* echo $rc4->decrypt($des->encrypt(substr($plaintext, 8, 8))); |
|||
* </code> |
|||
* <code> |
|||
* echo $rc4->decrypt($des->encrypt(substr($plaintext, 8, 8))); |
|||
* </code> |
|||
* |
|||
* With the continuous buffer disabled, these would yield the same output. With it enabled, they yield different |
|||
* outputs. The reason is due to the fact that the initialization vector's change after every encryption / |
|||
* decryption round when the continuous buffer is enabled. When it's disabled, they remain constant. |
|||
* |
|||
* Put another way, when the continuous buffer is enabled, the state of the Crypt_DES() object changes after each |
|||
* encryption / decryption round, whereas otherwise, it'd remain constant. For this reason, it's recommended that |
|||
* continuous buffers not be used. They do offer better security and are, in fact, sometimes required (SSH uses them), |
|||
* however, they are also less intuitive and more likely to cause you problems. |
|||
* |
|||
* @see Crypt_RC4::disableContinuousBuffer() |
|||
* @access public |
|||
*/ |
|||
function enableContinuousBuffer() |
|||
{ |
|||
$this->continuousBuffer = true; |
|||
} |
|||
|
|||
/** |
|||
* Treat consecutive packets as if they are a discontinuous buffer. |
|||
* |
|||
* The default behavior. |
|||
* |
|||
* @see Crypt_RC4::enableContinuousBuffer() |
|||
* @access public |
|||
*/ |
|||
function disableContinuousBuffer() |
|||
{ |
|||
if ( CRYPT_RC4_MODE == CRYPT_RC4_MODE_INTERNAL ) { |
|||
$this->encryptIndex = $this->decryptIndex = array(0, 0); |
|||
$this->setKey($this->key); |
|||
} |
|||
|
|||
$this->continuousBuffer = false; |
|||
} |
|||
|
|||
/** |
|||
* Dummy function. |
|||
* |
|||
* Since RC4 is a stream cipher and not a block cipher, no padding is necessary. The only reason this function is |
|||
* included is so that you can switch between a block cipher and a stream cipher transparently. |
|||
* |
|||
* @see Crypt_RC4::disablePadding() |
|||
* @access public |
|||
*/ |
|||
function enablePadding() |
|||
{ |
|||
} |
|||
|
|||
/** |
|||
* Dummy function. |
|||
* |
|||
* @see Crypt_RC4::enablePadding() |
|||
* @access public |
|||
*/ |
|||
function disablePadding() |
|||
{ |
|||
} |
|||
|
|||
/** |
|||
* Class destructor. |
|||
* |
|||
* Will be called, automatically, if you're using PHP5. If you're using PHP4, call it yourself. Only really |
|||
* needs to be called if mcrypt is being used. |
|||
* |
|||
* @access public |
|||
*/ |
|||
function __destruct() |
|||
{ |
|||
if ( CRYPT_RC4_MODE == CRYPT_RC4_MODE_MCRYPT ) { |
|||
$this->_closeMCrypt(); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Properly close the MCrypt objects. |
|||
* |
|||
* @access prviate |
|||
*/ |
|||
function _closeMCrypt() |
|||
{ |
|||
if ( $this->encryptStream !== false ) { |
|||
if ( $this->continuousBuffer ) { |
|||
mcrypt_generic_deinit($this->encryptStream); |
|||
} |
|||
|
|||
mcrypt_module_close($this->encryptStream); |
|||
|
|||
$this->encryptStream = false; |
|||
} |
|||
|
|||
if ( $this->decryptStream !== false ) { |
|||
if ( $this->continuousBuffer ) { |
|||
mcrypt_generic_deinit($this->decryptStream); |
|||
} |
|||
|
|||
mcrypt_module_close($this->decryptStream); |
|||
|
|||
$this->decryptStream = false; |
|||
} |
|||
} |
|||
} |
|||
2664
apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/RSA.php
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,243 @@ |
|||
<?php |
|||
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ |
|||
|
|||
/** |
|||
* Random Number Generator |
|||
* |
|||
* PHP versions 4 and 5 |
|||
* |
|||
* Here's a short example of how to use this library: |
|||
* <code> |
|||
* <?php |
|||
* include('Crypt/Random.php'); |
|||
* |
|||
* echo bin2hex(crypt_random_string(8)); |
|||
* ?>
|
|||
* </code> |
|||
* |
|||
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
* of this software and associated documentation files (the "Software"), to deal |
|||
* in the Software without restriction, including without limitation the rights |
|||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
* copies of the Software, and to permit persons to whom the Software is |
|||
* furnished to do so, subject to the following conditions: |
|||
* |
|||
* The above copyright notice and this permission notice shall be included in |
|||
* all copies or substantial portions of the Software. |
|||
* |
|||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
* THE SOFTWARE. |
|||
* |
|||
* @category Crypt |
|||
* @package Crypt_Random |
|||
* @author Jim Wigginton <terrafrost@php.net> |
|||
* @copyright MMVII Jim Wigginton |
|||
* @license http://www.opensource.org/licenses/mit-license.html MIT License |
|||
* @version $Id: Random.php,v 1.9 2010/04/24 06:40:48 terrafrost Exp $ |
|||
* @link http://phpseclib.sourceforge.net |
|||
*/ |
|||
|
|||
/** |
|||
* Generate a random string. |
|||
* |
|||
* Although microoptimizations are generally discouraged as they impair readability this function is ripe with |
|||
* microoptimizations because this function has the potential of being called a huge number of times. |
|||
* eg. for RSA key generation. |
|||
* |
|||
* @param Integer $length |
|||
* @return String |
|||
* @access public |
|||
*/ |
|||
function crypt_random_string($length) { |
|||
// PHP_OS & "\xDF\xDF\xDF" == strtoupper(substr(PHP_OS, 0, 3)), but a lot faster
|
|||
if ((PHP_OS & "\xDF\xDF\xDF") === 'WIN') { |
|||
// method 1. prior to PHP 5.3 this would call rand() on windows hence the function_exists('class_alias') call.
|
|||
// ie. class_alias is a function that was introduced in PHP 5.3
|
|||
if (function_exists('mcrypt_create_iv') && function_exists('class_alias')) { |
|||
return mcrypt_create_iv($length); |
|||
} |
|||
// method 2. openssl_random_pseudo_bytes was introduced in PHP 5.3.0 but prior to PHP 5.3.4 there was,
|
|||
// to quote <http://php.net/ChangeLog-5.php#5.3.4>, "possible blocking behavior". as of 5.3.4
|
|||
// openssl_random_pseudo_bytes and mcrypt_create_iv do the exact same thing on Windows. ie. they both
|
|||
// call php_win32_get_random_bytes():
|
|||
//
|
|||
// https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/openssl/openssl.c#L5008
|
|||
// https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/mcrypt/mcrypt.c#L1392
|
|||
//
|
|||
// php_win32_get_random_bytes() is defined thusly:
|
|||
//
|
|||
// https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/win32/winutil.c#L80
|
|||
//
|
|||
// we're calling it, all the same, in the off chance that the mcrypt extension is not available
|
|||
if (function_exists('openssl_random_pseudo_bytes') && version_compare(PHP_VERSION, '5.3.4', '>=')) { |
|||
return openssl_random_pseudo_bytes($length); |
|||
} |
|||
} else { |
|||
// method 1. the fastest
|
|||
if (function_exists('openssl_random_pseudo_bytes')) { |
|||
return openssl_random_pseudo_bytes($length); |
|||
} |
|||
// method 2
|
|||
static $fp = true; |
|||
if ($fp === true) { |
|||
// warning's will be output unles the error suppression operator is used. errors such as
|
|||
// "open_basedir restriction in effect", "Permission denied", "No such file or directory", etc.
|
|||
$fp = @fopen('/dev/urandom', 'rb'); |
|||
} |
|||
if ($fp !== true && $fp !== false) { // surprisingly faster than !is_bool() or is_resource()
|
|||
return fread($urandom, $length); |
|||
} |
|||
// method 3. pretty much does the same thing as method 2 per the following url:
|
|||
// https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/mcrypt/mcrypt.c#L1391
|
|||
// surprisingly slower than method 2. maybe that's because mcrypt_create_iv does a bunch of error checking that we're
|
|||
// not doing. regardless, this'll only be called if this PHP script couldn't open /dev/urandom due to open_basedir
|
|||
// restrictions or some such
|
|||
if (function_exists('mcrypt_create_iv')) { |
|||
return mcrypt_create_iv($length, MCRYPT_DEV_URANDOM); |
|||
} |
|||
} |
|||
// at this point we have no choice but to use a pure-PHP CSPRNG
|
|||
|
|||
// cascade entropy across multiple PHP instances by fixing the session and collecting all
|
|||
// environmental variables, including the previous session data and the current session
|
|||
// data.
|
|||
//
|
|||
// mt_rand seeds itself by looking at the PID and the time, both of which are (relatively)
|
|||
// easy to guess at. linux uses mouse clicks, keyboard timings, etc, as entropy sources, but
|
|||
// PHP isn't low level to be able to use those as sources and on a web server there's not likely
|
|||
// going to be a ton of keyboard or mouse action. web servers do have one thing that we can use
|
|||
// however. a ton of people visiting the website. obviously you don't want to base your seeding
|
|||
// soley on parameters a potential attacker sends but (1) not everything in $_SERVER is controlled
|
|||
// by the user and (2) this isn't just looking at the data sent by the current user - it's based
|
|||
// on the data sent by all users. one user requests the page and a hash of their info is saved.
|
|||
// another user visits the page and the serialization of their data is utilized along with the
|
|||
// server envirnment stuff and a hash of the previous http request data (which itself utilizes
|
|||
// a hash of the session data before that). certainly an attacker should be assumed to have
|
|||
// full control over his own http requests. he, however, is not going to have control over
|
|||
// everyone's http requests.
|
|||
static $crypto = false, $v; |
|||
if ($crypto === false) { |
|||
// save old session data
|
|||
$old_session_id = session_id(); |
|||
$old_use_cookies = ini_get('session.use_cookies'); |
|||
$old_session_cache_limiter = session_cache_limiter(); |
|||
if (isset($_SESSION)) { |
|||
$_OLD_SESSION = $_SESSION; |
|||
} |
|||
if ($old_session_id != '') { |
|||
session_write_close(); |
|||
} |
|||
|
|||
session_id(1); |
|||
ini_set('session.use_cookies', 0); |
|||
session_cache_limiter(''); |
|||
session_start(); |
|||
|
|||
$v = $seed = $_SESSION['seed'] = pack('H*', sha1( |
|||
serialize($_SERVER) . |
|||
serialize($_POST) . |
|||
serialize($_GET) . |
|||
serialize($_COOKIE) . |
|||
serialize($_GLOBAL) . |
|||
serialize($_SESSION) . |
|||
serialize($_OLD_SESSION) |
|||
)); |
|||
if (!isset($_SESSION['count'])) { |
|||
$_SESSION['count'] = 0; |
|||
} |
|||
$_SESSION['count']++; |
|||
|
|||
session_write_close(); |
|||
|
|||
// restore old session data
|
|||
if ($old_session_id != '') { |
|||
session_id($old_session_id); |
|||
session_start(); |
|||
ini_set('session.use_cookies', $old_use_cookies); |
|||
session_cache_limiter($old_session_cache_limiter); |
|||
} else { |
|||
if (isset($_OLD_SESSION)) { |
|||
$_SESSION = $_OLD_SESSION; |
|||
unset($_OLD_SESSION); |
|||
} else { |
|||
unset($_SESSION); |
|||
} |
|||
} |
|||
|
|||
// in SSH2 a shared secret and an exchange hash are generated through the key exchange process.
|
|||
// the IV client to server is the hash of that "nonce" with the letter A and for the encryption key it's the letter C.
|
|||
// if the hash doesn't produce enough a key or an IV that's long enough concat successive hashes of the
|
|||
// original hash and the current hash. we'll be emulating that. for more info see the following URL:
|
|||
//
|
|||
// http://tools.ietf.org/html/rfc4253#section-7.2
|
|||
//
|
|||
// see the is_string($crypto) part for an example of how to expand the keys
|
|||
$key = pack('H*', sha1($seed . 'A')); |
|||
$iv = pack('H*', sha1($seed . 'C')); |
|||
|
|||
// ciphers are used as per the nist.gov link below. also, see this link:
|
|||
//
|
|||
// http://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator#Designs_based_on_cryptographic_primitives
|
|||
switch (true) { |
|||
case class_exists('Crypt_AES'): |
|||
$crypto = new Crypt_AES(CRYPT_AES_MODE_CTR); |
|||
break; |
|||
case class_exists('Crypt_TripleDES'): |
|||
$crypto = new Crypt_TripleDES(CRYPT_DES_MODE_CTR); |
|||
break; |
|||
case class_exists('Crypt_DES'): |
|||
$crypto = new Crypt_DES(CRYPT_DES_MODE_CTR); |
|||
break; |
|||
case class_exists('Crypt_RC4'): |
|||
$crypto = new Crypt_RC4(); |
|||
break; |
|||
default: |
|||
$crypto = $seed; |
|||
return crypt_random_string($length); |
|||
} |
|||
|
|||
$crypto->setKey($key); |
|||
$crypto->setIV($iv); |
|||
$crypto->enableContinuousBuffer(); |
|||
} |
|||
|
|||
if (is_string($crypto)) { |
|||
// the following is based off of ANSI X9.31:
|
|||
//
|
|||
// http://csrc.nist.gov/groups/STM/cavp/documents/rng/931rngext.pdf
|
|||
//
|
|||
// OpenSSL uses that same standard for it's random numbers:
|
|||
//
|
|||
// http://www.opensource.apple.com/source/OpenSSL/OpenSSL-38/openssl/fips-1.0/rand/fips_rand.c
|
|||
// (do a search for "ANS X9.31 A.2.4")
|
|||
//
|
|||
// ANSI X9.31 recommends ciphers be used and phpseclib does use them if they're available (see
|
|||
// later on in the code) but if they're not we'll use sha1
|
|||
$result = ''; |
|||
while (strlen($result) < $length) { // each loop adds 20 bytes
|
|||
// microtime() isn't packed as "densely" as it could be but then neither is that the idea.
|
|||
// the idea is simply to ensure that each "block" has a unique element to it.
|
|||
$i = pack('H*', sha1(microtime())); |
|||
$r = pack('H*', sha1($i ^ $v)); |
|||
$v = pack('H*', sha1($r ^ $i)); |
|||
$result.= $r; |
|||
} |
|||
return substr($result, 0, $length); |
|||
} |
|||
|
|||
//return $crypto->encrypt(str_repeat("\0", $length));
|
|||
|
|||
$result = ''; |
|||
while (strlen($result) < $length) { |
|||
$i = $crypto->encrypt(microtime()); |
|||
$r = $crypto->encrypt($i ^ $v); |
|||
$v = $crypto->encrypt($r ^ $i); |
|||
$result.= $r; |
|||
} |
|||
return substr($result, 0, $length); |
|||
} |
|||
1496
apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/Rijndael.php
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1061
apps/files_external/3rdparty/phpseclib/phpseclib/Crypt/TripleDES.php
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,558 @@ |
|||
<?php |
|||
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ |
|||
|
|||
/** |
|||
* Pure-PHP ANSI Decoder |
|||
* |
|||
* PHP versions 4 and 5 |
|||
* |
|||
* If you call read() in 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 |
|||
* {@link http://en.wikipedia.org/wiki/Terminal_emulator terminal emulator} how to format the characters, what |
|||
* color to display them in, etc. File_ANSI is a {@link http://en.wikipedia.org/wiki/VT100 VT100} terminal emulator. |
|||
* |
|||
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
* of this software and associated documentation files (the "Software"), to deal |
|||
* in the Software without restriction, including without limitation the rights |
|||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
* copies of the Software, and to permit persons to whom the Software is |
|||
* furnished to do so, subject to the following conditions: |
|||
* |
|||
* The above copyright notice and this permission notice shall be included in |
|||
* all copies or substantial portions of the Software. |
|||
* |
|||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
* THE SOFTWARE. |
|||
* |
|||
* @category File |
|||
* @package File_ANSI |
|||
* @author Jim Wigginton <terrafrost@php.net> |
|||
* @copyright MMXII Jim Wigginton |
|||
* @license http://www.opensource.org/licenses/mit-license.html MIT License |
|||
* @version $Id$ |
|||
* @link htp://phpseclib.sourceforge.net |
|||
*/ |
|||
|
|||
/** |
|||
* Pure-PHP ANSI Decoder |
|||
* |
|||
* @author Jim Wigginton <terrafrost@php.net> |
|||
* @version 0.3.0 |
|||
* @access public |
|||
* @package File_ANSI |
|||
*/ |
|||
class File_ANSI { |
|||
/** |
|||
* Max Width |
|||
* |
|||
* @var Integer |
|||
* @access private |
|||
*/ |
|||
var $max_x; |
|||
|
|||
/** |
|||
* Max Height |
|||
* |
|||
* @var Integer |
|||
* @access private |
|||
*/ |
|||
var $max_y; |
|||
|
|||
/** |
|||
* Max History |
|||
* |
|||
* @var Integer |
|||
* @access private |
|||
*/ |
|||
var $max_history; |
|||
|
|||
/** |
|||
* History |
|||
* |
|||
* @var Array |
|||
* @access private |
|||
*/ |
|||
var $history; |
|||
|
|||
/** |
|||
* History Attributes |
|||
* |
|||
* @var Array |
|||
* @access private |
|||
*/ |
|||
var $history_attrs; |
|||
|
|||
/** |
|||
* Current Column |
|||
* |
|||
* @var Integer |
|||
* @access private |
|||
*/ |
|||
var $x; |
|||
|
|||
/** |
|||
* Current Row |
|||
* |
|||
* @var Integer |
|||
* @access private |
|||
*/ |
|||
var $y; |
|||
|
|||
/** |
|||
* Old Column |
|||
* |
|||
* @var Integer |
|||
* @access private |
|||
*/ |
|||
var $old_x; |
|||
|
|||
/** |
|||
* Old Row |
|||
* |
|||
* @var Integer |
|||
* @access private |
|||
*/ |
|||
var $old_y; |
|||
|
|||
/** |
|||
* An empty attribute row |
|||
* |
|||
* @var Array |
|||
* @access private |
|||
*/ |
|||
var $attr_row; |
|||
|
|||
/** |
|||
* The current screen text |
|||
* |
|||
* @var Array |
|||
* @access private |
|||
*/ |
|||
var $screen; |
|||
|
|||
/** |
|||
* The current screen attributes |
|||
* |
|||
* @var Array |
|||
* @access private |
|||
*/ |
|||
var $attrs; |
|||
|
|||
/** |
|||
* The current foreground color |
|||
* |
|||
* @var String |
|||
* @access private |
|||
*/ |
|||
var $foreground; |
|||
|
|||
/** |
|||
* The current background color |
|||
* |
|||
* @var String |
|||
* @access private |
|||
*/ |
|||
var $background; |
|||
|
|||
/** |
|||
* Bold flag |
|||
* |
|||
* @var Boolean |
|||
* @access private |
|||
*/ |
|||
var $bold; |
|||
|
|||
/** |
|||
* Underline flag |
|||
* |
|||
* @var Boolean |
|||
* @access private |
|||
*/ |
|||
var $underline; |
|||
|
|||
/** |
|||
* Blink flag |
|||
* |
|||
* @var Boolean |
|||
* @access private |
|||
*/ |
|||
var $blink; |
|||
|
|||
/** |
|||
* Reverse flag |
|||
* |
|||
* @var Boolean |
|||
* @access private |
|||
*/ |
|||
var $reverse; |
|||
|
|||
/** |
|||
* Color flag |
|||
* |
|||
* @var Boolean |
|||
* @access private |
|||
*/ |
|||
var $color; |
|||
|
|||
/** |
|||
* Current ANSI code |
|||
* |
|||
* @var String |
|||
* @access private |
|||
*/ |
|||
var $ansi; |
|||
|
|||
/** |
|||
* Default Constructor. |
|||
* |
|||
* @return File_ANSI |
|||
* @access public |
|||
*/ |
|||
function File_ANSI() |
|||
{ |
|||
$this->setHistory(200); |
|||
$this->setDimensions(80, 24); |
|||
} |
|||
|
|||
/** |
|||
* Set terminal width and height |
|||
* |
|||
* Resets the screen as well |
|||
* |
|||
* @param Integer $x |
|||
* @param Integer $y |
|||
* @access public |
|||
*/ |
|||
function setDimensions($x, $y) |
|||
{ |
|||
$this->max_x = $x - 1; |
|||
$this->max_y = $y - 1; |
|||
$this->x = $this->y = 0; |
|||
$this->history = $this->history_attrs = array(); |
|||
$this->attr_row = array_fill(0, $this->max_x + 1, ''); |
|||
$this->screen = array_fill(0, $this->max_y + 1, ''); |
|||
$this->attrs = array_fill(0, $this->max_y + 1, $this->attr_row); |
|||
$this->foreground = 'white'; |
|||
$this->background = 'black'; |
|||
$this->bold = false; |
|||
$this->underline = false; |
|||
$this->blink = false; |
|||
$this->reverse = false; |
|||
$this->color = false; |
|||
|
|||
$this->ansi = ''; |
|||
} |
|||
|
|||
/** |
|||
* Set the number of lines that should be logged past the terminal height |
|||
* |
|||
* @param Integer $x |
|||
* @param Integer $y |
|||
* @access public |
|||
*/ |
|||
function setHistory($history) |
|||
{ |
|||
$this->max_history = $history; |
|||
} |
|||
|
|||
/** |
|||
* Load a string |
|||
* |
|||
* @param String $source |
|||
* @access public |
|||
*/ |
|||
function loadString($source) |
|||
{ |
|||
$this->setDimensions($this->max_x + 1, $this->max_y + 1); |
|||
$this->appendString($source); |
|||
} |
|||
|
|||
/** |
|||
* Appdend a string |
|||
* |
|||
* @param String $source |
|||
* @access public |
|||
*/ |
|||
function appendString($source) |
|||
{ |
|||
for ($i = 0; $i < strlen($source); $i++) { |
|||
if (strlen($this->ansi)) { |
|||
$this->ansi.= $source[$i]; |
|||
$chr = ord($source[$i]); |
|||
// http://en.wikipedia.org/wiki/ANSI_escape_code#Sequence_elements
|
|||
// single character CSI's not currently supported
|
|||
switch (true) { |
|||
case $this->ansi == "\x1B=": |
|||
$this->ansi = ''; |
|||
continue 2; |
|||
case strlen($this->ansi) == 2 && $chr >= 64 && $chr <= 95 && $chr != ord('['): |
|||
case strlen($this->ansi) > 2 && $chr >= 64 && $chr <= 126: |
|||
break; |
|||
default: |
|||
continue 2; |
|||
} |
|||
// http://ascii-table.com/ansi-escape-sequences-vt-100.php
|
|||
switch ($this->ansi) { |
|||
case "\x1B[H": |
|||
$this->old_x = $this->x; |
|||
$this->old_y = $this->y; |
|||
$this->x = $this->y = 0; |
|||
break; |
|||
case "\x1B[J": |
|||
$this->history = array_merge($this->history, array_slice(array_splice($this->screen, $this->y + 1), 0, $this->old_y)); |
|||
$this->screen = array_merge($this->screen, array_fill($this->y, $this->max_y, '')); |
|||
|
|||
$this->history_attrs = array_merge($this->history_attrs, array_slice(array_splice($this->attrs, $this->y + 1), 0, $this->old_y)); |
|||
$this->attrs = array_merge($this->attrs, array_fill($this->y, $this->max_y, $this->attr_row)); |
|||
|
|||
if (count($this->history) == $this->max_history) { |
|||
array_shift($this->history); |
|||
array_shift($this->history_attrs); |
|||
} |
|||
case "\x1B[K": |
|||
$this->screen[$this->y] = substr($this->screen[$this->y], 0, $this->x); |
|||
|
|||
array_splice($this->attrs[$this->y], $this->x + 1); |
|||
break; |
|||
case "\x1B[?1h": // set cursor key to application
|
|||
break; |
|||
default: |
|||
switch (true) { |
|||
case preg_match('#\x1B\[(\d+);(\d+)H#', $this->ansi, $match): |
|||
$this->old_x = $this->x; |
|||
$this->old_y = $this->y; |
|||
$this->x = $match[2] - 1; |
|||
$this->y = $match[1] - 1; |
|||
break; |
|||
case preg_match('#\x1B\[(\d+)C#', $this->ansi, $match): |
|||
$this->old_x = $this->x; |
|||
$x = $match[1] - 1; |
|||
break; |
|||
case preg_match('#\x1B\[(\d+);(\d+)r#', $this->ansi, $match): // Set top and bottom lines of a window
|
|||
break; |
|||
case preg_match('#\x1B\[(\d*(?:;\d*)*)m#', $this->ansi, $match): |
|||
$mods = explode(';', $match[1]); |
|||
foreach ($mods as $mod) { |
|||
switch ($mod) { |
|||
case 0: |
|||
$this->attrs[$this->y][$this->x] = ''; |
|||
|
|||
if ($this->bold) $this->attrs[$this->y][$this->x].= '</b>'; |
|||
if ($this->underline) $this->attrs[$this->y][$this->x].= '</underline>'; |
|||
if ($this->blink) $this->attrs[$this->y][$this->x].= '</blink>'; |
|||
if ($this->color) $this->attrs[$this->y][$this->x].= '</span>'; |
|||
|
|||
if ($this->reverse) { |
|||
$temp = $this->background; |
|||
$this->background = $this->foreground; |
|||
$this->foreground = $temp; |
|||
} |
|||
|
|||
$this->bold = $this->underline = $this->blink = $this->color = $this->reverse = false; |
|||
break; |
|||
case 1: |
|||
if (!$this->bold) { |
|||
$this->attrs[$this->y][$this->x] = '<b>'; |
|||
$this->bold = true; |
|||
} |
|||
break; |
|||
case 4: |
|||
if (!$this->underline) { |
|||
$this->attrs[$this->y][$this->x] = '<u>'; |
|||
$this->underline = true; |
|||
} |
|||
break; |
|||
case 5: |
|||
if (!$this->blink) { |
|||
$this->attrs[$this->y][$this->x] = '<blink>'; |
|||
$this->blink = true; |
|||
} |
|||
break; |
|||
case 7: |
|||
$this->reverse = !$this->reverse; |
|||
$temp = $this->background; |
|||
$this->background = $this->foreground; |
|||
$this->foreground = $temp; |
|||
$this->attrs[$this->y][$this->x] = '<span style="color: ' . $this->foreground . '; background: ' . $this->background . '">'; |
|||
if ($this->color) { |
|||
$this->attrs[$this->y][$this->x] = '</span>' . $this->attrs[$this->y][$this->x]; |
|||
} |
|||
$this->color = true; |
|||
break; |
|||
default: |
|||
//$front = $this->reverse ? &$this->background : &$this->foreground;
|
|||
$front = &$this->{ $this->reverse ? 'background' : 'foreground' }; |
|||
//$back = $this->reverse ? &$this->foreground : &$this->background;
|
|||
$back = &$this->{ $this->reverse ? 'foreground' : 'background' }; |
|||
switch ($mod) { |
|||
case 30: $front = 'black'; break; |
|||
case 31: $front = 'red'; break; |
|||
case 32: $front = 'green'; break; |
|||
case 33: $front = 'yellow'; break; |
|||
case 34: $front = 'blue'; break; |
|||
case 35: $front = 'magenta'; break; |
|||
case 36: $front = 'cyan'; break; |
|||
case 37: $front = 'white'; break; |
|||
|
|||
case 40: $back = 'black'; break; |
|||
case 41: $back = 'red'; break; |
|||
case 42: $back = 'green'; break; |
|||
case 43: $back = 'yellow'; break; |
|||
case 44: $back = 'blue'; break; |
|||
case 45: $back = 'magenta'; break; |
|||
case 46: $back = 'cyan'; break; |
|||
case 47: $back = 'white'; break; |
|||
|
|||
default: |
|||
$this->_handle_error('Unsupported attribute: ' . $mod); |
|||
$this->ansi = ''; |
|||
break 2; |
|||
} |
|||
|
|||
unset($temp); |
|||
$this->attrs[$this->y][$this->x] = '<span style="color: ' . $this->foreground . '; background: ' . $this->background . '">'; |
|||
if ($this->color) { |
|||
$this->attrs[$this->y][$this->x] = '</span>' . $this->attrs[$this->y][$this->x]; |
|||
} |
|||
$this->color = true; |
|||
} |
|||
} |
|||
break; |
|||
default: |
|||
echo "{$this->ansi} unsupported\r\n"; |
|||
} |
|||
} |
|||
$this->ansi = ''; |
|||
continue; |
|||
} |
|||
|
|||
switch ($source[$i]) { |
|||
case "\r": |
|||
$this->x = 0; |
|||
break; |
|||
case "\n": |
|||
//if ($this->y < $this->max_y) {
|
|||
// $this->y++;
|
|||
//}
|
|||
|
|||
while ($this->y >= $this->max_y) { |
|||
$this->history = array_merge($this->history, array(array_shift($this->screen))); |
|||
$this->screen[] = ''; |
|||
|
|||
$this->history_attrs = array_merge($this->history_attrs, array(array_shift($this->attrs))); |
|||
$this->attrs[] = $this->attr_row; |
|||
|
|||
if (count($this->history) >= $this->max_history) { |
|||
array_shift($this->history); |
|||
array_shift($this->history_attrs); |
|||
} |
|||
|
|||
$this->y--; |
|||
} |
|||
$this->y++; |
|||
break; |
|||
case "\x0F": // shift
|
|||
break; |
|||
case "\x1B": // start ANSI escape code
|
|||
$this->ansi.= "\x1B"; |
|||
break; |
|||
default: |
|||
$this->screen[$this->y] = substr_replace( |
|||
$this->screen[$this->y], |
|||
$source[$i], |
|||
$this->x, |
|||
1 |
|||
); |
|||
|
|||
if ($this->x > $this->max_x) { |
|||
$this->x = 0; |
|||
$this->y++; |
|||
} else { |
|||
$this->x++; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Returns the current screen without preformating |
|||
* |
|||
* @access private |
|||
* @return String |
|||
*/ |
|||
function _getScreen() |
|||
{ |
|||
$output = ''; |
|||
for ($i = 0; $i <= $this->max_y; $i++) { |
|||
for ($j = 0; $j <= $this->max_x + 1; $j++) { |
|||
if (isset($this->attrs[$i][$j])) { |
|||
$output.= $this->attrs[$i][$j]; |
|||
} |
|||
if (isset($this->screen[$i][$j])) { |
|||
$output.= htmlspecialchars($this->screen[$i][$j]); |
|||
} |
|||
} |
|||
$output.= "\r\n"; |
|||
} |
|||
return rtrim($output); |
|||
} |
|||
|
|||
/** |
|||
* Returns the current screen |
|||
* |
|||
* @access public |
|||
* @return String |
|||
*/ |
|||
function getScreen() |
|||
{ |
|||
return '<pre style="color: white; background: black" width="' . ($this->max_x + 1) . '">' . $this->_getScreen() . '</pre>'; |
|||
} |
|||
|
|||
/** |
|||
* Returns the current screen and the x previous lines |
|||
* |
|||
* @access public |
|||
* @return String |
|||
*/ |
|||
function getHistory() |
|||
{ |
|||
$scrollback = ''; |
|||
for ($i = 0; $i < count($this->history); $i++) { |
|||
for ($j = 0; $j <= $this->max_x + 1; $j++) { |
|||
if (isset($this->history_attrs[$i][$j])) { |
|||
$scrollback.= $this->history_attrs[$i][$j]; |
|||
} |
|||
if (isset($this->history[$i][$j])) { |
|||
$scrollback.= htmlspecialchars($this->history[$i][$j]); |
|||
} |
|||
} |
|||
$scrollback.= "\r\n"; |
|||
} |
|||
$scrollback.= $this->_getScreen(); |
|||
|
|||
return '<pre style="color: white; background: black" width="' . ($this->max_x + 1) . '">' . $scrollback . '</pre>'; |
|||
} |
|||
|
|||
/** |
|||
* Error Handler |
|||
* |
|||
* Throws exceptions if PHPSECLIB_USE_EXCEPTIONS is defined. |
|||
* Unless PHPSECLIB_EXCEPTION_CLASS is set it'll throw generic Exceptions. |
|||
* |
|||
* @param String $string |
|||
* @access private |
|||
*/ |
|||
function _handle_error($err_msg) { |
|||
if (defined('PHPSECLIB_USE_EXCEPTIONS') && version_compare(PHP_VERSION, '5.1.0', '>=')) { |
|||
$class = defined('PHPSECLIB_EXCEPTION_CLASS') && class_exists(PHPSECLIB_EXCEPTION_CLASS) ? PHPSECLIB_EXCEPTION_CLASS : 'Exception'; |
|||
throw(new $class($err_msg)); |
|||
} else { |
|||
user_error($err_msg); |
|||
} |
|||
} |
|||
} |
|||
1295
apps/files_external/3rdparty/phpseclib/phpseclib/File/ASN1.php
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
4341
apps/files_external/3rdparty/phpseclib/phpseclib/File/X509.php
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
3633
apps/files_external/3rdparty/phpseclib/phpseclib/Math/BigInteger.php
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2029
apps/files_external/3rdparty/phpseclib/phpseclib/Net/SFTP.php
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1435
apps/files_external/3rdparty/phpseclib/phpseclib/Net/SSH1.php
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2997
apps/files_external/3rdparty/phpseclib/phpseclib/Net/SSH2.php
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,6 @@ |
|||
# minimalist openssl.cnf file for use with phpseclib |
|||
|
|||
HOME = . |
|||
RANDFILE = $ENV::HOME/.rnd |
|||
|
|||
[ v3_ca ] |
|||
@ -0,0 +1,18 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
|
|||
<phpunit bootstrap="tests/bootstrap.php" |
|||
colors="true" |
|||
> |
|||
<testsuites> |
|||
<testsuite name="phpseclib Test Suite"> |
|||
<directory>./tests/</directory> |
|||
</testsuite> |
|||
</testsuites> |
|||
|
|||
<!-- Code Coverage --> |
|||
<filter> |
|||
<whitelist> |
|||
<directory>./phpseclib/</directory> |
|||
</whitelist> |
|||
</filter> |
|||
</phpunit> |
|||
@ -0,0 +1,47 @@ |
|||
<?php |
|||
/** |
|||
* @author Andreas Fischer <bantu@phpbb.com> |
|||
* @copyright MMXII Andreas Fischer |
|||
* @license http://www.opensource.org/licenses/mit-license.html MIT License |
|||
*/ |
|||
|
|||
class Crypt_Hash_MD5Test extends Crypt_Hash_TestCase |
|||
{ |
|||
public function getInstance() |
|||
{ |
|||
return new Crypt_Hash('md5'); |
|||
} |
|||
|
|||
/** |
|||
* @dataProvider hashData() |
|||
*/ |
|||
public function testHash($message, $result) |
|||
{ |
|||
$this->assertHashesTo($this->getInstance(), $message, $result); |
|||
} |
|||
|
|||
static public function hashData() |
|||
{ |
|||
return array( |
|||
array('', 'd41d8cd98f00b204e9800998ecf8427e'), |
|||
array('The quick brown fox jumps over the lazy dog', '9e107d9d372bb6826bd81d3542a419d6'), |
|||
array('The quick brown fox jumps over the lazy dog.', 'e4d909c290d0fb1ca068ffaddf22cbd0'), |
|||
); |
|||
} |
|||
|
|||
/** |
|||
* @dataProvider hmacData() |
|||
*/ |
|||
public function testHMAC($key, $message, $result) |
|||
{ |
|||
$this->assertHMACsTo($this->getInstance(), $key, $message, $result); |
|||
} |
|||
|
|||
static public function hmacData() |
|||
{ |
|||
return array( |
|||
array('', '', '74e6f7298a9c2d168935f58c001bad88'), |
|||
array('key', 'The quick brown fox jumps over the lazy dog', '80070713463e7749b90c2dc24911e275'), |
|||
); |
|||
} |
|||
} |
|||
@ -0,0 +1,47 @@ |
|||
<?php |
|||
/** |
|||
* @author Andreas Fischer <bantu@phpbb.com> |
|||
* @copyright MMXII Andreas Fischer |
|||
* @license http://www.opensource.org/licenses/mit-license.html MIT License |
|||
*/ |
|||
|
|||
abstract class Crypt_Hash_TestCase extends PHPUnit_Framework_TestCase |
|||
{ |
|||
static public function setUpBeforeClass() |
|||
{ |
|||
require_once('Crypt/Hash.php'); |
|||
|
|||
if (!defined('CRYPT_HASH_MODE')) |
|||
{ |
|||
define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_INTERNAL); |
|||
} |
|||
} |
|||
|
|||
public function setUp() |
|||
{ |
|||
if (defined('CRYPT_HASH_MODE') && CRYPT_HASH_MODE !== CRYPT_HASH_MODE_INTERNAL) |
|||
{ |
|||
$this->markTestSkipped('Skipping test because CRYPT_HASH_MODE is not defined as CRYPT_HASH_MODE_INTERNAL.'); |
|||
} |
|||
} |
|||
|
|||
protected function assertHashesTo(Crypt_Hash $hash, $message, $expected) |
|||
{ |
|||
$this->assertEquals( |
|||
strtolower($expected), |
|||
bin2hex($hash->hash($message)), |
|||
sprintf("Failed asserting that '%s' hashes to '%s'.", $message, $expected) |
|||
); |
|||
} |
|||
|
|||
protected function assertHMACsTo(Crypt_Hash $hash, $key, $message, $expected) |
|||
{ |
|||
$hash->setKey($key); |
|||
|
|||
$this->assertEquals( |
|||
strtolower($expected), |
|||
bin2hex($hash->hash($message)), |
|||
sprintf("Failed asserting that '%s' HMACs to '%s' with key '%s'.", $message, $expected, $key) |
|||
); |
|||
} |
|||
} |
|||
@ -0,0 +1,259 @@ |
|||
<?php |
|||
/** |
|||
* @author Andreas Fischer <bantu@phpbb.com> |
|||
* @copyright MMXII Andreas Fischer |
|||
* @license http://www.opensource.org/licenses/mit-license.html MIT License |
|||
*/ |
|||
|
|||
class Math_BigIntegerTest extends PHPUnit_Framework_TestCase |
|||
{ |
|||
public function getInstance($x = 0, $base = 10) |
|||
{ |
|||
return new Math_BigInteger($x, $base); |
|||
} |
|||
|
|||
public function testConstructorBase2() |
|||
{ |
|||
// 2**65 = 36893488147419103232
|
|||
$this->assertSame('36893488147419103232', (string) $this->getInstance('1' . str_repeat('0', 65), 2)); |
|||
} |
|||
|
|||
public function testConstructorBase10() |
|||
{ |
|||
$this->assertSame('18446744073709551616', (string) $this->getInstance('18446744073709551616')); |
|||
} |
|||
|
|||
public function testConstructorBase16() |
|||
{ |
|||
$this->assertSame('50', (string) $this->getInstance('0x32', 16)); |
|||
$this->assertSame('12345678910', (string) $this->getInstance('0x2DFDC1C3E', 16)); |
|||
$this->assertSame('18446744073709551615', (string) $this->getInstance('0xFFFFFFFFFFFFFFFF', 16)); |
|||
$this->assertSame('18446744073709551616', (string) $this->getInstance('0x10000000000000000', 16)); |
|||
} |
|||
|
|||
public function testToBytes() |
|||
{ |
|||
$this->assertSame(chr(65), $this->getInstance('65')->toBytes()); |
|||
} |
|||
|
|||
public function testToBytesTwosCompliment() |
|||
{ |
|||
$this->assertSame(chr(126), $this->getInstance('01111110', 2)->toBytes(true)); |
|||
} |
|||
|
|||
public function testToHex() |
|||
{ |
|||
$this->assertSame('41', $this->getInstance('65')->toHex()); |
|||
} |
|||
|
|||
public function testToBits() |
|||
{ |
|||
$this->assertSame('1000001', $this->getInstance('65')->toBits()); |
|||
} |
|||
|
|||
public function testAdd() |
|||
{ |
|||
$x = $this->getInstance('18446744073709551615'); |
|||
$y = $this->getInstance( '100000000000'); |
|||
|
|||
$a = $x->add($y); |
|||
$b = $y->add($x); |
|||
|
|||
$this->assertTrue($a->equals($b)); |
|||
$this->assertTrue($b->equals($a)); |
|||
|
|||
$this->assertSame('18446744173709551615', (string) $a); |
|||
$this->assertSame('18446744173709551615', (string) $b); |
|||
} |
|||
|
|||
public function testSubtract() |
|||
{ |
|||
$x = $this->getInstance('18446744073709551618'); |
|||
$y = $this->getInstance( '4000000000000'); |
|||
$this->assertSame('18446740073709551618', (string) $x->subtract($y)); |
|||
} |
|||
|
|||
public function testMultiply() |
|||
{ |
|||
$x = $this->getInstance('8589934592'); // 2**33
|
|||
$y = $this->getInstance('36893488147419103232'); // 2**65
|
|||
|
|||
$a = $x->multiply($y); // 2**98
|
|||
$b = $y->multiply($x); // 2**98
|
|||
|
|||
$this->assertTrue($a->equals($b)); |
|||
$this->assertTrue($b->equals($a)); |
|||
|
|||
$this->assertSame('316912650057057350374175801344', (string) $a); |
|||
$this->assertSame('316912650057057350374175801344', (string) $b); |
|||
} |
|||
|
|||
public function testDivide() |
|||
{ |
|||
$x = $this->getInstance('1180591620717411303425'); // 2**70 + 1
|
|||
$y = $this->getInstance('12345678910'); |
|||
|
|||
list($q, $r) = $x->divide($y); |
|||
|
|||
$this->assertSame('95627922070', (string) $q); |
|||
$this->assertSame('10688759725', (string) $r); |
|||
} |
|||
|
|||
public function testModPow() |
|||
{ |
|||
$a = $this->getInstance('10'); |
|||
$b = $this->getInstance('20'); |
|||
$c = $this->getInstance('30'); |
|||
$d = $a->modPow($b, $c); |
|||
|
|||
$this->assertSame('10', (string) $d); |
|||
} |
|||
|
|||
public function testModInverse() |
|||
{ |
|||
$a = $this->getInstance(30); |
|||
$b = $this->getInstance(17); |
|||
|
|||
$c = $a->modInverse($b); |
|||
$this->assertSame('4', (string) $c); |
|||
|
|||
$d = $a->multiply($c); |
|||
list($q, $r) = $d->divide($b); |
|||
$this->assertSame('1', (string) $r); |
|||
} |
|||
|
|||
public function testExtendedGCD() |
|||
{ |
|||
$a = $this->getInstance(693); |
|||
$b = $this->getInstance(609); |
|||
|
|||
$arr = $a->extendedGCD($b); |
|||
|
|||
$this->assertSame('21', (string) $arr['gcd']); |
|||
$this->assertSame(21, $a->toString() * $arr['x']->toString() + $b->toString() * $arr['y']->toString()); |
|||
} |
|||
|
|||
public function testGCD() |
|||
{ |
|||
$x = $this->getInstance(693); |
|||
$y = $this->getInstance(609); |
|||
$this->assertSame('21', (string) $x->gcd($y)); |
|||
} |
|||
|
|||
public function testAbs() |
|||
{ |
|||
$x = $this->getInstance('-18446744073709551617'); |
|||
$y = $x->abs(); |
|||
|
|||
$this->assertSame('-18446744073709551617', (string) $x); |
|||
$this->assertSame('18446744073709551617', (string) $y); |
|||
} |
|||
|
|||
public function testEquals() |
|||
{ |
|||
$x = $this->getInstance('18446744073709551616'); |
|||
$y = $this->getInstance('18446744073709551616'); |
|||
|
|||
$this->assertTrue($x->equals($y)); |
|||
$this->assertTrue($y->equals($x)); |
|||
} |
|||
|
|||
public function testCompare() |
|||
{ |
|||
$a = $this->getInstance('-18446744073709551616'); |
|||
$b = $this->getInstance('36893488147419103232'); |
|||
$c = $this->getInstance('36893488147419103232'); |
|||
$d = $this->getInstance('316912650057057350374175801344'); |
|||
|
|||
// a < b
|
|||
$this->assertLessThan(0, $a->compare($b)); |
|||
$this->assertGreaterThan(0, $b->compare($a)); |
|||
|
|||
// b = c
|
|||
$this->assertSame(0, $b->compare($c)); |
|||
$this->assertSame(0, $c->compare($b)); |
|||
|
|||
// c < d
|
|||
$this->assertLessThan(0, $c->compare($d)); |
|||
$this->assertGreaterThan(0, $d->compare($c)); |
|||
} |
|||
|
|||
public function testBitwiseAND() |
|||
{ |
|||
$x = $this->getInstance('66666666666666666666666', 16); |
|||
$y = $this->getInstance('33333333333333333333333', 16); |
|||
$z = $this->getInstance('22222222222222222222222', 16); |
|||
|
|||
$this->assertSame($z->toHex(), $x->bitwise_AND($y)->toHex()); |
|||
} |
|||
|
|||
public function testBitwiseOR() |
|||
{ |
|||
$x = $this->getInstance('11111111111111111111111', 16); |
|||
$y = $this->getInstance('EEEEEEEEEEEEEEEEEEEEEEE', 16); |
|||
$z = $this->getInstance('FFFFFFFFFFFFFFFFFFFFFFF', 16); |
|||
|
|||
$this->assertSame($z->toHex(), $x->bitwise_OR($y)->toHex()); |
|||
} |
|||
|
|||
public function testBitwiseXOR() |
|||
{ |
|||
$x = $this->getInstance('AFAFAFAFAFAFAFAFAFAFAFAF', 16); |
|||
$y = $this->getInstance('133713371337133713371337', 16); |
|||
$z = $this->getInstance('BC98BC98BC98BC98BC98BC98', 16); |
|||
|
|||
$this->assertSame($z->toHex(), $x->bitwise_XOR($y)->toHex()); |
|||
} |
|||
|
|||
public function testBitwiseNOT() |
|||
{ |
|||
$x = $this->getInstance('EEEEEEEEEEEEEEEEEEEEEEE', 16); |
|||
$z = $this->getInstance('11111111111111111111111', 16); |
|||
|
|||
$this->assertSame($z->toHex(), $x->bitwise_NOT()->toHex()); |
|||
} |
|||
|
|||
public function testBitwiseLeftShift() |
|||
{ |
|||
$x = $this->getInstance('0x0000000FF0000000', 16); |
|||
$y = $this->getInstance('0x000FF00000000000', 16); |
|||
|
|||
$this->assertSame($y->toHex(), $x->bitwise_LeftShift(16)->toHex()); |
|||
} |
|||
|
|||
public function testBitwiseRightShift() |
|||
{ |
|||
$x = $this->getInstance('0x0000000FF0000000', 16); |
|||
$y = $this->getInstance('0x00000000000FF000', 16); |
|||
$z = $this->getInstance('0x000000000000000F', 16); |
|||
$n = $this->getInstance(0); |
|||
|
|||
$this->assertSame($y->toHex(), $x->bitwise_RightShift(16)->toHex()); |
|||
$this->assertSame($z->toHex(), $x->bitwise_RightShift(32)->toHex()); |
|||
$this->assertSame($n->toHex(), $x->bitwise_RightShift(36)->toHex()); |
|||
} |
|||
|
|||
public function testSerializable() |
|||
{ |
|||
$x = $this->getInstance('18446744073709551616'); |
|||
$y = unserialize(serialize($x)); |
|||
|
|||
$this->assertTrue($x->equals($y)); |
|||
$this->assertTrue($y->equals($x)); |
|||
|
|||
$this->assertSame('18446744073709551616', (string) $x); |
|||
$this->assertSame('18446744073709551616', (string) $y); |
|||
} |
|||
|
|||
public function testClone() |
|||
{ |
|||
$x = $this->getInstance('18446744073709551616'); |
|||
$y = clone $x; |
|||
|
|||
$this->assertTrue($x->equals($y)); |
|||
$this->assertTrue($y->equals($x)); |
|||
|
|||
$this->assertSame('18446744073709551616', (string) $x); |
|||
$this->assertSame('18446744073709551616', (string) $y); |
|||
} |
|||
} |
|||
@ -0,0 +1,22 @@ |
|||
<?php |
|||
/** |
|||
* Bootstrapping File for phpseclib Test Suite |
|||
* |
|||
* @license http://www.opensource.org/licenses/mit-license.html MIT License |
|||
*/ |
|||
|
|||
// Set up include path accordingly. This is especially required because some
|
|||
// class files of phpseclib require() other dependencies.
|
|||
set_include_path(implode(PATH_SEPARATOR, array( |
|||
dirname(__FILE__) . '/../phpseclib/', |
|||
get_include_path(), |
|||
))); |
|||
|
|||
function phpseclib_autoload($class) |
|||
{ |
|||
$file = str_replace('_', '/', $class) . '.php'; |
|||
|
|||
require $file; |
|||
} |
|||
|
|||
spl_autoload_register('phpseclib_autoload'); |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue