diff options
author | Stephen Paul Weber <singpolyma@singpolyma.net> | 2012-04-27 12:29:16 -0500 |
---|---|---|
committer | Stephen Paul Weber <singpolyma@singpolyma.net> | 2012-04-27 12:29:16 -0500 |
commit | 67d36d8979d50ead14d40cb4c94ed6da153d0232 (patch) | |
tree | 92f711de75c8aeb2967d805cbb86c4b81cb910e9 /Data | |
parent | b4a1a294abf7777a74ce08f340a4b2436a16262d (diff) |
Handle signature subpacket critical bit
Currently throws away the data. Suboptimal
Diffstat (limited to 'Data')
-rw-r--r-- | Data/OpenPGP.hs | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/Data/OpenPGP.hs b/Data/OpenPGP.hs index e48dcf6..d1aac6a 100644 --- a/Data/OpenPGP.hs +++ b/Data/OpenPGP.hs | |||
@@ -675,21 +675,14 @@ instance BINARY_CLASS SignatureSubpacket where | |||
675 | fmap fromIntegral (get :: Get Word32) | 675 | fmap fromIntegral (get :: Get Word32) |
676 | _ -> -- One octet length, no furthur processing | 676 | _ -> -- One octet length, no furthur processing |
677 | return len | 677 | return len |
678 | tag <- get :: Get Word8 | 678 | tag <- fmap stripCrit get :: Get Word8 |
679 | -- This forces the whole packet to be consumed | 679 | -- This forces the whole packet to be consumed |
680 | packet <- getSomeByteString (len-1) | 680 | packet <- getSomeByteString (len-1) |
681 | return $ unsafeRunGet (parse_signature_subpacket tag) packet | 681 | return $ unsafeRunGet (parse_signature_subpacket tag) packet |
682 | 682 | where | |
683 | -- | Find the keyid that issued a SignaturePacket | 683 | -- TODO: Decide how to actually encode the "is critical" data |
684 | signature_issuer :: Packet -> Maybe String | 684 | -- instead of just ignoring it |
685 | signature_issuer (SignaturePacket {hashed_subpackets = hashed, | 685 | stripCrit tag = if tag .&. 0x80 == 0x80 then tag .&. 0x7f else tag |
686 | unhashed_subpackets = unhashed}) = | ||
687 | if length issuers > 0 then Just issuer else Nothing | ||
688 | where IssuerPacket issuer = issuers !! 0 | ||
689 | issuers = filter isIssuer hashed ++ filter isIssuer unhashed | ||
690 | isIssuer (IssuerPacket {}) = True | ||
691 | isIssuer _ = False | ||
692 | signature_issuer _ = Nothing | ||
693 | 686 | ||
694 | put_signature_subpacket :: SignatureSubpacket -> (B.ByteString, Word8) | 687 | put_signature_subpacket :: SignatureSubpacket -> (B.ByteString, Word8) |
695 | put_signature_subpacket (SignatureCreationTimePacket time) = | 688 | put_signature_subpacket (SignatureCreationTimePacket time) = |
@@ -710,6 +703,17 @@ parse_signature_subpacket 16 = do | |||
710 | parse_signature_subpacket tag = | 703 | parse_signature_subpacket tag = |
711 | fmap (UnsupportedSignatureSubpacket tag) getRemainingByteString | 704 | fmap (UnsupportedSignatureSubpacket tag) getRemainingByteString |
712 | 705 | ||
706 | -- | Find the keyid that issued a SignaturePacket | ||
707 | signature_issuer :: Packet -> Maybe String | ||
708 | signature_issuer (SignaturePacket {hashed_subpackets = hashed, | ||
709 | unhashed_subpackets = unhashed}) = | ||
710 | if length issuers > 0 then Just issuer else Nothing | ||
711 | where IssuerPacket issuer = issuers !! 0 | ||
712 | issuers = filter isIssuer hashed ++ filter isIssuer unhashed | ||
713 | isIssuer (IssuerPacket {}) = True | ||
714 | isIssuer _ = False | ||
715 | signature_issuer _ = Nothing | ||
716 | |||
713 | find_key :: (Packet -> String) -> Message -> String -> Maybe Packet | 717 | find_key :: (Packet -> String) -> Message -> String -> Maybe Packet |
714 | find_key fpr (Message (x@(PublicKeyPacket {}):xs)) keyid = | 718 | find_key fpr (Message (x@(PublicKeyPacket {}):xs)) keyid = |
715 | find_key' fpr x xs keyid | 719 | find_key' fpr x xs keyid |