| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 | <?phpnamespace Aws;/** * Incremental hashing using PHP's hash functions. */class PhpHash implements HashInterface{    /** @var resource|\HashContext */    private $context;    /** @var string */    private $algo;    /** @var array */    private $options;    /** @var string */    private $hash;    /**     * @param string $algo Hashing algorithm. One of PHP's hash_algos()     *     return values (e.g. md5, sha1, etc...).     * @param array  $options Associative array of hashing options:     *     - key: Secret key used with the hashing algorithm.     *     - base64: Set to true to base64 encode the value when complete.     */    public function __construct($algo, array $options = [])    {        $this->algo = $algo;        $this->options = $options;    }    public function update($data)    {        if ($this->hash !== null) {            $this->reset();        }        hash_update($this->getContext(), $data);    }    public function complete()    {        if ($this->hash) {            return $this->hash;        }        $this->hash = hash_final($this->getContext(), true);        if (isset($this->options['base64']) && $this->options['base64']) {            $this->hash = base64_encode($this->hash);        }        return $this->hash;    }    public function reset()    {        $this->context = $this->hash = null;    }    /**     * Get a hash context or create one if needed     *     * @return resource|\HashContext      */    private function getContext()    {        if (!$this->context) {            $key = isset($this->options['key']) ? $this->options['key'] : '';            $this->context = hash_init(                $this->algo,                $key ? HASH_HMAC : 0,                $key            );        }        return $this->context;    }}
 |