    -- |
    -- Module      : Crypto.PubKey.MaskGenFunction
    -- License     : BSD-style
    -- Maintainer  : Vincent Hanquez <vincent@snarc.org>
    -- Stability   : experimental
    -- Portability : Good
    --
    module Crypto.PubKey.MaskGenFunction
        ( MaskGenAlgorithm
        , mgf1
        ) where

    import Data.ByteString (ByteString)
    import qualified Data.ByteString as B
    import Crypto.PubKey.HashDescr
    import Crypto.Number.Serialize (i2ospOf_)

    -- | Represent a mask generation algorithm
    type MaskGenAlgorithm = HashFunction -- ^ hash function to use
                         -> ByteString   -- ^ seed
                         -> Int          -- ^ length to generate
                         -> ByteString

    -- | Mask generation algorithm MGF1
    mgf1 :: MaskGenAlgorithm
    mgf1 hashF seed len = loop B.empty 0
        where loop t counter
                | B.length t >= len = B.take len t
                | otherwise         = let counterBS = i2ospOf_ 4 counter
                                          newT = t `B.append` hashF (seed `B.append` counterBS)
                                       in loop newT (counter+1)