def proof_req_infos2briefs(proof_req: dict, infos: Union[dict, Sequence[dict]]) -> list:
    """
    Given a proof request and corresponding cred-info(s), return a list of cred-briefs
    (i.e., cred-info plus interval).

    The proof request must have cred def id restrictions on all requested attribute specifications.

    :param proof_req: proof request
    :param infos: cred-info or sequence thereof; e.g.,

    ::

        [
            {
                'attrs': {
                    'auditDate': '2018-07-30',
                    'greenLevel': 'Silver',
                    'legalName': 'Tart City'
                },
                'cred_rev_id': '48',
                'cred_def_id': 'WgWxqztrNooG92RXvxSTWv:3:CL:17:tag',
                'referent': 'c15674a9-7321-440d-bbed-e1ac9273abd5',
                'rev_reg_id': 'WgWxqztrNooG92RXvxSTWv:4:WgWxqztrNooG92RXvxSTWv:3:CL:17:tag:CL_ACCUM:0',
                'schema_id': 'WgWxqztrNooG92RXvxSTWv:2:green:1.0'
            },
            ...
        ]

    :return: list of cred-briefs
    """

    rv = []
    refts = proof_req_attr_referents(proof_req)
    for info in iter_briefs(infos):
        if info['cred_def_id'] not in refts:
            continue
        brief = {
            'cred_info': info,
            'interval': {}
        }
        fro = None
        to = None
        for uuid in refts[info['cred_def_id']].values():
            interval = proof_req['requested_attributes'][uuid].get('non_revoked', {})
            if 'from' in interval:
                fro = min(fro or interval['from'], interval['from'])
            if 'to' in interval:
                to = max(to or interval['to'], interval['to'])

        if to:
            brief['interval']['to'] = to
        if fro:
            brief['interval']['from'] = fro
        if not brief['interval']:
            brief['interval'] = None

        rv.append(brief)

    return rv