-- SignatureQualities.hs: OpenPGP (RFC4880) signature qualities
-- Copyright © 2012-2019  Clint Adams
-- This software is released under the terms of the Expat license.
-- (See the LICENSE file).
module Codec.Encryption.OpenPGP.SignatureQualities
  ( sigType
  , sigPKA
  , sigHA
  , sigCT
  ) where

import Data.List (find)

import Codec.Encryption.OpenPGP.Ontology (isSigCreationTime)
import Codec.Encryption.OpenPGP.Types

sigType :: SignaturePayload -> Maybe SigType
sigType :: SignaturePayload -> Maybe SigType
sigType (SigV3 SigType
st ThirtyTwoBitTimeStamp
_ EightOctetKeyId
_ PubKeyAlgorithm
_ HashAlgorithm
_ Word16
_ NonEmpty MPI
_) = SigType -> Maybe SigType
forall a. a -> Maybe a
Just SigType
st
sigType (SigV4 SigType
st PubKeyAlgorithm
_ HashAlgorithm
_ [SigSubPacket]
_ [SigSubPacket]
_ Word16
_ NonEmpty MPI
_) = SigType -> Maybe SigType
forall a. a -> Maybe a
Just SigType
st
sigType SignaturePayload
_ = Maybe SigType
forall a. Maybe a
Nothing -- this includes v2 sigs, which don't seem to be specified in the RFCs but exist in the wild

sigPKA :: SignaturePayload -> Maybe PubKeyAlgorithm
sigPKA :: SignaturePayload -> Maybe PubKeyAlgorithm
sigPKA (SigV3 SigType
_ ThirtyTwoBitTimeStamp
_ EightOctetKeyId
_ PubKeyAlgorithm
pka HashAlgorithm
_ Word16
_ NonEmpty MPI
_) = PubKeyAlgorithm -> Maybe PubKeyAlgorithm
forall a. a -> Maybe a
Just PubKeyAlgorithm
pka
sigPKA (SigV4 SigType
_ PubKeyAlgorithm
pka HashAlgorithm
_ [SigSubPacket]
_ [SigSubPacket]
_ Word16
_ NonEmpty MPI
_) = PubKeyAlgorithm -> Maybe PubKeyAlgorithm
forall a. a -> Maybe a
Just PubKeyAlgorithm
pka
sigPKA SignaturePayload
_ = Maybe PubKeyAlgorithm
forall a. Maybe a
Nothing -- this includes v2 sigs, which don't seem to be specified in the RFCs but exist in the wild

sigHA :: SignaturePayload -> Maybe HashAlgorithm
sigHA :: SignaturePayload -> Maybe HashAlgorithm
sigHA (SigV3 SigType
_ ThirtyTwoBitTimeStamp
_ EightOctetKeyId
_ PubKeyAlgorithm
_ HashAlgorithm
ha Word16
_ NonEmpty MPI
_) = HashAlgorithm -> Maybe HashAlgorithm
forall a. a -> Maybe a
Just HashAlgorithm
ha
sigHA (SigV4 SigType
_ PubKeyAlgorithm
_ HashAlgorithm
ha [SigSubPacket]
_ [SigSubPacket]
_ Word16
_ NonEmpty MPI
_) = HashAlgorithm -> Maybe HashAlgorithm
forall a. a -> Maybe a
Just HashAlgorithm
ha
sigHA SignaturePayload
_ = Maybe HashAlgorithm
forall a. Maybe a
Nothing -- this includes v2 sigs, which don't seem to be specified in the RFCs but exist in the wild

sigCT :: SignaturePayload -> Maybe ThirtyTwoBitTimeStamp
sigCT :: SignaturePayload -> Maybe ThirtyTwoBitTimeStamp
sigCT (SigV3 SigType
_ ThirtyTwoBitTimeStamp
ct EightOctetKeyId
_ PubKeyAlgorithm
_ HashAlgorithm
_ Word16
_ NonEmpty MPI
_) = ThirtyTwoBitTimeStamp -> Maybe ThirtyTwoBitTimeStamp
forall a. a -> Maybe a
Just ThirtyTwoBitTimeStamp
ct
sigCT (SigV4 SigType
_ PubKeyAlgorithm
_ HashAlgorithm
_ [SigSubPacket]
hsubs [SigSubPacket]
_ Word16
_ NonEmpty MPI
_) =
  (SigSubPacket -> ThirtyTwoBitTimeStamp)
-> Maybe SigSubPacket -> Maybe ThirtyTwoBitTimeStamp
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap
    (\(SigSubPacket Bool
_ (SigCreationTime ThirtyTwoBitTimeStamp
i)) -> ThirtyTwoBitTimeStamp
i)
    ((SigSubPacket -> Bool) -> [SigSubPacket] -> Maybe SigSubPacket
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find SigSubPacket -> Bool
isSigCreationTime [SigSubPacket]
hsubs)
sigCT SignaturePayload
_ = Maybe ThirtyTwoBitTimeStamp
forall a. Maybe a
Nothing