    {-# LANGUAGE CPP                        #-}
    {-# LANGUAGE DataKinds                  #-}
    {-# LANGUAGE GeneralizedNewtypeDeriving #-}
    {-# LANGUAGE TypeFamilies               #-}
    {-# LANGUAGE FlexibleInstances          #-}
    {-# LANGUAGE MultiParamTypeClasses      #-}
    {-# CFILES raaz/hash/sha1/portable.c    #-}

    -- | Internals of Sha256.
    module Raaz.Hash.Sha256.Internal
           ( SHA256(..)
           ) where

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

    import Raaz.Core

    import Raaz.Hash.Internal

    ----------------------------- SHA256 -------------------------------------------

    -- | The Sha256 hash value.
    newtype SHA256 = SHA256 (Tuple 8 (BE Word32))
                  deriving (Eq, Equality, Storable, EndianStore)

    instance Encodable SHA256

    instance IsString SHA256 where
      fromString = fromBase16

    instance Show SHA256 where
      show =  showBase16

    instance Initialisable (HashMemory SHA256) () where
      initialise _ = initialise $ SHA256 $ unsafeFromList [ 0x6a09e667
                                                          , 0xbb67ae85
                                                          , 0x3c6ef372
                                                          , 0xa54ff53a
                                                          , 0x510e527f
                                                          , 0x9b05688c
                                                          , 0x1f83d9ab
                                                          , 0x5be0cd19
                                                          ]

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

    instance Hash SHA256 where
      additionalPadBlocks _ = toEnum 1