-- | -- Module : Crypto.Hash.SHA512t -- License : BSD-style -- Maintainer : Vincent Hanquez -- Stability : experimental -- Portability : unknown -- -- A module containing SHA512/t -- module Crypto.Hash.SHA512t ( Ctx(..) -- * Incremental hashing Functions , init -- :: Ctx , update -- :: Ctx -> ByteString -> Ctx , finalize -- :: Ctx -> ByteString -- * Single Pass hashing , hash -- :: ByteString -> ByteString , hashlazy -- :: ByteString -> ByteString ) where import Prelude hiding (init) import Data.List (foldl') import Data.ByteString (ByteString) import qualified Data.ByteString as B import qualified Data.ByteString.Lazy as L import qualified Crypto.Hash.SHA512 as SHA512 -- | SHA512 Context with variable size output data Ctx = Ctx !Int !SHA512.Ctx -- | init a context init :: Int -> Ctx init t = Ctx t (SHA512.init_t t) -- | update a context with a bytestring update :: Ctx -> ByteString -> Ctx update (Ctx t ctx) d = Ctx t (SHA512.update ctx d) -- | finalize the context into a digest bytestring finalize :: Ctx -> ByteString finalize (Ctx sz ctx) = B.take (sz `div` 8) (SHA512.finalize ctx) -- | hash a strict bytestring into a digest bytestring hash :: Int -> ByteString -> ByteString hash t = finalize . update (init t) -- | hash a lazy bytestring into a digest bytestring hashlazy :: Int -> L.ByteString -> ByteString hashlazy t = finalize . foldl' update (init t) . L.toChunks