summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2020-05-16 07:52:53 -0400
committerJoe Crayne <joe@jerkface.net>2020-05-19 11:58:22 -0400
commit8fdfd0fc119519041683bc74e9d7a35231728ae3 (patch)
treee1e86003a349a0c1a378ac3457c7e4a0788a1278
parent53849fa83d96f6f1b45f2a8d2b8001747a053357 (diff)
Issuer Fingerprint hashed subpacket (draft-ietf-openpgp-rfc4880bis-09).
-rw-r--r--Data/OpenPGP.hs25
1 files changed, 20 insertions, 5 deletions
diff --git a/Data/OpenPGP.hs b/Data/OpenPGP.hs
index 571e8a4..4133f38 100644
--- a/Data/OpenPGP.hs
+++ b/Data/OpenPGP.hs
@@ -1196,7 +1196,10 @@ data SignatureSubpacket =
1196 hash :: B.ByteString 1196 hash :: B.ByteString
1197 } | 1197 } |
1198 EmbeddedSignaturePacket Packet | 1198 EmbeddedSignaturePacket Packet |
1199 -- TODO: IssuerFingerprintPacket (tag=33) 1199 IssuerFingerprintPacket {
1200 fingerprint_version :: Word8,
1201 issuer_fingerprint :: BS.ByteString
1202 } |
1200 UnsupportedSignatureSubpacket Word8 B.ByteString 1203 UnsupportedSignatureSubpacket Word8 B.ByteString
1201 deriving (Show, Read, Eq) 1204 deriving (Show, Read, Eq)
1202 1205
@@ -1307,6 +1310,8 @@ put_signature_subpacket (SignatureTargetPacket kalgo halgo hash) =
1307put_signature_subpacket (EmbeddedSignaturePacket packet) 1310put_signature_subpacket (EmbeddedSignaturePacket packet)
1308 | isSignaturePacket packet = (fst $ put_packet packet, 32) 1311 | isSignaturePacket packet = (fst $ put_packet packet, 32)
1309 | otherwise = error $ "Tried to put non-SignaturePacket in EmbeddedSignaturePacket: " ++ show packet 1312 | otherwise = error $ "Tried to put non-SignaturePacket in EmbeddedSignaturePacket: " ++ show packet
1313put_signature_subpacket (IssuerFingerprintPacket v fp) =
1314 (runPut . putByteString $ v `BS.cons` fp,33)
1310put_signature_subpacket (UnsupportedSignatureSubpacket tag bytes) = 1315put_signature_subpacket (UnsupportedSignatureSubpacket tag bytes) =
1311 (bytes, tag) 1316 (bytes, tag)
1312 1317
@@ -1421,6 +1426,11 @@ parse_signature_subpacket 31 =
1421-- EmbeddedSignaturePacket, http://tools.ietf.org/html/rfc4880#section-5.2.3.26 1426-- EmbeddedSignaturePacket, http://tools.ietf.org/html/rfc4880#section-5.2.3.26
1422parse_signature_subpacket 32 = 1427parse_signature_subpacket 32 =
1423 fmap EmbeddedSignaturePacket (parse_packet 2) 1428 fmap EmbeddedSignaturePacket (parse_packet 2)
1429-- IssuerFingerprintPacket
1430parse_signature_subpacket 33 = do
1431 v <- get
1432 fp <- getByteString (if v==4 then 20 else 32)
1433 return $ IssuerFingerprintPacket v fp
1424-- Represent unsupported packets as their tag and literal bytes 1434-- Represent unsupported packets as their tag and literal bytes
1425parse_signature_subpacket tag = 1435parse_signature_subpacket tag =
1426 fmap (UnsupportedSignatureSubpacket tag) getRemainingByteString 1436 fmap (UnsupportedSignatureSubpacket tag) getRemainingByteString
@@ -1429,13 +1439,18 @@ parse_signature_subpacket tag =
1429signature_issuer :: Packet -> Maybe String 1439signature_issuer :: Packet -> Maybe String
1430signature_issuer (SignaturePacket {hashed_subpackets = hashed, 1440signature_issuer (SignaturePacket {hashed_subpackets = hashed,
1431 unhashed_subpackets = unhashed}) = 1441 unhashed_subpackets = unhashed}) =
1432 case issuers of 1442 case fps of
1433 IssuerPacket issuer : _ -> Just issuer 1443 IssuerFingerprintPacket _ fp : _ -> Just $ hexify fp
1434 _ -> Nothing 1444 _ -> case issuers of
1445 IssuerPacket issuer : _ -> Just issuer
1446 _ -> Nothing
1435 where 1447 where
1448 fps = filter isFingerprint hashed
1436 issuers = filter isIssuer hashed ++ filter isIssuer unhashed 1449 issuers = filter isIssuer hashed ++ filter isIssuer unhashed
1437 isIssuer (IssuerPacket {}) = True 1450 isIssuer (IssuerPacket {}) = True
1438 isIssuer _ = False 1451 isIssuer _ = False
1452 isFingerprint (IssuerFingerprintPacket {}) = True
1453 isFingerprint _ = False
1439signature_issuer _ = Nothing 1454signature_issuer _ = Nothing
1440 1455
1441-- | Find a key with the given Fingerprint/KeyID 1456-- | Find a key with the given Fingerprint/KeyID
@@ -1457,7 +1472,7 @@ find_key' fpr x xs keyid
1457 | thisid == keyid = Just x 1472 | thisid == keyid = Just x
1458 | otherwise = find_key fpr (Message xs) keyid 1473 | otherwise = find_key fpr (Message xs) keyid
1459 where 1474 where
1460 thisid = takeFromEnd (length keyid) (fpr x) 1475 thisid = (if version x >= 5 then take else takeFromEnd) (length keyid) (fpr x)
1461 1476
1462takeFromEnd :: Int -> String -> String 1477takeFromEnd :: Int -> String -> String
1463takeFromEnd l = reverse . take l . reverse 1478takeFromEnd l = reverse . take l . reverse