hsaml2-0.1: SAML2/XML/ASN1.hs
module SAML2.XML.ASN1 where
import Control.Arrow (left)
import Data.ASN1.Types (ASN1, ASN1Object(..))
import Data.ASN1.BinaryEncoding (BER(BER), DER(DER))
import Data.ASN1.Encoding (decodeASN1', encodeASN1')
import qualified Data.X509 as X509
import qualified Text.XML.HXT.Arrow.Pickle.Xml.Invertible as XP
import qualified SAML2.XML.Schema as XS
xpASN1 :: XP.PU [ASN1]
xpASN1 = XP.xpWrapEither
( left show . decodeASN1' BER
, encodeASN1' DER
) XS.xpBase64Binary
xpASN1Object :: ASN1Object a => XP.PU a
xpASN1Object = XP.xpWrapEither
( either Left check . fromASN1
, (`toASN1` [])
) xpASN1 where
check (x, []) = Right x
check _ = Left "trailing ASN1 data"
xpX509Signed :: (Show a, Eq a, ASN1Object a) => XP.PU (X509.SignedExact a)
xpX509Signed = XP.xpWrapEither
( X509.decodeSignedObject
, X509.encodeSignedObject
) XS.xpBase64Binary