{-# LANGUAGE PackageImports #-}
{-# LANGUAGE Strict         #-}

module Foreign.Erlang.Digest
    ( genChallenge
    , genDigest
    ) where

import           "cryptonite" Crypto.Hash           (MD5 (MD5), hashFinalize,
                                                     hashInitWith, hashUpdate)
import           Data.ByteArray        (convert)
import qualified Data.ByteString       as BS
import qualified Data.ByteString.Char8 as CS
import           Data.Word
import           System.Random         (randomIO)

genChallenge :: IO Word32
genChallenge = randomIO

genDigest :: Word32 -> BS.ByteString -> BS.ByteString
genDigest challenge cookie =
    let ctx0 = hashInitWith MD5
        ctx1 = hashUpdate ctx0 cookie
        ctx2 = hashUpdate ctx1 (CS.pack (show challenge))
        digest = hashFinalize ctx2
    in
        convert digest