Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add anoncreds issuance and presentation format #3331

Merged
merged 16 commits into from
Nov 22, 2024
Merged
Prev Previous commit
Next Next commit
Fix/update BDD tests
Signed-off-by: jamshale <jamiehalebc@gmail.com>
  • Loading branch information
jamshale committed Nov 22, 2024
commit 240ca19d8d46d053503269826263fb2f997dfdc5
4 changes: 4 additions & 0 deletions demo/bdd_support/agent_backchannel_client.py
Original file line number Diff line number Diff line change
@@ -143,11 +143,13 @@ def aries_container_issue_credential(
the_container: AgentContainer,
cred_def_id: str,
cred_attrs: list,
filter_type: str = "indy",
):
return run_coroutine(
the_container.issue_credential,
cred_def_id,
cred_attrs,
filter_type=filter_type,
)


@@ -167,11 +169,13 @@ def aries_container_request_proof(
the_container: AgentContainer,
proof_request: dict,
explicit_revoc_required: bool = False,
is_anoncreds: bool = False,
):
return run_coroutine(
the_container.request_proof,
proof_request,
explicit_revoc_required=explicit_revoc_required,
is_anoncreds=is_anoncreds,
)


5 changes: 2 additions & 3 deletions demo/features/steps/0453-issue-credential.py
Original file line number Diff line number Diff line change
@@ -62,10 +62,9 @@ def step_impl(context, issuer, credential_data):
agent = context.active_agents[issuer]

cred_attrs = read_credential_data(context.schema_name, credential_data)
filter_type = "indy" if not is_anoncreds(agent) else "anoncreds"
cred_exchange = aries_container_issue_credential(
agent["agent"],
context.cred_def_id,
cred_attrs,
agent["agent"], context.cred_def_id, cred_attrs, filter_type
)

context.cred_attrs = cred_attrs
11 changes: 9 additions & 2 deletions demo/features/steps/0454-present-proof.py
Original file line number Diff line number Diff line change
@@ -34,7 +34,11 @@ def step_impl(context, verifier, request_for_proof, prover):
"restrictions"
] = cred_def_restrictions

proof_exchange = aries_container_request_proof(agent["agent"], proof_request_info)
proof_exchange = aries_container_request_proof(
agent["agent"],
proof_request_info,
agent["agent"].wallet_type == "askar-anoncreds",
)

context.proof_request = proof_request_info
context.proof_exchange = proof_exchange
@@ -49,7 +53,10 @@ def step_impl(context, verifier, request_for_proof, prover):
proof_request_info = read_proof_req_data(request_for_proof)

proof_exchange = aries_container_request_proof(
agent["agent"], proof_request_info, explicit_revoc_required=True
agent["agent"],
proof_request_info,
explicit_revoc_required=True,
is_anoncreds=agent["agent"].wallet_type == "askar-anoncreds",
)

context.proof_request = proof_request_info
3 changes: 0 additions & 3 deletions demo/features/upgrade.feature
Original file line number Diff line number Diff line change
@@ -19,10 +19,7 @@ Feature: ACA-Py Anoncreds Upgrade
Then "Faber" has the proof verification fail
Then "Bob" can verify the credential from "<issuer>" was revoked
And "<issuer>" upgrades the wallet to anoncreds
And "Bob" has an issued <Schema_name> credential <Credential_data> from "<issuer>"
And "Bob" upgrades the wallet to anoncreds
And "Bob" has an issued <Schema_name> credential <Credential_data> from "<issuer>"
When "Faber" sends a request for proof presentation <Proof_request> to "Bob"

Examples:
| issuer | Acme_capabilities | Bob_capabilities | Schema_name | Credential_data | Proof_request |
36 changes: 19 additions & 17 deletions demo/runners/agent_container.py
Original file line number Diff line number Diff line change
@@ -474,8 +474,6 @@ async def handle_present_proof_v2_0(self, message):
"indy"
) or pres_request_by_format.get("anoncreds")

print("****************************")
print(pres_request_by_format)
pres_request_dif = pres_request_by_format.get("dif")
request = {}

@@ -1077,11 +1075,13 @@ async def receive_credential(

return matched

async def request_proof(self, proof_request, explicit_revoc_required: bool = False):
async def request_proof(
self, proof_request, explicit_revoc_required: bool = False, is_anoncreds=False
):
log_status("#20 Request proof of degree from alice")

if self.cred_type in [CRED_FORMAT_ANONCREDS, CRED_FORMAT_INDY, CRED_FORMAT_VC_DI]:
indy_proof_request = {
proof_request = {
"name": (
proof_request["name"] if "name" in proof_request else "Proof of stuff"
),
@@ -1097,24 +1097,24 @@ async def request_proof(self, proof_request, explicit_revoc_required: bool = Fal
# plug in revocation where requested in the supplied proof request
non_revoked = {"to": int(time.time())}
if "non_revoked" in proof_request:
indy_proof_request["non_revoked"] = non_revoked
proof_request["non_revoked"] = non_revoked
non_revoked_supplied = True
for attr in proof_request["requested_attributes"]:
if "non_revoked" in proof_request["requested_attributes"][attr]:
indy_proof_request["requested_attributes"][attr][
"non_revoked"
] = non_revoked
proof_request["requested_attributes"][attr]["non_revoked"] = (
non_revoked
)
non_revoked_supplied = True
for pred in proof_request["requested_predicates"]:
if "non_revoked" in proof_request["requested_predicates"][pred]:
indy_proof_request["requested_predicates"][pred][
"non_revoked"
] = non_revoked
proof_request["requested_predicates"][pred]["non_revoked"] = (
non_revoked
)
non_revoked_supplied = True

if not non_revoked_supplied and not explicit_revoc_required:
# else just make it global
indy_proof_request["non_revoked"] = non_revoked
proof_request["non_revoked"] = non_revoked

else:
# make sure we are not leaking non-revoc requests
@@ -1127,13 +1127,16 @@ async def request_proof(self, proof_request, explicit_revoc_required: bool = Fal
if "non_revoked" in proof_request["requested_predicates"][pred]:
del proof_request["requested_predicates"][pred]["non_revoked"]

log_status(f" >>> asking for proof for request: {indy_proof_request}")
log_status(f" >>> asking for proof for request: {proof_request}")

if is_anoncreds:
presentation_request = {"anoncreds": proof_request}
else:
presentation_request = {"indy": proof_request}

proof_request_web_request = {
"connection_id": self.agent.connection_id,
"presentation_request": {
"indy": indy_proof_request,
},
"presentation_request": presentation_request,
"trace": self.exchange_tracing,
}
proof_exchange = await self.agent.admin_POST(
@@ -1144,7 +1147,6 @@ async def request_proof(self, proof_request, explicit_revoc_required: bool = Fal

elif self.cred_type == CRED_FORMAT_JSON_LD:
# TODO create and send the json-ld proof request
pass
return None

else: