-- SignatureQualities.hs: OpenPGP (RFC9580) signature qualities
-- Copyright © 2012-2026  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
    , signatureSubpacketListsKnown
    , signatureHashedSubpacketsKnown
    ) where

import Control.Applicative ((<|>))
import Control.Lens (preview, _1)
import Data.List (find)

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

sigType :: SignaturePayload -> Maybe SigType
sigType :: SignaturePayload -> Maybe SigType
sigType SignaturePayload
sig =
    Getting (First SigType) SignaturePayload SigType
-> SignaturePayload -> Maybe SigType
forall s (m :: * -> *) a.
MonadReader s m =>
Getting (First a) s a -> m (Maybe a)
preview (((SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
  HashAlgorithm, Word16, NonEmpty MPI)
 -> Const
      (First SigType)
      (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
       HashAlgorithm, Word16, NonEmpty MPI))
-> SignaturePayload -> Const (First SigType) SignaturePayload
Prism'
  SignaturePayload
  (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
   HashAlgorithm, Word16, NonEmpty MPI)
_SigV3 (((SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId,
   PubKeyAlgorithm, HashAlgorithm, Word16, NonEmpty MPI)
  -> Const
       (First SigType)
       (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
        HashAlgorithm, Word16, NonEmpty MPI))
 -> SignaturePayload -> Const (First SigType) SignaturePayload)
-> ((SigType -> Const (First SigType) SigType)
    -> (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId,
        PubKeyAlgorithm, HashAlgorithm, Word16, NonEmpty MPI)
    -> Const
         (First SigType)
         (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
          HashAlgorithm, Word16, NonEmpty MPI))
-> Getting (First SigType) SignaturePayload SigType
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SigType -> Const (First SigType) SigType)
-> (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId,
    PubKeyAlgorithm, HashAlgorithm, Word16, NonEmpty MPI)
-> Const
     (First SigType)
     (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
      HashAlgorithm, Word16, NonEmpty MPI)
forall s t a b. Field1 s t a b => Lens s t a b
Lens
  (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
   HashAlgorithm, Word16, NonEmpty MPI)
  (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
   HashAlgorithm, Word16, NonEmpty MPI)
  SigType
  SigType
_1) SignaturePayload
sig
        Maybe SigType -> Maybe SigType -> Maybe SigType
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Getting (First SigType) SignaturePayload SigType
-> SignaturePayload -> Maybe SigType
forall s (m :: * -> *) a.
MonadReader s m =>
Getting (First a) s a -> m (Maybe a)
preview (((SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
  [SigSubPacket], Word16, NonEmpty MPI)
 -> Const
      (First SigType)
      (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
       [SigSubPacket], Word16, NonEmpty MPI))
-> SignaturePayload -> Const (First SigType) SignaturePayload
Prism'
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
   [SigSubPacket], Word16, NonEmpty MPI)
_SigV4 (((SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
   [SigSubPacket], Word16, NonEmpty MPI)
  -> Const
       (First SigType)
       (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
        [SigSubPacket], Word16, NonEmpty MPI))
 -> SignaturePayload -> Const (First SigType) SignaturePayload)
-> ((SigType -> Const (First SigType) SigType)
    -> (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
        [SigSubPacket], Word16, NonEmpty MPI)
    -> Const
         (First SigType)
         (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
          [SigSubPacket], Word16, NonEmpty MPI))
-> Getting (First SigType) SignaturePayload SigType
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SigType -> Const (First SigType) SigType)
-> (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
    [SigSubPacket], Word16, NonEmpty MPI)
-> Const
     (First SigType)
     (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
      [SigSubPacket], Word16, NonEmpty MPI)
forall s t a b. Field1 s t a b => Lens s t a b
Lens
  (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
   [SigSubPacket], Word16, NonEmpty MPI)
  (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
   [SigSubPacket], Word16, NonEmpty MPI)
  SigType
  SigType
_1) SignaturePayload
sig
        Maybe SigType -> Maybe SigType -> Maybe SigType
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Getting (First SigType) SignaturePayload SigType
-> SignaturePayload -> Maybe SigType
forall s (m :: * -> *) a.
MonadReader s m =>
Getting (First a) s a -> m (Maybe a)
preview (((SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
  [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
 -> Const
      (First SigType)
      (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
       [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI))
-> SignaturePayload -> Const (First SigType) SignaturePayload
Prism'
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
   [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
_SigV6 (((SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
   [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
  -> Const
       (First SigType)
       (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
        [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI))
 -> SignaturePayload -> Const (First SigType) SignaturePayload)
-> ((SigType -> Const (First SigType) SigType)
    -> (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
        [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
    -> Const
         (First SigType)
         (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
          [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI))
-> Getting (First SigType) SignaturePayload SigType
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SigType -> Const (First SigType) SigType)
-> (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
    [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
-> Const
     (First SigType)
     (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
      [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
forall s t a b. Field1 s t a b => Lens s t a b
Lens
  (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
   [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
  (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
   [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
  SigType
  SigType
_1) SignaturePayload
sig

sigPKA :: SignaturePayload -> Maybe PubKeyAlgorithm
sigPKA :: SignaturePayload -> Maybe PubKeyAlgorithm
sigPKA SignaturePayload
sig =
    case Getting
  (First
     (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
      HashAlgorithm, Word16, NonEmpty MPI))
  SignaturePayload
  (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
   HashAlgorithm, Word16, NonEmpty MPI)
-> SignaturePayload
-> Maybe
     (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
      HashAlgorithm, Word16, NonEmpty MPI)
forall s (m :: * -> *) a.
MonadReader s m =>
Getting (First a) s a -> m (Maybe a)
preview Getting
  (First
     (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
      HashAlgorithm, Word16, NonEmpty MPI))
  SignaturePayload
  (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
   HashAlgorithm, Word16, NonEmpty MPI)
Prism'
  SignaturePayload
  (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
   HashAlgorithm, Word16, NonEmpty MPI)
_SigV3 SignaturePayload
sig of
        Just (SigType
_st, ThirtyTwoBitTimeStamp
_ts, EightOctetKeyId
_ekid, PubKeyAlgorithm
pka, HashAlgorithm
_ha, Word16
_w16, NonEmpty MPI
_mpis) -> PubKeyAlgorithm -> Maybe PubKeyAlgorithm
forall a. a -> Maybe a
Just PubKeyAlgorithm
pka
        Maybe
  (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
   HashAlgorithm, Word16, NonEmpty MPI)
_ -> case Getting
  (First
     (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
      [SigSubPacket], Word16, NonEmpty MPI))
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
   [SigSubPacket], Word16, NonEmpty MPI)
-> SignaturePayload
-> Maybe
     (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
      [SigSubPacket], Word16, NonEmpty MPI)
forall s (m :: * -> *) a.
MonadReader s m =>
Getting (First a) s a -> m (Maybe a)
preview Getting
  (First
     (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
      [SigSubPacket], Word16, NonEmpty MPI))
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
   [SigSubPacket], Word16, NonEmpty MPI)
Prism'
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
   [SigSubPacket], Word16, NonEmpty MPI)
_SigV4 SignaturePayload
sig of
            Just (SigType
_st, PubKeyAlgorithm
pka, HashAlgorithm
_ha, [SigSubPacket]
_hsps, [SigSubPacket]
_usps, Word16
_w16, NonEmpty MPI
_mpis) -> PubKeyAlgorithm -> Maybe PubKeyAlgorithm
forall a. a -> Maybe a
Just PubKeyAlgorithm
pka
            Maybe
  (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
   [SigSubPacket], Word16, NonEmpty MPI)
_ -> case Getting
  (First
     (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
      [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI))
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
   [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
-> SignaturePayload
-> Maybe
     (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
      [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
forall s (m :: * -> *) a.
MonadReader s m =>
Getting (First a) s a -> m (Maybe a)
preview Getting
  (First
     (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
      [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI))
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
   [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
Prism'
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
   [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
_SigV6 SignaturePayload
sig of
                Just (SigType
_st, PubKeyAlgorithm
pka, HashAlgorithm
_ha, SignatureSalt
_salt, [SigSubPacket]
_hsps, [SigSubPacket]
_usps, Word16
_w16, NonEmpty MPI
_mpis) -> PubKeyAlgorithm -> Maybe PubKeyAlgorithm
forall a. a -> Maybe a
Just PubKeyAlgorithm
pka
                Maybe
  (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
   [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
_ -> Maybe PubKeyAlgorithm
forall a. Maybe a
Nothing

sigHA :: SignaturePayload -> Maybe HashAlgorithm
sigHA :: SignaturePayload -> Maybe HashAlgorithm
sigHA SignaturePayload
sig =
    case Getting
  (First
     (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
      HashAlgorithm, Word16, NonEmpty MPI))
  SignaturePayload
  (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
   HashAlgorithm, Word16, NonEmpty MPI)
-> SignaturePayload
-> Maybe
     (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
      HashAlgorithm, Word16, NonEmpty MPI)
forall s (m :: * -> *) a.
MonadReader s m =>
Getting (First a) s a -> m (Maybe a)
preview Getting
  (First
     (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
      HashAlgorithm, Word16, NonEmpty MPI))
  SignaturePayload
  (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
   HashAlgorithm, Word16, NonEmpty MPI)
Prism'
  SignaturePayload
  (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
   HashAlgorithm, Word16, NonEmpty MPI)
_SigV3 SignaturePayload
sig of
        Just (SigType
_st, ThirtyTwoBitTimeStamp
_ts, EightOctetKeyId
_ekid, PubKeyAlgorithm
_pka, HashAlgorithm
ha, Word16
_w16, NonEmpty MPI
_mpis) -> HashAlgorithm -> Maybe HashAlgorithm
forall a. a -> Maybe a
Just HashAlgorithm
ha
        Maybe
  (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
   HashAlgorithm, Word16, NonEmpty MPI)
_ -> case Getting
  (First
     (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
      [SigSubPacket], Word16, NonEmpty MPI))
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
   [SigSubPacket], Word16, NonEmpty MPI)
-> SignaturePayload
-> Maybe
     (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
      [SigSubPacket], Word16, NonEmpty MPI)
forall s (m :: * -> *) a.
MonadReader s m =>
Getting (First a) s a -> m (Maybe a)
preview Getting
  (First
     (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
      [SigSubPacket], Word16, NonEmpty MPI))
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
   [SigSubPacket], Word16, NonEmpty MPI)
Prism'
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
   [SigSubPacket], Word16, NonEmpty MPI)
_SigV4 SignaturePayload
sig of
            Just (SigType
_st, PubKeyAlgorithm
_pka, HashAlgorithm
ha, [SigSubPacket]
_hsps, [SigSubPacket]
_usps, Word16
_w16, NonEmpty MPI
_mpis) -> HashAlgorithm -> Maybe HashAlgorithm
forall a. a -> Maybe a
Just HashAlgorithm
ha
            Maybe
  (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
   [SigSubPacket], Word16, NonEmpty MPI)
_ -> case Getting
  (First
     (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
      [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI))
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
   [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
-> SignaturePayload
-> Maybe
     (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
      [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
forall s (m :: * -> *) a.
MonadReader s m =>
Getting (First a) s a -> m (Maybe a)
preview Getting
  (First
     (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
      [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI))
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
   [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
Prism'
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
   [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
_SigV6 SignaturePayload
sig of
                Just (SigType
_st, PubKeyAlgorithm
_pka, HashAlgorithm
ha, SignatureSalt
_salt, [SigSubPacket]
_hsps, [SigSubPacket]
_usps, Word16
_w16, NonEmpty MPI
_mpis) -> HashAlgorithm -> Maybe HashAlgorithm
forall a. a -> Maybe a
Just HashAlgorithm
ha
                Maybe
  (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
   [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
_ -> Maybe HashAlgorithm
forall a. Maybe a
Nothing

sigCT :: SignaturePayload -> Maybe ThirtyTwoBitTimeStamp
sigCT :: SignaturePayload -> Maybe ThirtyTwoBitTimeStamp
sigCT SignaturePayload
sig =
    case Getting
  (First
     (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
      HashAlgorithm, Word16, NonEmpty MPI))
  SignaturePayload
  (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
   HashAlgorithm, Word16, NonEmpty MPI)
-> SignaturePayload
-> Maybe
     (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
      HashAlgorithm, Word16, NonEmpty MPI)
forall s (m :: * -> *) a.
MonadReader s m =>
Getting (First a) s a -> m (Maybe a)
preview Getting
  (First
     (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
      HashAlgorithm, Word16, NonEmpty MPI))
  SignaturePayload
  (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
   HashAlgorithm, Word16, NonEmpty MPI)
Prism'
  SignaturePayload
  (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
   HashAlgorithm, Word16, NonEmpty MPI)
_SigV3 SignaturePayload
sig of
        Just (SigType
_st, ThirtyTwoBitTimeStamp
ct, EightOctetKeyId
_ekid, PubKeyAlgorithm
_pka, HashAlgorithm
_ha, Word16
_w16, NonEmpty MPI
_mpis) -> ThirtyTwoBitTimeStamp -> Maybe ThirtyTwoBitTimeStamp
forall a. a -> Maybe a
Just ThirtyTwoBitTimeStamp
ct
        Maybe
  (SigType, ThirtyTwoBitTimeStamp, EightOctetKeyId, PubKeyAlgorithm,
   HashAlgorithm, Word16, NonEmpty MPI)
_ -> case Getting
  (First
     (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
      [SigSubPacket], Word16, NonEmpty MPI))
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
   [SigSubPacket], Word16, NonEmpty MPI)
-> SignaturePayload
-> Maybe
     (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
      [SigSubPacket], Word16, NonEmpty MPI)
forall s (m :: * -> *) a.
MonadReader s m =>
Getting (First a) s a -> m (Maybe a)
preview Getting
  (First
     (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
      [SigSubPacket], Word16, NonEmpty MPI))
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
   [SigSubPacket], Word16, NonEmpty MPI)
Prism'
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
   [SigSubPacket], Word16, NonEmpty MPI)
_SigV4 SignaturePayload
sig of
            Just (SigType
_st, PubKeyAlgorithm
_pka, HashAlgorithm
_ha, [SigSubPacket]
hsubs, [SigSubPacket]
_usps, Word16
_w16, NonEmpty MPI
_mpis) ->
                (SigSubPacket -> ThirtyTwoBitTimeStamp)
-> Maybe SigSubPacket -> Maybe ThirtyTwoBitTimeStamp
forall a b. (a -> b) -> Maybe a -> Maybe b
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)
            Maybe
  (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
   [SigSubPacket], Word16, NonEmpty MPI)
_ -> case Getting
  (First
     (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
      [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI))
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
   [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
-> SignaturePayload
-> Maybe
     (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
      [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
forall s (m :: * -> *) a.
MonadReader s m =>
Getting (First a) s a -> m (Maybe a)
preview Getting
  (First
     (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
      [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI))
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
   [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
Prism'
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
   [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
_SigV6 SignaturePayload
sig of
                Just (SigType
_st, PubKeyAlgorithm
_pka, HashAlgorithm
_ha, SignatureSalt
_salt, [SigSubPacket]
hsubs, [SigSubPacket]
_usps, Word16
_w16, NonEmpty MPI
_mpis) ->
                    (SigSubPacket -> ThirtyTwoBitTimeStamp)
-> Maybe SigSubPacket -> Maybe ThirtyTwoBitTimeStamp
forall a b. (a -> b) -> Maybe a -> Maybe b
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)
                Maybe
  (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
   [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
_ -> Maybe ThirtyTwoBitTimeStamp
forall a. Maybe a
Nothing

signatureSubpacketListsKnown
    :: SignaturePayload -> Maybe ([SigSubPacket], [SigSubPacket])
signatureSubpacketListsKnown :: SignaturePayload -> Maybe ([SigSubPacket], [SigSubPacket])
signatureSubpacketListsKnown SignaturePayload
sig =
    (Getting
  (First
     (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
      [SigSubPacket], Word16, NonEmpty MPI))
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
   [SigSubPacket], Word16, NonEmpty MPI)
-> SignaturePayload
-> Maybe
     (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
      [SigSubPacket], Word16, NonEmpty MPI)
forall s (m :: * -> *) a.
MonadReader s m =>
Getting (First a) s a -> m (Maybe a)
preview Getting
  (First
     (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
      [SigSubPacket], Word16, NonEmpty MPI))
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
   [SigSubPacket], Word16, NonEmpty MPI)
Prism'
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
   [SigSubPacket], Word16, NonEmpty MPI)
_SigV4 SignaturePayload
sig Maybe
  (SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
   [SigSubPacket], Word16, NonEmpty MPI)
-> ((SigType, PubKeyAlgorithm, HashAlgorithm, [SigSubPacket],
     [SigSubPacket], Word16, NonEmpty MPI)
    -> Maybe ([SigSubPacket], [SigSubPacket]))
-> Maybe ([SigSubPacket], [SigSubPacket])
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \(SigType
_, PubKeyAlgorithm
_, HashAlgorithm
_, [SigSubPacket]
h, [SigSubPacket]
u, Word16
_, NonEmpty MPI
_) -> ([SigSubPacket], [SigSubPacket])
-> Maybe ([SigSubPacket], [SigSubPacket])
forall a. a -> Maybe a
Just ([SigSubPacket]
h, [SigSubPacket]
u))
        Maybe ([SigSubPacket], [SigSubPacket])
-> Maybe ([SigSubPacket], [SigSubPacket])
-> Maybe ([SigSubPacket], [SigSubPacket])
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Getting
  (First
     (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
      [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI))
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
   [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
-> SignaturePayload
-> Maybe
     (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
      [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
forall s (m :: * -> *) a.
MonadReader s m =>
Getting (First a) s a -> m (Maybe a)
preview Getting
  (First
     (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
      [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI))
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
   [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
Prism'
  SignaturePayload
  (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
   [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
_SigV6 SignaturePayload
sig Maybe
  (SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
   [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
-> ((SigType, PubKeyAlgorithm, HashAlgorithm, SignatureSalt,
     [SigSubPacket], [SigSubPacket], Word16, NonEmpty MPI)
    -> Maybe ([SigSubPacket], [SigSubPacket]))
-> Maybe ([SigSubPacket], [SigSubPacket])
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \(SigType
_, PubKeyAlgorithm
_, HashAlgorithm
_, SignatureSalt
_, [SigSubPacket]
h, [SigSubPacket]
u, Word16
_, NonEmpty MPI
_) -> ([SigSubPacket], [SigSubPacket])
-> Maybe ([SigSubPacket], [SigSubPacket])
forall a. a -> Maybe a
Just ([SigSubPacket]
h, [SigSubPacket]
u))

signatureHashedSubpacketsKnown
    :: SignaturePayload -> Maybe [SigSubPacket]
signatureHashedSubpacketsKnown :: SignaturePayload -> Maybe [SigSubPacket]
signatureHashedSubpacketsKnown SignaturePayload
sigPayload =
    ([SigSubPacket], [SigSubPacket]) -> [SigSubPacket]
forall a b. (a, b) -> a
fst (([SigSubPacket], [SigSubPacket]) -> [SigSubPacket])
-> Maybe ([SigSubPacket], [SigSubPacket]) -> Maybe [SigSubPacket]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> SignaturePayload -> Maybe ([SigSubPacket], [SigSubPacket])
signatureSubpacketListsKnown SignaturePayload
sigPayload