packages feed

nano-md5 0.1.1 → 0.1.2

raw patch · 4 files changed

+51/−6 lines, 4 files

Files

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))