summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Paul Weber <singpolyma@singpolyma.net>2013-01-03 16:40:47 -0500
committerStephen Paul Weber <singpolyma@singpolyma.net>2013-01-03 16:40:47 -0500
commit431f879dbb29790f731c841b0e40876e1debce60 (patch)
treed5f97829880cec5e4c128130fe76ec160c767ff6
parent6c1805b9f9fd0ce6f9387fb63c34ad99205e0736 (diff)
More generic signature extraction
-rw-r--r--Data/OpenPGP.hs50
1 files changed, 43 insertions, 7 deletions
diff --git a/Data/OpenPGP.hs b/Data/OpenPGP.hs
index ede0caa..1108aa8 100644
--- a/Data/OpenPGP.hs
+++ b/Data/OpenPGP.hs
@@ -58,7 +58,8 @@ module Data.OpenPGP (
58 MPI(..), 58 MPI(..),
59 find_key, 59 find_key,
60 fingerprint_material, 60 fingerprint_material,
61 signatures_and_data, 61 SignatureOver(..),
62 signatures,
62 signature_issuer, 63 signature_issuer,
63 public_key_fields, 64 public_key_fields,
64 secret_key_fields 65 secret_key_fields
@@ -890,16 +891,51 @@ instance Monoid Message where
890 mempty = Message [] 891 mempty = Message []
891 mappend (Message a) (Message b) = Message (a ++ b) 892 mappend (Message a) (Message b) = Message (a ++ b)
892 893
893-- | Extract all signature and data packets from a 'Message' 894-- | Data needed to verify a signature
894signatures_and_data :: Message -> ([Packet], [Packet]) 895data SignatureOver =
895signatures_and_data (Message ((CompressedDataPacket {message = m}):_)) = 896 DataSignature Packet [Packet] |
896 signatures_and_data m 897 -- ^ LiteralData, [Signature]
897signatures_and_data (Message lst) = 898 KeySignature Packet [Packet] |
898 (filter isSignaturePacket lst, filter isDta lst) 899 -- ^ Revocation. Key, [Signature]
900 SubkeySignature Packet Packet [Packet] |
901 -- ^ Revocation or subkey binding. Key, Subkey, [Signature]
902 CertificationSignature Packet Packet [Packet]
903 -- ^ KeyPacket, (UserID | UserAttribute), [Signature]
904
905-- | Extract signed objects from a well-formatted message
906--
907-- Recurses into CompressedDataPacket
908--
909-- <http://tools.ietf.org/html/rfc4880#section-11>
910signatures :: Message -> [SignatureOver]
911signatures (Message [CompressedDataPacket _ m]) = signatures m
912signatures (Message ps) =
913 maybe (paired_sigs Nothing ps) (\p -> [DataSignature p sigs]) (find isDta ps)
899 where 914 where
915 sigs = filter isSignaturePacket ps
900 isDta (LiteralDataPacket {}) = True 916 isDta (LiteralDataPacket {}) = True
901 isDta _ = False 917 isDta _ = False
902 918
919-- TODO: UserAttribute
920paired_sigs :: Maybe Packet -> [Packet] -> [SignatureOver]
921paired_sigs _ [] = []
922paired_sigs _ (p@(PublicKeyPacket {is_subkey = False}):ps) =
923 KeySignature p (takeWhile isSignaturePacket ps) :
924 paired_sigs (Just p) (dropWhile isSignaturePacket ps)
925paired_sigs _ (p@(SecretKeyPacket {is_subkey = False}):ps) =
926 KeySignature p (takeWhile isSignaturePacket ps) :
927 paired_sigs (Just p) (dropWhile isSignaturePacket ps)
928paired_sigs (Just k) (p@(PublicKeyPacket {is_subkey = True}):ps) =
929 SubkeySignature k p (takeWhile isSignaturePacket ps) :
930 paired_sigs (Just p) (dropWhile isSignaturePacket ps)
931paired_sigs (Just k) (p@(SecretKeyPacket {is_subkey = True}):ps) =
932 SubkeySignature k p (takeWhile isSignaturePacket ps) :
933 paired_sigs (Just p) (dropWhile isSignaturePacket ps)
934paired_sigs (Just k) (p@(UserIDPacket {}):ps) =
935 CertificationSignature k p (takeWhile isSignaturePacket ps) :
936 paired_sigs (Just p) (dropWhile isSignaturePacket ps)
937paired_sigs k (_:ps) = paired_sigs k ps
938
903-- | <http://tools.ietf.org/html/rfc4880#section-3.2> 939-- | <http://tools.ietf.org/html/rfc4880#section-3.2>
904newtype MPI = MPI Integer deriving (Show, Read, Eq, Ord) 940newtype MPI = MPI Integer deriving (Show, Read, Eq, Ord)
905instance BINARY_CLASS MPI where 941instance BINARY_CLASS MPI where