Added verify_presentation bindings and use them in verification_portal backend

This commit is contained in:
Daniel Armengod 2023-11-27 07:42:12 +01:00
parent 2c4dca40b7
commit 8566098f2c
2 changed files with 43 additions and 1 deletions

View File

@ -2,6 +2,8 @@ import json
from django.core.mail import send_mail from django.core.mail import send_mail
from django.http import HttpResponse, HttpResponseRedirect from django.http import HttpResponse, HttpResponseRedirect
from utils.idhub_ssikit import verify_presentation
from .models import VPVerifyRequest from .models import VPVerifyRequest
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from more_itertools import flatten, unique_everseen from more_itertools import flatten, unique_everseen
@ -9,7 +11,10 @@ from more_itertools import flatten, unique_everseen
def verify(request): def verify(request):
assert request.method == "POST" assert request.method == "POST"
# TODO: use request.POST["presentation_submission"] # TODO: incorporate request.POST["presentation_submission"] as schema definition
(presentation_valid, _) = verify_presentation(request.POST["vp_token"])
if not presentation_valid:
raise Exception("Failed to verify signature on the given Verifiable Presentation.")
vp = json.loads(request.POST["vp_token"]) vp = json.loads(request.POST["vp_token"])
nonce = vp["nonce"] nonce = vp["nonce"]
# "vr" = verification_request # "vr" = verification_request

View File

@ -72,3 +72,40 @@ def verify_credential(vc, proof_options):
return didkit.verify_credential(vc, proof_options) return didkit.verify_credential(vc, proof_options)
return asyncio.run(inner()) return asyncio.run(inner())
def issue_verifiable_presentation(vc_list: list[str], jwk_holder: str, holder_did: str) -> str:
async def inner():
unsigned_vp = unsigned_vp_template.render(data)
signed_vp = await didkit.issue_presentation(
unsigned_vp,
'{"proofFormat": "ldp"}',
jwk_holder
)
return signed_vp
# TODO: convert from Jinja2 -> django-templates
env = Environment(
loader=FileSystemLoader("vc_templates"),
autoescape=select_autoescape()
)
unsigned_vp_template = env.get_template("verifiable_presentation.json")
data = {
"holder_did": holder_did,
"verifiable_credential_list": "[" + ",".join(vc_list) + "]"
}
return asyncio.run(inner())
def verify_presentation(vp):
"""
Returns a (bool, str) tuple indicating whether the credential is valid.
If the boolean is true, the credential is valid and the second argument can be ignored.
If it is false, the VC is invalid and the second argument contains a JSON object with further information.
"""
async def inner():
proof_options = '{"proofFormat": "ldp"}'
return didkit.verify_presentation(vp, proof_options)
return asyncio.run(inner())