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

[proposal] Define a credential revocation API #937

Closed
mirceanis opened this issue Jun 14, 2022 · 6 comments
Closed

[proposal] Define a credential revocation API #937

mirceanis opened this issue Jun 14, 2022 · 6 comments
Assignees
Labels
enhancement New feature or request help wanted Extra attention is needed incomplete Issue is not well defined. Please ask for clarification before starting to work on it! pinned don't close this just for being stale

Comments

@mirceanis
Copy link
Member

We need a plugin interface for the credential revocation frontend.

At this time, there are 2 foreseeable actions that this interface should perform:

  • One is a call to revoke a credential. Probably this interface will be implemented by an aggregator that can look at a credential that is about to be revoked, inspect the credentialStatus entry and then forward the revocation call to the actual credentialStatus driver.

  • The other (which may be optional?) is a call that a Credential Issuer might make to build a credentialStatus entry.
    Many credentialStatus methods work on collections of credentials, so it is likely that when a credential is being created it needs to know its place in the collection (its index, its merkle path, etc)

This task only refers to the interface for such a plugin, and should initially serve as a discussion board.

@mirceanis mirceanis added enhancement New feature or request help wanted Extra attention is needed incomplete Issue is not well defined. Please ask for clarification before starting to work on it! pinned don't close this just for being stale labels Jun 14, 2022
@italobb
Copy link
Contributor

italobb commented Jun 15, 2022

In the picture below, in yellow, we have the current components already implemented when we talk about credential revocation/status in Veramo. In green, a proposal for the components we should build to allow two initial revocation methods: one using local storage (it can implement Revocation List 2020 or a simpler spec) and another one using an EVM network (following the ethr-status-registry).

image

Here is a brief explanation about each component in the diagram:

  • credential-revocation: implements the interface mentioned by @mirceanis for the revocation and delegates their implementation to plugin specific for each revocation method.
  • revocation-plugin: an interface for revocation methods plugins.
  • revocation-eth: a revocation plugin which uses the ethr-status-registry spec.
  • revocation-local: a revocation plugin which uses Revocation List 2020 or a simpler method for revocation, storing the status using the agent data-store. This component, exceptionally, will also be used by the agent to serve the endpoint used in credentialStatus field of the VCs using the revocation method chosen.
  • credential-status-eth: a library which implements the status verification using ethr-status-registry.
  • revocation-eth: a library which implements the revocation of VCs using the ethr-status-registry.

As suggested by @mirceanis, the credential-revocation will expose 2 main endpoints:

  • revoke
    • Params:
      • vc: a reference to the VC to be revoked.
      • method: a reference to the revocation method to be used
      • method-params (optional): a JSON object with the revocation method params, if necessary.
    • Return:
      • The updated revocation status
  • metadata
    • Params:
      • method: a reference to the revocation method
    • Return:
      • A JSON describing the params for the revocation method (the params received as input in revoke.method-params).

The revocation-local plugin will additionally implement the endpoint referenced in the credentialStatus field of the VCs using the method Revocation List 2020 or a simpler one TBD in this discussion:

In addition to a feedback regarding this proposal, it would be nice to understand if there are more revocation methods already specified and implemented in libraries which we could plug or adopt, mainly for the local (initial) implementation.

@mirceanis
Copy link
Member Author

@italobb, kudos for all the details!

Some notes:

  • revoke - doesn't need the method parameter, since the method should be embedded already in the vc. The method-params are probably required, and will depend on the method. These parameters would be forwarded to the underlying revocation driver. Perhaps a more generic name like options is more appropriate here.
    I think the return type should be something that can accommodate multiple types of revocation methods, so returning the status directly might be too much to expect. For example, if the update requires a transaction to be processed by a blockchain, it's unreasonable to await for a status since that might take days. Some flexibility is required here too, so a result object stating that the revocation request was processed successfully might be more appropriate.

Example:

result: {
  success: true, // mandatory property of the result for successful processing
  error: undefined, // mandatory property of the result for error during processing
  txHash: `0x0a359d...` // optional details provided by the revocation driver specific to the revocation method
}
  • metadata - The way I understand this, it would be the method that generates the credentialStatus property that would be embedded in a VC. This is the chance of the revocation driver to specify the coordinates of the credentialStatus method. In that case I think that a name like credentialStatusGenerate might be more descriptive and help with API discovery. Please correct me if I misunderstood.

Naming is hard.
Since these endpoints are supposed to be agent plugin interface methods, it makes sense to give them more specific names, with a namespace included, to avoid confusion and collisions down the line:

  • revoke -> credentialStatusUpdate - updates the status of an existing credential
  • metadata -> credentialStatusGenerate - generates the credentialStatus property for future credentials
  • status -> credentialStatusRead - not part of the main interface, but implemented by the revocation-local plugin, returns the status of a particular credential, as it is known by this agent. This might not make sense for most revocation methods, since some may not even require keeping track of this state internally, or some may not support querying for a single credential.

@italobb
Copy link
Contributor

italobb commented Jun 20, 2022

@mirceanis I liked all suggestions, including the naming. Your understanding about the metadata was wrong, but I realized that the endpoint to query the parameters for a revocation method doesn't make sense. So, the credentialStatusGenerate is fine. Actually we'll need an endpoint to list the supported revocation methods in the agent.

So, we would have something like:

  • credentialStatusUpdate - updates the status of an existing credential
    • Params:
      • vc: a reference to the VC to be revoked.
      • options (optional): a JSON object with the revocation method specific params, if necessary.
    • Return:
      • result: JSON object
        • success: boolean telling if the request was successfully processed (doesn't mean the revocation was completed yet)
        • error: string with error details.
        • details: JSON with optional details provided by the revocation driver specific to the revocation method.
  • credentialStatusGenerate - generates the credentialStatus property for future credentials
    • Params:
      • method: The name of the revocation method
      • options (optional): parameters specific to the revocation method
    • Return:
      • credentialStatus : the credentialStatus property for future credentials
  • credentialStatusRead : returns the status of a particular credential, as it is known by this agent.
  • credentialStatusListMethods: returns the list of revocation methods supported by the agent.

@Eengineer1
Copy link
Contributor

Eengineer1 commented Jun 30, 2022

Hey, @italobb @mirceanis .

Keen on helping with this.
A few questions:

  • Have any implementations started on this?
  • What's the bandwidth, if yes?

@italobb
Copy link
Contributor

italobb commented Jun 30, 2022

Hi, @Eengineer1!
I'm currently writing the interfaces we just described here and planning the implementation of the components for next Veramo version. It's the right time to have you joining!
Do you have something specific you want to collaborate on? It would be nice to get together to plan. Could you please get in touch with me through the Veramo Discord channel, please?

@Eengineer1
Copy link
Contributor

@italobb Thanks!
You have PM.

mirceanis added a commit that referenced this issue Sep 22, 2022
* chore(deps): update dependency openapi-types to v9.3.1

* fix(deps): update all non-major dependencies

* fix(deps): update dependency express-handlebars to v6

* chore(deps): update devdeps

* fix(deps): update dependency typeorm to v0.2.41

* fix(deps): update dependency did-jwt to v5.12.0

* JSON-LD Signature Support (#525)

* feat(utils): add `@veramo/utils` package

* feat(core): add common type definitions for credentials and presentations

* feat(credential-ld) add `@veramo/credential-ld` packages

* feat(credential-ld): added EcdsaSecp256k1RecoverySignature2020 and Ed25519Signature2018 credential signature and verification.

* feat(credential-ld): added presentation creation and verification.

* fix(credential-w3c): delegate `lds` proof types to `@veramo/credential-ld` if available.

* fix(data-store): fixed save operation for LD credentials

* feat(did-provider-key): fixed did:key dependencies, supporting only ed25519 x25519 and secp256k1 for now.

* feat(credential-ld): included credential context from transmute library

* refactor(credential-ld): simplify `CredentialIssuerLD` plugin initialization API

* feat(credential-ld): proper mapping from local database keys to DID document verificationMethods

* feat(cli): update default config to use `CredentialIssuerLD` module

* feat(credential-w3c): autoselect presentation audience if it's a managed DID, for verification

* feat(cli): add CLI methods to verify credentials and presentations

Co-authored-by: Simonas Karuzas <simonas@not.cat>
Co-authored-by: Mircea Nistor <mirceanis@gmail.com>

fixes #273
fixes #756
relates to #586
relates to #588

* fix(credential-ld): include LDDefaultContexts in npm bundle

* fix(credential-ld): include credential context and fix context loader Map

* fix(deps): update dependency did-jwt-vc to v2.1.8

* chore(deps): update devdeps

* feat(credential-ld): add option to fetch remote contexts

This pattern is not recommended, but useful sometimes for debugging. This is a foot-gun.

* docs: link to social (#764)

* docs: update badges

* fix(deps): update builders-and-testers

* fix(remote-server): api-key-auth (#772)

fixes #771

* fix(remote-server): web-did-doc-router options (#777)

* fix(deps): update builders-and-testers

* docs: rewrite readme and fix links

fixes #785

* chore(deps): update dependency openapi-types to v10

* fix(deps): update dependency openapi-types to v10

* fix: fix inquirer prompt for subject DID during SDR

fixes #790

* fix(deps): update builders-and-testers

* fix(deps): update builders-and-testers

* fix(deps): update dependency @ethersproject/random to v5.5.1

* fix(did-resolver): use interface `Resolvable` instead of the `Resolver` class

and update dependencies

* fix(deps): update dependency dotenv to v12

* chore(deps): update dependency ts-jest to v27.1.3

* chore: upgrade ethr-did-resolver

* chore(deps): update devdeps

* chore(deps): update dependency semantic-release to v19

* fix(deps): update dependency dotenv to v14

* chore(deps): update devdeps

* fix(deps): update dependency commander to v9

* fix(key-manager): add missing uuid dependency (#807)

* chore(deps): fix lockfile

* test: add headless browser testing (#809)

* version added, test:browser script added.
* github workflows updated

* fix(deps): pin dependencies

* fix(deps): update did-libraries

* chore(deps): pin dependencies

* fix(deps): pin dependency typescript to 4.5.5

* fix(deps): update dependency dotenv to v16

* chore(deps): update devdeps

* fix(deps): update all non-major dependencies

* fix(deps): update dependency inquirer-autocomplete-prompt to v2

* chore(deps): update devdeps

* fix(deps): update all non-major dependencies

* chore(deps): update actions/setup-node action to v3

* fix(deps): update all non-major dependencies

* chore(deps): update devdeps

* feat(date-store-json): add JSON object storage implementation (#819)

* feat(data-store-json): add JSON backed storage option

* feat(data-store-json): add private-key-store

* feat(data-store-json): use the same JSON object backend for all the data stores

* feat(data-store-json): simplify JSON store APIs

convert integration test to use a plain file as the backend for the JSON storage.

* test(browser): use data-store-json in browser tests and unlock more test scenarios

* test(browser): link local packages during browser tests

* feat(core): define IDataStoreORM interface at the `@veramo/core` level

* docs(core): add some inline documentation for the `IDataStoreORM` plugin interface.

* docs(data-store-json): add some inline documentation for types defined in data-store-json

* chore: commit updated schemas

* chore(deps): pin dependencies

* fix(deps): pin dependencies

* chore(deps): update actions/checkout action to v3

* fix(deps): update builders-and-testers

* feat: add key type definitions: 'Bls12381G1Key2020' and 'Bls12381G2Key2020' (#839)

* Add key types: 'Bls12381G1Key2020' and 'Bls12381G2Key2020'
Co-authored-by: Ilie Circiumaru <ici@zurich.ibm.com>

* fix(deps): update dependency typescript to v4.6.3

* chore(deps): update devdeps

* feat(utils): add 2 utility functions for inspecting ethr dids (#842)

* feat(utils): Add 2 utility functions for inspecting ethr dids

* chore: regenerate plugin schemas (#843)

* chore: Regenerate did-comm plugin schema (#844)

Co-authored-by: Nick Reynolds

* fix(deps): update did-libraries

* fix(deps): update builders-and-testers

* chore(deps): update actions/cache action to v3

* chore(deps): update dependency ts-json-schema-generator to v1

* fix(deps): update dependency @types/react-dom to v18

* fix(deps): update dependency ts-json-schema-generator to v1

* fix(deps): update dependency web-did-resolver to v2.0.15

* chore(deps): update devdeps

* fix(deps): update builders-and-testers

* fix(data-store-json): structuredClone

* fix(core): plugin schema

* chore(deps): update devdeps

* fix(deps): update builders-and-testers

* fix(deps): update dependency web-did-resolver to v2.0.16

* chore(deps): update node.js to v18

* chore(deps): update devdeps

* fix(deps): update dependency typescript to v4.6.4

* fix(deps): update dependency openapi-types to v11

* fix(deps): update dependency yaml to v2

* chore(deps): update devdeps

* fix(deps): update dependency @microsoft/api-extractor to v7.23.1

* feat(credential-status): add credential status check plugin for Veramo (#874)

* feat: add credential status plugin

* chore: fixes according the feedback

* chore: bump 'credential-status' dependency version

* chore: update plugin's schema

* fix(deps): update dependency @types/react to v18

* chore(deps): update devdeps

* fix(data-store-json): structuredClone (#885)

Fixes #857

* feat(did-provider-ethr): Using meta account

* fix(credential-w3c): forward domain and challenge args to createVerifiablePresentationJwt (#887)

* feat: create DIDComm JWE with multiple recipients (#888)

* fix(deps): update dependency @ungap/structured-clone to v1

* fix(deps): update react monorepo to v18

* fix(credential-ld): remove fs dependency for JSON LD default contexts (#868)

* remove fs dependency for JSON LD default contexts
* add contexts/*.json files in the build output

fixes #837

* feat: add partial match for dids and aliases in did discovery provider for data store

* fix (deps) : update dependency typeorm to v0.3.6 (#901)

Co-authored-by: ludovic duranteau <ludovic.duranteau@signaturelnd.com>

* feat(cli): add choices when selecting credential Subject in CLI (#898)

* Add choices when selecting credential Subject in CLI

* Change from list input type to autocomplete

* Remove validation when choosing subject DID

* fix(deps): update all non-major dependencies

* chore(deps): update devdeps

* feat: update did-discover-provider to search by DID likeness in addition to name

* chore: fix didDiscovery error test

* chore(build): rename jest config file (#908)

* fix(credential-status): simplify credential-status scripts

* chore: rebuild lockfile

* fix(cli): fix typo in command description (#913)

* fix(credential-ld): fix EcdsaSecp256k1RecoverySignature2020 suite context (#909)

* feat(data-store-json): BrowserLocalStorageStore (#914)

* feat: CredentialIssuerEIP712 (#899)

* fix(credential-eip712): update plugin schema (#915)

* feat(credential-ld): add support for browser environments (#916)

* fix(credential-ld): use @digitalcredentials instead of @digitalbazaar packages for better browser compatibility

* test: add test-utils package and move `fake-did-provider` there

* fix(credential-ld): bump @transmute and did-resolver dependencies

* fix(credential-ld): include default `@contexts` in build

* test(browser): use `stream-browserify` to enable `did:key` (from the @transmute implementation)

* test(browser): enable all integration test suites in the browser test

* fix(data-store-json): enable `dom` lib in `tsconfig.json`

* test(browser): move browser sample app to packages/ to simplify package linking

* chore(deps): update all non-major dependencies

* chore(deps): update devdeps

* fix(cli): update default CLI config to account for renamed class (#919)

BREAKING CHANGE: ProfileDiscoveryProvider has been renamed to DataStoreDiscoveryProvider in #597. Please update your config accordingly

* fix: update and fix inline documentation of all exported types (#921)

* fix(build): use correct cross-package imports

* chore(build): split build scripts for better granularity

* docs(data-store-json): fix and augment inline documentation for public exports

* docs(key-manager): add missing inline docs to exported classes

* docs(kms-local): update inline docs for public classes

* docs(message-handler): fix JSDoc links and update plugin documentation

* docs(remote-server): fix inline docs

* docs(url-handler): add description to UrlMessageHandler

* docs(core): update and fix inline docs for @veramo/core exports

* docs(selective-disclosure): update inline docs for @veramo/selective-disclosure exports

* docs(credential-w3c): update inline docs for @veramo/credential-w3c exports

* docs(data-store): fix and augment inline documentation for `@veramo/data-store` exports

* docs(did-discovery): update and fix inline docs for @veramo/did-discovery exports

* docs(did-comm): update and fix inline docs for @veramo/did-comm exports

* docs(credential-eip712): update and fix inline docs for @veramo/credential-eip712 exports

* fix(credential-status): update and fix type definitions and inline docs

* docs(credential-ld): update and fix inline docs

* fix(deps): bump api-extractor tools

* docs(did-manager): update inline docs

* docs(did-provider-key): add some inline docs

* docs(did-resolver): update inline docs

* docs(remote-client): add inline documentation for exports

* fix(build): update lockfile and autogen tests

* fix(deps): update did-libraries

* fix(deps): use did-jwt v6 and ethr-did-resolver v6 (#925)

* fix(deps): bump did-jwt to v6 and all related deps to latest

closes #923
closes #848

* chore(deps): use ganache instead of ganache-cli

This speeds up testing

* fix(docs): fix relevant errors and warnings in TSDoc to enable proper docs generation on `@next` branch

* fix(deps): update builders-and-testers (#930)

* chore(ci): adjust renovate bot schedule to reduce CI spam

* chore(ci): disable automatic pinning of dependencies

* chore(deps): update dependency ganache to v7.3.0

* chore(deps): update devdeps (major) (#881)

* chore(deps): update devdeps

* fix(build): adjust browser-tests for jest v28

* force `jsonld` to resolve to `@digitalbazaar/jsonld`
* run browser tests with `NODE_OPTIONS=--experimental-vm-modules`
* explicitly install some jest packages

Co-authored-by: Mircea Nistor <mirceanis@gmail.com>

* * fix(deps): pin resolution of @types/eslint to unblock build with conflicting versions (#928)

* chore(deps): update all non-major dependencies

* fix(deps): pin resolution of @types/eslint to unblock build with conflicting versions

Co-authored-by: Renovate Bot <bot@renovateapp.com>
Co-authored-by: Mircea Nistor <mirceanis@gmail.com>

* feat(kms-web3): add a KMS implementation backed by a web3 provider (#924)

closes #688

* chore(deps): fix lockfile

* fix(kms-web3): use ethers _signTypedData (#939)

fixes #938

* fix(deps): Update dependency web-did-resolver to v2.0.19

* fix(deps): update dependency openapi-types to v12

* fix(deps): replace @transmute/lds-ecdsa-secp256k1-recovery2020 with fork (#953)

The fork uses `@digitalcredentials` variants of the JSON-LD libraries and upgrades some other dependencies to more maintained variants

closes #952

* fix(deps): Bump `did-jwt`, `did-jwt-vc` as direct package deps (#955)

* chore(ci): add PR template (#958)

* chore(ci): move the PR template file

* chore(ci): simplify the PR template

* chore(ci): clarify the PR template

* fix(deps): Update dependency @digitalcredentials/vc to v4

* fix(deps): Update dependency ethr-did-resolver to v6.0.2 (#964)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* fix(credential-status): check credential status for all credential types (#949)

fixes #934

* fix(did-provider-key) : fix typo in error message for `addKey` (#967)

* feat(did-provider-ethr): use multiple networks per EthrDIDProvider (#969)

* feat(did-manager): allow DID providers to match multiple prefixes
* feat(did-provider-ethr): support multi-network config for EthrDIDProvider

fixes #968
fixes #893

* feat(kms-web3): add ability to list provider accounts as keys (#965)

fixes #933

* feat(data-store): use DataSource instead of Connection (#970)

fixes #947

* feat(cli): in explore, allow copy to clipboard the text of identifier or credential or presentation (#902)

* feat(cli): in explore, allow user to copy to clipboard the text of identifier or credential or presentation

* feat(cli): add command to output selected credential or presentation

* feat(did-manager): add`didManagerUpdate` method for full DID document updates (#974)

fixes #971
this is also related to #960 and #948

* chore(core): update plugin schema

* fix: deprecate the `save` parameter (#975)

closes #966

* chore: create authors.md (#972)

This page contains a list of the awesome humans behind Veramo

* docs: update Twitter badge

* feat: define an interface for credential status manager (#956)

partially fixes #937
relates to #981

* feat(credential-status): rename plugin interfaces and methods

fixes #981

* feat(credential-status): expect revoked boolean property from StatusMethods

docs: fix inline docs broken references

docs(kms-web3): add docs to kms-web3

* feat(did-resolver): simplify DIDResolverPlugin constructor (#986)

fixes #976

* feat: add support for serviceEndpoint property as defined in latest DID Spec (#988)

BREAKING CHANGE: the `did-resolver` and connected libraries change the data-type for `ServiceEndpoint` to `Service` and the previous semantic has changed. Services can have multiple endpoints, not just a single string.

* feat(credential-w3c): add override policies to verifyPresentation (#990)

relates to #375
relates to #954

* fix(deps): Update dependency did-jwt-vc to v3

* chore(deps): update postgres docker tag to v14

* feat(credential-w3c): align verification API between formats (#996)

* feat(credential-w3c): align verification API between formats

fixes #935
fixes #954
fixes #375

* test: add test cases for VC/VP verification policies

* feat(credential-w3c): add extra options to VC/VP issuance and verification

* fix: forward the `fetchRemoteContext` parameter to the document loader

fixes #989

* feat(credential-w3c): add ICredentialPlugin interface in core package (#1001)

closes #941

The `ICredentialIssuer` interface was moved to the core package, but is reexported by the `credential-w3c` package for compatibility.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request help wanted Extra attention is needed incomplete Issue is not well defined. Please ask for clarification before starting to work on it! pinned don't close this just for being stale
Projects
None yet
Development

No branches or pull requests

3 participants