From 433e8f502945f0bd67f4a82a20b7d21cb6b6baca Mon Sep 17 00:00:00 2001 From: Glib Glugovskiy Date: Sat, 31 Jan 2026 00:56:40 +0200 Subject: [PATCH 1/3] fix(VC): use URL safe encoding for the status list (#2948) Update Base64 encoding to the URL-safe format that is supported by the latest versions of the LC wallet. --- .../apps/verifiable_credentials/composition/status_list.py | 2 +- .../composition/tests/test_status_list.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/credentials/apps/verifiable_credentials/composition/status_list.py b/credentials/apps/verifiable_credentials/composition/status_list.py index 53385b9a3..99dddef3c 100644 --- a/credentials/apps/verifiable_credentials/composition/status_list.py +++ b/credentials/apps/verifiable_credentials/composition/status_list.py @@ -155,5 +155,5 @@ def regenerate_encoded_status_sequence(issuer_id): status_list[index] = 1 gzip_data = gzip.compress(status_list) - base64_data = base64.b64encode(gzip_data) + base64_data = base64.urlsafe_b64encode(gzip_data).rstrip(b"=") return base64_data.decode("utf-8") diff --git a/credentials/apps/verifiable_credentials/composition/tests/test_status_list.py b/credentials/apps/verifiable_credentials/composition/tests/test_status_list.py index 483fc693b..12eacd5ff 100644 --- a/credentials/apps/verifiable_credentials/composition/tests/test_status_list.py +++ b/credentials/apps/verifiable_credentials/composition/tests/test_status_list.py @@ -25,7 +25,9 @@ def setUp(self): def test_regenerate_encoded_status_sequence(self, mock_get_revoked_indices): mock_get_revoked_indices.return_value = [1, 3, 5] result = regenerate_encoded_status_sequence("test") - decoded_data = base64.b64decode(result) + # Add padding back for urlsafe_b64decode + padded_result = result + "=" * (-len(result) % 4) + decoded_data = base64.urlsafe_b64decode(padded_result) decompressed_data = gzip.decompress(decoded_data) status_list = bytearray(decompressed_data) From f7810ca83b760ce93e52d83910f8261527656954 Mon Sep 17 00:00:00 2001 From: Glib Glugovskiy Date: Thu, 26 Feb 2026 10:54:43 +0200 Subject: [PATCH 2/3] fix(vc): update obv3 achievement id format to urn compatible --- .../apps/verifiable_credentials/composition/open_badges.py | 2 +- .../composition/tests/test_open_badges.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/credentials/apps/verifiable_credentials/composition/open_badges.py b/credentials/apps/verifiable_credentials/composition/open_badges.py index 3ac84788a..82beffa85 100644 --- a/credentials/apps/verifiable_credentials/composition/open_badges.py +++ b/credentials/apps/verifiable_credentials/composition/open_badges.py @@ -18,7 +18,7 @@ class AchievementSchema(serializers.Serializer): # pylint: disable=abstract-met TYPE = "Achievement" - id = serializers.CharField(source="user_credential.uuid") + id = serializers.UUIDField(source="user_credential.uuid", format="urn") type = serializers.CharField(default=TYPE) name = serializers.CharField(source="credential_name") description = serializers.CharField(source="credential_description") diff --git a/credentials/apps/verifiable_credentials/composition/tests/test_open_badges.py b/credentials/apps/verifiable_credentials/composition/tests/test_open_badges.py index 517c0e561..f575a739c 100644 --- a/credentials/apps/verifiable_credentials/composition/tests/test_open_badges.py +++ b/credentials/apps/verifiable_credentials/composition/tests/test_open_badges.py @@ -82,7 +82,7 @@ def test_credential_subject_achievement_id(self, program_issuance_line): """ Credential Subject Achievement `id` property. """ - expected_id = str(program_issuance_line.user_credential.uuid) + expected_id = f"urn:uuid:{program_issuance_line.user_credential.uuid}" composed_obv3 = OpenBadgesDataModel(program_issuance_line).data From 9aa0bb03ce410848852eaf875c4471b3372e1f30 Mon Sep 17 00:00:00 2001 From: Glib Glugovskiy Date: Wed, 1 Apr 2026 16:16:09 +0200 Subject: [PATCH 3/3] chore(vc): update didkit package to openedx fork (#2976) - openedx-didkit is a drop-in replacement for the didkit-python package and does not require any changes to the application code. - The forked version has updated the DIDKit Core Rust library with added VCv2 support and provides pre-built wheels for all Python versions >= 3.10. --- requirements/all.txt | 2 +- requirements/base.in | 2 +- requirements/base.txt | 2 +- requirements/dev.txt | 2 +- requirements/production.txt | 2 +- requirements/test.txt | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/requirements/all.txt b/requirements/all.txt index 2dd5cc4d1..5226086f0 100644 --- a/requirements/all.txt +++ b/requirements/all.txt @@ -128,7 +128,7 @@ defusedxml==0.7.1 # -r requirements/production.txt # python3-openid # social-auth-core -didkit==0.3.3 +openedx-didkit==0.3.5 # via # -r requirements/dev.txt # -r requirements/production.txt diff --git a/requirements/base.in b/requirements/base.in index 09587436d..62430f821 100644 --- a/requirements/base.in +++ b/requirements/base.in @@ -11,7 +11,7 @@ bleach coreapi -didkit +openedx-didkit django django-config-models # Configuration models for Django allowing config management with auditing django-cors-headers diff --git a/requirements/base.txt b/requirements/base.txt index 348bd5264..b4696c0d3 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -52,7 +52,7 @@ defusedxml==0.7.1 # via # python3-openid # social-auth-core -didkit==0.3.3 +openedx-didkit==0.3.5 # via -r requirements/base.in django==5.2.7 # via diff --git a/requirements/dev.txt b/requirements/dev.txt index 1cb6059a6..401c7c4de 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -102,7 +102,7 @@ defusedxml==0.7.1 # -r requirements/test.txt # python3-openid # social-auth-core -didkit==0.3.3 +openedx-didkit==0.3.5 # via -r requirements/test.txt dill==0.4.0 # via diff --git a/requirements/production.txt b/requirements/production.txt index f87ae7728..b53c2b904 100644 --- a/requirements/production.txt +++ b/requirements/production.txt @@ -80,7 +80,7 @@ defusedxml==0.7.1 # -r requirements/base.txt # python3-openid # social-auth-core -didkit==0.3.3 +openedx-didkit==0.3.5 # via -r requirements/base.txt django==5.2.7 # via diff --git a/requirements/test.txt b/requirements/test.txt index 507325554..816bbb054 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -96,7 +96,7 @@ defusedxml==0.7.1 # -r requirements/base.txt # python3-openid # social-auth-core -didkit==0.3.3 +openedx-didkit==0.3.5 # via -r requirements/base.txt dill==0.4.0 # via pylint