{-# 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