{-|

This module exposes all the cryptographic hash functions available
under the raaz library.

-}
{-# OPTIONS_GHC -fno-warn-warnings-deprecations #-}

module Raaz.Hash
       (
         -- * Cryptographic hashes and hmacs.
         -- $computingHash$

         -- ** Encoding and displaying.
         -- $encoding$
         --
         Hash, hash, hashFile, hashSource
       , HMAC, hmac, hmacFile, hmacSource
         -- * Exposing individual hashes.
         -- $individualHashes$
       , module Raaz.Hash.Blake2
       , module Raaz.Hash.Sha224
       , module Raaz.Hash.Sha256
       , module Raaz.Hash.Sha384
       , module Raaz.Hash.Sha512
       -- , module Raaz.Hash.Blake256

       ) where

-- import Raaz.Hash.Blake256

import Raaz.Hash.Blake2
import Raaz.Hash.Sha224
import Raaz.Hash.Sha256
import Raaz.Hash.Sha384
import Raaz.Hash.Sha512

import Raaz.Hash.Internal      ( Hash, hash, hashFile, hashSource )
import Raaz.Hash.Internal.HMAC ( HMAC, hmac, hmacFile, hmacSource )

-- $computingHash$
--
--
-- The cryptographic hashes provided by raaz give the following
-- guarantees:
--
-- 1. Distinct hashes are distinct types and hence it is a compiler
--    error to compare two different hashes.
--
-- 2. A hash and its associated hmac are distinct types and hence
--    it is an compile time error to compare a hash with its  hmac.
--
-- 3. The `Eq` instance for hashes and the corresponding hmacs use
--    a constant time equality test and hence it is safe to check
--    equality using the operator `==`.
--
-- The functions `hash`, `hashFile`, and `hashSource` provide a rather
-- high level interface for computing hashes. For hmacs the associated
-- functions are `hmac`, `hmacFile`, and `hmacSource`
--
-- === NOTE: SHA1 is broken.
--
-- SHA1 is no more available form this module, its use is highly
-- depreciated. If you want to use it for transition please import
-- Raaz.Hash.Sha1 specifically


-- $encoding$
--
-- When interfacing with other applications or when printing output to
-- users, it is often necessary to encode hash, hmac or their keys as
-- strings. Applications usually present hashes encoded in base16. The
-- `Show` and `Data.String.IsString` instances for the hashes exposed
-- here follow this convention.
--
-- More generaly, hashes, hmacs and their key are instances of type
-- class `Raaz.Core.Encode.Encodable` and can hence can be encoded in
-- any of the formats supported in raaz.

-- $individualHashes$
--
-- Individual hash and hmacs are exposed via their respective modules.
-- These module also export the specialized variants for `hashSource`,
-- `hash` and `hashFile` for specific hashes.  For example, if you are
-- interested only in say `SHA512` you can import the module
-- "Raaz.Hash.Sha512". This will expose the functions `sha512Source`,
-- `sha512` and `sha512File` which are specialized variants of
-- `hashSource` `hash` and `hashFile` respectively for the hash
-- `SHA512`. For example, if you want to print the sha512 checksum of
-- a file, you can use the following.
--
-- > sha512Checksum :: FilePath -> IO ()
-- >            -- print the sha512 checksum of a given file.
-- > sha512Checksum fname =  sha512File fname >>= print

{-# ANN module "HLint: ignore Use import/export shortcut" #-}