content: {-# LANGUAGE ForeignFunctionInterface #-}
  
  module Monocypher.Blake2bSpec where
  
  
  import           Data.ByteString.Internal (unsafeCreate)
  import           Data.ByteString.Unsafe   (unsafeUseAsCStringLen)
  import qualified Foreign.Storable as Storable
  import           Foreign.Ptr
  import           Foreign.C.Types
  import           Foreign.C.String
  
  import           Tests.Core
  import qualified Raaz.Digest.Blake2b as Blake2b
  
  foreign import ccall unsafe
      crypto_blake2b :: Ptr Word8  -- hash
                     -> Ptr CChar  -- message
                     -> CSize
                     -> IO ()
  
  blake2bSize :: Int
  blake2bSize = Storable.sizeOf (undefined :: Blake2b)
  
  monocypher_blake2b_io :: Ptr Word8 -> CStringLen -> IO ()
  monocypher_blake2b_io hshPtr (ptr, l) = crypto_blake2b hshPtr ptr (toEnum l)
  
  
  monocypher_blake2b :: ByteString -> Blake2b
  monocypher_blake2b bs = unsafeFromByteString $ unsafeCreate blake2bSize creator
    where creator ptr = unsafeUseAsCStringLen bs (monocypher_blake2b_io ptr)
  
  spec :: Spec
  spec = prop "monocypher vs raaz - blake2b" $
         \ x ->
           monocypher_blake2b x `shouldBe` Blake2b.digest x
  