nano-md5 0.1.1 → 0.1.2
raw patch · 4 files changed
+51/−6 lines, 4 files
Files
- Data/Digest/OpenSSL/MD5.hs +8/−3
- nano-md5.cabal +7/−3
- tests/Demo.hs +7/−0
- tests/Race.hs +29/−0
Data/Digest/OpenSSL/MD5.hs view
@@ -30,6 +30,9 @@ import Foreign.C.Types import Numeric (showHex) +md5_digest_length :: Int+md5_digest_length = 16+ -- -- | Fast md5 using OpenSSL. The md5 hash should be referentially transparent.. -- The ByteString is guaranteed not to be copied.@@ -44,14 +47,16 @@ -- md5sum :: B.ByteString -> String md5sum p = unsafePerformIO $ B.unsafeUseAsCStringLen p $ \(ptr,n) -> do- digest <- c_md5 ptr (fromIntegral n) nullPtr- go digest 0 []+ allocaBytes md5_digest_length $ \digest_ptr -> do+ digest <- c_md5 ptr (fromIntegral n) digest_ptr+ go digest 0 [] where -- print it in 0-padded hex format go :: Ptr Word8 -> Int -> [String] -> IO String #ifndef __HADDOCK__- go !q !n acc+ go q n acc+ | n `seq` q `seq` False = undefined | n >= 16 = return $ concat (reverse acc) | otherwise = do w <- peekElemOff q n go q (n+1) (draw w : acc)
nano-md5.cabal view
@@ -1,5 +1,5 @@ name: nano-md5-version: 0.1.1+version: 0.1.2 description: Efficient, ByteString bindings to OpenSSL. synopsis: Efficient, ByteString bindings to OpenSSL. license: BSD3@@ -8,6 +8,7 @@ author: Don Stewart category: Codec maintainer: <dons@galois.com>+build-type: Simple Cabal-Version: >= 1.2 flag split-base@@ -17,8 +18,11 @@ else build-depends: base < 3 exposed-modules: Data.Digest.OpenSSL.MD5- ghc-options: -Wall -Werror -O2 -fvia-C- extensions: ForeignFunctionInterface, BangPatterns, CPP+ ghc-options: -Wall + -O2+ -fvia-C+ extensions: ForeignFunctionInterface,+ CPP includes: openssl/md5.h extra-libraries: crypto
+ tests/Demo.hs view
@@ -0,0 +1,7 @@+ import System.Environment+ import Data.Digest.OpenSSL.MD5+ import qualified Data.ByteString as B++ main = do+ [f] <- getArgs+ putStrLn . md5sum =<< B.readFile f
+ tests/Race.hs view
@@ -0,0 +1,29 @@+import Control.Concurrent (forkIO, threadDelay)+import Control.Monad (when, forever)+import Data.Digest.OpenSSL.MD5 as N -- nano (OpenSSL Binding)+import Data.Digest.MD5 as P -- Pure (only Haskell)+import Data.ByteString as B+import Data.ByteString.Lazy as L++main = do+ let bs1 = B.pack [1..10]+ answer1 = show $ P.md5 $ fromChunks [bs1]+ bs2 = B.pack [11..20]+ answer2 = show $ P.md5 $ fromChunks [bs2]+ bs3 = B.pack [1..255]+ answer3 = show $ P.md5 $ fromChunks [bs3]+ assert = confirm "assert: "+ race = \x -> forever (confirm "FAILURE: " x)+ assert (return bs1, answer1)+ assert (return bs2, answer2)+ assert (return bs3, answer3)+ forkIO $ race (return bs1, answer1)+ forkIO $ race (return bs2, answer2)+ forkIO $ race (return bs3, answer3)+ threadDelay maxBound++confirm :: String -> (IO B.ByteString, String) -> IO ()+confirm prefix (getBS,str) = do+ bs <- getBS+ let s = N.md5sum bs+ when (s /= str) (error (prefix ++ s ++ " does not equal " ++ str))