diff options
author | Stephen Paul Weber <singpolyma@singpolyma.net> | 2013-01-03 16:40:47 -0500 |
---|---|---|
committer | Stephen Paul Weber <singpolyma@singpolyma.net> | 2013-01-03 16:40:47 -0500 |
commit | 431f879dbb29790f731c841b0e40876e1debce60 (patch) | |
tree | d5f97829880cec5e4c128130fe76ec160c767ff6 | |
parent | 6c1805b9f9fd0ce6f9387fb63c34ad99205e0736 (diff) |
More generic signature extraction
-rw-r--r-- | Data/OpenPGP.hs | 50 |
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 |
894 | signatures_and_data :: Message -> ([Packet], [Packet]) | 895 | data SignatureOver = |
895 | signatures_and_data (Message ((CompressedDataPacket {message = m}):_)) = | 896 | DataSignature Packet [Packet] | |
896 | signatures_and_data m | 897 | -- ^ LiteralData, [Signature] |
897 | signatures_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> | ||
910 | signatures :: Message -> [SignatureOver] | ||
911 | signatures (Message [CompressedDataPacket _ m]) = signatures m | ||
912 | signatures (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 | ||
920 | paired_sigs :: Maybe Packet -> [Packet] -> [SignatureOver] | ||
921 | paired_sigs _ [] = [] | ||
922 | paired_sigs _ (p@(PublicKeyPacket {is_subkey = False}):ps) = | ||
923 | KeySignature p (takeWhile isSignaturePacket ps) : | ||
924 | paired_sigs (Just p) (dropWhile isSignaturePacket ps) | ||
925 | paired_sigs _ (p@(SecretKeyPacket {is_subkey = False}):ps) = | ||
926 | KeySignature p (takeWhile isSignaturePacket ps) : | ||
927 | paired_sigs (Just p) (dropWhile isSignaturePacket ps) | ||
928 | paired_sigs (Just k) (p@(PublicKeyPacket {is_subkey = True}):ps) = | ||
929 | SubkeySignature k p (takeWhile isSignaturePacket ps) : | ||
930 | paired_sigs (Just p) (dropWhile isSignaturePacket ps) | ||
931 | paired_sigs (Just k) (p@(SecretKeyPacket {is_subkey = True}):ps) = | ||
932 | SubkeySignature k p (takeWhile isSignaturePacket ps) : | ||
933 | paired_sigs (Just p) (dropWhile isSignaturePacket ps) | ||
934 | paired_sigs (Just k) (p@(UserIDPacket {}):ps) = | ||
935 | CertificationSignature k p (takeWhile isSignaturePacket ps) : | ||
936 | paired_sigs (Just p) (dropWhile isSignaturePacket ps) | ||
937 | paired_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> |
904 | newtype MPI = MPI Integer deriving (Show, Read, Eq, Ord) | 940 | newtype MPI = MPI Integer deriving (Show, Read, Eq, Ord) |
905 | instance BINARY_CLASS MPI where | 941 | instance BINARY_CLASS MPI where |