--- /dev/null
+<?php
+/**
+ * A hash utility data mapper class
+ *
+ * This class's purpose is to store information about hash algorithms that is
+ * otherwise unavailable during runtime. Some information is available (such
+ * as the output size), but is included anyway for performance and completeness
+ * reasons.
+ *
+ * PHP version 5.3
+ *
+ * @category PHPCryptLib
+ * @package Hash
+ * @author Anthony Ferrara <ircmaxell@ircmaxell.com>
+ * @copyright 2011 The Authors
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @version Build @@version@@
+ */
+namespace CryptLib\Hash;
+
+/**
+ * A hash utility data mapper class
+ *
+ * This class's purpose is to store information about hash algorithms that is
+ * otherwise unavailable during runtime. Some information is available (such
+ * as the output size), but is included anyway for performance and completeness
+ * reasons.
+ *
+ * PHP version 5.3
+ *
+ * @category PHPCryptLib
+ * @package Hash
+ * @author Anthony Ferrara <ircmaxell@ircmaxell.com>
+ */
+class Hash {
+
+ /**
+ * This array contains information about each hash function available to PHP
+ * at the present time. Block sizes are not available from functions, so they
+ * must be hard coded.
+ *
+ * The "secure" indicates the strength of the hash and whether or not any known
+ * cryptographic attacks exist for the hash function. This will only apply when
+ * using the hash functions for situations that require cryptographic strength
+ * such as message signing. For other uses the insecure ones can have valid
+ * uses.
+ *
+ * @var array An array of information about each supported hash function
+ */
+ protected static $hashInfo = array(
+ 'md2' => array(
+ 'HashSize' => 128,
+ 'BlockSize' => 128,
+ 'secure' => false,
+ ),
+ 'md4' => array(
+ 'HashSize' => 128,
+ 'BlockSize' => 512,
+ 'secure' => false,
+ ),
+ 'md5' => array(
+ 'HashSize' => 128,
+ 'BlockSize' => 512,
+ 'secure' => false,
+ ),
+ 'sha1' => array(
+ 'HashSize' => 160,
+ 'BlockSize' => 512,
+ 'secure' => false,
+ ),
+ 'sha224' => array(
+ 'HashSize' => 224,
+ 'BlockSize' => 512,
+ 'secure' => true,
+ ),
+ 'sha256' => array(
+ 'HashSize' => 256,
+ 'BlockSize' => 512,
+ 'secure' => true,
+ ),
+ 'sha384' => array(
+ 'HashSize' => 384,
+ 'BlockSize' => 1024,
+ 'secure' => true,
+ ),
+ 'sha512' => array(
+ 'HashSize' => 512,
+ 'BlockSize' => 1024,
+ 'secure' => true,
+ ),
+ 'ripemd128' => array(
+ 'HashSize' => 128,
+ 'BlockSize' => 512,
+ 'secure' => true,
+ ),
+ 'ripemd160' => array(
+ 'HashSize' => 160,
+ 'BlockSize' => 512,
+ 'secure' => true,
+ ),
+ 'ripemd256' => array(
+ 'HashSize' => 256,
+ 'BlockSize' => 512,
+ 'secure' => true,
+ ),
+ 'ripemd320' => array(
+ 'HashSize' => 320,
+ 'BlockSize' => 512,
+ 'secure' => true,
+ ),
+ 'whirlpool' => array(
+ 'HashSize' => 512,
+ 'BlockSize' => 512,
+ 'secure' => true,
+ ),
+ 'tiger128,3' => array(
+ 'HashSize' => 128,
+ 'BlockSize' => 512,
+ 'secure' => true,
+ ),
+ 'tiger160,3' => array(
+ 'HashSize' => 160,
+ 'BlockSize' => 512,
+ 'secure' => true,
+ ),
+ 'tiger192,3' => array(
+ 'HashSize' => 192,
+ 'BlockSize' => 512,
+ 'secure' => true,
+ ),
+ 'tiger128,4' => array(
+ 'HashSize' => 128,
+ 'BlockSize' => 512,
+ 'secure' => true,
+ ),
+ 'tiger160,4' => array(
+ 'HashSize' => 160,
+ 'BlockSize' => 512,
+ 'secure' => true,
+ ),
+ 'tiger192,4' => array(
+ 'HashSize' => 192,
+ 'BlockSize' => 512,
+ 'secure' => true,
+ ),
+ 'snefru' => array(
+ 'HashSize' => 256,
+ 'BlockSize' => 512,
+ 'secure' => false,
+ ),
+ 'snefru256' => array(
+ 'HashSize' => 256,
+ 'BlockSize' => 512,
+ 'secure' => false,
+ ),
+ 'gost' => array(
+ 'HashSize' => 256,
+ 'BlockSize' => 256,
+ 'secure' => false,
+ ),
+ 'adler32' => array(
+ 'HashSize' => 32,
+ 'BlockSize' => 16,
+ 'secure' => false,
+ ),
+ 'crc32' => array(
+ 'HashSize' => 32,
+ 'BlockSize' => 32,
+ 'secure' => false,
+ ),
+ 'crc32b' => array(
+ 'HashSize' => 32,
+ 'BlockSize' => 32,
+ 'secure' => false,
+ ),
+ 'salsa10' => array(
+ 'HashSize' => 512,
+ 'BlockSize' => 512,
+ 'secure' => true,
+ ),
+ 'salsa20' => array(
+ 'HashSize' => 512,
+ 'BlockSize' => 512,
+ 'secure' => true,
+ ),
+ 'haval128,3' => array(
+ 'HashSize' => 128,
+ 'BlockSize' => 1024,
+ 'secure' => false,
+ ),
+ 'haval160,3' => array(
+ 'HashSize' => 160,
+ 'BlockSize' => 1024,
+ 'secure' => false,
+ ),
+ 'haval192,3' => array(
+ 'HashSize' => 192,
+ 'BlockSize' => 1024,
+ 'secure' => false,
+ ),
+ 'haval224,3' => array(
+ 'HashSize' => 224,
+ 'BlockSize' => 1024,
+ 'secure' => false,
+ ),
+ 'haval256,3' => array(
+ 'HashSize' => 256,
+ 'BlockSize' => 1024,
+ 'secure' => false,
+ ),
+ 'haval128,4' => array(
+ 'HashSize' => 128,
+ 'BlockSize' => 1024,
+ 'secure' => false,
+ ),
+ 'haval160,4' => array(
+ 'HashSize' => 160,
+ 'BlockSize' => 1024,
+ 'secure' => false,
+ ),
+ 'haval192,4' => array(
+ 'HashSize' => 192,
+ 'BlockSize' => 1024,
+ 'secure' => false,
+ ),
+ 'haval224,4' => array(
+ 'HashSize' => 224,
+ 'BlockSize' => 1024,
+ 'secure' => false,
+ ),
+ 'haval256,4' => array(
+ 'HashSize' => 256,
+ 'BlockSize' => 1024,
+ 'secure' => false,
+ ),
+ 'haval128,5' => array(
+ 'HashSize' => 128,
+ 'BlockSize' => 1024,
+ 'secure' => false,
+ ),
+ 'haval160,5' => array(
+ 'HashSize' => 160,
+ 'BlockSize' => 1024,
+ 'secure' => false,
+ ),
+ 'haval192,5' => array(
+ 'HashSize' => 192,
+ 'BlockSize' => 1024,
+ 'secure' => false,
+ ),
+ 'haval224,5' => array(
+ 'HashSize' => 224,
+ 'BlockSize' => 1024,
+ 'secure' => false,
+ ),
+ 'haval256,5' => array(
+ 'HashSize' => 256,
+ 'BlockSize' => 1024,
+ 'secure' => false,
+ ),
+ 'joaat' => array(
+ 'HashSize' => 32,
+ 'BlockSize' => 64,
+ 'secure' => false,
+ ),
+ 'fnv132' => array(
+ 'HashSize' => 32,
+ 'BlockSize' => 32,
+ 'secure' => false,
+ ),
+ 'fnv164' => array(
+ 'HashSize' => 64,
+ 'BlockSize' => 64,
+ 'secure' => false,
+ ),
+ );
+
+ /**
+ * Get the block size of the specified function in bytes
+ *
+ * @param string $hash The hash function to look up
+ *
+ * @return int The number of bytes in the block function
+ */
+ public static function getBlockSize($hash) {
+ return static::getBlockSizeInBits($hash) / 8;
+ }
+
+ /**
+ * Get the block size of the specified function in bits
+ *
+ * @param string $hash The hash function to look up
+ *
+ * @return int The number of bits in the block function
+ */
+ public static function getBlockSizeInBits($hash) {
+ if (isset(static::$hashInfo[$hash]['BlockSize'])) {
+ return static::$hashInfo[$hash]['BlockSize'];
+ }
+ return 0;
+ }
+
+ /**
+ * Get the output size of the specified function in bytes
+ *
+ * @param string $hash The hash function to look up
+ *
+ * @return int The number of bytes outputted by the hash function
+ */
+ public static function getHashSize($hash) {
+ return static::getHashSizeInBits($hash) / 8;
+ }
+
+ /**
+ * Get the output size of the specified function in bits
+ *
+ * @param string $hash The hash function to look up
+ *
+ * @return int The number of bits outputted by the hash function
+ */
+ public static function getHashSizeInBits($hash) {
+ if (isset(static::$hashInfo[$hash]['HashSize'])) {
+ return static::$hashInfo[$hash]['HashSize'];
+ }
+ return 0;
+ }
+
+ /**
+ * Check to see if the hash function specified is available
+ *
+ * @param string $hash The hash function to look up
+ *
+ * @return boolean If the hash function is available in this version of PHP
+ */
+ public static function isAvailable($hash) {
+ return in_array($hash, hash_algos());
+ }
+
+ /**
+ * Check to see if the specified hash function is secure enough for
+ * cryptographic uses
+ *
+ * The "secure" indicates the strength of the hash and whether or not any known
+ * cryptographic attacks exist for the hash function. This will only apply when
+ * using the hash functions for situations that require cryptographic strength
+ * such as message signing. For other uses the insecure ones can have valid
+ * uses.
+ *
+ * @param string $hash The hash function to look up
+ *
+ * @return bolean If the function is secure
+ */
+ public static function isSecure($hash) {
+ if (isset(static::$hashInfo[$hash])) {
+ return static::$hashInfo[$hash]['secure'];
+ }
+ return false;
+ }
+
+}
\ No newline at end of file