packages feed

torrent-2007.6.24: src/Data/Torrent/SHA1.hs

-----------------------------------------------------------------------------
-- |
-- Module      :  Data.Torrent.SHA1
-- Copyright   :  (c) Lemmih 2005
-- License     :  BSD-like
--
-- Maintainer  :  lemmih@gmail.com
-- Stability   :  experimental
-- Portability :  portable
--
-----------------------------------------------------------------------------
module Data.Torrent.SHA1 (sha1) where

import Foreign
import Foreign.C
import System.IO.Unsafe

import qualified Data.ByteString as BS
import qualified Data.ByteString.Base as BS
import Data.ByteString (ByteString)

--void SHA1(sha1_byte *data, unsigned int len, sha1_byte digest[SHA1_DIGEST_LENGTH]);
foreign import ccall safe "SHA1" c_sha1 :: CString -> Int -> CString -> IO ()

sha1 :: ByteString -> ByteString
sha1 fs = unsafePerformIO $
          BS.unsafeUseAsCString fs $ \cstr ->
              do ret <- mallocBytes 20
                 c_sha1 cstr (BS.length fs) ret
                 fp <- newForeignPtr finalizerFree (castPtr ret)
                 return (BS.fromForeignPtr fp 20)