{-# LANGUAGE OverloadedStrings #-} module PEM where import Data.Monoid import qualified Data.ByteString.Lazy as LW import qualified Data.ByteString.Lazy.Char8 as L import Control.Monad import Control.Applicative import qualified Data.ByteString.Char8 as S8 import Data.ByteArray.Encoding import ScanningParser import FunctorToMaybe data PEMBlob = PEMBlob { pemType :: L.ByteString , pemBlob :: L.ByteString } deriving (Eq,Show) pemParser :: Maybe L.ByteString -> ScanningParser L.ByteString PEMBlob pemParser mtyp = ScanningParser (maybe fndany fndtyp mtyp) pbdy where hdr typ = "-----BEGIN " <> typ <> "-----" fndtyp typ bs = if bs==hdr typ then Just typ else Nothing fndany bs = do guard $ "-----BEGIN " `L.isPrefixOf` bs let x0 = L.drop 11 bs guard $ "-----" `LW.isSuffixOf` x0 let typ = L.take (L.length x0 - 5) x0 return typ pbdy typ xs = (mblob, drop 1 rs) where (ys,rs) = span (/="-----END " <> typ <> "-----") xs mblob = PEMBlob typ <$> LW.fromStrict <$> (functorToMaybe $ convertFromBase Base64 $ L.toStrict dta) dta = case ys of [] -> "" dta_lines -> L.concat dta_lines