conjure-0.1: src/Conjure/Utils/SHA1.hs
{-# LANGUAGE ForeignFunctionInterface #-}
-----------------------------------------------------------------------------
-- |
-- Module : Conjure.Utils.SHA1
-- Copyright : (c) Lemmih 2005
-- License : BSD-like
--
-- Maintainer : lemmih@gmail.com
-- Stability : experimental
-- Portability : portable
--
-----------------------------------------------------------------------------
-- FIXME: Move this to Conjure.SHA1?
module Conjure.Utils.SHA1 (sha1) where
import Foreign
import Foreign.C
import System.IO.Unsafe
import qualified Data.ByteString.Char8 as BS
import qualified Data.ByteString as ByteString
import qualified Data.ByteString.Internal as ByteString
import qualified Data.ByteString.Unsafe as ByteString (unsafeUseAsCString)
import Data.ByteString.Char8 (ByteString)
--void SHA1(sha1_byte *data, unsigned int len, sha1_byte digest[SHA1_DIGEST_LENGTH]);
foreign import ccall unsafe "SHA1" c_sha1 :: CString -> Int -> CString -> IO ()
sha1 :: ByteString -> ByteString
sha1 fs = unsafePerformIO $
ByteString.unsafeUseAsCString fs $ \cstr ->
do ret <- mallocBytes 20
c_sha1 cstr (BS.length fs) ret
fp <- newForeignPtr finalizerFree (castPtr ret)
return $ ByteString.fromForeignPtr fp 0 20