diff --git a/index.html b/index.html index 3cc8d9a..3a4fd54 100644 --- a/index.html +++ b/index.html @@ -229,32 +229,32 @@

Introduction

Conceptual Framework

- This section outlines the core concept utilized by the status list - mechanism described in this document. At the most basic level, status - information for all verifiable credentials issued by an issuer - are expressed as simple binary values. The issuer keeps a bitstring - list of all verifiable credentials it has issued. Each - verifiable credential is associated with a position in the list. If - the binary value of the position in the list is 1 (one), the - verifiable credential is revoked, if it is 0 (zero) it is not revoked. +This section outlines the core concept utilized by the status list +mechanism described in this document. At the most basic level, status +information for all verifiable credentials issued by an issuer +are expressed as simple binary values. The issuer keeps a bitstring +list of all verifiable credentials it has issued. Each +verifiable credential is associated with a position in the list. If +the binary value of the position in the list is 1 (one), the +verifiable credential is revoked, if it is 0 (zero) it is not revoked.

- One of the benefits of using a bitstring is that it is a highly compressible - data format since, in the average case, large numbers of credentials will - remain unrevoked. This will ensure long sections of bits that are the same - value and thus highly compressible using run-length compression techniques - such as GZIP [[RFC1952]]. The default bitstring size is 16KB (131,072 entries), - and when only a handful of verifiable credentials are revoked, the - compressed bitstring size is reduced down to a few hundred bytes. +One of the benefits of using a bitstring is that it is a highly compressible +data format since, in the average case, large numbers of credentials will +remain unrevoked. This will ensure long sections of bits that are the same +value and thus highly compressible using run-length compression techniques +such as GZIP [[RFC1952]]. The default bitstring size is 16KB (131,072 entries), +and when only a handful of verifiable credentials are revoked, the +compressed bitstring size is reduced down to a few hundred bytes.

- Another benefit of using a bitstring is that it enables large numbers of - verifiable credential statuses to be placed in the same list. - This specification utilizes a minimum bitstring length of 131,072 (16KB). This - population size ensures an adequate amount of herd privacy in the average case. - If better herd privacy is required, the bitstring can be made to be larger. +Another benefit of using a bitstring is that it enables large numbers of +verifiable credential statuses to be placed in the same list. +This specification utilizes a minimum bitstring length of 131,072 (16KB). This +population size ensures an adequate amount of herd privacy in the average case. +If better herd privacy is required, the bitstring can be made to be larger.

@@ -310,15 +310,15 @@

BitstringStatusListEntry

id -An optional identifier for the status list entry. The constraints on the -`id` property are listed in the Verifiable Credentials Data Model -specification [[VC-DATA-MODEL]]. If present, the value is expected to be a URL -that identifies the status information associated with the verifiable -credential. It MUST NOT be the URL for the status list. The value is -not used during the verification or validation process, and does not need to be -related to the `statusListCredential` value. If necessary, the value can be -used to uniquely identify the `BitstringStatusListEntry` object, such as when it is -stored in a database. +An optional identifier for the status list entry. The constraints on the `id` +property are listed in the Verifiable Credentials Data Model specification +[[VC-DATA-MODEL]]. If present, the value is expected to be a URL that identifies +the status information associated with the verifiable credential. It MUST +NOT be the URL for the status list. The value is not used during the +verification or validation process, and does not need to be related to the +`statusListCredential` value. If necessary, the value can be used to uniquely +identify the `BitstringStatusListEntry` object, such as when it is stored in a +database. @@ -503,9 +503,10 @@

BitstringStatusListCredential

`status` -Used to indicate a status message associated with a verifiable credential. -The status message descriptions MUST be defined in `credentialSubject.statusMessages`. -`credentialSubject.size` MUST be defined with this `statusPurpose`. +Used to indicate a status message associated with a verifiable +credential. The status message descriptions MUST be defined in +`credentialSubject.statusMessages`. `credentialSubject.size` MUST be defined +with this `statusPurpose`. @@ -528,33 +529,26 @@

BitstringStatusListCredential

+ credentialSubject.ttl - credentialSubject.ttl - - - The `ttl` indicates the "time to live" in milliseconds. - This property MAY be present. If not present, implementers MUST - use a value of `300000` for this property. A verifier - MUST NOT use a cached `BitstringStatusListCredential` that was - cached for more than the `ttl` duration prior to the - start of verification operation on a verifiable credential. - Implementations that publish the status list SHOULD align - any protocol-specific caching information, such as the - HTTP `Cache-Control` header, with the value in this field. +The `ttl` indicates the "time to live" in milliseconds. This property MAY be +present. If not present, implementers MUST use a value of `300000` for this +property. A verifier MUST NOT use a cached `BitstringStatusListCredential` that +was cached for more than the `ttl` duration prior to the start of verification +operation on a verifiable credential. Implementations that publish the +status list SHOULD align any protocol-specific caching information, such as the +HTTP `Cache-Control` header, with the value in this field. + credentialSubject.size - credentialSubject.size - - - The `size` indicates the size of the status entry in bits. - `size` MAY be provided. If `size` is not present - as a property of the `credentialStatus`, then `size` - MUST be processed as `1`. `size` MUST be an integer greater than zero. - If `size` is provided and is greater than `1`, then the property - `credentialStatus.statusMessages` MUST be present, and the number of - status messages must equal the number of possible values. +The `size` indicates the size of the status entry in bits. `size` MAY be +provided. If `size` is not present as a property of the `credentialStatus`, then +`size` MUST be processed as `1`. `size` MUST be an integer greater than zero. +If `size` is provided and is greater than `1`, then the property +`credentialStatus.statusMessages` MUST be present, and the number of status +messages must equal the number of possible values. @@ -562,43 +556,43 @@

BitstringStatusListCredential

credentialSubject.statusMessages - The `statusMessages` property MUST be an array. If present, - the length of the array must equal the number of possible status states - indicated by `size`. `statusMessages` MAY be present if - `size` is `1`. `statusMessages` MUST be present if - `size` is greater than `1`. If not present, the message value - associated with the bit value of `0` is "unset" and the bit - value of `1` is "set". - If present, elements in the `statusMessages` array MUST contain at - minimum two properties: +The `statusMessages` property MUST be an array. If present, +the length of the array must equal the number of possible status states +indicated by `size`. `statusMessages` MAY be present if +`size` is `1`. `statusMessages` MUST be present if +`size` is greater than `1`. If not present, the message value +associated with the bit value of `0` is "unset" and the bit +value of `1` is "set". +If present, elements in the `statusMessages` array MUST contain at +minimum two properties: - Implementers MAY add additional values to objects in the `statusMessages` - array. - Implementers MAY use the string value of `undefined` in the value - to indicate that a corresponding status is not defined for the associated - status value, but that it may be defined in the future. - Rules for how to handle various status messages are outside the scope of - normative requirements in this document, but it is assumed that implementers - will document rules for processing various status codes. +Implementers MAY add additional values to objects in the `statusMessages` array. +Implementers MAY use the string value of `undefined` in the value to indicate +that a corresponding status is not defined for the associated status value, but +that it may be defined in the future. Rules for how to handle various status +messages are outside the scope of normative requirements in this document, but +it is assumed that implementers will document rules for processing various +status codes. + credentialSubject.reference - credentialSubject.reference - - - The `reference` property provides a point for implementers to - include a [[URL]] to material related to the status. An implementer MAY include - the `reference` property, and if they do, the value MUST be a - [[URL]] or an array of URLs. Implementers using a `statusPurpose` of `status` - are strongly encouraged to provide a `reference`. +The `reference` property provides a point for implementers to include a [[URL]] +to material related to the status. An implementer MAY include the `reference` +property, and if they do, the value MUST be a [[URL]] or an array of URLs. +Implementers using a `statusPurpose` of `status` are strongly encouraged to +provide a `reference`.

- `reference` is especially important when interpertation of the - status for a credential may involve some understanding of the business case - involved. +`reference` is especially important when interpretation of the status for a +credential may involve some understanding of the business case involved.

@@ -623,34 +617,38 @@

BitstringStatusListCredential

"proof": { ... } } -

-The Working Group is still discussing the unification of a design between status lists with a single state (such as "revoked" or "suspended") and status lists with multiple states (exposed via a series of status messages). We are seeking implementer feedback on what a unified design should look like from an ease of implementation, privacy, and security standpoint. -

-
-          {
-            "@context": [
-              "https://www.w3.org/ns/credentials/v2"
-            ],
-            "id": "https://example.com/credentials/status/3",
-            "type": ["VerifiableCredential", "BitstringStatusListCredential"],
-            "issuer": "did:example:12345",
-            "validFrom": "2021-04-05T14:27:40Z",
-            "credentialSubject": {
-              "id": "https://example.com/status/3#list",
-              "type": "BitstringStatusList",
-              "ttl": 500,
-              "statusPurpose": "status",
-              "reference": "https://example.org/status-dictionary/",
-              "size": 2,
-              "statusMessages": [
-                  {"status":"0x0", "value":"valid"},
-                  {"status":"0x1", "value":"invalid"},
-                  {"status":"0x2", "value":"pending_review"},
-                  ...
-              ],
-              "encodedList": "H4sIAAAAAAAAA-3BMQEAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAIC3AYbSVKsAQAAA"
-            }
-          }
+        

+The Working Group is still discussing the unification of a design between status +lists with a single state (such as "revoked" or "suspended") and status lists +with multiple states (exposed via a series of status messages). We are seeking +implementer feedback on what a unified design should look like from an ease of +implementation, privacy, and security standpoint. +

+
+{
+  "@context": [
+    "https://www.w3.org/ns/credentials/v2"
+  ],
+  "id": "https://example.com/credentials/status/3",
+  "type": ["VerifiableCredential", "BitstringStatusListCredential"],
+  "issuer": "did:example:12345",
+  "validFrom": "2021-04-05T14:27:40Z",
+  "credentialSubject": {
+    "id": "https://example.com/status/3#list",
+    "type": "BitstringStatusList",
+    "ttl": 500,
+    "statusPurpose": "status",
+    "reference": "https://example.org/status-dictionary/",
+    "size": 2,
+    "statusMessages": [
+        {"status":"0x0", "value":"valid"},
+        {"status":"0x1", "value":"invalid"},
+        {"status":"0x2", "value":"pending_review"},
+        ...
+    ],
+    "encodedList": "H4sIAAAAAAAAA-3BMQEAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAIC3AYbSVKsAQAAA"
+  }
+}
         
@@ -820,31 +818,30 @@

Bitstring Expansion Algorithm

Media Types

- When dereferencing `statusListCredential`, - the content type of the `statusListCredential` might - be any media type registered for the purpose of expressing a - verifiable credential with one or more proofs. + When dereferencing `statusListCredential`, the content type of the + `statusListCredential` might be any media type registered for the purpose of + expressing a verifiable credential with one or more proofs.

- For example, a verifiable credential secured with - Data Integrity Proofs might have content type `application/vc+ld+json`, - whereas a verifiable credential secured with - SD-JWT might have content-type `application/sd-jwt`. + For example, a verifiable credential secured with Data Integrity Proofs might + have content type `application/vc+ld+json`, whereas a verifiable credential + secured with SD-JWT might have content-type `application/sd-jwt`.

- Some implementations might choose to support less specific media types such as - `application/ld+json` or `application/json`. +Some implementations might choose to support less specific media types such as +`application/ld+json` or `application/json`.

- When dereferencing over HTTP, - the use of the accept - and content-type headers, - might allow some implementations to negotiate for the proof format - used to secure the `statusListCredential`. +When dereferencing over HTTP, the use of the accept +and content-type headers, might allow +some implementations to negotiate for the proof format used to secure the +`statusListCredential`.

- Some implementations might use the 415 Unsupported Media Type - status code to signal that they do not support the requested media type. +Some implementations might use the 415 +Unsupported Media Type status code to signal that they do not support the +requested media type.

@@ -896,24 +893,27 @@

Content Distribution Networks

-
-

Malicious Issuers and Verifiers

-

-In general, the herd privacy protections offered by this specification can be circumvented by malicious issuers and verifiers. Its privacy benefits can only be realized when issuers and verifiers intend to avoid tracking or sharing the presentation of particular credentials. -

-

+

+

Malicious Issuers and Verifiers

+

+In general, the herd privacy protections offered by this specification can be +circumvented by malicious issuers and verifiers. Its privacy +benefits can only be realized when issuers and verifiers intend to avoid +tracking or sharing the presentation of particular credentials. +

+

A malicious issuer might intentionally attack herd privacy by creating a unique status list per credential issued in order to establish a 1-1 mapping to track when a verifier processes a specific credential. Similarly, they could establish another a 1-1 mapping by using a different cryptographic key for every credential issued that is tracked in a status list. -

-

+

+

A malicious verifier might intentionally attack herd privacy by sharing information from presented credentials with a malicious issuer. -

-

-
+

+

+
@@ -964,7 +964,8 @@

Bitstring Encoding

-For example, if a bitstring is 131,072 bits in size (16KB), the first index will be 0, and the last index will be 131,071. +For example, if a bitstring is 131,072 bits in size (16KB), the first index will +be 0, and the last index will be 131,071.

Implementations SHOULD consume and/or assign indexes randomly.