module Data.X509.Memory
( readKeyFileFromMemory
, readSignedObjectFromMemory
) where
import Data.ASN1.Types
import Data.ASN1.BinaryEncoding
import Data.ASN1.Encoding
import Data.Maybe
import qualified Data.X509 as X509
import Data.PEM (pemParseBS, pemContent, pemName, PEM)
import qualified Data.ByteString as B
import qualified Crypto.Types.PubKey.DSA as DSA
readKeyFileFromMemory :: B.ByteString -> [X509.PrivKey]
readKeyFileFromMemory = either (const []) (catMaybes . foldl pemToKey []) . pemParseBS
where pemToKey acc pem =
case decodeASN1' BER (pemContent pem) of
Left _ -> acc
Right asn1 -> case pemName pem of
"PRIVATE KEY" ->
tryRSA asn1 : tryDSA asn1 : acc
"RSA PRIVATE KEY" ->
tryRSA asn1 : acc
"DSA PRIVATE KEY" ->
tryDSA asn1 : acc
_ -> acc
tryRSA asn1 = case fromASN1 asn1 of
Left _ -> Nothing
Right (k,_) -> Just $ X509.PrivKeyRSA k
tryDSA asn1 = case fromASN1 asn1 of
Left _ -> Nothing
Right (k,_) -> Just $ X509.PrivKeyDSA $ DSA.toPrivateKey k
readSignedObjectFromMemory :: (ASN1Object a, Eq a, Show a)
=> B.ByteString
-> [X509.SignedExact a]
readSignedObjectFromMemory = either (const []) (foldl pemToSigned []) . pemParseBS
where pemToSigned acc pem =
case X509.decodeSignedObject $ pemContent pem of
Left _ -> acc
Right obj -> obj : acc