File indexing completed on 2024-12-22 05:37:15
0001 <?php 0002 /** 0003 * Zend Framework 0004 * 0005 * LICENSE 0006 * 0007 * This source file is subject to the new BSD license that is bundled 0008 * with this package in the file LICENSE.txt. 0009 * It is also available through the world-wide-web at this URL: 0010 * http://framework.zend.com/license/new-bsd 0011 * If you did not receive a copy of the license and are unable to 0012 * obtain it through the world-wide-web, please send an email 0013 * to license@zend.com so we can send you a copy immediately. 0014 * 0015 * @category Zend 0016 * @package Zend_Crypt 0017 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) 0018 * @license http://framework.zend.com/license/new-bsd New BSD License 0019 * @version $Id$ 0020 */ 0021 0022 /** 0023 * @category Zend 0024 * @package Zend_Crypt 0025 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) 0026 * @license http://framework.zend.com/license/new-bsd New BSD License 0027 */ 0028 class Zend_Crypt 0029 { 0030 0031 const TYPE_OPENSSL = 'openssl'; 0032 const TYPE_HASH = 'hash'; 0033 const TYPE_MHASH = 'mhash'; 0034 0035 protected static $_type = null; 0036 0037 /** 0038 * @var array 0039 */ 0040 protected static $_supportedAlgosOpenssl = array( 0041 'md2', 0042 'md4', 0043 'mdc2', 0044 'rmd160', 0045 'sha', 0046 'sha1', 0047 'sha224', 0048 'sha256', 0049 'sha384', 0050 'sha512' 0051 ); 0052 0053 /** 0054 * @var array 0055 */ 0056 protected static $_supportedAlgosMhash = array( 0057 'adler32', 0058 'crc32', 0059 'crc32b', 0060 'gost', 0061 'haval128', 0062 'haval160', 0063 'haval192', 0064 'haval256', 0065 'md4', 0066 'md5', 0067 'ripemd160', 0068 'sha1', 0069 'sha256', 0070 'tiger', 0071 'tiger128', 0072 'tiger160' 0073 ); 0074 0075 /** 0076 * @param string $algorithm 0077 * @param string $data 0078 * @param bool $binaryOutput 0079 * @return unknown 0080 */ 0081 public static function hash($algorithm, $data, $binaryOutput = false) 0082 { 0083 $algorithm = strtolower($algorithm); 0084 if (function_exists($algorithm)) { 0085 return $algorithm($data, $binaryOutput); 0086 } 0087 self::_detectHashSupport($algorithm); 0088 $supportedMethod = '_digest' . ucfirst(self::$_type); 0089 $result = self::$supportedMethod($algorithm, $data, $binaryOutput); 0090 return $result; 0091 } 0092 0093 /** 0094 * @param string $algorithm 0095 * @throws Zend_Crypt_Exception 0096 */ 0097 protected static function _detectHashSupport($algorithm) 0098 { 0099 if (function_exists('hash')) { 0100 self::$_type = self::TYPE_HASH; 0101 if (in_array($algorithm, hash_algos())) { 0102 return; 0103 } 0104 } 0105 if (function_exists('mhash')) { 0106 self::$_type = self::TYPE_MHASH; 0107 if (in_array($algorithm, self::$_supportedAlgosMhash)) { 0108 return; 0109 } 0110 } 0111 if (function_exists('openssl_digest')) { 0112 if ($algorithm == 'ripemd160') { 0113 $algorithm = 'rmd160'; 0114 } 0115 self::$_type = self::TYPE_OPENSSL; 0116 if (in_array($algorithm, self::$_supportedAlgosOpenssl)) { 0117 return; 0118 } 0119 } 0120 /** 0121 * @see Zend_Crypt_Exception 0122 */ 0123 // require_once 'Zend/Crypt/Exception.php'; 0124 throw new Zend_Crypt_Exception('\'' . $algorithm . '\' is not supported by any available extension or native function'); 0125 } 0126 0127 /** 0128 * @param string $algorithm 0129 * @param string $data 0130 * @param bool $binaryOutput 0131 * @return string 0132 */ 0133 protected static function _digestHash($algorithm, $data, $binaryOutput) 0134 { 0135 return hash($algorithm, $data, $binaryOutput); 0136 } 0137 0138 /** 0139 * @param string $algorithm 0140 * @param string $data 0141 * @param bool $binaryOutput 0142 * @return string 0143 */ 0144 protected static function _digestMhash($algorithm, $data, $binaryOutput) 0145 { 0146 $constant = constant('MHASH_' . strtoupper($algorithm)); 0147 $binary = mhash($constant, $data); 0148 if ($binaryOutput) { 0149 return $binary; 0150 } 0151 return bin2hex($binary); 0152 } 0153 0154 /** 0155 * @param string $algorithm 0156 * @param string $data 0157 * @param bool $binaryOutput 0158 * @return string 0159 */ 0160 protected static function _digestOpenssl($algorithm, $data, $binaryOutput) 0161 { 0162 if ($algorithm == 'ripemd160') { 0163 $algorithm = 'rmd160'; 0164 } 0165 return openssl_digest($data, $algorithm, $binaryOutput); 0166 } 0167 0168 }