module Data.X509.File
( readSignedObject
, readKeyFile
) where
import Control.Applicative
import Data.ASN1.Types
import Data.ASN1.BinaryEncoding
import Data.ASN1.Encoding
import Data.Maybe
import qualified Data.X509 as X509
import Data.X509.Memory (pemToKey)
import Data.PEM (pemParseLBS, pemContent, pemName, PEM)
import qualified Data.ByteString.Lazy as L
readPEMs :: FilePath -> IO [PEM]
readPEMs filepath = do
content <- L.readFile filepath
return $ either error id $ pemParseLBS content
readSignedObject :: (ASN1Object a, Eq a, Show a)
=> FilePath
-> IO [X509.SignedExact a]
readSignedObject filepath = decodePEMs <$> readPEMs filepath
where decodePEMs pems =
[ obj | pem <- pems, Right obj <- [X509.decodeSignedObject $ pemContent pem] ]
readKeyFile :: FilePath -> IO [X509.PrivKey]
readKeyFile path = catMaybes . foldl pemToKey [] <$> readPEMs path