diff options
author | Joe Crayne <joe@jerkface.net> | 2020-05-16 07:52:53 -0400 |
---|---|---|
committer | Joe Crayne <joe@jerkface.net> | 2020-05-19 11:58:22 -0400 |
commit | 8fdfd0fc119519041683bc74e9d7a35231728ae3 (patch) | |
tree | e1e86003a349a0c1a378ac3457c7e4a0788a1278 /Data | |
parent | 53849fa83d96f6f1b45f2a8d2b8001747a053357 (diff) |
Issuer Fingerprint hashed subpacket (draft-ietf-openpgp-rfc4880bis-09).
Diffstat (limited to 'Data')
-rw-r--r-- | Data/OpenPGP.hs | 25 |
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) = | |||
1307 | put_signature_subpacket (EmbeddedSignaturePacket packet) | 1310 | put_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 |
1313 | put_signature_subpacket (IssuerFingerprintPacket v fp) = | ||
1314 | (runPut . putByteString $ v `BS.cons` fp,33) | ||
1310 | put_signature_subpacket (UnsupportedSignatureSubpacket tag bytes) = | 1315 | put_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 |
1422 | parse_signature_subpacket 32 = | 1427 | parse_signature_subpacket 32 = |
1423 | fmap EmbeddedSignaturePacket (parse_packet 2) | 1428 | fmap EmbeddedSignaturePacket (parse_packet 2) |
1429 | -- IssuerFingerprintPacket | ||
1430 | parse_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 |
1425 | parse_signature_subpacket tag = | 1435 | parse_signature_subpacket tag = |
1426 | fmap (UnsupportedSignatureSubpacket tag) getRemainingByteString | 1436 | fmap (UnsupportedSignatureSubpacket tag) getRemainingByteString |
@@ -1429,13 +1439,18 @@ parse_signature_subpacket tag = | |||
1429 | signature_issuer :: Packet -> Maybe String | 1439 | signature_issuer :: Packet -> Maybe String |
1430 | signature_issuer (SignaturePacket {hashed_subpackets = hashed, | 1440 | signature_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 | ||
1439 | signature_issuer _ = Nothing | 1454 | signature_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 | ||
1462 | takeFromEnd :: Int -> String -> String | 1477 | takeFromEnd :: Int -> String -> String |
1463 | takeFromEnd l = reverse . take l . reverse | 1478 | takeFromEnd l = reverse . take l . reverse |