mirror of
https://github.com/kellyjonbrazil/jc.git
synced 2025-06-23 00:29:59 +02:00
convert larg integers to ascii-hex. simplify _fix_objects. add iso date strings. allow multiple certs in a PEM bundle
This commit is contained in:
@ -71,7 +71,13 @@ def _process(proc_data: List[Dict]) -> List[Dict]:
|
|||||||
return proc_data
|
return proc_data
|
||||||
|
|
||||||
|
|
||||||
|
def _i2b(integer: int) -> bytes:
|
||||||
|
"""Convert long integers into a bytes object (big endian)"""
|
||||||
|
return integer.to_bytes((integer.bit_length() + 7) // 8, byteorder='big')
|
||||||
|
|
||||||
|
|
||||||
def _b2a(byte_string: bytes) -> str:
|
def _b2a(byte_string: bytes) -> str:
|
||||||
|
"""Convert a byte string to a colon-delimited hex ascii string"""
|
||||||
return binascii.hexlify(byte_string, ':').decode('utf-8')
|
return binascii.hexlify(byte_string, ':').decode('utf-8')
|
||||||
|
|
||||||
|
|
||||||
@ -86,17 +92,20 @@ def _fix_objects(obj):
|
|||||||
if isinstance(obj, OrderedDict):
|
if isinstance(obj, OrderedDict):
|
||||||
obj = dict(obj)
|
obj = dict(obj)
|
||||||
|
|
||||||
if isinstance(obj, datetime):
|
|
||||||
obj = int(round(obj.timestamp()))
|
|
||||||
|
|
||||||
if isinstance(obj, bytes):
|
|
||||||
obj = _b2a(obj)
|
|
||||||
|
|
||||||
if isinstance(obj, dict):
|
if isinstance(obj, dict):
|
||||||
for k, v in obj.items():
|
for k, v in obj.copy().items():
|
||||||
|
if k == 'serial_number':
|
||||||
|
obj.update({k: _b2a(_i2b(v))})
|
||||||
|
continue
|
||||||
|
|
||||||
|
if k == 'modulus':
|
||||||
|
obj.update({k: _b2a(_i2b(v))})
|
||||||
|
continue
|
||||||
|
|
||||||
if isinstance(v, datetime):
|
if isinstance(v, datetime):
|
||||||
|
iso = v.isoformat()
|
||||||
v = int(round(v.timestamp()))
|
v = int(round(v.timestamp()))
|
||||||
obj.update({k: v})
|
obj.update({k: v, f'{k}_iso': iso})
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if isinstance(v, bytes):
|
if isinstance(v, bytes):
|
||||||
@ -104,14 +113,6 @@ def _fix_objects(obj):
|
|||||||
obj.update({k: v})
|
obj.update({k: v})
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if isinstance(v, set):
|
|
||||||
v = list(v)
|
|
||||||
obj.update({k: v})
|
|
||||||
|
|
||||||
if isinstance(v, OrderedDict):
|
|
||||||
v = dict(v)
|
|
||||||
obj.update({k: v})
|
|
||||||
|
|
||||||
if isinstance(v, dict):
|
if isinstance(v, dict):
|
||||||
obj.update({k: _fix_objects(v)})
|
obj.update({k: _fix_objects(v)})
|
||||||
continue
|
continue
|
||||||
@ -162,20 +163,14 @@ def parse(
|
|||||||
except TypeError:
|
except TypeError:
|
||||||
der_bytes = data # type: ignore
|
der_bytes = data # type: ignore
|
||||||
|
|
||||||
|
certs = []
|
||||||
if pem.detect(der_bytes):
|
if pem.detect(der_bytes):
|
||||||
type_name, headers, der_bytes = pem.unarmor(der_bytes)
|
for type_name, headers, der_bytes in pem.unarmor(der_bytes, multiple=True):
|
||||||
|
certs.append(x509.Certificate.load(der_bytes))
|
||||||
|
|
||||||
cert = x509.Certificate.load(der_bytes)
|
else:
|
||||||
|
certs.append(x509.Certificate.load(der_bytes))
|
||||||
# convert bytes to hexadecimal representation strings for JSON conversion: _b2a()
|
|
||||||
# convert datetime objects to timestamp integers for JSON conversion:
|
|
||||||
# timestamp = int(round(dt_obj.timestamp()))
|
|
||||||
|
|
||||||
clean_dict = _fix_objects(cert.native)
|
|
||||||
# import pprint
|
|
||||||
# pprint.pprint(clean_dict)
|
|
||||||
|
|
||||||
raw_output = clean_dict
|
|
||||||
|
|
||||||
|
raw_output = [_fix_objects(cert.native) for cert in certs]
|
||||||
|
|
||||||
return raw_output if raw else _process(raw_output)
|
return raw_output if raw else _process(raw_output)
|
||||||
|
Reference in New Issue
Block a user