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

-- | Internals of Sha512.
module Raaz.Hash.Sha512.Internal (SHA512(..)) where


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

import           Raaz.Core


import           Raaz.Hash.Internal

----------------------------- SHA512 ---------------------------------

-- | The Sha512 hash value. Used in implementation of Sha384 as well.
newtype SHA512 = SHA512 (Tuple 8 (BE Word64))
               deriving (Eq, Equality, Storable, EndianStore)

instance Encodable SHA512

instance IsString SHA512 where
  fromString = fromBase16

instance Show SHA512 where
  show =  showBase16

instance Primitive SHA512 where
  blockSize _ = BYTES 128
  type Implementation SHA512 = SomeHashI SHA512

instance Initialisable (HashMemory SHA512) () where
  initialise _ = initialise $ SHA512
                 $ unsafeFromList [ 0x6a09e667f3bcc908
                                  , 0xbb67ae8584caa73b
                                  , 0x3c6ef372fe94f82b
                                  , 0xa54ff53a5f1d36f1
                                  , 0x510e527fade682d1
                                  , 0x9b05688c2b3e6c1f
                                  , 0x1f83d9abfb41bd6b
                                  , 0x5be0cd19137e2179
                                  ]

instance Hash SHA512 where
  additionalPadBlocks _ = toEnum 1