Skip to content
Merged
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
12 changes: 11 additions & 1 deletion .github/workflows/cd-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,17 @@ jobs:
fi
echo "tag=$TAG" >> $GITHUB_OUTPUT

- name: Ensure tag exists for changelog generation
env:
TAG: ${{ steps.tag.outputs.tag }}
run: |
if ! git rev-parse "$TAG" >/dev/null 2>&1; then
git tag "$TAG"
echo "Created lightweight tag $TAG at $(git rev-parse HEAD)"
else
echo "Tag $TAG already exists"
fi

- name: Generate changelog
id: changelog
uses: orhun/git-cliff-action@v4
Expand All @@ -60,7 +71,6 @@ jobs:
env:
OUTPUT: CHANGELOG.md
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
continue-on-error: true

- name: Create GitHub Release
uses: softprops/action-gh-release@v3
Expand Down
2 changes: 1 addition & 1 deletion docs/credentials/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ All credentials follow the W3C Verifiable Credentials Data Model v2.0 with three
"type": "<subject-type>",
"harbourCredential": "<harbour-gx-credential-urn>"
},
"credentialStatus": [{"type": "harbour:CRSetEntry", "statusPurpose": "revocation"}],
"credentialStatus": [{"type": "harbour:CRSetEntry", "statusPurpose": "revocation", "statusServiceOperator": "<crset-operator-did>", "statusIndex": "<index>"}],
"evidence": [{"type": ["harbour:CredentialEvidence"], "verifiablePresentation": "..."}]
}
```
Expand Down
5 changes: 3 additions & 2 deletions examples/simpulseid-administrator-credential.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,10 @@
},
"credentialStatus": [
{
"id": "did:ethr:0x14a34:0x4612FbF84Ef87dfBc363c6077235A475502346d1/f8b8a8150acbbbf936df9692ed7ca809c9a6a66b190149ce9d4e9557587829ec",
"type": "harbour:CRSetEntry",
"statusPurpose": "revocation"
"statusPurpose": "revocation",
"statusServiceOperator": "did:ethr:0x14a34:0x4612FbF84Ef87dfBc363c6077235A475502346d1",
"statusIndex": "f8b8a8150acbbbf936df9692ed7ca809c9a6a66b190149ce9d4e9557587829ec"
}
],
"evidence": [
Expand Down
5 changes: 3 additions & 2 deletions examples/simpulseid-ascs-base-membership-credential.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,10 @@
},
"credentialStatus": [
{
"id": "did:ethr:0x14a34:0x4612FbF84Ef87dfBc363c6077235A475502346d1/6239c5abac53d33fff4a9babaaae70f6c71ac495cface74d26ac1e3affee8c61",
"type": "harbour:CRSetEntry",
"statusPurpose": "revocation"
"statusPurpose": "revocation",
"statusServiceOperator": "did:ethr:0x14a34:0x4612FbF84Ef87dfBc363c6077235A475502346d1",
"statusIndex": "6239c5abac53d33fff4a9babaaae70f6c71ac495cface74d26ac1e3affee8c61"
}
],
"evidence": [
Expand Down
5 changes: 3 additions & 2 deletions examples/simpulseid-ascs-envited-membership-credential.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,10 @@
},
"credentialStatus": [
{
"id": "did:ethr:0x14a34:0x4612FbF84Ef87dfBc363c6077235A475502346d1/b8ca800e6cf1807ed35c682ca7c84f07df55ad53a20784fe0ee896f279a6a047",
"type": "harbour:CRSetEntry",
"statusPurpose": "revocation"
"statusPurpose": "revocation",
"statusServiceOperator": "did:ethr:0x14a34:0x4612FbF84Ef87dfBc363c6077235A475502346d1",
"statusIndex": "b8ca800e6cf1807ed35c682ca7c84f07df55ad53a20784fe0ee896f279a6a047"
}
],
"evidence": [
Expand Down
5 changes: 3 additions & 2 deletions examples/simpulseid-participant-credential.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,10 @@
},
"credentialStatus": [
{
"id": "did:ethr:0x14a34:0x4612FbF84Ef87dfBc363c6077235A475502346d1/608101d3a8430e61f60dcf1be0f42ab3ceb52b6abffb9f75b6f36c80362fc25a",
"type": "harbour:CRSetEntry",
"statusPurpose": "revocation"
"statusPurpose": "revocation",
"statusServiceOperator": "did:ethr:0x14a34:0x4612FbF84Ef87dfBc363c6077235A475502346d1",
"statusIndex": "608101d3a8430e61f60dcf1be0f42ab3ceb52b6abffb9f75b6f36c80362fc25a"
}
],
"evidence": [
Expand Down
5 changes: 3 additions & 2 deletions examples/simpulseid-user-credential.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,10 @@
},
"credentialStatus": [
{
"id": "did:ethr:0x14a34:0x4612FbF84Ef87dfBc363c6077235A475502346d1/9396f1d42a2a5eaa93a1a3211e4b0db85c8185d533b835984cd98d24ecba6440",
"type": "harbour:CRSetEntry",
"statusPurpose": "revocation"
"statusPurpose": "revocation",
"statusServiceOperator": "did:ethr:0x14a34:0x4612FbF84Ef87dfBc363c6077235A475502346d1",
"statusIndex": "9396f1d42a2a5eaa93a1a3211e4b0db85c8185d533b835984cd98d24ecba6440"
}
],
"evidence": [
Expand Down
13 changes: 8 additions & 5 deletions tests/test_examples_integrity.py
Original file line number Diff line number Diff line change
Expand Up @@ -352,13 +352,16 @@ def test_base_membership_credential_resolves(path):

@pytest.mark.parametrize("path", EXAMPLE_FILES, ids=[f.stem for f in EXAMPLE_FILES])
def test_credential_status_registry_resolves(path):
"""credentialStatus id prefix must match the revocation registry DID."""
"""credentialStatus statusServiceOperator must match the revocation registry DID."""
vc = json.loads(path.read_text())
for status in vc.get("credentialStatus", []):
status_id = status.get("id", "")
assert status_id.startswith(REVOCATION_REGISTRY_DID), (
f"credentialStatus id '{status_id}' in {path.name} does not start "
f"with revocation registry DID {REVOCATION_REGISTRY_DID}"
operator = status.get("statusServiceOperator", "")
assert operator == REVOCATION_REGISTRY_DID, (
f"credentialStatus statusServiceOperator '{operator}' in {path.name} "
f"does not match revocation registry DID {REVOCATION_REGISTRY_DID}"
)
assert status.get("statusIndex"), (
f"credentialStatus in {path.name} is missing statusIndex"
)
assert REVOCATION_REGISTRY_DID in DID_DOCS, (
f"Revocation registry DID {REVOCATION_REGISTRY_DID} has no DID document."
Expand Down
Loading