add methods to decrypt return data from router
[GitHub/Stricted/speedport-hybrid-php-api.git] / CryptLib / Hash / Hash.php
diff --git a/CryptLib/Hash/Hash.php b/CryptLib/Hash/Hash.php
new file mode 100644 (file)
index 0000000..8c6f8a6
--- /dev/null
@@ -0,0 +1,360 @@
+<?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