    {-|

    This module exposes combinators to compute the SHA512 hash and the
    associated HMAC for some common types.

    -}

    module Raaz.Hash.Sha512
           ( -- * The SHA512 cryptographic hash
             SHA512
           , sha512, sha512File, sha512Source
           -- * HMAC computation using SHA512
           , hmacSha512, hmacSha512File, hmacSha512Source
           ) where

    import qualified Data.ByteString as B
    import qualified Data.ByteString.Lazy as L

    import Raaz.Core

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

    -- | Compute the sha512 hash of an instance of `PureByteSource`. Use
    -- this for computing the sha512 hash of a strict or lazy byte string.
    sha512       :: PureByteSource src => src -> SHA512
    sha512       = hash
    {-# SPECIALIZE sha512 :: B.ByteString -> SHA512 #-}
    {-# SPECIALIZE sha512 :: L.ByteString -> SHA512 #-}

    -- | Compute the sha512 hash of a file.
    sha512File   :: FilePath -> IO SHA512
    sha512File   = hashFile

    -- | Compute the sha512 hash of a general byte source.
    sha512Source :: ByteSource src => src -> IO SHA512
    sha512Source = hashSource

    -- | Compute the message authentication code using hmac-sha512.
    hmacSha512 :: PureByteSource src
               => Key (HMAC SHA512)  -- ^ Key to use
               -> src                -- ^ pure source whose hmac is to be
                                     -- computed
               -> HMAC SHA512
    hmacSha512 = hmac

    -- | Compute the message authentication code for a file.
    hmacSha512File :: Key (HMAC SHA512) -- ^ Key to use
                   -> FilePath          -- ^ File whose hmac is to be computed
                   -> IO (HMAC SHA512)
    hmacSha512File = hmacFile

    -- | Compute the message authetication code for a generic byte source.
    hmacSha512Source :: ByteSource src
                     => Key (HMAC SHA512)
                     -> src
                     -> IO (HMAC SHA512)
    hmacSha512Source = hmacSource