Source code for aries_cloudagent.protocols.present_proof.v1_0.util.indy

"""Utilities for dealing with indy conventions."""

from .....indy.holder import IndyHolder

from ..messages.inner.presentation_preview import PresentationPreview


[docs]async def indy_proof_req_preview2indy_requested_creds( indy_proof_req: dict, preview: PresentationPreview = None, *, holder: IndyHolder ): """ Build indy requested-credentials structure. Given input proof request and presentation preview, use credentials in holder's wallet to build indy requested credentials structure for input to proof creation. Args: indy_proof_req: indy proof request pres_preview: preview from presentation proposal, if applicable holder: holder injected into current context """ req_creds = { "self_attested_attributes": {}, "requested_attributes": {}, "requested_predicates": {}, } for (referent, req_item) in indy_proof_req["requested_attributes"].items(): credentials = await holder.get_credentials_for_presentation_request_by_referent( presentation_request=indy_proof_req, referents=(referent,), start=0, count=100, ) if not credentials: raise ValueError( "Could not automatically construct presentation for " + f"presentation request {indy_proof_req['name']}" + f":{indy_proof_req['version']} because referent " + f"{referent} did not produce any credentials." ) # match returned creds against any preview values if len(credentials) == 1: cred_match = credentials[0] elif preview: reft = indy_proof_req["requested_attributes"][referent] names = [reft["name"]] if "name" in reft else reft.get("names") for cred in credentials: # holder sorts by irrevocability, least referent if all( preview.has_attr_spec( cred_def_id=cred["cred_info"]["cred_def_id"], name=name, value=cred["cred_info"]["attrs"][name], ) for name in names ): cred_match = cred break else: raise ValueError( "Could not automatically construct presentation for " + f"presentation request {indy_proof_req['name']}" + f":{indy_proof_req['version']} because referent " + f"{referent} did not produce any credentials matching " + "proposed preview." ) else: cred_match = credentials[0] # holder sorts if "restrictions" in indy_proof_req["requested_attributes"][referent]: req_creds["requested_attributes"][referent] = { "cred_id": cred_match["cred_info"]["referent"], "revealed": True, } else: req_creds["self_attested_attributes"][referent] = cred_match["cred_info"][ "attrs" ][indy_proof_req["requested_attributes"][referent]["name"]] for referent in indy_proof_req["requested_predicates"]: credentials = await holder.get_credentials_for_presentation_request_by_referent( presentation_request=indy_proof_req, referents=(referent,), start=0, count=100, ) if not credentials: raise ValueError( "Could not automatically construct presentation for " + f"presentation request {indy_proof_req['name']}" + f":{indy_proof_req['version']} because predicate " + f"referent {referent} did not produce any credentials." ) cred_match = credentials[0] # holder sorts if "restrictions" in indy_proof_req["requested_predicates"][referent]: req_creds["requested_predicates"][referent] = { "cred_id": cred_match["cred_info"]["referent"], "revealed": True, } else: req_creds["self_attested_attributes"][referent] = cred_match["cred_info"][ "attrs" ][indy_proof_req["requested_predicates"][referent]["name"]] return req_creds
[docs]def indy_proof_req2non_revoc_intervals(indy_proof_req: dict): """Return non-revocation intervals by requested item referent in proof request.""" non_revoc_intervals = {} for req_item_type in ("requested_attributes", "requested_predicates"): for (reft, req_item) in indy_proof_req[req_item_type].items(): interval = req_item.get( "non_revoked", indy_proof_req.get("non_revoked"), ) if interval: fro = interval.get("from") to = interval.get("to") if (to is not None) and fro == to: interval["from"] = 0 # accommodate indy-sdk verify=False if fro=to non_revoc_intervals[reft] = interval return non_revoc_intervals