gpg: re-structure public key packets for easier parsing
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
"""Decoders for GPG v2 data structures."""
|
"""Decoders for GPG v2 data structures."""
|
||||||
import base64
|
import base64
|
||||||
|
import copy
|
||||||
import functools
|
import functools
|
||||||
import hashlib
|
import hashlib
|
||||||
import io
|
import io
|
||||||
@@ -272,6 +273,30 @@ def digest_packets(packets, hasher):
|
|||||||
return hasher.digest()
|
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 = {
|
HASH_ALGORITHMS = {
|
||||||
1: 'md5',
|
1: 'md5',
|
||||||
2: 'sha1',
|
2: 'sha1',
|
||||||
|
|||||||
@@ -110,4 +110,5 @@ def public_key_path(request):
|
|||||||
|
|
||||||
|
|
||||||
def test_gpg_files(public_key_path): # pylint: disable=redefined-outer-name
|
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)
|
||||||
|
|||||||
Reference in New Issue
Block a user