gpg: re-structure public key packets for easier parsing

This commit is contained in:
Roman Zeyde 2016-07-22 22:51:02 +03:00
parent 744696fdee
commit b9b7b8dafd
2 changed files with 27 additions and 1 deletions

View File

@ -1,5 +1,6 @@
"""Decoders for GPG v2 data structures."""
import base64
import copy
import functools
import hashlib
import io
@ -272,6 +273,30 @@ def digest_packets(packets, hasher):
return hasher.digest()
def collect_packets(packets, types_to_collect):
"""Collect specified packet types into their leading packet."""
packet = None
result = []
for p in packets:
if p['type'] in types_to_collect:
packet.setdefault(p['type'], []).append(p)
else:
packet = copy.deepcopy(p)
result.append(packet)
return result
def parse_public_key(stream):
"""Parse GPG public key into hierarchy of packets."""
packets = list(parse_packets(stream))
packets = collect_packets(packets, {'signature'})
packets = collect_packets(packets, {'user_id', 'user_attribute'})
packets = collect_packets(packets, {'subkey'})
if len(packets) != 1:
raise ValueError('Unexpected packet structure: %r', packets)
return packets[0]
HASH_ALGORITHMS = {
1: 'md5',
2: 'sha1',

View File

@ -110,4 +110,5 @@ def public_key_path(request):
def test_gpg_files(public_key_path): # pylint: disable=redefined-outer-name
decode.load_public_key(open(public_key_path, 'rb').read())
with open(public_key_path, 'rb') as f:
decode.parse_public_key(f)