{-# LANGUAGE CPP                        #-}
{-# LANGUAGE DataKinds                  #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE TypeFamilies               #-}
{-# LANGUAGE FlexibleInstances          #-}

{-# LANGUAGE MultiParamTypeClasses      #-}
{-# CFILES raaz/hash/sha1/portable.c    #-}

{-|

This module exposes the `SHA1` hash constructor. You would hardly need
to import the module directly as you would want to treat the `SHA1`
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.

-}

module Raaz.Hash.Sha1.Internal (SHA1(..)) where

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

import           Raaz.Core

import           Raaz.Hash.Internal

-- | The cryptographic hash SHA1.
newtype SHA1 = SHA1 (Tuple 5 (BE Word32))
             deriving (Storable, EndianStore, Equality, Eq)

instance Encodable SHA1

instance IsString SHA1 where
  fromString = fromBase16

instance Show SHA1 where
  show = showBase16

instance Initialisable (HashMemory SHA1) () where
  initialise _ = initialise $ SHA1 $ unsafeFromList [ 0x67452301
                                                    , 0xefcdab89
                                                    , 0x98badcfe
                                                    , 0x10325476
                                                    , 0xc3d2e1f0
                                                    ]


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

instance Hash SHA1 where
  additionalPadBlocks _ = toEnum 1