module Data.Digest.ApacheMD5.Internal
( md5BS
, md5DigestLength
)
where
import Control.Monad (void)
import Data.Word (Word8)
import Foreign (Ptr)
import Foreign.C.Types (CChar(..), CULong(..))
import System.IO.Unsafe (unsafePerformIO)
import Data.ByteString (ByteString)
import qualified Data.ByteString.Internal as BS (create)
import qualified Data.ByteString.Unsafe as BS (unsafeUseAsCStringLen)
foreign import ccall "openssl/md5.h MD5"
c_md5 :: Ptr CChar -> CULong -> Ptr Word8 -> IO (Ptr Word8)
md5DigestLength :: Int
md5DigestLength = 16
md5BS :: ByteString -> ByteString
md5BS bs = unsafePerformIO . BS.unsafeUseAsCStringLen bs $ \ (ptr, len) ->
BS.create md5DigestLength $ void . c_md5 ptr (fromIntegral len)