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

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


from .....holder.base import BaseHolder

from ..messages.inner.presentation_preview import PresentationPreview


[docs]async def indy_proof_req_preview2indy_requested_creds( indy_proof_request: dict, preview: PresentationPreview = None, *, holder: BaseHolder ): """ 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_request: 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 in indy_proof_request["requested_attributes"]: credentials = await holder.get_credentials_for_presentation_request_by_referent( presentation_request=indy_proof_request, referents=(referent,), start=0, count=100, ) if not credentials: raise ValueError( f"Could not automatically construct presentation for " + f"presentation request {indy_proof_request['name']}" + f":{indy_proof_request['version']} because referent " + f"{referent} did not produce any credentials." ) # match returned creds against any preview values if len(credentials) == 1: cred_id = credentials[0]["cred_info"]["referent"] else: if preview: for cred in sorted( credentials, key=lambda c: c["cred_info"]["referent"] ): name = indy_proof_request["requested_attributes"][referent]["name"] value = cred["cred_info"]["attrs"][name] if preview.has_attr_spec( cred_def_id=cred["cred_info"]["cred_def_id"], name=name, value=value, ): cred_id = cred["cred_info"]["referent"] break else: raise ValueError( f"Could not automatically construct presentation for " + f"presentation request {indy_proof_request['name']}" + f":{indy_proof_request['version']} because referent " + f"{referent} did not produce any credentials matching " + f"proposed preview." ) else: cred_id = min(cred["cred_info"]["referent"] for cred in credentials) req_creds["requested_attributes"][referent] = { "cred_id": cred_id, "revealed": True, # TODO allow specification of unrevealed attrs? } for referent in indy_proof_request["requested_predicates"]: credentials = await holder.get_credentials_for_presentation_request_by_referent( presentation_request=indy_proof_request, referents=(referent,), start=0, count=100, ) if not credentials: raise ValueError( f"Could not automatically construct presentation for " + f"presentation request {indy_proof_request['name']}" + f":{indy_proof_request['version']} because predicate " + f"referent {referent} did not produce any credentials." ) if len(credentials) == 1: cred_id = credentials[0]["cred_info"]["referent"] else: cred_id = min(cred["cred_info"]["referent"] for cred in credentials) req_creds["requested_predicates"][referent] = { "cred_id": cred_id, "revealed": True, # TODO allow specification of unrevealed attrs? } return req_creds