From a6a84d32bc133ee374ecbea14f300bd12e899b7f 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 052f1fc8ec8c74744ac6ce5e4f2aa6266e2fc15f 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 567985d1495950335ee7365c0587241f55280923 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 393bcaecf..dccd46fde 100644 --- a/requirements/all.txt +++ b/requirements/all.txt @@ -123,7 +123,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 2032e0c6e..644d0a861 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 d6605137c..fc2be2bf2 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -49,7 +49,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==4.2.20 # via diff --git a/requirements/dev.txt b/requirements/dev.txt index dbae71a31..f7b2b1198 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -98,7 +98,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 7e3207ef0..05d2060ea 100644 --- a/requirements/production.txt +++ b/requirements/production.txt @@ -75,7 +75,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==4.2.20 # via diff --git a/requirements/test.txt b/requirements/test.txt index 0fd33d225..3dbace1af 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -91,7 +91,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