@sphereon/ssi-sdk.vc-status-list 0.32.1-next.54 → 0.33.1-feature.jose.vcdm.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +979 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +275 -0
- package/dist/index.d.ts +273 -3
- package/dist/index.js +946 -19
- package/dist/index.js.map +1 -1
- package/package.json +36 -14
- package/src/functions.ts +77 -161
- package/src/impl/IStatusList.ts +42 -0
- package/src/impl/OAuthStatusList.ts +206 -0
- package/src/impl/StatusList2021.ts +249 -0
- package/src/impl/StatusListFactory.ts +34 -0
- package/src/impl/encoding/cbor.ts +177 -0
- package/src/impl/encoding/common.ts +20 -0
- package/src/impl/encoding/jwt.ts +80 -0
- package/src/types/index.ts +162 -48
- package/src/utils.ts +95 -0
- package/dist/functions.d.ts +0 -69
- package/dist/functions.d.ts.map +0 -1
- package/dist/functions.js +0 -256
- package/dist/functions.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -111
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -3
- package/dist/types/index.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;GACG;;;;;;;;;;;;;;;;AAEH,0CAAuB;AACvB,8CAA2B"}
|
|
1
|
+
{"version":3,"sources":["../src/types/index.ts","../src/functions.ts","../src/utils.ts","../src/impl/StatusList2021.ts","../src/impl/OAuthStatusList.ts","../src/impl/encoding/jwt.ts","../src/impl/encoding/common.ts","../src/impl/encoding/cbor.ts","../src/impl/StatusListFactory.ts"],"sourcesContent":["import type { IIdentifierResolution } from '@sphereon/ssi-sdk-ext.identifier-resolution'\nimport {\n type ICredential,\n type ICredentialStatus,\n type IIssuer,\n type IVerifiableCredential,\n type OrPromise,\n type CredentialProofFormat,\n type StatusListCredential,\n StatusListCredentialIdMode,\n StatusListDriverType,\n type StatusListIndexingDirection,\n StatusListType,\n type StatusPurpose2021,\n} from '@sphereon/ssi-types'\nimport type {\n CredentialPayload,\n IAgentContext,\n ICredentialIssuer,\n ICredentialPlugin,\n ICredentialVerifier,\n IKeyManager,\n IPluginMethodMap,\n} from '@veramo/core'\nimport { DataSource } from 'typeorm'\nimport type { BitsPerStatus } from '@sd-jwt/jwt-status-list'\nimport type { SdJwtVcPayload } from '@sd-jwt/sd-jwt-vc'\nimport type { StatusListOpts } from '@sphereon/oid4vci-common'\n\nexport enum StatusOAuth {\n Valid = 0,\n Invalid = 1,\n Suspended = 2,\n}\n\nexport enum Status2021 {\n Valid = 0,\n Invalid = 1,\n}\n\nexport type StatusList2021Args = {\n indexingDirection: StatusListIndexingDirection\n statusPurpose?: StatusPurpose2021\n // todo: validFrom and validUntil\n}\n\nexport type OAuthStatusListArgs = {\n bitsPerStatus?: BitsPerStatus\n expiresAt?: Date\n}\n\nexport type BaseCreateNewStatusListArgs = {\n type: StatusListType\n id: string\n issuer: string | IIssuer\n correlationId?: string\n length?: number\n proofFormat?: CredentialProofFormat\n keyRef?: string\n statusList2021?: StatusList2021Args\n oauthStatusList?: OAuthStatusListArgs\n driverType?: StatusListDriverType\n}\n\nexport type UpdateStatusList2021Args = {\n statusPurpose: StatusPurpose2021\n}\n\nexport type UpdateOAuthStatusListArgs = {\n bitsPerStatus: BitsPerStatus\n expiresAt?: Date\n}\n\nexport interface UpdateStatusListFromEncodedListArgs {\n type?: StatusListType\n statusListIndex: number | string\n value: boolean\n proofFormat?: CredentialProofFormat\n keyRef?: string\n correlationId?: string\n encodedList: string\n issuer: string | IIssuer\n id: string\n statusList2021?: UpdateStatusList2021Args\n oauthStatusList?: UpdateOAuthStatusListArgs\n}\n\nexport interface UpdateStatusListFromStatusListCredentialArgs {\n statusListCredential: StatusListCredential // | CompactJWT\n keyRef?: string\n statusListIndex: number | string\n value: number | Status2021 | StatusOAuth\n}\n\nexport interface StatusListResult {\n encodedList: string\n statusListCredential: StatusListCredential\n length: number\n type: StatusListType\n proofFormat: CredentialProofFormat\n id: string\n statuslistContentType: string\n issuer: string | IIssuer\n statusList2021?: StatusList2021Details\n oauthStatusList?: OAuthStatusDetails\n\n // These cannot be deduced from the VC, so they are present when callers pass in these values as params\n correlationId?: string\n driverType?: StatusListDriverType\n credentialIdMode?: StatusListCredentialIdMode\n}\n\ninterface StatusList2021Details {\n indexingDirection: StatusListIndexingDirection\n statusPurpose?: StatusPurpose2021\n}\n\ninterface OAuthStatusDetails {\n bitsPerStatus?: BitsPerStatus\n expiresAt?: Date\n}\n\nexport interface StatusList2021EntryCredentialStatus extends ICredentialStatus {\n type: 'StatusList2021Entry'\n statusPurpose: StatusPurpose2021\n statusListIndex: string\n statusListCredential: string\n}\n\nexport interface StatusListOAuthEntryCredentialStatus extends ICredentialStatus {\n type: 'OAuthStatusListEntry'\n bitsPerStatus: number\n statusListIndex: string\n statusListCredential: string\n expiresAt?: Date\n}\n\nexport interface StatusList2021ToVerifiableCredentialArgs {\n issuer: string | IIssuer\n id: string\n type?: StatusListType\n proofFormat?: CredentialProofFormat\n keyRef?: string\n encodedList: string\n statusPurpose: StatusPurpose2021\n}\n\nexport interface CreateStatusListArgs {\n issuer: string | IIssuer\n id: string\n proofFormat?: CredentialProofFormat\n keyRef?: string\n correlationId?: string\n length?: number\n statusList2021?: StatusList2021Args\n oauthStatusList?: OAuthStatusListArgs\n}\n\nexport interface UpdateStatusListIndexArgs {\n statusListCredential: StatusListCredential // | CompactJWT\n statusListIndex: number | string\n value: number | Status2021 | StatusOAuth\n keyRef?: string\n expiresAt?: Date\n}\n\nexport interface CheckStatusIndexArgs {\n statusListCredential: StatusListCredential // | CompactJWT\n statusListIndex: string | number\n}\n\nexport interface ToStatusListDetailsArgs {\n statusListPayload: StatusListCredential\n correlationId?: string\n driverType?: StatusListDriverType\n}\n\n/**\n * The interface definition for a plugin that can add statuslist info to a credential\n *\n * @remarks Please see {@link https://www.w3.org/TR/vc-data-model | W3C Verifiable Credentials data model}\n *\n * @beta This API is likely to change without a BREAKING CHANGE notice\n */\nexport interface IStatusListPlugin extends IPluginMethodMap {\n /**\n * Create a new status list\n *\n * @param args Status list information like type and size\n * @param context - This reserved param is automatically added and handled by the framework, *do not override*\n *\n * @returns - The details of the newly created status list\n */\n slCreateStatusList(args: CreateNewStatusListArgs, context: IRequiredContext): Promise<StatusListResult>\n\n /**\n * Ensures status list info like index and list id is added to a credential\n *\n * @param args - Arguments necessary to add the statuslist info.\n * @param context - This reserved param is automatically added and handled by the framework, *do not override*\n *\n * @returns - a promise that resolves to the credential now with status support\n *\n * @beta This API is likely to change without a BREAKING CHANGE notice\n */\n slAddStatusToCredential(args: IAddStatusToCredentialArgs, context: IRequiredContext): Promise<CredentialWithStatusSupport>\n\n slAddStatusToSdJwtCredential(args: IAddStatusToSdJwtCredentialArgs, context: IRequiredContext): Promise<SdJwtVcPayload>\n\n /**\n * Get the status list using the configured driver for the SL. Normally a correlationId or id should suffice. Optionally accepts a dbName/datasource\n * @param args\n * @param context\n */\n slGetStatusList(args: GetStatusListArgs, context: IRequiredContext): Promise<StatusListResult>\n\n /**\n * Import status lists when noy yet present\n *\n * @param imports Array of status list information like type and size\n * @param context - This reserved param is automatically added and handled by the framework, *do not override*\n */\n slImportStatusLists(imports: Array<CreateNewStatusListArgs>, context: IRequiredContext): Promise<boolean>\n}\n\nexport type CreateNewStatusListFuncArgs = BaseCreateNewStatusListArgs\n\nexport type CreateNewStatusListArgs = BaseCreateNewStatusListArgs & {\n dbName?: string\n dataSource?: OrPromise<DataSource>\n isDefault?: boolean\n}\n\nexport type IAddStatusToCredentialArgs = Omit<IIssueCredentialStatusOpts, 'dataSource'> & {\n credential: CredentialWithStatusSupport\n}\n\nexport type IAddStatusToSdJwtCredentialArgs = Omit<IIssueCredentialStatusOpts, 'dataSource'> & {\n credential: SdJwtVcPayload\n}\n\nexport interface IIssueCredentialStatusOpts {\n dataSource?: DataSource\n statusLists?: Array<StatusListOpts>\n credentialId?: string // An id to use for the credential. Normally should be set as the crdential.id value\n value?: string\n}\n\nexport type GetStatusListArgs = {\n id?: string\n correlationId?: string\n dataSource?: OrPromise<DataSource>\n dbName?: string\n}\n\nexport type CredentialWithStatusSupport = ICredential | CredentialPayload | IVerifiableCredential\n\nexport type SignedStatusListData = {\n statusListCredential: StatusListCredential\n encodedList: string\n}\n\nexport type IRequiredPlugins = ICredentialPlugin & IIdentifierResolution\nexport type IRequiredContext = IAgentContext<ICredentialIssuer & ICredentialVerifier & IIdentifierResolution & IKeyManager & ICredentialPlugin>\n","import type { IIdentifierResolution } from '@sphereon/ssi-sdk-ext.identifier-resolution'\nimport {\n CredentialMapper,\n DocumentFormat,\n type CredentialProofFormat,\n type StatusListCredential,\n StatusListDriverType,\n StatusListType,\n type StatusPurpose2021,\n} from '@sphereon/ssi-types'\nimport type { CredentialStatus, DIDDocument, IAgentContext, ICredentialPlugin, ProofFormat as VeramoProofFormat } from '@veramo/core'\n\nimport { checkStatus } from '@sphereon/vc-status-list'\n\n// @ts-ignore\nimport { CredentialJwtOrJSON, StatusMethod } from 'credential-status'\nimport {\n CreateNewStatusListFuncArgs,\n Status2021,\n StatusList2021ToVerifiableCredentialArgs,\n StatusListResult,\n StatusOAuth,\n UpdateStatusListFromEncodedListArgs,\n UpdateStatusListIndexArgs,\n} from './types'\nimport { assertValidProofType, determineStatusListType, getAssertedValue, getAssertedValues } from './utils'\nimport { getStatusListImplementation } from './impl/StatusListFactory'\n\nexport async function fetchStatusListCredential(args: { statusListCredential: string }): Promise<StatusListCredential> {\n const url = getAssertedValue('statusListCredential', args.statusListCredential)\n try {\n const response = await fetch(url)\n if (!response.ok) {\n throw Error(`Fetching status list ${url} resulted in an error: ${response.status} : ${response.statusText}`)\n }\n const responseAsText = await response.text()\n if (responseAsText.trim().startsWith('{')) {\n return JSON.parse(responseAsText) as StatusListCredential\n }\n return responseAsText as StatusListCredential\n } catch (error) {\n console.error(`Fetching status list ${url} resulted in an unexpected error: ${error instanceof Error ? error.message : JSON.stringify(error)}`)\n throw error\n }\n}\n\nexport function statusPluginStatusFunction(args: {\n documentLoader: any\n suite: any\n mandatoryCredentialStatus?: boolean\n verifyStatusListCredential?: boolean\n verifyMatchingIssuers?: boolean\n errorUnknownListType?: boolean\n}): StatusMethod {\n return async (credential: CredentialJwtOrJSON, didDoc: DIDDocument): Promise<CredentialStatus> => {\n const result = await checkStatusForCredential({\n ...args,\n documentLoader: args.documentLoader,\n credential: credential as StatusListCredential,\n errorUnknownListType: args.errorUnknownListType,\n })\n\n return {\n revoked: !result.verified || result.error,\n ...(result.error && { error: result.error }),\n }\n }\n}\n\n/**\n * Function that can be used together with @digitalbazar/vc and @digitialcredentials/vc\n * @param args\n */\nexport function vcLibCheckStatusFunction(args: {\n mandatoryCredentialStatus?: boolean\n verifyStatusListCredential?: boolean\n verifyMatchingIssuers?: boolean\n errorUnknownListType?: boolean\n}) {\n const { mandatoryCredentialStatus, verifyStatusListCredential, verifyMatchingIssuers, errorUnknownListType } = args\n return (args: {\n credential: StatusListCredential\n documentLoader: any\n suite: any\n }): Promise<{\n verified: boolean\n error?: any\n }> => {\n return checkStatusForCredential({\n ...args,\n mandatoryCredentialStatus,\n verifyStatusListCredential,\n verifyMatchingIssuers,\n errorUnknownListType,\n })\n }\n}\n\nexport async function checkStatusForCredential(args: {\n credential: StatusListCredential\n documentLoader: any\n suite: any\n mandatoryCredentialStatus?: boolean\n verifyStatusListCredential?: boolean\n verifyMatchingIssuers?: boolean\n errorUnknownListType?: boolean\n}): Promise<{ verified: boolean; error?: any }> {\n const verifyStatusListCredential = args.verifyStatusListCredential ?? true\n const verifyMatchingIssuers = args.verifyMatchingIssuers ?? true\n const uniform = CredentialMapper.toUniformCredential(args.credential)\n if (!('credentialStatus' in uniform) || !uniform.credentialStatus) {\n if (args.mandatoryCredentialStatus) {\n const error = 'No credential status object found in the Verifiable Credential and it is mandatory'\n console.log(error)\n return { verified: false, error }\n }\n return { verified: true }\n }\n if ('credentialStatus' in uniform && uniform.credentialStatus) {\n if (uniform.credentialStatus.type === 'StatusList2021Entry') {\n return checkStatus({ ...args, verifyStatusListCredential, verifyMatchingIssuers })\n } else if (args?.errorUnknownListType) {\n const error = `Credential status type ${uniform.credentialStatus.type} is not supported, and check status has been configured to not allow for that`\n console.log(error)\n return { verified: false, error }\n } else {\n console.log(`Skipped verification of status type ${uniform.credentialStatus.type} as we do not support it (yet)`)\n }\n }\n return { verified: true }\n}\n\nexport async function simpleCheckStatusFromStatusListUrl(args: {\n statusListCredential: string\n statusPurpose?: StatusPurpose2021\n type?: StatusListType | 'StatusList2021Entry'\n id?: string\n statusListIndex: string\n}): Promise<number | Status2021 | StatusOAuth> {\n return checkStatusIndexFromStatusListCredential({\n ...args,\n statusListCredential: await fetchStatusListCredential(args),\n })\n}\n\nexport async function checkStatusIndexFromStatusListCredential(args: {\n statusListCredential: StatusListCredential\n statusPurpose?: StatusPurpose2021\n type?: StatusListType | 'StatusList2021Entry'\n id?: string\n statusListIndex: string | number\n}): Promise<number | Status2021 | StatusOAuth> {\n const statusListType: StatusListType = determineStatusListType(args.statusListCredential)\n const implementation = getStatusListImplementation(statusListType)\n return implementation.checkStatusIndex(args)\n}\n\nexport async function createNewStatusList(\n args: CreateNewStatusListFuncArgs,\n context: IAgentContext<ICredentialPlugin & IIdentifierResolution>,\n): Promise<StatusListResult> {\n const { type } = getAssertedValues(args)\n const implementation = getStatusListImplementation(type)\n return implementation.createNewStatusList(args, context)\n}\n\nexport async function updateStatusIndexFromStatusListCredential(\n args: UpdateStatusListIndexArgs,\n context: IAgentContext<ICredentialPlugin & IIdentifierResolution>,\n): Promise<StatusListResult> {\n const credential = getAssertedValue('statusListCredential', args.statusListCredential)\n const statusListType: StatusListType = determineStatusListType(credential)\n const implementation = getStatusListImplementation(statusListType)\n return implementation.updateStatusListIndex(args, context)\n}\n\n// Keeping helper function for backward compatibility\nexport async function statusListCredentialToDetails(args: {\n statusListCredential: StatusListCredential\n correlationId?: string\n driverType?: StatusListDriverType\n}): Promise<StatusListResult> {\n const credential = getAssertedValue('statusListCredential', args.statusListCredential)\n\n let statusListType: StatusListType | undefined\n const documentFormat = CredentialMapper.detectDocumentType(credential)\n if (documentFormat === DocumentFormat.JWT) {\n const [header] = credential.split('.')\n const decodedHeader = JSON.parse(Buffer.from(header, 'base64').toString())\n\n if (decodedHeader.typ === 'statuslist+jwt') {\n statusListType = StatusListType.OAuthStatusList\n }\n } else if (documentFormat === DocumentFormat.MSO_MDOC) {\n statusListType = StatusListType.OAuthStatusList\n // TODO check CBOR content?\n }\n if (!statusListType) {\n const uniform = CredentialMapper.toUniformCredential(credential)\n const type = uniform.type.find((t) => t.includes('StatusList2021') || t.includes('OAuth2StatusList'))\n if (!type) {\n throw new Error('Invalid status list credential type')\n }\n statusListType = type.replace('Credential', '') as StatusListType\n }\n\n const implementation = getStatusListImplementation(statusListType)\n return await implementation.toStatusListDetails({\n statusListPayload: credential,\n correlationId: args.correlationId,\n driverType: args.driverType,\n })\n}\n\nexport async function updateStatusListIndexFromEncodedList(\n args: UpdateStatusListFromEncodedListArgs,\n context: IAgentContext<ICredentialPlugin & IIdentifierResolution>,\n): Promise<StatusListResult> {\n const { type } = getAssertedValue('type', args)\n const implementation = getStatusListImplementation(type!)\n return implementation.updateStatusListFromEncodedList(args, context)\n}\n\nexport async function statusList2021ToVerifiableCredential(\n args: StatusList2021ToVerifiableCredentialArgs,\n context: IAgentContext<ICredentialPlugin & IIdentifierResolution>,\n): Promise<StatusListCredential> {\n const { issuer, id, type } = getAssertedValues(args)\n const identifier = await context.agent.identifierManagedGet({\n identifier: typeof issuer === 'string' ? issuer : issuer.id,\n vmRelationship: 'assertionMethod',\n offlineWhenNoDIDRegistered: true, // FIXME Fix identifier resolution for EBSI\n })\n const proofFormat: CredentialProofFormat = args?.proofFormat ?? 'lds'\n assertValidProofType(StatusListType.StatusList2021, proofFormat)\n const veramoProofFormat: VeramoProofFormat = proofFormat as VeramoProofFormat\n\n const encodedList = getAssertedValue('encodedList', args.encodedList)\n const statusPurpose = getAssertedValue('statusPurpose', args.statusPurpose)\n const credential = {\n '@context': ['https://www.w3.org/2018/credentials/v1', 'https://w3id.org/vc/status-list/2021/v1'],\n id,\n issuer,\n // issuanceDate: \"2021-03-10T04:24:12.164Z\",\n type: ['VerifiableCredential', `${type}Credential`],\n credentialSubject: {\n id,\n type,\n statusPurpose,\n encodedList,\n },\n }\n // TODO copy statuslist schema to local and disable fetching remote contexts\n const verifiableCredential = await context.agent.createVerifiableCredential({\n credential,\n keyRef: identifier.kmsKeyRef,\n proofFormat: veramoProofFormat,\n fetchRemoteContexts: true,\n })\n\n return CredentialMapper.toWrappedVerifiableCredential(verifiableCredential as StatusListCredential).original as StatusListCredential\n}\n","import {\n CredentialMapper,\n type IIssuer,\n type CredentialProofFormat,\n StatusListType,\n StatusListType as StatusListTypeW3C,\n type StatusListCredential,\n DocumentFormat,\n} from '@sphereon/ssi-types'\nimport { jwtDecode } from 'jwt-decode'\n\nexport function getAssertedStatusListType(type?: StatusListType) {\n const assertedType = type ?? StatusListType.StatusList2021\n if (![StatusListType.StatusList2021, StatusListType.OAuthStatusList].includes(assertedType)) {\n throw Error(`StatusList type ${assertedType} is not supported (yet)`)\n }\n return assertedType\n}\n\nexport function getAssertedValue<T>(name: string, value: T): NonNullable<T> {\n if (value === undefined || value === null) {\n throw Error(`Missing required ${name} value`)\n }\n return value\n}\n\nexport function getAssertedValues(args: { issuer: string | IIssuer; id: string; type?: StatusListTypeW3C | StatusListType }) {\n const type = getAssertedStatusListType(args?.type)\n const id = getAssertedValue('id', args.id)\n const issuer = getAssertedValue('issuer', args.issuer)\n return { id, issuer, type }\n}\n\nexport function getAssertedProperty<T extends object>(propertyName: string, obj: T): NonNullable<any> {\n if (!(propertyName in obj)) {\n throw Error(`The input object does not contain required property: ${propertyName}`)\n }\n return getAssertedValue(propertyName, (obj as any)[propertyName])\n}\n\nconst ValidProofTypeMap = new Map<StatusListType, CredentialProofFormat[]>([\n [StatusListType.StatusList2021, ['jwt', 'lds', 'EthereumEip712Signature2021']],\n [StatusListType.OAuthStatusList, ['jwt', 'cbor']],\n])\n\nexport function assertValidProofType(type: StatusListType, proofFormat: CredentialProofFormat) {\n const validProofTypes = ValidProofTypeMap.get(type)\n if (!validProofTypes?.includes(proofFormat)) {\n throw Error(`Invalid proof format '${proofFormat}' for status list type ${type}`)\n }\n}\n\nexport function determineStatusListType(credential: StatusListCredential): StatusListType {\n const proofFormat = determineProofFormat(credential)\n switch (proofFormat) {\n case 'jwt':\n const payload: StatusListCredential = jwtDecode(credential as string)\n const keys = Object.keys(payload)\n if (keys.includes('status_list')) {\n return StatusListType.OAuthStatusList\n } else if (keys.includes('vc')) {\n return StatusListType.StatusList2021\n }\n break\n case 'lds':\n const uniform = CredentialMapper.toUniformCredential(credential)\n const type = uniform.type.find((t) => {\n return Object.values(StatusListType).some((statusType) => t.includes(statusType))\n })\n if (!type) {\n throw new Error('Invalid status list credential type')\n }\n return type.replace('Credential', '') as StatusListType\n\n case 'cbor':\n return StatusListType.OAuthStatusList\n }\n\n throw new Error('Cannot determine status list type from credential payload')\n}\n\nexport function determineProofFormat(credential: StatusListCredential): CredentialProofFormat {\n const type: DocumentFormat = CredentialMapper.detectDocumentType(credential)\n switch (type) {\n case DocumentFormat.JWT:\n return 'jwt'\n case DocumentFormat.MSO_MDOC:\n // Not really mdoc, just assume Cbor for now, I'd need to decode at least the header to what type of Cbor we have\n return 'cbor'\n case DocumentFormat.JSONLD:\n return 'lds'\n default:\n throw Error('Cannot determine credential payload type')\n }\n}\n","import type { IAgentContext, ICredentialPlugin, ProofFormat as VeramoProofFormat } from '@veramo/core'\nimport type { IIdentifierResolution } from '@sphereon/ssi-sdk-ext.identifier-resolution'\nimport {\n CredentialMapper,\n DocumentFormat,\n type IIssuer,\n type CredentialProofFormat,\n type StatusListCredential,\n StatusListType,\n} from '@sphereon/ssi-types'\n\nimport { StatusList } from '@sphereon/vc-status-list'\nimport type { IStatusList } from './IStatusList'\nimport type {\n CheckStatusIndexArgs,\n CreateStatusListArgs,\n StatusListResult,\n ToStatusListDetailsArgs,\n UpdateStatusListFromEncodedListArgs,\n UpdateStatusListIndexArgs,\n} from '../types'\n\nimport { Status2021 } from '../types'\nimport { assertValidProofType, getAssertedProperty, getAssertedValue, getAssertedValues } from '../utils'\n\nexport const DEFAULT_LIST_LENGTH = 250000\nexport const DEFAULT_PROOF_FORMAT = 'lds' as VeramoProofFormat\n\nexport class StatusList2021Implementation implements IStatusList {\n async createNewStatusList(\n args: CreateStatusListArgs,\n context: IAgentContext<ICredentialPlugin & IIdentifierResolution>,\n ): Promise<StatusListResult> {\n const length = args?.length ?? DEFAULT_LIST_LENGTH\n const proofFormat: CredentialProofFormat = args?.proofFormat ?? DEFAULT_PROOF_FORMAT\n assertValidProofType(StatusListType.StatusList2021, proofFormat)\n const veramoProofFormat: VeramoProofFormat = proofFormat as VeramoProofFormat\n\n const { issuer, id } = args\n const correlationId = getAssertedValue('correlationId', args.correlationId)\n\n const list = new StatusList({ length })\n const encodedList = await list.encode()\n const statusPurpose = 'revocation'\n\n const statusListCredential = await this.createVerifiableCredential(\n {\n ...args,\n encodedList,\n proofFormat: veramoProofFormat,\n },\n context,\n )\n\n return {\n encodedList,\n statusListCredential: statusListCredential,\n statusList2021: {\n statusPurpose,\n indexingDirection: 'rightToLeft',\n },\n length,\n type: StatusListType.StatusList2021,\n proofFormat,\n id,\n correlationId,\n issuer,\n statuslistContentType: this.buildContentType(proofFormat),\n }\n }\n\n async updateStatusListIndex(\n args: UpdateStatusListIndexArgs,\n context: IAgentContext<ICredentialPlugin & IIdentifierResolution>,\n ): Promise<StatusListResult> {\n const credential = args.statusListCredential\n const uniform = CredentialMapper.toUniformCredential(credential)\n const { issuer, credentialSubject } = uniform\n const id = getAssertedValue('id', uniform.id)\n const origEncodedList = getAssertedProperty('encodedList', credentialSubject)\n\n const index = typeof args.statusListIndex === 'number' ? args.statusListIndex : parseInt(args.statusListIndex)\n const statusList = await StatusList.decode({ encodedList: origEncodedList })\n statusList.setStatus(index, args.value != 0)\n const encodedList = await statusList.encode()\n\n const proofFormat = CredentialMapper.detectDocumentType(credential) === DocumentFormat.JWT ? 'jwt' : 'lds'\n const updatedCredential = await this.createVerifiableCredential(\n {\n ...args,\n id,\n issuer,\n encodedList,\n proofFormat: proofFormat,\n },\n context,\n )\n\n return {\n statusListCredential: updatedCredential,\n encodedList,\n statusList2021: {\n ...('statusPurpose' in credentialSubject ? { statusPurpose: credentialSubject.statusPurpose } : {}),\n indexingDirection: 'rightToLeft',\n },\n length: statusList.length - 1,\n type: StatusListType.StatusList2021,\n proofFormat: proofFormat,\n id,\n issuer,\n statuslistContentType: this.buildContentType(proofFormat),\n }\n }\n\n async updateStatusListFromEncodedList(\n args: UpdateStatusListFromEncodedListArgs,\n context: IAgentContext<ICredentialPlugin & IIdentifierResolution>,\n ): Promise<StatusListResult> {\n if (!args.statusList2021) {\n throw new Error('statusList2021 options required for type StatusList2021')\n }\n const proofFormat: CredentialProofFormat = args?.proofFormat ?? DEFAULT_PROOF_FORMAT\n assertValidProofType(StatusListType.StatusList2021, proofFormat)\n const veramoProofFormat: VeramoProofFormat = proofFormat as VeramoProofFormat\n\n const { issuer, id } = getAssertedValues(args)\n const statusList = await StatusList.decode({ encodedList: args.encodedList })\n const index = typeof args.statusListIndex === 'number' ? args.statusListIndex : parseInt(args.statusListIndex)\n statusList.setStatus(index, args.value)\n\n const newEncodedList = await statusList.encode()\n const credential = await this.createVerifiableCredential(\n {\n id,\n issuer,\n encodedList: newEncodedList,\n proofFormat: veramoProofFormat,\n keyRef: args.keyRef,\n },\n context,\n )\n\n return {\n type: StatusListType.StatusList2021,\n statusListCredential: credential,\n encodedList: newEncodedList,\n statusList2021: {\n statusPurpose: args.statusList2021.statusPurpose,\n indexingDirection: 'rightToLeft',\n },\n length: statusList.length,\n proofFormat: args.proofFormat ?? 'lds',\n id: id,\n issuer: issuer,\n statuslistContentType: this.buildContentType(proofFormat),\n }\n }\n\n async checkStatusIndex(args: CheckStatusIndexArgs): Promise<number | Status2021> {\n const uniform = CredentialMapper.toUniformCredential(args.statusListCredential)\n const { credentialSubject } = uniform\n const encodedList = getAssertedProperty('encodedList', credentialSubject)\n\n const statusList = await StatusList.decode({ encodedList })\n const status = statusList.getStatus(typeof args.statusListIndex === 'number' ? args.statusListIndex : parseInt(args.statusListIndex))\n return status ? Status2021.Invalid : Status2021.Valid\n }\n\n async toStatusListDetails(args: ToStatusListDetailsArgs): Promise<StatusListResult> {\n const { statusListPayload } = args\n const uniform = CredentialMapper.toUniformCredential(statusListPayload)\n const { issuer, credentialSubject } = uniform\n const id = getAssertedValue('id', uniform.id)\n const encodedList = getAssertedProperty('encodedList', credentialSubject)\n const proofFormat: CredentialProofFormat = CredentialMapper.detectDocumentType(statusListPayload) === DocumentFormat.JWT ? 'jwt' : 'lds'\n\n const statusPurpose = getAssertedProperty('statusPurpose', credentialSubject)\n const list = await StatusList.decode({ encodedList })\n\n return {\n id,\n encodedList,\n issuer,\n type: StatusListType.StatusList2021,\n proofFormat,\n length: list.length,\n statusListCredential: statusListPayload,\n statuslistContentType: this.buildContentType(proofFormat),\n statusList2021: {\n indexingDirection: 'rightToLeft',\n statusPurpose,\n },\n ...(args.correlationId && { correlationId: args.correlationId }),\n ...(args.driverType && { driverType: args.driverType }),\n }\n }\n\n private async createVerifiableCredential(\n args: {\n id: string\n issuer: string | IIssuer\n encodedList: string\n proofFormat: VeramoProofFormat\n keyRef?: string\n },\n context: IAgentContext<ICredentialPlugin & IIdentifierResolution>,\n ): Promise<StatusListCredential> {\n const identifier = await context.agent.identifierManagedGet({\n identifier: typeof args.issuer === 'string' ? args.issuer : args.issuer.id,\n vmRelationship: 'assertionMethod',\n offlineWhenNoDIDRegistered: true,\n })\n\n const credential = {\n '@context': ['https://www.w3.org/2018/credentials/v1', 'https://w3id.org/vc/status-list/2021/v1'],\n id: args.id,\n issuer: args.issuer,\n type: ['VerifiableCredential', 'StatusList2021Credential'],\n credentialSubject: {\n id: args.id,\n type: 'StatusList2021',\n statusPurpose: 'revocation',\n encodedList: args.encodedList,\n },\n }\n\n const verifiableCredential = await context.agent.createVerifiableCredential({\n credential,\n keyRef: args.keyRef ?? identifier.kmsKeyRef,\n proofFormat: args.proofFormat,\n fetchRemoteContexts: true,\n })\n\n return CredentialMapper.toWrappedVerifiableCredential(verifiableCredential as StatusListCredential).original as StatusListCredential\n }\n\n private buildContentType(proofFormat: 'jwt' | 'lds' | 'EthereumEip712Signature2021' | 'cbor' | undefined) {\n switch (proofFormat) {\n case 'jwt':\n return `application/statuslist+jwt`\n case 'cbor':\n return `application/statuslist+cwt`\n case 'lds':\n return 'application/statuslist+ld+json'\n default:\n throw Error(`Unsupported content type '${proofFormat}' for status lists`)\n }\n }\n}\n","import type { IAgentContext, ICredentialPlugin, IKeyManager } from '@veramo/core'\nimport { type CompactJWT, type CWT, type CredentialProofFormat, StatusListType } from '@sphereon/ssi-types'\nimport type {\n CheckStatusIndexArgs,\n CreateStatusListArgs,\n SignedStatusListData,\n StatusListResult,\n StatusOAuth,\n ToStatusListDetailsArgs,\n UpdateStatusListFromEncodedListArgs,\n UpdateStatusListIndexArgs,\n} from '../types'\nimport { determineProofFormat, getAssertedValue, getAssertedValues } from '../utils'\nimport type { IStatusList } from './IStatusList'\nimport { StatusList } from '@sd-jwt/jwt-status-list'\nimport type { IJwtService } from '@sphereon/ssi-sdk-ext.jwt-service'\nimport type { IIdentifierResolution } from '@sphereon/ssi-sdk-ext.identifier-resolution'\nimport { createSignedJwt, decodeStatusListJWT } from './encoding/jwt'\nimport { createSignedCbor, decodeStatusListCWT } from './encoding/cbor'\n\ntype IRequiredContext = IAgentContext<ICredentialPlugin & IJwtService & IIdentifierResolution & IKeyManager>\n\nexport const DEFAULT_BITS_PER_STATUS = 1 // 1 bit is sufficient for 0x00 - \"VALID\" 0x01 - \"INVALID\" saving space in the process\nexport const DEFAULT_LIST_LENGTH = 250000\nexport const DEFAULT_PROOF_FORMAT = 'jwt' as CredentialProofFormat\n\nexport class OAuthStatusListImplementation implements IStatusList {\n async createNewStatusList(args: CreateStatusListArgs, context: IRequiredContext): Promise<StatusListResult> {\n if (!args.oauthStatusList) {\n throw new Error('OAuthStatusList options are required for type OAuthStatusList')\n }\n\n const proofFormat = args?.proofFormat ?? DEFAULT_PROOF_FORMAT\n const { issuer, id, oauthStatusList, keyRef } = args\n const { bitsPerStatus, expiresAt } = oauthStatusList\n const length = args.length ?? DEFAULT_LIST_LENGTH\n const issuerString = typeof issuer === 'string' ? issuer : issuer.id\n const correlationId = getAssertedValue('correlationId', args.correlationId)\n\n const statusList = new StatusList(new Array(length).fill(0), bitsPerStatus ?? DEFAULT_BITS_PER_STATUS)\n const encodedList = statusList.compressStatusList()\n const { statusListCredential } = await this.createSignedStatusList(proofFormat, context, statusList, issuerString, id, expiresAt, keyRef)\n\n return {\n encodedList,\n statusListCredential,\n oauthStatusList: { bitsPerStatus },\n length,\n type: StatusListType.OAuthStatusList,\n proofFormat,\n id,\n correlationId,\n issuer,\n statuslistContentType: this.buildContentType(proofFormat),\n }\n }\n\n async updateStatusListIndex(args: UpdateStatusListIndexArgs, context: IRequiredContext): Promise<StatusListResult> {\n const { statusListCredential, value, expiresAt, keyRef } = args\n if (typeof statusListCredential !== 'string') {\n return Promise.reject('statusListCredential in neither JWT nor CWT')\n }\n\n const proofFormat = determineProofFormat(statusListCredential)\n const decoded = proofFormat === 'jwt' ? decodeStatusListJWT(statusListCredential) : decodeStatusListCWT(statusListCredential)\n const { statusList, issuer, id } = decoded\n\n const index = typeof args.statusListIndex === 'number' ? args.statusListIndex : parseInt(args.statusListIndex)\n if (index < 0 || index >= statusList.statusList.length) {\n throw new Error('Status list index out of bounds')\n }\n\n statusList.setStatus(index, value)\n const { statusListCredential: signedCredential, encodedList } = await this.createSignedStatusList(\n proofFormat,\n context,\n statusList,\n issuer,\n id,\n expiresAt,\n keyRef,\n )\n\n return {\n statusListCredential: signedCredential,\n encodedList,\n oauthStatusList: {\n bitsPerStatus: statusList.getBitsPerStatus(),\n },\n length: statusList.statusList.length,\n type: StatusListType.OAuthStatusList,\n proofFormat,\n id,\n issuer,\n statuslistContentType: this.buildContentType(proofFormat),\n }\n }\n\n // FIXME: This still assumes only two values (boolean), whilst this list supports 8 bits max\n async updateStatusListFromEncodedList(args: UpdateStatusListFromEncodedListArgs, context: IRequiredContext): Promise<StatusListResult> {\n if (!args.oauthStatusList) {\n throw new Error('OAuthStatusList options are required for type OAuthStatusList')\n }\n const { proofFormat, oauthStatusList, keyRef } = args\n const { bitsPerStatus, expiresAt } = oauthStatusList\n\n const { issuer, id } = getAssertedValues(args)\n const issuerString = typeof issuer === 'string' ? issuer : issuer.id\n\n const listToUpdate = StatusList.decompressStatusList(args.encodedList, bitsPerStatus ?? DEFAULT_BITS_PER_STATUS)\n const index = typeof args.statusListIndex === 'number' ? args.statusListIndex : parseInt(args.statusListIndex)\n // FIXME: See above.\n listToUpdate.setStatus(index, args.value ? 1 : 0)\n\n const { statusListCredential, encodedList } = await this.createSignedStatusList(\n proofFormat ?? DEFAULT_PROOF_FORMAT,\n context,\n listToUpdate,\n issuerString,\n id,\n expiresAt,\n keyRef,\n )\n\n return {\n encodedList,\n statusListCredential,\n oauthStatusList: {\n bitsPerStatus,\n expiresAt,\n },\n length: listToUpdate.statusList.length,\n type: StatusListType.OAuthStatusList,\n proofFormat: proofFormat ?? DEFAULT_PROOF_FORMAT,\n id,\n issuer,\n statuslistContentType: this.buildContentType(proofFormat),\n }\n }\n\n private buildContentType(proofFormat: 'jwt' | 'lds' | 'EthereumEip712Signature2021' | 'cbor' | undefined) {\n return `application/statuslist+${proofFormat === 'cbor' ? 'cwt' : 'jwt'}`\n }\n\n async checkStatusIndex(args: CheckStatusIndexArgs): Promise<number | StatusOAuth> {\n const { statusListCredential, statusListIndex } = args\n if (typeof statusListCredential !== 'string') {\n return Promise.reject('statusListCredential in neither JWT nor CWT')\n }\n\n const proofFormat = determineProofFormat(statusListCredential)\n const { statusList } = proofFormat === 'jwt' ? decodeStatusListJWT(statusListCredential) : decodeStatusListCWT(statusListCredential)\n\n const index = typeof statusListIndex === 'number' ? statusListIndex : parseInt(statusListIndex)\n if (index < 0 || index >= statusList.statusList.length) {\n throw new Error('Status list index out of bounds')\n }\n\n return statusList.getStatus(index)\n }\n\n async toStatusListDetails(args: ToStatusListDetailsArgs): Promise<StatusListResult> {\n const { statusListPayload } = args as { statusListPayload: CompactJWT | CWT }\n const proofFormat = determineProofFormat(statusListPayload)\n const decoded = proofFormat === 'jwt' ? decodeStatusListJWT(statusListPayload) : decodeStatusListCWT(statusListPayload)\n const { statusList, issuer, id, exp } = decoded\n\n return {\n id,\n encodedList: statusList.compressStatusList(),\n issuer,\n type: StatusListType.OAuthStatusList,\n proofFormat,\n length: statusList.statusList.length,\n statusListCredential: statusListPayload,\n statuslistContentType: this.buildContentType(proofFormat),\n oauthStatusList: {\n bitsPerStatus: statusList.getBitsPerStatus(),\n ...(exp && { expiresAt: new Date(exp * 1000) }),\n },\n ...(args.correlationId && { correlationId: args.correlationId }),\n ...(args.driverType && { driverType: args.driverType }),\n }\n }\n\n private async createSignedStatusList(\n proofFormat: 'jwt' | 'lds' | 'EthereumEip712Signature2021' | 'cbor',\n context: IAgentContext<ICredentialPlugin & IJwtService & IIdentifierResolution & IKeyManager>,\n statusList: StatusList,\n issuerString: string,\n id: string,\n expiresAt?: Date,\n keyRef?: string,\n ): Promise<SignedStatusListData> {\n switch (proofFormat) {\n case 'jwt': {\n return await createSignedJwt(context, statusList, issuerString, id, expiresAt, keyRef)\n }\n case 'cbor': {\n return await createSignedCbor(context, statusList, issuerString, id, expiresAt, keyRef)\n }\n default:\n throw new Error(`Invalid proof format '${proofFormat}' for OAuthStatusList`)\n }\n }\n}\n","import { type CompactJWT, JoseSignatureAlgorithm } from '@sphereon/ssi-types'\nimport { createHeaderAndPayload, StatusList, type StatusListJWTHeaderParameters, type StatusListJWTPayload } from '@sd-jwt/jwt-status-list'\nimport base64url from 'base64url'\nimport type { JWTPayload } from 'did-jwt'\nimport type { IRequiredContext, SignedStatusListData } from '../../types'\nimport { type DecodedStatusListPayload, resolveIdentifier } from './common'\nimport type { TKeyType } from '@veramo/core'\nimport { ensureManagedIdentifierResult } from '@sphereon/ssi-sdk-ext.identifier-resolution'\n\nconst STATUS_LIST_JWT_TYP = 'statuslist+jwt'\n\nexport const createSignedJwt = async (\n context: IRequiredContext,\n statusList: StatusList,\n issuerString: string,\n id: string,\n expiresAt?: Date,\n keyRef?: string,\n): Promise<SignedStatusListData> => {\n const identifier = await resolveIdentifier(context, issuerString, keyRef)\n const resolution = await ensureManagedIdentifierResult(identifier, context)\n\n const payload: JWTPayload = {\n iss: issuerString,\n sub: id,\n iat: Math.floor(Date.now() / 1000),\n ...(expiresAt && { exp: Math.floor(expiresAt.getTime() / 1000) }),\n }\n\n const header: StatusListJWTHeaderParameters = {\n alg: getSigningAlgo(resolution.key.type),\n typ: STATUS_LIST_JWT_TYP,\n }\n const values = createHeaderAndPayload(statusList, payload, header)\n const signedJwt = await context.agent.jwtCreateJwsCompactSignature({\n issuer: { ...identifier, noIssPayloadUpdate: false },\n protectedHeader: values.header,\n payload: values.payload,\n })\n\n return {\n statusListCredential: signedJwt.jwt,\n encodedList: (values.payload as StatusListJWTPayload).status_list.lst,\n }\n}\n\nexport const decodeStatusListJWT = (jwt: CompactJWT): DecodedStatusListPayload => {\n const [, payloadBase64] = jwt.split('.')\n const payload = JSON.parse(base64url.decode(payloadBase64))\n\n if (!payload.iss || !payload.sub || !payload.status_list) {\n throw new Error('Missing required fields in JWT payload')\n }\n\n const statusList = StatusList.decompressStatusList(payload.status_list.lst, payload.status_list.bits)\n\n return {\n issuer: payload.iss,\n id: payload.sub,\n statusList,\n exp: payload.exp,\n ttl: payload.ttl,\n iat: payload.iat,\n }\n}\n\nexport const getSigningAlgo = (type: TKeyType): JoseSignatureAlgorithm => {\n switch (type) {\n case 'Ed25519':\n return JoseSignatureAlgorithm.EdDSA\n case 'Secp256k1':\n return JoseSignatureAlgorithm.ES256K\n case 'Secp256r1':\n return JoseSignatureAlgorithm.ES256\n case 'RSA':\n return JoseSignatureAlgorithm.RS256\n default:\n throw Error('Key type not yet supported')\n }\n}\n","import type { IRequiredContext } from '../../types'\nimport { StatusList } from '@sd-jwt/jwt-status-list'\n\nexport interface DecodedStatusListPayload {\n issuer: string\n id: string\n statusList: StatusList\n exp?: number\n ttl?: number\n iat: number\n}\n\nexport const resolveIdentifier = async (context: IRequiredContext, issuer: string, keyRef?: string) => {\n return await context.agent.identifierManagedGet({\n identifier: issuer,\n vmRelationship: 'assertionMethod',\n offlineWhenNoDIDRegistered: true,\n ...(keyRef && { kmsKeyRef: keyRef }), // TODO the getDid resolver should look at this ASAP\n })\n}\n","import type { BitsPerStatus } from '@sd-jwt/jwt-status-list'\nimport { StatusList } from '@sd-jwt/jwt-status-list'\nimport { deflate, inflate } from 'pako'\nimport pkg from '@sphereon/kmp-mdoc-core';\nconst { com, kotlin } = pkg;\nimport base64url from 'base64url'\nimport type { IRequiredContext, SignedStatusListData } from '../../types'\nimport { type DecodedStatusListPayload, resolveIdentifier } from './common'\n\nexport type IKey = pkg.com.sphereon.crypto.IKey\nexport type CborItem<T> = pkg.com.sphereon.cbor.CborItem<T>\nexport const CborByteString = com.sphereon.cbor.CborByteString\nexport type CborByteStringType = pkg.com.sphereon.cbor.CborByteString\nexport const CborUInt = com.sphereon.cbor.CborUInt\nexport type CborUIntType = pkg.com.sphereon.cbor.CborUInt\nexport const CborString = com.sphereon.cbor.CborString\nexport type CborStringType = pkg.com.sphereon.cbor.CborString\n\n// const cbor = cborpkg.com.sphereon.cbor\n// const kmp = cborpkg.com.sphereon.kmp\n// const kotlin = cborpkg.kotlin\nconst decompressRawStatusList = (StatusList as any).decodeStatusList.bind(StatusList)\n\nconst CWT_CLAIMS = {\n SUBJECT: 2,\n ISSUER: 1,\n ISSUED_AT: 6,\n EXPIRATION: 4,\n TIME_TO_LIVE: 65534,\n STATUS_LIST: 65533,\n} as const\n\nexport const createSignedCbor = async (\n context: IRequiredContext,\n statusList: StatusList,\n issuerString: string,\n id: string,\n expiresAt?: Date,\n keyRef?: string,\n): Promise<SignedStatusListData> => {\n const identifier = await resolveIdentifier(context, issuerString, keyRef)\n\n const encodeStatusList = statusList.encodeStatusList()\n const compressedList = deflate(encodeStatusList, { level: 9 })\n const compressedBytes = new Int8Array(compressedList)\n\n const statusListMap = new com.sphereon.cbor.CborMap(\n kotlin.collections.KtMutableMap.fromJsMap(\n new Map<CborStringType, CborItem<any>>([\n [\n new com.sphereon.cbor.CborString('bits'),\n new com.sphereon.cbor.CborUInt(com.sphereon.kmp.LongKMP.fromNumber(statusList.getBitsPerStatus())),\n ],\n [new com.sphereon.cbor.CborString('lst'), new com.sphereon.cbor.CborByteString(compressedBytes)],\n ]),\n ),\n )\n\n const protectedHeader = new com.sphereon.cbor.CborMap(\n kotlin.collections.KtMutableMap.fromJsMap(\n new Map([[new com.sphereon.cbor.CborUInt(com.sphereon.kmp.LongKMP.fromNumber(16)), new com.sphereon.cbor.CborString('statuslist+cwt')]]), // \"type\"\n ),\n )\n const protectedHeaderEncoded = com.sphereon.cbor.Cbor.encode(protectedHeader)\n const claimsMap = buildClaimsMap(id, issuerString, statusListMap, expiresAt)\n const claimsEncoded: Int8Array = com.sphereon.cbor.Cbor.encode(claimsMap)\n\n const signedCWT: string = await context.agent.keyManagerSign({\n keyRef: identifier.kmsKeyRef,\n data: base64url.encode(Buffer.from(claimsEncoded)), // TODO test on RN\n encoding: undefined,\n })\n\n const protectedHeaderEncodedInt8 = new Int8Array(protectedHeaderEncoded)\n const claimsEncodedInt8 = new Int8Array(claimsEncoded)\n const signatureBytes = base64url.decode(signedCWT)\n const signatureInt8 = new Int8Array(Buffer.from(signatureBytes))\n\n const cwtArrayElements: Array<CborItem<any>> = [\n new CborByteString(protectedHeaderEncodedInt8),\n new CborByteString(claimsEncodedInt8),\n new CborByteString(signatureInt8),\n ]\n const cwtArray = new com.sphereon.cbor.CborArray(kotlin.collections.KtMutableList.fromJsArray(cwtArrayElements))\n const cwtEncoded = com.sphereon.cbor.Cbor.encode(cwtArray)\n const cwtBuffer = Buffer.from(cwtEncoded)\n return {\n statusListCredential: base64url.encode(cwtBuffer),\n encodedList: base64url.encode(compressedList as Buffer), // JS in @sd-jwt/jwt-status-list drops it in like this, so keep the same method\n }\n}\n\nfunction buildClaimsMap(id: string, issuerString: string, statusListMap: pkg.com.sphereon.cbor.CborMap<CborStringType, CborItem<any>>, expiresAt?: Date) {\n const ttl = 65535 // FIXME figure out what value should be / come from and what the difference is with exp\n const claimsEntries: Array<[CborUIntType, CborItem<any>]> = [\n [new CborUInt(com.sphereon.kmp.LongKMP.fromNumber(CWT_CLAIMS.SUBJECT)), new com.sphereon.cbor.CborString(id)], // \"sub\"\n [new CborUInt(com.sphereon.kmp.LongKMP.fromNumber(CWT_CLAIMS.ISSUER)), new com.sphereon.cbor.CborString(issuerString)], // \"iss\"\n [\n new CborUInt(com.sphereon.kmp.LongKMP.fromNumber(CWT_CLAIMS.ISSUED_AT)),\n new CborUInt(com.sphereon.kmp.LongKMP.fromNumber(Math.floor(Date.now() / 1000))), // \"iat\"\n ],\n ]\n\n if (expiresAt) {\n claimsEntries.push([\n new com.sphereon.cbor.CborUInt(com.sphereon.kmp.LongKMP.fromNumber(CWT_CLAIMS.EXPIRATION)),\n new com.sphereon.cbor.CborUInt(com.sphereon.kmp.LongKMP.fromNumber(Math.floor(expiresAt.getTime() / 1000))), // \"exp\"\n ])\n }\n\n if (ttl) {\n claimsEntries.push([\n new com.sphereon.cbor.CborUInt(com.sphereon.kmp.LongKMP.fromNumber(CWT_CLAIMS.TIME_TO_LIVE)),\n new com.sphereon.cbor.CborUInt(com.sphereon.kmp.LongKMP.fromNumber(ttl)), // \"time to live\"\n ])\n }\n\n claimsEntries.push([new com.sphereon.cbor.CborUInt(com.sphereon.kmp.LongKMP.fromNumber(CWT_CLAIMS.STATUS_LIST)), statusListMap])\n\n const claimsMap = new com.sphereon.cbor.CborMap(kotlin.collections.KtMutableMap.fromJsMap(new Map(claimsEntries)))\n return claimsMap\n}\n\nconst getCborValueFromMap = <T>(map: Map<CborItem<any>, CborItem<any>>, key: number): T => {\n const value = getCborOptionalValueFromMap<T>(map, key)\n if (value === undefined) {\n throw new Error(`Required claim ${key} not found`)\n }\n return value\n}\n\nconst getCborOptionalValueFromMap = <T>(map: Map<CborItem<any>, CborItem<any>>, key: number): T | undefined | never => {\n const value = map.get(new CborUInt(com.sphereon.kmp.LongKMP.fromNumber(key)))\n if (!value) {\n return undefined\n }\n return value.value as T\n}\n\nexport const decodeStatusListCWT = (cwt: string): DecodedStatusListPayload => {\n const encodedCbor = base64url.toBuffer(cwt)\n const encodedCborArray = new Int8Array(encodedCbor)\n const decodedCbor = com.sphereon.cbor.Cbor.decode(encodedCborArray)\n\n if (!(decodedCbor instanceof com.sphereon.cbor.CborArray)) {\n throw new Error('Invalid CWT format: Expected a CBOR array')\n }\n\n const [, payload] = decodedCbor.value.asJsArrayView()\n if (!(payload instanceof com.sphereon.cbor.CborByteString)) {\n throw new Error('Invalid payload format: Expected a CBOR ByteString')\n }\n\n const claims = com.sphereon.cbor.Cbor.decode(payload.value)\n if (!(claims instanceof com.sphereon.cbor.CborMap)) {\n throw new Error('Invalid claims format: Expected a CBOR map')\n }\n\n const claimsMap = claims.value.asJsMapView()\n\n const statusListMap = claimsMap.get(new CborUInt(com.sphereon.kmp.LongKMP.fromNumber(65533))).value.asJsMapView()\n\n const bits = Number(statusListMap.get(new CborString('bits')).value) as BitsPerStatus\n const decoded = new Uint8Array(statusListMap.get(new CborString('lst')).value)\n const uint8Array = inflate(decoded)\n const rawStatusList = decompressRawStatusList(uint8Array, bits)\n const statusList = new StatusList(rawStatusList, bits)\n\n return {\n issuer: getCborValueFromMap<string>(claimsMap, CWT_CLAIMS.ISSUER),\n id: getCborValueFromMap<string>(claimsMap, CWT_CLAIMS.SUBJECT),\n statusList,\n iat: Number(getCborValueFromMap<number>(claimsMap, CWT_CLAIMS.ISSUED_AT)),\n exp: getCborOptionalValueFromMap<number>(claimsMap, CWT_CLAIMS.EXPIRATION),\n ttl: getCborOptionalValueFromMap<number>(claimsMap, CWT_CLAIMS.TIME_TO_LIVE),\n }\n}\n","import type { IStatusList } from './IStatusList'\nimport { StatusList2021Implementation } from './StatusList2021'\nimport { OAuthStatusListImplementation } from './OAuthStatusList'\nimport { StatusListType } from '@sphereon/ssi-types'\n\nexport class StatusListFactory {\n private static instance: StatusListFactory\n private implementations: Map<StatusListType, IStatusList>\n\n private constructor() {\n this.implementations = new Map()\n this.implementations.set(StatusListType.StatusList2021, new StatusList2021Implementation())\n this.implementations.set(StatusListType.OAuthStatusList, new OAuthStatusListImplementation())\n }\n\n public static getInstance(): StatusListFactory {\n if (!StatusListFactory.instance) {\n StatusListFactory.instance = new StatusListFactory()\n }\n return StatusListFactory.instance\n }\n\n public getByType(type: StatusListType): IStatusList {\n const statusList = this.implementations.get(type)\n if (!statusList) {\n throw new Error(`No implementation found for status list type: ${type}`)\n }\n return statusList\n }\n}\n\nexport function getStatusListImplementation(type: StatusListType): IStatusList {\n return StatusListFactory.getInstance().getByType(type)\n}\n"],"mappings":"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","names":["StatusOAuth","Status2021","CredentialMapper","DocumentFormat","StatusListType","checkStatus","CredentialMapper","StatusListType","DocumentFormat","jwtDecode","getAssertedStatusListType","type","assertedType","StatusListType","StatusList2021","OAuthStatusList","includes","Error","getAssertedValue","name","value","undefined","getAssertedValues","args","id","issuer","getAssertedProperty","propertyName","obj","ValidProofTypeMap","Map","assertValidProofType","proofFormat","validProofTypes","get","determineStatusListType","credential","determineProofFormat","payload","jwtDecode","keys","Object","uniform","CredentialMapper","toUniformCredential","find","t","values","some","statusType","replace","detectDocumentType","DocumentFormat","JWT","MSO_MDOC","JSONLD","CredentialMapper","DocumentFormat","StatusListType","StatusList","DEFAULT_LIST_LENGTH","DEFAULT_PROOF_FORMAT","StatusList2021Implementation","createNewStatusList","args","context","length","proofFormat","assertValidProofType","StatusListType","StatusList2021","veramoProofFormat","issuer","id","correlationId","getAssertedValue","list","StatusList","encodedList","encode","statusPurpose","statusListCredential","createVerifiableCredential","statusList2021","indexingDirection","type","statuslistContentType","buildContentType","updateStatusListIndex","credential","uniform","CredentialMapper","toUniformCredential","credentialSubject","origEncodedList","getAssertedProperty","index","statusListIndex","parseInt","statusList","decode","setStatus","value","detectDocumentType","DocumentFormat","JWT","updatedCredential","updateStatusListFromEncodedList","Error","getAssertedValues","newEncodedList","keyRef","checkStatusIndex","status","getStatus","Status2021","Invalid","Valid","toStatusListDetails","statusListPayload","driverType","identifier","agent","identifierManagedGet","vmRelationship","offlineWhenNoDIDRegistered","verifiableCredential","kmsKeyRef","fetchRemoteContexts","toWrappedVerifiableCredential","original","StatusListType","StatusList","JoseSignatureAlgorithm","createHeaderAndPayload","StatusList","base64url","resolveIdentifier","context","issuer","keyRef","agent","identifierManagedGet","identifier","vmRelationship","offlineWhenNoDIDRegistered","kmsKeyRef","ensureManagedIdentifierResult","STATUS_LIST_JWT_TYP","createSignedJwt","context","statusList","issuerString","id","expiresAt","keyRef","identifier","resolveIdentifier","resolution","ensureManagedIdentifierResult","payload","iss","sub","iat","Math","floor","Date","now","exp","getTime","header","alg","getSigningAlgo","key","type","typ","values","createHeaderAndPayload","signedJwt","agent","jwtCreateJwsCompactSignature","issuer","noIssPayloadUpdate","protectedHeader","statusListCredential","jwt","encodedList","status_list","lst","decodeStatusListJWT","payloadBase64","split","JSON","parse","base64url","decode","Error","StatusList","decompressStatusList","bits","ttl","JoseSignatureAlgorithm","EdDSA","ES256K","ES256","RS256","StatusList","deflate","inflate","pkg","base64url","com","kotlin","pkg","CborByteString","sphereon","cbor","CborUInt","CborString","decompressRawStatusList","StatusList","decodeStatusList","bind","CWT_CLAIMS","SUBJECT","ISSUER","ISSUED_AT","EXPIRATION","TIME_TO_LIVE","STATUS_LIST","createSignedCbor","context","statusList","issuerString","id","expiresAt","keyRef","identifier","resolveIdentifier","encodeStatusList","compressedList","deflate","level","compressedBytes","Int8Array","statusListMap","CborMap","collections","KtMutableMap","fromJsMap","Map","kmp","LongKMP","fromNumber","getBitsPerStatus","protectedHeader","protectedHeaderEncoded","Cbor","encode","claimsMap","buildClaimsMap","claimsEncoded","signedCWT","agent","keyManagerSign","kmsKeyRef","data","base64url","Buffer","from","encoding","undefined","protectedHeaderEncodedInt8","claimsEncodedInt8","signatureBytes","decode","signatureInt8","cwtArrayElements","cwtArray","CborArray","KtMutableList","fromJsArray","cwtEncoded","cwtBuffer","statusListCredential","encodedList","ttl","claimsEntries","Math","floor","Date","now","push","getTime","getCborValueFromMap","map","key","value","getCborOptionalValueFromMap","Error","get","decodeStatusListCWT","cwt","encodedCbor","toBuffer","encodedCborArray","decodedCbor","payload","asJsArrayView","claims","asJsMapView","bits","Number","decoded","Uint8Array","uint8Array","inflate","rawStatusList","issuer","iat","exp","DEFAULT_BITS_PER_STATUS","DEFAULT_LIST_LENGTH","DEFAULT_PROOF_FORMAT","OAuthStatusListImplementation","createNewStatusList","args","context","oauthStatusList","Error","proofFormat","issuer","id","keyRef","bitsPerStatus","expiresAt","length","issuerString","correlationId","getAssertedValue","statusList","StatusList","Array","fill","encodedList","compressStatusList","statusListCredential","createSignedStatusList","type","StatusListType","OAuthStatusList","statuslistContentType","buildContentType","updateStatusListIndex","value","Promise","reject","determineProofFormat","decoded","decodeStatusListJWT","decodeStatusListCWT","index","statusListIndex","parseInt","setStatus","signedCredential","getBitsPerStatus","updateStatusListFromEncodedList","getAssertedValues","listToUpdate","decompressStatusList","checkStatusIndex","getStatus","toStatusListDetails","statusListPayload","exp","Date","driverType","createSignedJwt","createSignedCbor","StatusListType","StatusListFactory","instance","implementations","Map","set","StatusListType","StatusList2021","StatusList2021Implementation","OAuthStatusList","OAuthStatusListImplementation","getInstance","getByType","type","statusList","get","Error","getStatusListImplementation","fetchStatusListCredential","args","url","getAssertedValue","statusListCredential","response","fetch","ok","Error","status","statusText","responseAsText","text","trim","startsWith","JSON","parse","error","console","message","stringify","statusPluginStatusFunction","credential","didDoc","result","checkStatusForCredential","documentLoader","errorUnknownListType","revoked","verified","vcLibCheckStatusFunction","mandatoryCredentialStatus","verifyStatusListCredential","verifyMatchingIssuers","uniform","CredentialMapper","toUniformCredential","credentialStatus","log","type","checkStatus","simpleCheckStatusFromStatusListUrl","checkStatusIndexFromStatusListCredential","statusListType","determineStatusListType","implementation","getStatusListImplementation","checkStatusIndex","createNewStatusList","context","getAssertedValues","updateStatusIndexFromStatusListCredential","updateStatusListIndex","statusListCredentialToDetails","documentFormat","detectDocumentType","DocumentFormat","JWT","header","split","decodedHeader","Buffer","from","toString","typ","StatusListType","OAuthStatusList","MSO_MDOC","find","t","includes","replace","toStatusListDetails","statusListPayload","correlationId","driverType","updateStatusListIndexFromEncodedList","updateStatusListFromEncodedList","statusList2021ToVerifiableCredential","issuer","id","identifier","agent","identifierManagedGet","vmRelationship","offlineWhenNoDIDRegistered","proofFormat","assertValidProofType","StatusList2021","veramoProofFormat","encodedList","statusPurpose","credentialSubject","verifiableCredential","createVerifiableCredential","keyRef","kmsKeyRef","fetchRemoteContexts","toWrappedVerifiableCredential","original"]}
|
package/package.json
CHANGED
|
@@ -1,24 +1,45 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sphereon/ssi-sdk.vc-status-list",
|
|
3
3
|
"description": "Sphereon SSI-SDK plugin for Status List management, like StatusList2021.",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.33.1-feature.jose.vcdm.55+6f02f6f8",
|
|
5
5
|
"source": "src/index.ts",
|
|
6
|
-
"
|
|
7
|
-
"
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.cjs",
|
|
8
|
+
"module": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
"react-native": "./dist/index.js",
|
|
12
|
+
"import": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"require": {
|
|
17
|
+
"types": "./dist/index.d.cts",
|
|
18
|
+
"require": "./dist/index.cjs"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
8
21
|
"scripts": {
|
|
9
|
-
"build": "
|
|
10
|
-
"build:clean": "tsc --build --clean && tsc --build"
|
|
22
|
+
"build": "tsup --config ../../tsup.config.ts --tsconfig ../../tsconfig.tsup.json"
|
|
11
23
|
},
|
|
12
24
|
"dependencies": {
|
|
13
|
-
"@
|
|
14
|
-
"@
|
|
15
|
-
"@
|
|
25
|
+
"@sd-jwt/core": "^0.9.2",
|
|
26
|
+
"@sd-jwt/jwt-status-list": "^0.9.1",
|
|
27
|
+
"@sd-jwt/sd-jwt-vc": "^0.9.2",
|
|
28
|
+
"@sphereon/kmp-mdoc-core": "0.2.0-SNAPSHOT.26",
|
|
29
|
+
"@sphereon/oid4vci-common": "0.17.1-feature.esm.cjs.39",
|
|
30
|
+
"@sphereon/ssi-sdk-ext.did-utils": "0.28.1-feature.esm.cjs.18",
|
|
31
|
+
"@sphereon/ssi-sdk-ext.identifier-resolution": "0.28.1-feature.esm.cjs.18",
|
|
32
|
+
"@sphereon/ssi-sdk-ext.jwt-service": "0.28.1-feature.esm.cjs.18",
|
|
33
|
+
"@sphereon/ssi-types": "0.33.1-feature.jose.vcdm.55+6f02f6f8",
|
|
16
34
|
"@sphereon/vc-status-list": "7.0.0-next.0",
|
|
17
35
|
"@veramo/core": "4.2.0",
|
|
18
36
|
"@veramo/credential-status": "4.2.0",
|
|
37
|
+
"base64url": "^3.0.1",
|
|
19
38
|
"credential-status": "^2.0.6",
|
|
20
39
|
"debug": "^4.3.5",
|
|
21
|
-
"
|
|
40
|
+
"jwt-decode": "^4.0.0",
|
|
41
|
+
"pako": "^2.1.0",
|
|
42
|
+
"typeorm": "0.3.20",
|
|
22
43
|
"uint8arrays": "^3.1.1"
|
|
23
44
|
},
|
|
24
45
|
"devDependencies": {
|
|
@@ -26,11 +47,13 @@
|
|
|
26
47
|
"@babel/core": "^7.24.9",
|
|
27
48
|
"@babel/preset-env": "^7.24.8",
|
|
28
49
|
"@babel/preset-typescript": "^7.24.7",
|
|
29
|
-
"
|
|
50
|
+
"@types/pako": "2.0.3",
|
|
51
|
+
"@veramo/key-manager": "4.2.0",
|
|
52
|
+
"typescript": "5.8.3"
|
|
30
53
|
},
|
|
31
54
|
"files": [
|
|
32
|
-
"dist
|
|
33
|
-
"src
|
|
55
|
+
"dist",
|
|
56
|
+
"src",
|
|
34
57
|
"README.md",
|
|
35
58
|
"LICENSE"
|
|
36
59
|
],
|
|
@@ -46,6 +69,5 @@
|
|
|
46
69
|
"SSI",
|
|
47
70
|
"StatusList2021"
|
|
48
71
|
],
|
|
49
|
-
"
|
|
50
|
-
"gitHead": "3b988a2bb62a7c4534a2670ea3a0985fd93d00f2"
|
|
72
|
+
"gitHead": "6f02f6f83679198268c6e1ea956be24cc1017234"
|
|
51
73
|
}
|
package/src/functions.ts
CHANGED
|
@@ -1,41 +1,45 @@
|
|
|
1
|
-
import { IIdentifierResolution } from '@sphereon/ssi-sdk-ext.identifier-resolution'
|
|
1
|
+
import type { IIdentifierResolution } from '@sphereon/ssi-sdk-ext.identifier-resolution'
|
|
2
2
|
import {
|
|
3
3
|
CredentialMapper,
|
|
4
4
|
DocumentFormat,
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
type CredentialProofFormat,
|
|
6
|
+
type StatusListCredential,
|
|
7
7
|
StatusListDriverType,
|
|
8
8
|
StatusListType,
|
|
9
|
-
StatusPurpose2021,
|
|
9
|
+
type StatusPurpose2021,
|
|
10
10
|
} from '@sphereon/ssi-types'
|
|
11
|
+
import type { CredentialStatus, DIDDocument, IAgentContext, ICredentialPlugin, ProofFormat as VeramoProofFormat } from '@veramo/core'
|
|
11
12
|
|
|
12
|
-
import { checkStatus
|
|
13
|
-
|
|
13
|
+
import { checkStatus } from '@sphereon/vc-status-list'
|
|
14
|
+
|
|
15
|
+
// @ts-ignore
|
|
14
16
|
import { CredentialJwtOrJSON, StatusMethod } from 'credential-status'
|
|
15
17
|
import {
|
|
16
18
|
CreateNewStatusListFuncArgs,
|
|
19
|
+
Status2021,
|
|
17
20
|
StatusList2021ToVerifiableCredentialArgs,
|
|
18
|
-
StatusListDetails,
|
|
19
21
|
StatusListResult,
|
|
22
|
+
StatusOAuth,
|
|
20
23
|
UpdateStatusListFromEncodedListArgs,
|
|
21
|
-
|
|
24
|
+
UpdateStatusListIndexArgs,
|
|
22
25
|
} from './types'
|
|
26
|
+
import { assertValidProofType, determineStatusListType, getAssertedValue, getAssertedValues } from './utils'
|
|
27
|
+
import { getStatusListImplementation } from './impl/StatusListFactory'
|
|
23
28
|
|
|
24
|
-
export async function fetchStatusListCredential(args: { statusListCredential: string }): Promise<
|
|
29
|
+
export async function fetchStatusListCredential(args: { statusListCredential: string }): Promise<StatusListCredential> {
|
|
25
30
|
const url = getAssertedValue('statusListCredential', args.statusListCredential)
|
|
26
31
|
try {
|
|
27
32
|
const response = await fetch(url)
|
|
28
33
|
if (!response.ok) {
|
|
29
|
-
|
|
30
|
-
throw Error(error)
|
|
34
|
+
throw Error(`Fetching status list ${url} resulted in an error: ${response.status} : ${response.statusText}`)
|
|
31
35
|
}
|
|
32
36
|
const responseAsText = await response.text()
|
|
33
37
|
if (responseAsText.trim().startsWith('{')) {
|
|
34
|
-
return JSON.parse(responseAsText) as
|
|
38
|
+
return JSON.parse(responseAsText) as StatusListCredential
|
|
35
39
|
}
|
|
36
|
-
return responseAsText as
|
|
40
|
+
return responseAsText as StatusListCredential
|
|
37
41
|
} catch (error) {
|
|
38
|
-
console.
|
|
42
|
+
console.error(`Fetching status list ${url} resulted in an unexpected error: ${error instanceof Error ? error.message : JSON.stringify(error)}`)
|
|
39
43
|
throw error
|
|
40
44
|
}
|
|
41
45
|
}
|
|
@@ -52,7 +56,7 @@ export function statusPluginStatusFunction(args: {
|
|
|
52
56
|
const result = await checkStatusForCredential({
|
|
53
57
|
...args,
|
|
54
58
|
documentLoader: args.documentLoader,
|
|
55
|
-
credential: credential as
|
|
59
|
+
credential: credential as StatusListCredential,
|
|
56
60
|
errorUnknownListType: args.errorUnknownListType,
|
|
57
61
|
})
|
|
58
62
|
|
|
@@ -75,7 +79,7 @@ export function vcLibCheckStatusFunction(args: {
|
|
|
75
79
|
}) {
|
|
76
80
|
const { mandatoryCredentialStatus, verifyStatusListCredential, verifyMatchingIssuers, errorUnknownListType } = args
|
|
77
81
|
return (args: {
|
|
78
|
-
credential:
|
|
82
|
+
credential: StatusListCredential
|
|
79
83
|
documentLoader: any
|
|
80
84
|
suite: any
|
|
81
85
|
}): Promise<{
|
|
@@ -93,7 +97,7 @@ export function vcLibCheckStatusFunction(args: {
|
|
|
93
97
|
}
|
|
94
98
|
|
|
95
99
|
export async function checkStatusForCredential(args: {
|
|
96
|
-
credential:
|
|
100
|
+
credential: StatusListCredential
|
|
97
101
|
documentLoader: any
|
|
98
102
|
suite: any
|
|
99
103
|
mandatoryCredentialStatus?: boolean
|
|
@@ -132,7 +136,7 @@ export async function simpleCheckStatusFromStatusListUrl(args: {
|
|
|
132
136
|
type?: StatusListType | 'StatusList2021Entry'
|
|
133
137
|
id?: string
|
|
134
138
|
statusListIndex: string
|
|
135
|
-
}): Promise<
|
|
139
|
+
}): Promise<number | Status2021 | StatusOAuth> {
|
|
136
140
|
return checkStatusIndexFromStatusListCredential({
|
|
137
141
|
...args,
|
|
138
142
|
statusListCredential: await fetchStatusListCredential(args),
|
|
@@ -140,163 +144,97 @@ export async function simpleCheckStatusFromStatusListUrl(args: {
|
|
|
140
144
|
}
|
|
141
145
|
|
|
142
146
|
export async function checkStatusIndexFromStatusListCredential(args: {
|
|
143
|
-
statusListCredential:
|
|
147
|
+
statusListCredential: StatusListCredential
|
|
144
148
|
statusPurpose?: StatusPurpose2021
|
|
145
149
|
type?: StatusListType | 'StatusList2021Entry'
|
|
146
150
|
id?: string
|
|
147
151
|
statusListIndex: string | number
|
|
148
|
-
}): Promise<
|
|
149
|
-
const
|
|
150
|
-
const
|
|
151
|
-
|
|
152
|
-
getAssertedValue('issuer', issuer) // We are only checking the value here
|
|
153
|
-
getAssertedValue('credentialSubject', credentialSubject)
|
|
154
|
-
if (args.statusPurpose && 'statusPurpose' in credentialSubject) {
|
|
155
|
-
if (args.statusPurpose !== credentialSubject.statusPurpose) {
|
|
156
|
-
throw Error(
|
|
157
|
-
`Status purpose in StatusList credential with id ${id} and value ${credentialSubject.statusPurpose} does not match supplied purpose: ${args.statusPurpose}`,
|
|
158
|
-
)
|
|
159
|
-
}
|
|
160
|
-
} else if (args.id && args.id !== id) {
|
|
161
|
-
throw Error(`Status list id ${id} did not match required supplied id: ${args.id}`)
|
|
162
|
-
}
|
|
163
|
-
if (!type || !(type.includes(requestedType) || type.includes(requestedType + 'Credential'))) {
|
|
164
|
-
throw Error(`Credential type ${JSON.stringify(type)} does not contain requested type ${requestedType}`)
|
|
165
|
-
}
|
|
166
|
-
// @ts-ignore
|
|
167
|
-
const encodedList = getAssertedValue('encodedList', credentialSubject['encodedList'])
|
|
168
|
-
|
|
169
|
-
const statusList = await StatusList.decode({ encodedList })
|
|
170
|
-
const status = statusList.getStatus(typeof args.statusListIndex === 'number' ? args.statusListIndex : Number.parseInt(args.statusListIndex))
|
|
171
|
-
return status
|
|
152
|
+
}): Promise<number | Status2021 | StatusOAuth> {
|
|
153
|
+
const statusListType: StatusListType = determineStatusListType(args.statusListCredential)
|
|
154
|
+
const implementation = getStatusListImplementation(statusListType)
|
|
155
|
+
return implementation.checkStatusIndex(args)
|
|
172
156
|
}
|
|
173
157
|
|
|
174
158
|
export async function createNewStatusList(
|
|
175
159
|
args: CreateNewStatusListFuncArgs,
|
|
176
160
|
context: IAgentContext<ICredentialPlugin & IIdentifierResolution>,
|
|
177
161
|
): Promise<StatusListResult> {
|
|
178
|
-
const
|
|
179
|
-
const
|
|
180
|
-
|
|
181
|
-
const correlationId = getAssertedValue('correlationId', args.correlationId)
|
|
182
|
-
|
|
183
|
-
const list = new StatusList({ length })
|
|
184
|
-
const encodedList = await list.encode()
|
|
185
|
-
const statusPurpose = args.statusPurpose ?? 'revocation'
|
|
186
|
-
const statusListCredential = await statusList2021ToVerifiableCredential(
|
|
187
|
-
{
|
|
188
|
-
...args,
|
|
189
|
-
type,
|
|
190
|
-
proofFormat,
|
|
191
|
-
encodedList,
|
|
192
|
-
},
|
|
193
|
-
context,
|
|
194
|
-
)
|
|
195
|
-
|
|
196
|
-
return {
|
|
197
|
-
encodedList,
|
|
198
|
-
statusListCredential,
|
|
199
|
-
length,
|
|
200
|
-
type,
|
|
201
|
-
proofFormat,
|
|
202
|
-
id,
|
|
203
|
-
correlationId,
|
|
204
|
-
issuer,
|
|
205
|
-
statusPurpose,
|
|
206
|
-
indexingDirection: 'rightToLeft',
|
|
207
|
-
} as StatusListResult
|
|
162
|
+
const { type } = getAssertedValues(args)
|
|
163
|
+
const implementation = getStatusListImplementation(type)
|
|
164
|
+
return implementation.createNewStatusList(args, context)
|
|
208
165
|
}
|
|
209
166
|
|
|
210
167
|
export async function updateStatusIndexFromStatusListCredential(
|
|
211
|
-
args:
|
|
168
|
+
args: UpdateStatusListIndexArgs,
|
|
212
169
|
context: IAgentContext<ICredentialPlugin & IIdentifierResolution>,
|
|
213
|
-
): Promise<
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
value: args.value,
|
|
219
|
-
},
|
|
220
|
-
context,
|
|
221
|
-
)
|
|
170
|
+
): Promise<StatusListResult> {
|
|
171
|
+
const credential = getAssertedValue('statusListCredential', args.statusListCredential)
|
|
172
|
+
const statusListType: StatusListType = determineStatusListType(credential)
|
|
173
|
+
const implementation = getStatusListImplementation(statusListType)
|
|
174
|
+
return implementation.updateStatusListIndex(args, context)
|
|
222
175
|
}
|
|
223
176
|
|
|
177
|
+
// Keeping helper function for backward compatibility
|
|
224
178
|
export async function statusListCredentialToDetails(args: {
|
|
225
|
-
statusListCredential:
|
|
179
|
+
statusListCredential: StatusListCredential
|
|
226
180
|
correlationId?: string
|
|
227
181
|
driverType?: StatusListDriverType
|
|
228
|
-
}): Promise<
|
|
182
|
+
}): Promise<StatusListResult> {
|
|
229
183
|
const credential = getAssertedValue('statusListCredential', args.statusListCredential)
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
184
|
+
|
|
185
|
+
let statusListType: StatusListType | undefined
|
|
186
|
+
const documentFormat = CredentialMapper.detectDocumentType(credential)
|
|
187
|
+
if (documentFormat === DocumentFormat.JWT) {
|
|
188
|
+
const [header] = credential.split('.')
|
|
189
|
+
const decodedHeader = JSON.parse(Buffer.from(header, 'base64').toString())
|
|
190
|
+
|
|
191
|
+
if (decodedHeader.typ === 'statuslist+jwt') {
|
|
192
|
+
statusListType = StatusListType.OAuthStatusList
|
|
193
|
+
}
|
|
194
|
+
} else if (documentFormat === DocumentFormat.MSO_MDOC) {
|
|
195
|
+
statusListType = StatusListType.OAuthStatusList
|
|
196
|
+
// TODO check CBOR content?
|
|
234
197
|
}
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
issuer,
|
|
243
|
-
type: StatusListType.StatusList2021,
|
|
244
|
-
proofFormat,
|
|
245
|
-
indexingDirection: 'rightToLeft',
|
|
246
|
-
length: (await StatusList.decode({ encodedList })).length,
|
|
247
|
-
statusPurpose,
|
|
248
|
-
statusListCredential: credential,
|
|
249
|
-
...(args.correlationId && { correlationId: args.correlationId }),
|
|
250
|
-
...(args.driverType && { driverType: args.driverType }),
|
|
198
|
+
if (!statusListType) {
|
|
199
|
+
const uniform = CredentialMapper.toUniformCredential(credential)
|
|
200
|
+
const type = uniform.type.find((t) => t.includes('StatusList2021') || t.includes('OAuth2StatusList'))
|
|
201
|
+
if (!type) {
|
|
202
|
+
throw new Error('Invalid status list credential type')
|
|
203
|
+
}
|
|
204
|
+
statusListType = type.replace('Credential', '') as StatusListType
|
|
251
205
|
}
|
|
206
|
+
|
|
207
|
+
const implementation = getStatusListImplementation(statusListType)
|
|
208
|
+
return await implementation.toStatusListDetails({
|
|
209
|
+
statusListPayload: credential,
|
|
210
|
+
correlationId: args.correlationId,
|
|
211
|
+
driverType: args.driverType,
|
|
212
|
+
})
|
|
252
213
|
}
|
|
253
214
|
|
|
254
215
|
export async function updateStatusListIndexFromEncodedList(
|
|
255
216
|
args: UpdateStatusListFromEncodedListArgs,
|
|
256
217
|
context: IAgentContext<ICredentialPlugin & IIdentifierResolution>,
|
|
257
|
-
): Promise<
|
|
258
|
-
const {
|
|
259
|
-
const
|
|
260
|
-
|
|
261
|
-
const index = getAssertedValue('index', typeof args.statusListIndex === 'number' ? args.statusListIndex : Number.parseInt(args.statusListIndex))
|
|
262
|
-
const value = getAssertedValue('value', args.value)
|
|
263
|
-
const statusPurpose = getAssertedValue('statusPurpose', args.statusPurpose)
|
|
264
|
-
|
|
265
|
-
const statusList = await StatusList.decode({ encodedList: origEncodedList })
|
|
266
|
-
statusList.setStatus(index, value)
|
|
267
|
-
const encodedList = await statusList.encode()
|
|
268
|
-
const statusListCredential = await statusList2021ToVerifiableCredential(
|
|
269
|
-
{
|
|
270
|
-
...args,
|
|
271
|
-
type,
|
|
272
|
-
proofFormat,
|
|
273
|
-
encodedList,
|
|
274
|
-
},
|
|
275
|
-
context,
|
|
276
|
-
)
|
|
277
|
-
return {
|
|
278
|
-
encodedList,
|
|
279
|
-
statusListCredential,
|
|
280
|
-
length: statusList.length - 1,
|
|
281
|
-
type,
|
|
282
|
-
proofFormat,
|
|
283
|
-
id,
|
|
284
|
-
issuer,
|
|
285
|
-
statusPurpose,
|
|
286
|
-
indexingDirection: 'rightToLeft',
|
|
287
|
-
}
|
|
218
|
+
): Promise<StatusListResult> {
|
|
219
|
+
const { type } = getAssertedValue('type', args)
|
|
220
|
+
const implementation = getStatusListImplementation(type!)
|
|
221
|
+
return implementation.updateStatusListFromEncodedList(args, context)
|
|
288
222
|
}
|
|
289
223
|
|
|
290
224
|
export async function statusList2021ToVerifiableCredential(
|
|
291
225
|
args: StatusList2021ToVerifiableCredentialArgs,
|
|
292
226
|
context: IAgentContext<ICredentialPlugin & IIdentifierResolution>,
|
|
293
|
-
): Promise<
|
|
227
|
+
): Promise<StatusListCredential> {
|
|
294
228
|
const { issuer, id, type } = getAssertedValues(args)
|
|
295
229
|
const identifier = await context.agent.identifierManagedGet({
|
|
296
230
|
identifier: typeof issuer === 'string' ? issuer : issuer.id,
|
|
297
231
|
vmRelationship: 'assertionMethod',
|
|
298
232
|
offlineWhenNoDIDRegistered: true, // FIXME Fix identifier resolution for EBSI
|
|
299
233
|
})
|
|
234
|
+
const proofFormat: CredentialProofFormat = args?.proofFormat ?? 'lds'
|
|
235
|
+
assertValidProofType(StatusListType.StatusList2021, proofFormat)
|
|
236
|
+
const veramoProofFormat: VeramoProofFormat = proofFormat as VeramoProofFormat
|
|
237
|
+
|
|
300
238
|
const encodedList = getAssertedValue('encodedList', args.encodedList)
|
|
301
239
|
const statusPurpose = getAssertedValue('statusPurpose', args.statusPurpose)
|
|
302
240
|
const credential = {
|
|
@@ -316,31 +254,9 @@ export async function statusList2021ToVerifiableCredential(
|
|
|
316
254
|
const verifiableCredential = await context.agent.createVerifiableCredential({
|
|
317
255
|
credential,
|
|
318
256
|
keyRef: identifier.kmsKeyRef,
|
|
319
|
-
proofFormat:
|
|
257
|
+
proofFormat: veramoProofFormat,
|
|
320
258
|
fetchRemoteContexts: true,
|
|
321
259
|
})
|
|
322
260
|
|
|
323
|
-
return CredentialMapper.toWrappedVerifiableCredential(verifiableCredential as
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
function getAssertedStatusListType(type?: StatusListType) {
|
|
327
|
-
const assertedType = type ?? StatusListType.StatusList2021
|
|
328
|
-
if (assertedType !== StatusListType.StatusList2021) {
|
|
329
|
-
throw Error(`StatusList type ${assertedType} is not supported (yet)`)
|
|
330
|
-
}
|
|
331
|
-
return assertedType
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
function getAssertedValue<T>(name: string, value: T): NonNullable<T> {
|
|
335
|
-
if (value === undefined || value === null) {
|
|
336
|
-
throw Error(`Missing required ${name} value`)
|
|
337
|
-
}
|
|
338
|
-
return value
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
function getAssertedValues(args: { issuer: string | IIssuer; id: string; type?: StatusListType }) {
|
|
342
|
-
const type = getAssertedStatusListType(args?.type)
|
|
343
|
-
const id = getAssertedValue('id', args.id)
|
|
344
|
-
const issuer = getAssertedValue('issuer', args.issuer)
|
|
345
|
-
return { id, issuer, type }
|
|
261
|
+
return CredentialMapper.toWrappedVerifiableCredential(verifiableCredential as StatusListCredential).original as StatusListCredential
|
|
346
262
|
}
|