| 
<?php
 /**
 * Message digest implementation.
 *
 * @author Marius Zadara <[email protected]>
 * @category org.zadara.marius.messagedigester.classes
 * @copyright (C) 2008, Marius Zadara <[email protected]>
 * @license GNU GPL
 * @package org.zadara.marius.messagedigester
 *
 * @final
 */
 final class MessageDigest
 {
 /**
 * The choosen digest algorithm.
 *
 * @var String
 * @access private
 * @see getInstance()
 */
 private $hashAlgorithm;
 
 /**
 * The text to digest
 *
 * @var String
 * @access private
 * @see update()
 */
 private $textToDigest;
 
 /**
 * Default constructor.
 * It will initialize the hash algorithm and text to digest
 * will NULL values.
 *
 * @access public
 */
 public function __construct()
 {
 // set to null the hash algorithm and text to digest
 $this->hashAlgorithm = null;
 $this->textToDigest = null;
 }
 
 /**
 * Get an instance of a hash algorithm.
 * The hash algorithm must have been defined.
 *
 * @param String $hashAlgorithmName The name of the hash algorithm
 * @access public
 */
 public function getInstance($hashAlgorithmName)
 {
 // search for the hash algorithm class
 if (!class_exists($hashAlgorithmName))
 throw new MessageDigestException(sprintf("'%s' license algorithm not found", $hashAlgorithmName));
 
 // set the algorithm
 $this->hashAlgorithm = new $hashAlgorithmName;
 
 // the class algorithm must implement the specific interface
 // if not, error
 if (!in_array("IHashAlgorithm",  class_implements($this->hashAlgorithm)))
 {
 $this->hashAlgorithm = null;
 throw new MessageDigestException(sprintf("'%s' license is not correctly defined", $hashAlgorithmName));
 }
 }
 
 /**
 * Reset the message digest data.
 * @access public
 */
 public function reset()
 {
 if (!is_null($this->hashAlgorithm))
 {
 // reset to default values
 $this->hashAlgorithm = null;
 $this->textToDigest = null;
 }
 }
 
 /**
 * Function to set the text for digest.
 * Also will check the algorithm to see if has been set
 *
 * @param String $text The text to digest later
 */
 public function update($text)
 {
 // check the hash algorithm
 if (is_null($this->hashAlgorithm))
 throw new MessageDigestException("Hash algorithm not set yet");
 
 // check the length of the string
 if (strlen($text) == 0)
 throw new MessageDigestException("Empty text to digest");
 
 // set the text
 $this->textToDigest = $text;
 }
 
 /**
 * Digest function.
 * This function will digest the text set before.
 *
 * @return string The text digested
 * @see IHashAlgorithm::hash()
 */
 public function digest()
 {
 // check the hash algorithm
 if (is_null($this->hashAlgorithm))
 throw new MessageDigestException("Hash algorithm not set yet");
 
 // check the text to digest
 if (is_null(($this->textToDigest)))
 throw new MessageDigestException("Text to hash not set yet");
 
 // set the default return string
 $hashedText = "";
 
 try
 {
 // try to call the hash method from the algorithm
 $hashedText = $this->hashAlgorithm->hash($this->textToDigest);
 }
 catch (HashAlgorithmException $hashAlgorithmException)
 {
 // throw the exception further
 throw new MessageDigestException
 (
 sprintf
 (
 "Failed to hash the text '%s' using the '%s' algorithm: %s",
 $this->textToDigest,
 $this->hashAlgorithm,
 $hashAlgorithmException->getMessage()
 )
 );
 }
 catch (Exception $generalException)
 {
 // throw the exception further
 throw new MessageDigestException
 (
 sprintf
 (
 "Failed to hash the text '%s' using the '%s' algorithm: %s",
 $this->textToDigest,
 $this->hashAlgorithm,
 $hashAlgorithmException->getMessage()
 )
 );
 }
 
 // return the hashed text
 return $hashedText;
 }
 }
 
 ?>
 |