add methods to decrypt return data from router
[GitHub/Stricted/speedport-hybrid-php-api.git] / CryptLib / Password / Implementation / Hash.php
diff --git a/CryptLib/Password/Implementation/Hash.php b/CryptLib/Password/Implementation/Hash.php
new file mode 100644 (file)
index 0000000..b85b00c
--- /dev/null
@@ -0,0 +1,145 @@
+<?php
+/**
+ * The basic Hash implementation.
+ *
+ * It's worth noting, since there's no prefix, you cannot create a hash using
+ * the factory method.
+ *
+ * PHP version 5.3
+ *
+ * @category   PHPCryptLib
+ * @package    Password
+ * @subpackage Implementation
+ * @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\Password\Implementation;
+
+use CryptLib\Random\Factory as RandomFactory;
+
+/**
+ * The basic Hash implementation.
+ *
+ * It's worth noting, since there's no prefix, you cannot create a hash using
+ * the factory method.
+ *
+ * @category   PHPCryptLib
+ * @package    Password
+ * @subpackage Implementation
+ * @author     Anthony Ferrara <ircmaxell@ircmaxell.com>
+ */
+class Hash implements \CryptLib\Password\Password {
+
+    /**
+     * @var Generator The random generator to use for seeds
+     */
+    protected $generator = null;
+
+    /**
+     * @var Hash The hash function to use (MD5)
+     */
+    protected $hash = null;
+
+    /**
+     * Determine if the hash was made with this method
+     *
+     * @param string $hash The hashed data to check
+     *
+     * @return boolean Was the hash created by this method
+     */
+    public static function detect($hash) {
+        $res  = preg_match('/^[a-fA-F0-9]+$/', $hash);
+        $res &= (int) in_array(strlen($hash), array(32, 40, 64, 128));
+        return (boolean) $res;
+    }
+
+    /**
+     * Return the prefix used by this hashing method
+     *
+     * @return string The prefix used
+     */
+    public static function getPrefix() {
+        return false;
+    }
+
+    /**
+     * Load an instance of the class based upon the supplied hash
+     *
+     * @param string $hash The hash to load from
+     *
+     * @return Password the created instance
+     * @throws InvalidArgumentException if the hash wasn't created here
+     */
+    public static function loadFromHash($hash) {
+        if (!static::detect($hash)) {
+            throw new \InvalidArgumentException('Hash Not Created Here');
+        }
+        $hashMethod = '';
+        switch (strlen($hash)) {
+            case 32:
+                $hashMethod = 'md5';
+                break;
+            case 40:
+                $hashMethod = 'sha1';
+                break;
+            case 64:
+                $hashMethod = 'sha256';
+                break;
+            case 128:
+                $hashMethod = 'sha512';
+                break;
+        }
+        return new static($hashMethod);
+    }
+
+    /**
+     * Build a new instance
+     *
+     * @param string    $hashMethod The hash function to use for hashing
+     * @param Generator $generator  The random generator to use for seeds
+     * @param Factory   $factory    The hash factory to use for this instance
+     *
+     * @return void
+     */
+    public function __construct(
+        $hashMethod,
+        \CryptLib\Random\Generator $generator = null
+    ) {
+        $this->hash = $hashMethod;
+        if (is_null($generator)) {
+            $random    = new RandomFactory();
+            $generator = $random->getMediumStrengthGenerator();
+        }
+        $this->generator = $generator;
+    }
+
+    /**
+     * Create a password hash for a given plain text password
+     *
+     * @param string $password The password to hash
+     *
+     * @return string The formatted password hash
+     */
+    public function create($password) {
+        throw new \BadMethodCallException(
+            'Unsalted Passwords are only implemented for verification'
+        );
+    }
+
+    /**
+     * Verify a password hash against a given plain text password
+     *
+     * @param string $password The password to hash
+     * @param string $hash     The supplied ahsh to validate
+     *
+     * @return boolean Does the password validate against the hash
+     */
+    public function verify($password, $hash) {
+        $test = hash($this->hash, $password);
+        return $test == $hash;
+    }
+
+}