diff --git a/SimpleAES.cabal b/SimpleAES.cabal
--- a/SimpleAES.cabal
+++ b/SimpleAES.cabal
@@ -3,7 +3,7 @@
 Description:
   A simplified binding to Brian Gladman's AES implementation,
   including a copy of that implementation
-Version:             0.4
+Version:             0.4.1
 License:             BSD3
 License-file:        COPYING
 Copyright:           Copyright (c) 2009 University of Tromsø,
diff --git a/src/Codec/Crypto/SimpleAES.hs b/src/Codec/Crypto/SimpleAES.hs
--- a/src/Codec/Crypto/SimpleAES.hs
+++ b/src/Codec/Crypto/SimpleAES.hs
@@ -4,7 +4,7 @@
     , Direction(..)
     , Key, IV
     , newIV, randomKey, crypt
-    , encryptMsg, encryptMsg', decryptMsg
+    , encryptMsg, encryptMsg', decryptMsg, decryptMsg'
     ) where
 
 import qualified Codec.Crypto.AES.IO as AES
@@ -62,18 +62,25 @@
                             , encrypted ]
 
 decryptMsg :: Mode -> Key -> BL.ByteString -> BL.ByteString
-decryptMsg mode key bs
-    = unsafePerformIO $
-      do when (BL.length iv /= ivLength)  $ error "Codec.Crypto.SimpleAES.decryptMsg: Invalid IV length. Message garbled."
-         when (BL.length lenStr /= 8)     $ error "Codec.Crypto.SimpleAES.decryptMsg: Invalid encoding. Message garbled."
-         when (BL.length encrypted < len) $ error "Codec.Crypto.SimpleAES.decryptMsg: Invalid size. Message garbled."
-         when (BL.length encrypted `mod` 16 /= 0) $ error "Codec.Crypto.SimpleAES.decryptMsg: Invalid padding. Message garbled."
+decryptMsg mode key bs = either error id $ decryptMsg' mode key bs
+
+decryptMsg' :: Mode -> Key -> BL.ByteString -> Either String BL.ByteString
+decryptMsg' mode key bs
+    = check (BL.length iv == ivLength) "Codec.Crypto.SimpleAES.decryptMsg: Invalid IV length. Message garbled."
+    $ check (BL.length lenStr == 8) "Codec.Crypto.SimpleAES.decryptMsg: Invalid encoding. Message garbled."
+    $ check (BL.length encrypted >= len) "Codec.Crypto.SimpleAES.decryptMsg: Invalid size. Message garbled."
+    $ check (BL.length encrypted `mod` 16 == 0) "Codec.Crypto.SimpleAES.decryptMsg: Invalid padding. Message garbled."
+    $ Right $ unsafePerformIO $ do
          ctx <- AES.newCtx mode key (B.concat $ BL.toChunks iv) Decrypt
          chunks <- unsafeInterleaveIO $ lazyCrypt ctx (repack encrypted)
          return $ BL.take len (BL.fromChunks chunks)
     where (iv, bs') = BL.splitAt ivLength bs
           (lenStr,encrypted) = BL.splitAt 8 bs'
           len = decode lenStr
+          check :: Bool -> String -> Either String a -> Either String a
+          check False s _ = Left s
+          check True _ f = f
+
 
 
 -- | Encryption/decryption for lazy bytestrings. The input string is zero-padded to
