module Data.Conduit.OpenPGP.Verify
( conduitVerify
) where
import Data.Conduit
import Data.Time.Clock (UTCTime)
import Codec.Encryption.OpenPGP.Internal (PktStreamContext(..), emptyPSC)
import Codec.Encryption.OpenPGP.Signatures (verifyAgainstKeyring, verifySigWith)
import Codec.Encryption.OpenPGP.Types
import qualified Data.Conduit.List as CL
conduitVerify ::
Monad m
=> Keyring
-> Maybe UTCTime
-> ConduitT Pkt (Either String Verification) m ()
conduitVerify :: forall (m :: * -> *).
Monad m =>
Keyring
-> Maybe UTCTime -> ConduitT Pkt (Either String Verification) m ()
conduitVerify Keyring
kr Maybe UTCTime
mt = (Pkt
-> PktStreamContext
-> (PktStreamContext, [Either String Verification]))
-> PktStreamContext
-> ConduitT Pkt (Either String Verification) m ()
forall (m :: * -> *) a accum b.
Monad m =>
(a -> accum -> (accum, [b])) -> accum -> ConduitT a b m ()
CL.concatMapAccum ((PktStreamContext
-> Pkt -> (PktStreamContext, [Either String Verification]))
-> Pkt
-> PktStreamContext
-> (PktStreamContext, [Either String Verification])
forall a b c. (a -> b -> c) -> b -> a -> c
flip PktStreamContext
-> Pkt -> (PktStreamContext, [Either String Verification])
push) PktStreamContext
emptyPSC
where
push :: PktStreamContext
-> Pkt -> (PktStreamContext, [Either String Verification])
push PktStreamContext
state ld :: Pkt
ld@LiteralDataPkt {} = (PktStreamContext
state {lastLD = ld}, [])
push PktStreamContext
state uid :: Pkt
uid@(UserIdPkt Text
_) = (PktStreamContext
state {lastUIDorUAt = uid}, [])
push PktStreamContext
state uat :: Pkt
uat@(UserAttributePkt [UserAttrSubPacket]
_) = (PktStreamContext
state {lastUIDorUAt = uat}, [])
push PktStreamContext
state pk :: Pkt
pk@(PublicKeyPkt PKPayload
_) = (PktStreamContext
state {lastPrimaryKey = pk}, [])
push PktStreamContext
state pk :: Pkt
pk@(PublicSubkeyPkt PKPayload
_) = (PktStreamContext
state {lastSubkey = pk}, [])
push PktStreamContext
state sk :: Pkt
sk@(SecretKeyPkt PKPayload
_ SKAddendum
_) = (PktStreamContext
state {lastPrimaryKey = sk}, [])
push PktStreamContext
state sk :: Pkt
sk@(SecretSubkeyPkt PKPayload
_ SKAddendum
_) = (PktStreamContext
state {lastSubkey = sk}, [])
push PktStreamContext
state sig :: Pkt
sig@(SignaturePkt SigV4 {}) =
( PktStreamContext
state {lastSig = sig}
, [(Pkt -> Maybe UTCTime -> ByteString -> Either String Verification)
-> Pkt
-> PktStreamContext
-> Maybe UTCTime
-> Either String Verification
verifySigWith (Keyring
-> Pkt -> Maybe UTCTime -> ByteString -> Either String Verification
verifyAgainstKeyring Keyring
kr) Pkt
sig PktStreamContext
state Maybe UTCTime
mt])
push PktStreamContext
state (OnePassSignaturePkt PacketVersion
_ SigType
_ HashAlgorithm
_ PubKeyAlgorithm
_ EightOctetKeyId
_ Bool
False) = (PktStreamContext
state, [])
push PktStreamContext
state Pkt
_ = (PktStreamContext
state, [])
normLineEndings :: a -> a
normLineEndings = a -> a
forall a. a -> a
id