{-# 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