Ejemplo n.º 1
0
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()
Ejemplo n.º 2
0
    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()
Ejemplo n.º 3
0
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()
Ejemplo n.º 4
0
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()
Ejemplo n.º 5
0
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()
Ejemplo n.º 6
0
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()
Ejemplo n.º 7
0
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()
Ejemplo n.º 8
0
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()
Ejemplo n.º 9
0
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()
Ejemplo n.º 10
0
def _parse_merkle_leaf_type(tdf):
    with TdfBytesParser(tdf) as parser:
        parser.read('val', '!B')  # (255)
        return parser.result()
Ejemplo n.º 11
0
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()
Ejemplo n.º 12
0
def _parse_log_id(tdf):
    with TdfBytesParser(tdf) as parser:
        parser.read('val', '!32s')
        return parser.result()
Ejemplo n.º 13
0
def _parse_log_entry_type(tdf):
    with TdfBytesParser(tdf) as parser:
        parser.read('val', '!H')  # (65535) -> 2 bytes
        return parser.result()
Ejemplo n.º 14
0
def _parse_version(tdf):
    with TdfBytesParser(tdf) as parser:
        parser.read('val', '!B')
        return parser.result()
Ejemplo n.º 15
0
def _parse_signature_type(tdf):
    with TdfBytesParser(tdf) as parser:
        parser.read('val', '!B')
        return parser.result()
Ejemplo n.º 16
0
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()
Ejemplo n.º 17
0
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()
Ejemplo n.º 18
0
 def _parse_lv2(tdf):
     with TdfBytesParser(tdf) as parser:
         parser.read('lv2', '!2s')
         return parser.result()