-----------------------------------------------------------------------------
-- |
-- 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)