    {-|

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

    -}
    module Raaz.Hash.Sha1
    {-# DEPRECATED "SHA1 is broken. This module is here only for transition." #-}
           (
             -- * The broken SHA1 cryptographic hash.
             -- $sha1$
             SHA1
           , sha1, sha1File, sha1Source
             -- * HMAC computation using SHA1
           , hmacSha1, hmacSha1File, hmacSha1Source
           ) 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.Sha1.Internal ( SHA1 )
    import Raaz.Hash.Sha1.Recommendation()

    -- $sha1$
    --
    -- We already have a collision for SHA1:
    -- <https://security.googleblog.com/2017/02/announcing-first-sha1-collision.html>
    --
    -- While it does not yet rule out SHA1 for some specific tasks, there
    -- is no reason for its continual usage. This module is present only
    -- to facilitate the transition to a better hash. Use it assuming no
    -- security guarantees. Raaz will not try to optimise the
    -- implementations given here and will remove this module at some
    -- point of time. So do not rely on this for your software.
    --
    --
    --

    {-# DEPRECATED sha1, sha1File, sha1Source
                   "SHA1 is broken. This functions are here only for transition." #-}
    -- | Compute the sha1 hash of an instance of `PureByteSource`. Use
    -- this for computing the sha1 hash of a strict or lazy byte string.
    sha1       :: PureByteSource src => src -> SHA1
    sha1 :: src -> SHA1
    sha1       = src -> SHA1
    forall h src.
    (Hash h, Recommendation h, PureByteSource src) =>
    src -> h
    hash

    {-# SPECIALIZE sha1 :: B.ByteString -> SHA1 #-}
    {-# SPECIALIZE sha1 :: L.ByteString -> SHA1 #-}

    -- | Compute the sha1 hash of a file.
    sha1File   :: FilePath -> IO SHA1
    sha1File :: FilePath -> IO SHA1
    sha1File   = FilePath -> IO SHA1
    forall h. (Hash h, Recommendation h) => FilePath -> IO h
    hashFile

    -- | Compute the sha1 hash of a general byte source.
    sha1Source :: ByteSource src => src -> IO SHA1
    sha1Source :: src -> IO SHA1
    sha1Source = src -> IO SHA1
    forall h src.
    (Hash h, Recommendation h, ByteSource src) =>
    src -> IO h
    hashSource

    {-# DEPRECATED hmacSha1, hmacSha1File, hmacSha1Source
                   "SHA1 is broken. This functions are here only for transition." #-}

    -- | Compute the message authentication code using hmac-sha1.
    hmacSha1 :: PureByteSource src  => Key (HMAC SHA1) -> src -> HMAC SHA1
    hmacSha1 :: Key (HMAC SHA1) -> src -> HMAC SHA1
    hmacSha1 = Key (HMAC SHA1) -> src -> HMAC SHA1
    forall h src.
    (Hash h, Recommendation h, PureByteSource src) =>
    Key (HMAC h) -> src -> HMAC h
    hmac

    -- | Compute the message authentication code for a file.
    hmacSha1File :: Key (HMAC SHA1) -> FilePath -> IO (HMAC SHA1)
    hmacSha1File :: Key (HMAC SHA1) -> FilePath -> IO (HMAC SHA1)
    hmacSha1File = Key (HMAC SHA1) -> FilePath -> IO (HMAC SHA1)
    forall h.
    (Hash h, Recommendation h) =>
    Key (HMAC h) -> FilePath -> IO (HMAC h)
    hmacFile

    -- | Compute the message authetication code for a generic byte source.
    hmacSha1Source :: ByteSource src => Key (HMAC SHA1) -> src -> IO (HMAC SHA1)
    hmacSha1Source :: Key (HMAC SHA1) -> src -> IO (HMAC SHA1)
    hmacSha1Source = Key (HMAC SHA1) -> src -> IO (HMAC SHA1)
    forall h src.
    (Hash h, Recommendation h, ByteSource src) =>
    Key (HMAC h) -> src -> IO (HMAC h)
    hmacSource