    -----------------------------------------------------------------------------
    -- |
    -- Module      :  Codec.Encryption.RSA.MGF
    -- Copyright   :  (c) Dominic Steinitz 2003
    -- License     :  BSD-style (see the file libraries/base/LICENSE)
    --
    -- Maintainer  :  dominic.steinitz@blueyonder.co.uk
    -- Stability   :  experimental
    -- Portability :  portable
    --
    -- Implements the mask generation function as specified in:
    -- <ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1.pdf>
    --
    -----------------------------------------------------------------------------

    module Codec.Encryption.RSA.MGF (
       -- * Function Types
       mgf) where

    import Codec.Utils (Octet, i2osp)

    -- | Take a hash function, a seed and the intended length of the
    --   the mask and deliver a mask of the requested length.

    mgf :: ([Octet] -> [Octet]) -> [Octet] -> Int -> [Octet]

    mgf hash z l =
       take l $ concat $ hashes
          where
             hashes = map f [0..(l `div` hLen)]
             hLen   = length $ f 0
    	 f      = hash . (z++) . (i2osp 4)