    {-|

    This module exposes the `SHA224` hash constructor. You would hardly
    need to import the module directly as you would want to treat the
    `SHA224` type as an opaque type for type safety. This module is
    exported only for special uses like writing a test case or defining a
    binary instance etc.

    -}

    {-# LANGUAGE CPP                        #-}
    {-# LANGUAGE TypeFamilies               #-}
    {-# LANGUAGE DataKinds                  #-}
    {-# LANGUAGE FlexibleInstances          #-}
    {-# LANGUAGE MultiParamTypeClasses      #-}
    {-# CFILES raaz/hash/sha1/portable.c    #-}
    {-# LANGUAGE GeneralizedNewtypeDeriving #-}
    module Raaz.Hash.Sha224.Internal
           ( SHA224(..)
           ) where

    import           Data.String
    import           Data.Word
    import           Foreign.Storable          ( Storable )

    import           Raaz.Core
    import           Raaz.Hash.Internal

    ----------------------------- SHA224 -------------------------------------------

    -- | Sha224 hash value which consist of 7 32bit words.
    newtype SHA224 = SHA224 (Tuple 7 (BE Word32))
                deriving (Eq, Equality, Storable, EndianStore)

    instance Encodable SHA224

    instance IsString SHA224 where
      fromString = fromBase16

    instance Show SHA224 where
      show =  showBase16

    instance Primitive SHA224 where
      blockSize _                = BYTES 64
      type Implementation SHA224 = SomeHashI SHA224

    instance Hash SHA224 where
      additionalPadBlocks _ = toEnum 1