UNPKG

@sphereon/ssi-sdk.credential-vcdm

Version:

Plugin for working with W3C Verifiable Credentials DataModel 1 and 2 Credentials & Presentations.

549 lines (485 loc) 19.5 kB
import type { CredentialPayload, IAgentContext, IDIDManager, IKey, IKeyManager, IPluginMethodMap, IResolver, PresentationPayload, VerificationPolicies, } from '@veramo/core' import type { VerifiableCredentialSP, VerifiablePresentationSP } from '@sphereon/ssi-sdk.core' import type { StatusListOpts } from '@sphereon/oid4vci-common' import type { ICredential, IVerifyResult, OriginalVerifiableCredential, W3CVerifiableCredential, W3CVerifiablePresentation, } from '@sphereon/ssi-types' import type { DataSource } from 'typeorm' export type IVcdmCredentialPlugin = IVcdmCredentialIssuer & IVcdmCredentialVerifier /** * Encapsulates the parameters required to check if a credential type can be issued * * @public */ export interface ICanIssueCredentialTypeArgs { proofFormat: string } /** * Encapsulates the parameters required to check if a document can be verified * * @public */ export interface ICanVerifyDocumentTypeArgs { /** * The document to check against the verifier */ document: W3CVerifiableCredential | W3CVerifiablePresentation } /** * Encapsulates the parameters required to create a * {@link https://www.w3.org/TR/vc-data-model/#presentations | W3C Verifiable Presentation} * * @beta This API is likely to change without a BREAKING CHANGE notice */ export interface ICreateVerifiablePresentationLDArgs { /** * The json payload of the Presentation according to the * {@link https://www.w3.org/TR/vc-data-model/#presentations | canonical model}. * * The signer of the Presentation is chosen based on the `holderDID` property * of the `presentation` * * '@context', 'type' and 'issuanceDate' will be added automatically if omitted */ presentation: PresentationPayload /** * Optional (only JWT) string challenge parameter to add to the verifiable presentation. */ challenge?: string /** * Optional string domain parameter to add to the verifiable presentation. */ domain?: string purpose?: IAuthenticationProofPurpose | IControllerProofPurpose | IAssertionProofPurpose | IProofPurpose /** * The desired format for the VerifiableCredential to be created. */ proofFormat: string /** * Remove payload members during JWT-JSON transformation. Defaults to `true`. * See https://www.w3.org/TR/vc-data-model/#jwt-encoding */ removeOriginalFields?: boolean /** * [Optional] The ID of the key that should sign this presentation. * If this is not specified, the first matching key will be used. */ keyRef?: string /** * When dealing with JSON-LD you also MUST provide the proper contexts. * Set this to `true` ONLY if you want the `@context` URLs to be fetched in case they are not preloaded. * The context definitions SHOULD rather be provided at startup instead of being fetched. * * Defaults to `false` */ fetchRemoteContexts?: boolean /** * Optional date to use for the `issuanceDate` or `validFrom` property depending on VCDM version being used. * If not specified, the current date will be used. * */ now?: Date | number } /** * Statuslist credential options, cloned from packages/vc-status-list/src/types/index.ts to break cyclic dependency loop */ export interface IIssueCredentialStatusOpts { dataSource?: DataSource statusLists?: Array<StatusListOpts> credentialId?: string // An id to use for the credential. Normally should be set as the crdential.id value value?: string } /** * Encapsulates the parameters required to create a * {@link https://www.w3.org/TR/vc-data-model/#credentials | W3C Verifiable Credential} * * @beta This API is likely to change without a BREAKING CHANGE notice */ export interface ICreateVerifiableCredentialLDArgs { /** * The JSON payload of the Credential according to the * {@link https://www.w3.org/TR/vc-data-model/#credentials | canonical model} * * The signer of the Credential is chosen based on the `issuer.id` property * of the `credential` * * `@context`, `type` and `issuanceDate` will be added automatically if omitted */ credential: CredentialPayload /** * Optional date to use for the `issuanceDate` or `validFrom` property depending on VCDM version being used. * If not specified, the current date will be used. * */ now?: Date | number /** * The desired format for the VerifiableCredential to be created. */ proofFormat: string /** * Remove payload members during JWT-JSON transformation. Defaults to `true`. * See https://www.w3.org/TR/vc-data-model/#jwt-encoding */ removeOriginalFields?: boolean /** * [Optional] The ID of the key that should sign this credential. * If this is not specified, the first matching key will be used. */ keyRef?: string /** * When dealing with JSON-LD you also MUST provide the proper contexts. * Set this to `true` ONLY if you want the `@context` URLs to be fetched in case they are not preloaded. * The context definitions SHOULD rather be provided at startup instead of being fetched. * * Defaults to `false` */ fetchRemoteContexts?: boolean /** * Use this purpose for the verification method in the DID when doing a check (defaults to CredentialIssuancePurpose) */ purpose?: IAuthenticationProofPurpose | IControllerProofPurpose | IAssertionProofPurpose | IProofPurpose credentialStatusOpts?: IIssueCredentialStatusOpts opts?: any } /** * Encapsulates the parameters required to verify a * {@link https://www.w3.org/TR/vc-data-model/#credentials | W3C Verifiable Credential} * * @beta This API is likely to change without a BREAKING CHANGE notice */ export interface IVerifyCredentialVcdmArgs { /** * The json payload of the Credential according to the * {@link https://www.w3.org/TR/vc-data-model/#credentials | canonical model} * * The signer of the Credential is chosen based on the `issuer.id` property * of the `credential` * */ credential: OriginalVerifiableCredential | ICredential /** * Set this to true if you want the '@context' URLs to be fetched in case they are not pre-loaded. * * @default false */ fetchRemoteContexts?: boolean /** * Overrides specific aspects of credential verification, where possible. */ policies?: VerificationPolicies /** * Use this presentation purpose for the verification method in the DID when doing a check (defaults to CredentialIssuancePurpose) */ purpose?: IAuthenticationProofPurpose | IControllerProofPurpose | IAssertionProofPurpose | IProofPurpose /** * Check status function, to check verifiableCredentials that have a credentialStatus property */ checkStatus?: Function /** * Allows you to use the default integrated statusList 2021 support. If a checkStatus function is provided, this will be ignored */ statusList?: StatusListCheck [key: string]: any } export interface StatusListCheck { /** * If no checkStatus function is given we default to a StatusList2021 check in case the VC has a credentialStatus. This boolean allows to disable this fallback check */ disableCheckStatusList2021?: boolean mandatoryCredentialStatus: boolean verifyStatusListCredential: boolean verifyMatchingIssuers: boolean errorUnknownListType?: boolean } /** * Encapsulates the parameters required to verify a * {@link https://www.w3.org/TR/vc-data-model/#presentations | W3C Verifiable Presentation} * * @beta This API is likely to change without a BREAKING CHANGE notice */ export interface IVerifyPresentationLDArgs { /** * The json payload of the Credential according to the * {@link https://www.w3.org/TR/vc-data-model/#credentials | canonical model} * * The signer of the Credential is chosen based on the `issuer.id` property * of the `credential` * */ presentation: VerifiablePresentationSP | W3CVerifiablePresentation /** * Optional (only for JWT) string challenge parameter to verify the verifiable presentation against */ challenge?: string /** * Optional (only for JWT) string domain parameter to verify the verifiable presentation against */ domain?: string /** * Set this to true if you want the '@context' URLs to be fetched in case they are not pre-loaded. * * @default false */ fetchRemoteContexts?: boolean /** * Overrides specific aspects of credential verification, where possible. */ policies?: VerificationPolicies /** * Use this presentation purpose for the verification method in the DID when doing a check (defaualts to assertionMethod) */ presentationPurpose?: IAuthenticationProofPurpose | IControllerProofPurpose | IAssertionProofPurpose | IProofPurpose /** * Check status function, to check verifiableCredentials that have a credentialStatus property */ checkStatus?: Function /** * Allows you to use the default integrated statusList 2021 support. If a checkStatus function is provided, this will be ignored */ statusList?: StatusListCheck [key: string]: any } /** * Represents the requirements that this plugin has. * The agent that is using this plugin is expected to provide these methods. * * This interface can be used for static type checks, to make sure your application is properly initialized. * * @beta This API is likely to change without a BREAKING CHANGE notice */ /* export type IRequiredContext = IAgentContext< IResolver & IDIDManager & Pick<ISphereonKeyManager, 'keyManagerGet' | 'keyManagerSign' | 'keyManagerVerify'> > */ /** * Represents the requirements that this plugin has. * The agent that is using this plugin is expected to provide these methods. * * This interface can be used for static type checks, to make sure your application is properly initialized. * * @beta */ export type IVcdmIssuerAgentContext = IAgentContext< IResolver & IDIDManager & Pick<IKeyManager, 'keyManagerGet' | 'keyManagerSign' | 'keyManagerVerify'> > export type ContextDoc = { '@context': string | Record<string, any> } /* @beta */ export interface IProofPurpose { term?: string date?: string | Date | number maxTimestampDelta?: number } /* @beta */ export interface IControllerProofPurpose extends IProofPurpose { controller?: object } /* @beta */ export interface IAuthenticationProofPurpose extends IControllerProofPurpose { challenge?: string domain?: string } /* @beta */ export interface IAssertionProofPurpose extends IControllerProofPurpose {} /** * The interface definition for a plugin that can generate Verifiable Credentials and Presentations * * @see {@link @veramo/credential-w3c#CredentialPlugin} for an implementation. * @remarks Please see {@link https://www.w3.org/TR/vc-data-model | W3C Verifiable Credentials data model} * * @public */ export interface IVcdmCredentialProvider { /** * Creates a Verifiable Presentation. * The payload, signer and format are chosen based on the `args` parameter. * * @param args - Arguments necessary to create the Presentation. * @param context - This reserved param is automatically added and handled by the framework, *do not override* * * @returns - a promise that resolves to the {@link @veramo/core#VerifiablePresentation} that was requested or * rejects with an error if there was a problem with the input or while getting the key to sign * * @remarks Please see {@link https://www.w3.org/TR/vc-data-model/#presentations | Verifiable Presentation data model * } */ createVerifiablePresentation(args: ICreateVerifiablePresentationLDArgs, context: IVcdmIssuerAgentContext): Promise<VerifiablePresentationSP> /** * Creates a Verifiable Presentation. * The payload, signer and format are chosen based on the `args` parameter. * * @param args - Arguments necessary to create the Presentation. * @param context - This reserved param is automatically added and handled by the framework, *do not override* * * @returns - a promise that resolves to the {@link @veramo/core#VerifiablePresentation} that was requested or * rejects with an error if there was a problem with the input or while getting the key to sign * * @remarks Please see {@link https://www.w3.org/TR/vc-data-model/#presentations | Verifiable Presentation data model * } */ canIssueCredentialType(args: ICanIssueCredentialTypeArgs): boolean /** * Matches a key against the type of proof supported by this issuer * * @param key - The key to match against the proof type(s) supported by this issuer * @param context - This reserved param is automatically added and handled by the framework, *do not override* * * @returns - a promise that resolves to a boolean indicating if the key can be used to sign a credential with this issuer */ matchKeyForType(key: IKey): boolean /** * Gets the proof type supported by this issuer * * @returns - a promise that resolves to a string of the proof format supported by this issuer */ getTypeProofFormat(): string /** * Creates a Verifiable Credential. * The payload, signer and format are chosen based on the `args` parameter. * * @param args - Arguments necessary to create the Presentation. * @param context - This reserved param is automatically added and handled by the framework, *do not override* * * @returns - a promise that resolves to the {@link @veramo/core#VerifiableCredential} that was requested or * rejects with an error if there was a problem with the input or while getting the key to sign * * @remarks Please see {@link https://www.w3.org/TR/vc-data-model/#credentials | Verifiable Credential data model} */ createVerifiableCredential(args: ICreateVerifiableCredentialLDArgs, context: IVcdmIssuerAgentContext): Promise<VerifiableCredentialSP> /** * Verifies a Verifiable Credential * * @param args - Arguments necessary to verify a VerifiableCredential * @param context - This reserved param is automatically added and handled by the framework, *do not override* * * @returns - a promise that resolves to an object containing a `verified` boolean property and an optional `error` * for details * * @remarks Please see {@link https://www.w3.org/TR/vc-data-model/#credentials | Verifiable Credential data model} */ verifyCredential(args: IVerifyCredentialVcdmArgs, context: IVcdmVerifierAgentContext): Promise<IVerifyResult> /** * * @param args - Arguments necessary to verify a document * @param context - This reserved param is automatically added and handled by the framework, *do not override* * * @returns a promise that resolves to a boolean indicating if the document can be verified */ canVerifyDocumentType(args: ICanVerifyDocumentTypeArgs): boolean /** * Verifies a Verifiable Presentation JWT or LDS Format. * * @param args - Arguments necessary to verify a VerifiableCredential * @param context - This reserved param is automatically added and handled by the framework, *do not override* * * @returns - a promise that resolves to an object containing a `verified` boolean property and an optional `error` * for details * * @remarks Please see {@link https://www.w3.org/TR/vc-data-model/#presentations | Verifiable Credential data model} */ verifyPresentation(args: IVerifyPresentationLDArgs, context: IVcdmVerifierAgentContext): Promise<IVerifyResult> } /** * The interface definition for a plugin that can generate Verifiable Credentials and Presentations * * @see {@link @veramo/credential-w3c#CredentialPlugin} for an implementation. * @remarks Please see {@link https://www.w3.org/TR/vc-data-model | W3C Verifiable Credentials data model} * * @public */ export interface IVcdmCredentialIssuer extends IPluginMethodMap { /** * Creates a Verifiable Presentation. * The payload, signer and format are chosen based on the `args` parameter. * * @param args - Arguments necessary to create the Presentation. * @param context - This reserved param is automatically added and handled by the framework, *do not override* * * @returns - a promise that resolves to the {@link @veramo/core#VerifiablePresentation} that was requested or * rejects with an error if there was a problem with the input or while getting the key to sign * * @remarks Please see {@link https://www.w3.org/TR/vc-data-model/#presentations | Verifiable Presentation data model * } */ createVerifiablePresentation(args: ICreateVerifiablePresentationLDArgs, context: IVcdmIssuerAgentContext): Promise<VerifiablePresentationSP> /** * Creates a Verifiable Credential. * The payload, signer and format are chosen based on the `args` parameter. * * @param args - Arguments necessary to create the Presentation. * @param context - This reserved param is automatically added and handled by the framework, *do not override* * * @returns - a promise that resolves to the {@link @veramo/core#VerifiableCredential} that was requested or rejects * with an error if there was a problem with the input or while getting the key to sign * * @remarks Please see {@link https://www.w3.org/TR/vc-data-model/#credentials | Verifiable Credential data model} */ createVerifiableCredential(args: ICreateVerifiableCredentialLDArgs, context: IVcdmIssuerAgentContext): Promise<VerifiableCredentialSP> } /** * The interface definition for a plugin that can generate Verifiable Credentials and Presentations * * @see {@link @veramo/credential-w3c#CredentialPlugin} for an implementation. * @remarks Please see {@link https://www.w3.org/TR/vc-data-model | W3C Verifiable Credentials data model} * * @public */ export interface IVcdmCredentialVerifier extends IPluginMethodMap { /** * Verifies a Verifiable Credential * * @param args - Arguments necessary to verify a VerifiableCredential * @param context - This reserved param is automatically added and handled by the framework, *do not override* * * @returns - a promise that resolves to an object containing a `verified` boolean property and an optional `error` * for details * * @remarks Please see {@link https://www.w3.org/TR/vc-data-model/#credentials | Verifiable Credential data model} */ verifyCredential(args: IVerifyCredentialVcdmArgs, context: IVcdmVerifierAgentContext): Promise<IVerifyResult> /** * Verifies a Verifiable Presentation JWT or LDS Format. * * @param args - Arguments necessary to verify a VerifiableCredential * @param context - This reserved param is automatically added and handled by the framework, *do not override* * * @returns - a promise that resolves to an object containing a `verified` boolean property and an optional `error` * for details * * @remarks Please see {@link https://www.w3.org/TR/vc-data-model/#presentations | Verifiable Credential data model} */ verifyPresentation(args: IVerifyPresentationLDArgs, context: IVcdmVerifierAgentContext): Promise<IVerifyResult> } /** * Represents the requirements that this plugin has. * The agent that is using this plugin is expected to provide these methods. * * This interface can be used for static type checks, to make sure your application is properly initialized. * * @beta */ export type IVcdmVerifierAgentContext = IAgentContext<IResolver & Pick<IDIDManager, 'didManagerGet' | 'didManagerFind'>>