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 vcdm 2.0 model and context #3436

Draft
wants to merge 4 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions acapy_agent/messaging/valid.py
Original file line number Diff line number Diff line change
Expand Up @@ -875,8 +875,11 @@ def __call__(self, value):
class CredentialContext(Validator):
"""Credential Context."""

FIRST_CONTEXT = "https://www.w3.org/2018/credentials/v1"
EXAMPLE = [FIRST_CONTEXT, "https://www.w3.org/2018/credentials/examples/v1"]
FIRST_CONTEXT = [
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps rename to a VALID_CONTEXTS?

"https://www.w3.org/2018/credentials/v1",
"https://www.w3.org/ns/credentials/v2",
]
EXAMPLE = [FIRST_CONTEXT[0], "https://www.w3.org/2018/credentials/examples/v1"]

def __init__(self) -> None:
"""Initialize the instance."""
Expand All @@ -886,9 +889,9 @@ def __call__(self, value):
"""Validate input value."""
length = len(value)

if length < 1 or value[0] != CredentialContext.FIRST_CONTEXT:
if length < 1 or value[0] not in CredentialContext.FIRST_CONTEXT:
raise ValidationError(
f"First context must be {CredentialContext.FIRST_CONTEXT}"
f"First context must be one of {CredentialContext.FIRST_CONTEXT}"
)

return value
Comment on lines 889 to 897
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If value is None, there would be a TypeError.

Probably worth asserting that value is of expected type before calling len or [0].
(because a dev could try call with a string, and get unclear error message).

Something like:

    def __call__(self, value: List[str]) -> List[str]:
        """Validate input value."""
        if not isinstance(value, list):
            raise ValidationError("Value must be a non-empty list.")

        if not value or value[0] not in CredentialContext.FIRST_CONTEXT:
            raise ValidationError(
                f"First context must be one of {CredentialContext.FIRST_CONTEXT}"
            )

        return value

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
TEST_DID_SOV = "did:sov:LjgpST2rjsoxYegQDRm7EL"
TEST_DID_KEY = "did:key:z6Mkgg342Ycpuk263R9d8Aq6MUaxPn1DDeHyGo38EefXmgDL"

LD_PROOF_VC_DETAIL = {
"credential": {
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://www.w3.org/2018/credentials/examples/v1",
],
"type": ["VerifiableCredential", "UniversityDegreeCredential"],
"credentialSubject": {"test": "key"},
"issuanceDate": "2021-04-12",
"issuer": TEST_DID_KEY,
},
"options": {
"proofType": "Ed25519Signature2018",
"created": "2019-12-11T03:50:55",
},
}
LD_PROOF_VC_DETAIL_BBS = {
"credential": {
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://www.w3.org/2018/credentials/examples/v1",
],
"type": ["VerifiableCredential", "UniversityDegreeCredential"],
"credentialSubject": {"test": "key"},
"issuanceDate": "2021-04-12",
"issuer": TEST_DID_KEY,
},
"options": {
"proofType": "BbsBlsSignature2020",
"created": "2019-12-11T03:50:55",
},
}
LD_PROOF_VC_DETAIL_ED25519_2020 = {
"credential": {
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://www.w3.org/2018/credentials/examples/v1",
],
"type": ["VerifiableCredential", "UniversityDegreeCredential"],
"credentialSubject": {"test": "key"},
"issuanceDate": "2021-04-12",
"issuer": TEST_DID_KEY,
},
"options": {
"proofType": "Ed25519Signature2020",
"created": "2019-12-11T03:50:55",
},
}
LD_PROOF_VC = {
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://www.w3.org/2018/credentials/examples/v1",
],
"type": ["VerifiableCredential", "UniversityDegreeCredential"],
"credentialSubject": {"test": "key"},
"issuanceDate": "2021-04-12",
"issuer": TEST_DID_KEY,
"proof": {
"proofPurpose": "assertionMethod",
"created": "2019-12-11T03:50:55",
"type": "Ed25519Signature2018",
"verificationMethod": "did:key:z6Mkgg342Ycpuk263R9d8Aq6MUaxPn1DDeHyGo38EefXmgDL#z6Mkgg342Ycpuk263R9d8Aq6MUaxPn1DDeHyGo38EefXmgDL",
"jws": "eyJhbGciOiAiRWREU0EiLCAiYjY0IjogZmFsc2UsICJjcml0IjogWyJiNjQiXX0..Q6amIrxGiSbM7Ce6DxlfwLCjVcYyclas8fMxaecspXFUcFW9DAAxKzgHx93FWktnlZjM_biitkMgZdStgvivAQ",
},
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,75 +43,12 @@
from ..handler import LOGGER as LD_PROOF_LOGGER
from ..handler import LDProofCredFormatHandler
from ..models.cred_detail import LDProofVCDetail

TEST_DID_SOV = "did:sov:LjgpST2rjsoxYegQDRm7EL"
TEST_DID_KEY = "did:key:z6Mkgg342Ycpuk263R9d8Aq6MUaxPn1DDeHyGo38EefXmgDL"

LD_PROOF_VC_DETAIL = {
"credential": {
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://www.w3.org/2018/credentials/examples/v1",
],
"type": ["VerifiableCredential", "UniversityDegreeCredential"],
"credentialSubject": {"test": "key"},
"issuanceDate": "2021-04-12",
"issuer": TEST_DID_KEY,
},
"options": {
"proofType": "Ed25519Signature2018",
"created": "2019-12-11T03:50:55",
},
}
LD_PROOF_VC_DETAIL_BBS = {
"credential": {
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://www.w3.org/2018/credentials/examples/v1",
],
"type": ["VerifiableCredential", "UniversityDegreeCredential"],
"credentialSubject": {"test": "key"},
"issuanceDate": "2021-04-12",
"issuer": TEST_DID_KEY,
},
"options": {
"proofType": "BbsBlsSignature2020",
"created": "2019-12-11T03:50:55",
},
}
LD_PROOF_VC_DETAIL_ED25519_2020 = {
"credential": {
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://www.w3.org/2018/credentials/examples/v1",
],
"type": ["VerifiableCredential", "UniversityDegreeCredential"],
"credentialSubject": {"test": "key"},
"issuanceDate": "2021-04-12",
"issuer": TEST_DID_KEY,
},
"options": {
"proofType": "Ed25519Signature2020",
"created": "2019-12-11T03:50:55",
},
}
LD_PROOF_VC = {
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://www.w3.org/2018/credentials/examples/v1",
],
"type": ["VerifiableCredential", "UniversityDegreeCredential"],
"credentialSubject": {"test": "key"},
"issuanceDate": "2021-04-12",
"issuer": TEST_DID_KEY,
"proof": {
"proofPurpose": "assertionMethod",
"created": "2019-12-11T03:50:55",
"type": "Ed25519Signature2018",
"verificationMethod": "did:key:z6Mkgg342Ycpuk263R9d8Aq6MUaxPn1DDeHyGo38EefXmgDL#z6Mkgg342Ycpuk263R9d8Aq6MUaxPn1DDeHyGo38EefXmgDL",
"jws": "eyJhbGciOiAiRWREU0EiLCAiYjY0IjogZmFsc2UsICJjcml0IjogWyJiNjQiXX0..Q6amIrxGiSbM7Ce6DxlfwLCjVcYyclas8fMxaecspXFUcFW9DAAxKzgHx93FWktnlZjM_biitkMgZdStgvivAQ",
},
}
from .fixtures import (
LD_PROOF_VC_DETAIL,
LD_PROOF_VC_DETAIL_BBS,
LD_PROOF_VC_DETAIL_ED25519_2020,
LD_PROOF_VC,
)


class TestV20LDProofCredFormatHandler(IsolatedAsyncioTestCase):
Expand Down Expand Up @@ -166,7 +103,7 @@ async def test_validate_fields(self):

incorrect_detail = {
**LD_PROOF_VC_DETAIL,
"credential": {**LD_PROOF_VC_DETAIL["credential"], "issuanceDate": None},
"credential": {**LD_PROOF_VC_DETAIL["credential"], "credentialSubject": None},
}

# test incorrect proposal
Expand All @@ -184,8 +121,7 @@ async def test_validate_fields(self):
# test incorrect cred
with self.assertRaises(ValidationError):
incorrect_cred = LD_PROOF_VC.copy()
incorrect_cred.pop("issuanceDate")

incorrect_cred.pop("credentialSubject")
self.handler.validate_fields(CRED_20_ISSUE, incorrect_cred)

async def test_get_ld_proof_detail_record(self):
Expand Down
1 change: 1 addition & 0 deletions acapy_agent/vc/ld_proofs/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
SECURITY_CONTEXT_URL = SECURITY_CONTEXT_V2_URL
DID_V1_CONTEXT_URL = "https://www.w3.org/ns/did/v1"
CREDENTIALS_CONTEXT_V1_URL = "https://www.w3.org/2018/credentials/v1"
CREDENTIALS_CONTEXT_V2_URL = "https://www.w3.org/ns/credentials/v2"
SECURITY_CONTEXT_BBS_URL = "https://w3id.org/security/bbs/v1"
SECURITY_CONTEXT_ED25519_2020_URL = "https://w3id.org/security/suites/ed25519-2020/v1"

Expand Down
1 change: 1 addition & 0 deletions acapy_agent/vc/ld_proofs/document_downloader.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ class StaticCacheJsonLdDownloader:

CONTEXT_FILE_MAPPING = {
"https://www.w3.org/2018/credentials/v1": "credentials_context.jsonld",
"https://www.w3.org/ns/credentials/v2": "credentials_v2_context.jsonld",
"https://w3id.org/vc/status-list/2021/v1": "status_list_context.jsonld",
"https://www.w3.org/ns/did/v1": "did_documents_context.jsonld",
"https://w3id.org/security/v1": "security-v1-context.jsonld",
Expand Down
Loading
Loading