diff --git a/Data/X509/File.hs b/Data/X509/File.hs
--- a/Data/X509/File.hs
+++ b/Data/X509/File.hs
@@ -1,9 +1,11 @@
 module Data.X509.File
     ( readSignedObject
     , readKeyFile
+    , PEMError (..)
     ) where
 
 import Control.Applicative
+import Control.Exception (Exception (..), throw)
 import Data.ASN1.Types
 import Data.ASN1.BinaryEncoding
 import Data.ASN1.Encoding
@@ -13,10 +15,16 @@
 import Data.PEM (pemParseLBS, pemContent, pemName, PEM)
 import qualified Data.ByteString.Lazy as L
 
+newtype PEMError = PEMError {displayPEMError :: String}
+  deriving Show
+
+instance Exception PEMError where
+  displayException = displayPEMError
+
 readPEMs :: FilePath -> IO [PEM]
 readPEMs filepath = do
     content <- L.readFile filepath
-    return $ either error id $ pemParseLBS content
+    either (throw . PEMError) pure $ pemParseLBS content
 
 -- | return all the signed objects in a file.
 --
diff --git a/Data/X509/Memory.hs b/Data/X509/Memory.hs
--- a/Data/X509/Memory.hs
+++ b/Data/X509/Memory.hs
@@ -22,6 +22,7 @@
 import           Data.X509.EC as X509
 import Data.PEM (pemParseBS, pemContent, pemName, PEM)
 import qualified Data.ByteString as B
+import           Crypto.Number.Basic (numBytes)
 import           Crypto.Number.Serialize (os2ip)
 import qualified Crypto.PubKey.DSA as DSA
 import qualified Crypto.PubKey.ECC.ECDSA as ECDSA
@@ -192,8 +193,7 @@
              : End Sequence
              : xs) = Right (privKey, xs)
   where
-    calculate_modulus m i = if (2 ^ (i * 8)) > m then i else calculate_modulus m (i+1)
-    pubKey  = RSA.PublicKey { RSA.public_size = calculate_modulus n 1
+    pubKey  = RSA.PublicKey { RSA.public_size = numBytes n
                             , RSA.public_n    = n
                             , RSA.public_e    = e
                             }
diff --git a/x509-store.cabal b/x509-store.cabal
--- a/x509-store.cabal
+++ b/x509-store.cabal
@@ -1,5 +1,5 @@
 Name:                x509-store
-version:             1.6.7
+version:             1.6.8
 Description:         X.509 collection accessing and storing methods for certificate, crl, exception list
 License:             BSD3
 License-file:        LICENSE
