{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeFamilies #-}
module Crypto.Store.CMS.Type
( ContentType(..)
, Encap(..)
, fromEncap
) where
import Data.ASN1.OID
import Crypto.Store.CMS.Util
data ContentType = DataType
| SignedDataType
| EnvelopedDataType
| DigestedDataType
| EncryptedDataType
| AuthenticatedDataType
| AuthEnvelopedDataType
deriving (Show,Eq)
instance Enumerable ContentType where
values = [ DataType
, SignedDataType
, EnvelopedDataType
, DigestedDataType
, EncryptedDataType
, AuthenticatedDataType
, AuthEnvelopedDataType
]
instance OIDable ContentType where
getObjectID DataType = [1,2,840,113549,1,7,1]
getObjectID SignedDataType = [1,2,840,113549,1,7,2]
getObjectID EnvelopedDataType = [1,2,840,113549,1,7,3]
getObjectID DigestedDataType = [1,2,840,113549,1,7,5]
getObjectID EncryptedDataType = [1,2,840,113549,1,7,6]
getObjectID AuthenticatedDataType = [1,2,840,113549,1,9,16,1,2]
getObjectID AuthEnvelopedDataType = [1,2,840,113549,1,9,16,1,23]
instance OIDNameable ContentType where
fromObjectID oid = unOIDNW <$> fromObjectID oid
data Encap a
= Detached
| Attached a
deriving (Show,Eq)
instance Functor Encap where
fmap _ Detached = Detached
fmap f (Attached c) = Attached (f c)
instance Applicative Encap where
pure = Attached
Attached f <*> e = fmap f e
Detached <*> _ = Detached
instance Foldable Encap where
foldMap = fromEncap mempty
foldr _ d Detached = d
foldr f d (Attached c) = f c d
foldl _ d Detached = d
foldl f d (Attached c) = f d c
instance Traversable Encap where
traverse _ Detached = pure Detached
traverse f (Attached c) = Attached <$> f c
fromEncap :: b -> (a -> b) -> Encap a -> b
fromEncap d _ Detached = d
fromEncap _ f (Attached c) = f c