packages feed

hopenssl-2.1: test/CheckLowLevelDigestAPI.hs

module Main ( main ) where

import OpenSSL.EVP.Digest
import OpenSesame

import Control.Exception
import Foreign
import Foreign.C.String
import Test.HUnit

main :: IO ()
main = runTestTT (TestList tests) >> return ()

tests :: [Test]
tests = map (uncurry (mkTest "open sesame")) opensesame

mkTest :: String -> String -> String -> Test
mkTest input algoName expect = TestCase $
  case digestByName' algoName of
    Nothing -> return ()
    Just algo -> digest algo input >>= assertEqual algoName expect

digest :: DigestDescription -> String -> IO String
digest algo input = do
  let digestSize = _digestSize (getDigestDescription algo)
  md <- bracket newContext freeContext $ \ctx -> do
    initDigest algo ctx
    withCStringLen input $ \(ptr,len) -> updateDigest ctx ptr (fromIntegral len)
    allocaArray (fromIntegral digestSize) $ \md -> do
      finalizeDigest ctx md
      peekArray (fromIntegral digestSize) md
  return (md >>= toHex)