def _parse_timestamped_entry(tdf): with TdfBytesParser(tdf) as parser: parser.read('timestamp', '!Q') # uint64 -> 8 bytes entry_type = LogEntryType( parser.delegate('entry_type', _parse_log_entry_type)) # parse leaf_entry if entry_type.is_x509_entry: parser.delegate('signed_entry', _parse_asn1_cert) parser.res['x509_entry'] = parser.res['signed_entry'] elif entry_type.is_precert_entry: parser.delegate('signed_entry', _parse_pre_cert) parser.res['precert_entry'] = parser.res['signed_entry'] else: raise Exception(flo('Unknown entry_type number: {entry_type}')) # TODO DEBUG ctlog_get_entries.py related (it looks like some log # answers are missing # the ct_extensions, # or an error in parse routines) try: parser.delegate('extensions', _parse_ct_extensions) except struct.error: pass return parser.result()
def _parse_nam_tup(tdf): with TdfBytesParser(tdf) as parser: parser.read('lv1', '!s') parse_lv2 = parser.delegate('_tmp', _parse_lv2) parser.res.update(parse_lv2) del parser.res['_tmp'] return parser.result()
def _parse_signature_input(tdf): with TdfBytesParser(tdf) as parser: parser.delegate('sct_version', _parse_version) parser.delegate('signature_type', _parse_signature_type) # rest of the SignatureInput is identical to an TimestampedEntry parser.delegate('_tmp', _parse_timestamped_entry) parser.res.update(parser.res['_tmp']) del parser.res['_tmp'] return parser.result()
def _parse_merkle_tree_leaf(tdf): with TdfBytesParser(tdf) as parser: parser.delegate('version', _parse_version) leaf_type = parser.delegate('leaf_type', _parse_merkle_leaf_type) if MerkleLeafType(leaf_type).is_timestamped_entry: parser.delegate('leaf_entry', _parse_timestamped_entry) else: raise Exception('unknown leaf_type: {leaf_type}!') return parser.result()
def _parse_tbs_certificate(tdf): with TdfBytesParser(tdf) as parser: parser.read('len1', '!B') parser.read('len2', '!B') parser.read('len3', '!B') len_der = struct.unpack( '=I', struct.pack('!4B', 0, parser.res['len1'], parser.res['len2'], parser.res['len3']))[0] from_ = parser.offset parser.offset += len_der until = parser.offset parser.res['der'] = tdf[from_:until] return parser.result()
def _parse_asn1_cert(tdf): with TdfBytesParser(tdf) as parser: parser.read('len1', '!B') parser.read('len2', '!B') parser.read('len3', '!B') der_len = struct.unpack( '=I', struct.pack('!4B', 0, parser.res['len1'], parser.res['len2'], parser.res['len3']))[0] parser.res['der_len'] = der_len parser.read('der', flo('!{der_len}s')) return parser.result()
def _parse_signed_certificate_timestamp(tdf): with TdfBytesParser(tdf) as parser: parser.delegate('version', _parse_version) parser.delegate('id', _parse_log_id) parser.read('timestamp', '!Q') parser.delegate('ct_extensions', _parse_ct_extensions) # digitally-signed struct parser.read('signature_alg_hash', '!B'), parser.read('signature_alg_sign', '!B'), signature_len = parser.read('signature_len', '!H') parser.read('signature', flo('!{signature_len}s')) return parser.result()
def _parse_log_entry(tdf): with TdfBytesParser(tdf) as parser: entry_type = LogEntryType( parser.delegate('entry_type', _parse_log_entry_type)) # parse entry if entry_type.is_x509_entry: parser.delegate('entry', _parse_x509_chain_entry) parser.res['x509_entry'] = parser.res['entry'] elif entry_type.is_precert_entry: parser.delegate('entry', _parse_precert_chain_entry) parser.res['precert_entry'] = parser.res['entry'] else: raise Exception(flo('Unknown entry_type: {entry_type}')) return parser.result()
def _parse_asn1_cert_list(tdf): with TdfBytesParser(tdf) as parser: parser.read('len1', '!B') parser.read('len2', '!B') parser.read('len3', '!B') der_list_len = struct.unpack( '=I', struct.pack('!4B', 0, parser.res['len1'], parser.res['len2'], parser.res['len3']))[0] der_end_offset = parser.offset + der_list_len list_of_parse_asn1_cert = [] while parser.offset < der_end_offset: parse_asn1_cert = parser.delegate(_parse_asn1_cert) list_of_parse_asn1_cert.append(parse_asn1_cert) parser.res['der_list_len'] = der_list_len parser.res['list_of_parse_asn1_cert'] = list_of_parse_asn1_cert return parser.result()
def _parse_merkle_leaf_type(tdf): with TdfBytesParser(tdf) as parser: parser.read('val', '!B') # (255) return parser.result()
def _parse_ct_extensions(tdf): with TdfBytesParser(tdf) as parser: parser.read('len', '!H') parser.res['val'] = None # "Currently, no extensions are specified" return parser.result()
def _parse_log_id(tdf): with TdfBytesParser(tdf) as parser: parser.read('val', '!32s') return parser.result()
def _parse_log_entry_type(tdf): with TdfBytesParser(tdf) as parser: parser.read('val', '!H') # (65535) -> 2 bytes return parser.result()
def _parse_version(tdf): with TdfBytesParser(tdf) as parser: parser.read('val', '!B') return parser.result()
def _parse_signature_type(tdf): with TdfBytesParser(tdf) as parser: parser.read('val', '!B') return parser.result()
def _parse_precert_chain_entry(tdf): with TdfBytesParser(tdf) as parser: parser.delegate('pre_certificate', _parse_asn1_cert), parser.delegate('precert_chain', _parse_asn1_cert_list), return parser.result()
def _parse_pre_cert(tdf): with TdfBytesParser(tdf) as parser: parser.read('issuer_key_hash', '!32s') parser.delegate('tbs_certificate', _parse_tbs_certificate) return parser.result()
def _parse_lv2(tdf): with TdfBytesParser(tdf) as parser: parser.read('lv2', '!2s') return parser.result()