diff --git a/Data/Digest/OpenSSL/MD5.hs b/Data/Digest/OpenSSL/MD5.hs
--- a/Data/Digest/OpenSSL/MD5.hs
+++ b/Data/Digest/OpenSSL/MD5.hs
@@ -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)
diff --git a/nano-md5.cabal b/nano-md5.cabal
--- a/nano-md5.cabal
+++ b/nano-md5.cabal
@@ -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
 
diff --git a/tests/Demo.hs b/tests/Demo.hs
new file mode 100644
--- /dev/null
+++ b/tests/Demo.hs
@@ -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
diff --git a/tests/Race.hs b/tests/Race.hs
new file mode 100644
--- /dev/null
+++ b/tests/Race.hs
@@ -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))
