@sphereon/ssi-sdk.vc-status-list 0.33.1-next.3 → 0.33.1-next.73

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.
Files changed (58) hide show
  1. package/dist/index.cjs +979 -0
  2. package/dist/index.cjs.map +1 -0
  3. package/dist/index.d.cts +275 -0
  4. package/dist/index.d.ts +273 -3
  5. package/dist/index.js +946 -19
  6. package/dist/index.js.map +1 -1
  7. package/package.json +28 -17
  8. package/src/functions.ts +9 -7
  9. package/src/impl/IStatusList.ts +3 -3
  10. package/src/impl/OAuthStatusList.ts +7 -7
  11. package/src/impl/StatusList2021.ts +17 -9
  12. package/src/impl/StatusListFactory.ts +1 -1
  13. package/src/impl/encoding/cbor.ts +53 -42
  14. package/src/impl/encoding/common.ts +1 -1
  15. package/src/impl/encoding/jwt.ts +6 -6
  16. package/src/types/index.ts +19 -19
  17. package/src/utils.ts +6 -6
  18. package/dist/functions.d.ts +0 -69
  19. package/dist/functions.d.ts.map +0 -1
  20. package/dist/functions.js +0 -200
  21. package/dist/functions.js.map +0 -1
  22. package/dist/impl/IStatusList.d.ts +0 -26
  23. package/dist/impl/IStatusList.d.ts.map +0 -1
  24. package/dist/impl/IStatusList.js +0 -3
  25. package/dist/impl/IStatusList.js.map +0 -1
  26. package/dist/impl/OAuthStatusList.d.ts +0 -21
  27. package/dist/impl/OAuthStatusList.d.ts.map +0 -1
  28. package/dist/impl/OAuthStatusList.js +0 -155
  29. package/dist/impl/OAuthStatusList.js.map +0 -1
  30. package/dist/impl/StatusList2021.d.ts +0 -16
  31. package/dist/impl/StatusList2021.d.ts.map +0 -1
  32. package/dist/impl/StatusList2021.js +0 -186
  33. package/dist/impl/StatusList2021.js.map +0 -1
  34. package/dist/impl/StatusListFactory.d.ts +0 -11
  35. package/dist/impl/StatusListFactory.d.ts.map +0 -1
  36. package/dist/impl/StatusListFactory.js +0 -32
  37. package/dist/impl/StatusListFactory.js.map +0 -1
  38. package/dist/impl/encoding/cbor.d.ts +0 -6
  39. package/dist/impl/encoding/cbor.d.ts.map +0 -1
  40. package/dist/impl/encoding/cbor.js +0 -140
  41. package/dist/impl/encoding/cbor.js.map +0 -1
  42. package/dist/impl/encoding/common.d.ts +0 -12
  43. package/dist/impl/encoding/common.d.ts.map +0 -1
  44. package/dist/impl/encoding/common.js +0 -17
  45. package/dist/impl/encoding/common.js.map +0 -1
  46. package/dist/impl/encoding/jwt.d.ts +0 -9
  47. package/dist/impl/encoding/jwt.d.ts.map +0 -1
  48. package/dist/impl/encoding/jwt.js +0 -74
  49. package/dist/impl/encoding/jwt.js.map +0 -1
  50. package/dist/index.d.ts.map +0 -1
  51. package/dist/types/index.d.ts +0 -209
  52. package/dist/types/index.d.ts.map +0 -1
  53. package/dist/types/index.js +0 -15
  54. package/dist/types/index.js.map +0 -1
  55. package/dist/utils.d.ts +0 -17
  56. package/dist/utils.d.ts.map +0 -1
  57. package/dist/utils.js +0 -88
  58. package/dist/utils.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 | any) /*IvcdMCredentialPlugin is not available*/ & 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(\n id: string,\n issuerString: string,\n statusListMap: pkg.com.sphereon.cbor.CborMap<CborStringType, CborItem<any>>,\n expiresAt?: Date,\n) {\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,36 @@
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.33.1-next.3+fd1a6fba",
4
+ "version": "0.33.1-next.73+be17b2cb",
5
5
  "source": "src/index.ts",
6
- "main": "dist/index.js",
7
- "types": "dist/index.d.ts",
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": "tsc --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
25
  "@sd-jwt/core": "^0.9.2",
14
26
  "@sd-jwt/jwt-status-list": "^0.9.1",
15
27
  "@sd-jwt/sd-jwt-vc": "^0.9.2",
16
- "@sphereon/kmp-cbor": "0.2.0-SNAPSHOT.25",
17
- "@sphereon/oid4vci-common": "0.17.0",
18
- "@sphereon/ssi-sdk-ext.did-utils": "0.28.0",
19
- "@sphereon/ssi-sdk-ext.identifier-resolution": "0.28.0",
20
- "@sphereon/ssi-sdk-ext.jwt-service": "0.28.0",
21
- "@sphereon/ssi-types": "0.33.1-next.3+fd1a6fba",
28
+ "@sphereon/kmp-mdoc-core": "0.2.0-SNAPSHOT.26",
29
+ "@sphereon/oid4vci-common": "0.17.1-next.39",
30
+ "@sphereon/ssi-sdk-ext.did-utils": "0.28.1-next.53",
31
+ "@sphereon/ssi-sdk-ext.identifier-resolution": "0.28.1-next.53",
32
+ "@sphereon/ssi-sdk-ext.jwt-service": "0.28.1-next.53",
33
+ "@sphereon/ssi-types": "0.33.1-next.73+be17b2cb",
22
34
  "@sphereon/vc-status-list": "7.0.0-next.0",
23
35
  "@veramo/core": "4.2.0",
24
36
  "@veramo/credential-status": "4.2.0",
@@ -27,7 +39,7 @@
27
39
  "debug": "^4.3.5",
28
40
  "jwt-decode": "^4.0.0",
29
41
  "pako": "^2.1.0",
30
- "typeorm": "^0.3.21",
42
+ "typeorm": "0.3.20",
31
43
  "uint8arrays": "^3.1.1"
32
44
  },
33
45
  "devDependencies": {
@@ -37,11 +49,11 @@
37
49
  "@babel/preset-typescript": "^7.24.7",
38
50
  "@types/pako": "2.0.3",
39
51
  "@veramo/key-manager": "4.2.0",
40
- "typescript": "5.4.2"
52
+ "typescript": "5.8.3"
41
53
  },
42
54
  "files": [
43
- "dist/**/*",
44
- "src/**/*",
55
+ "dist",
56
+ "src",
45
57
  "README.md",
46
58
  "LICENSE"
47
59
  ],
@@ -57,6 +69,5 @@
57
69
  "SSI",
58
70
  "StatusList2021"
59
71
  ],
60
- "nx": {},
61
- "gitHead": "fd1a6fba306a83a73ff7c531db87fa207dbf436d"
72
+ "gitHead": "be17b2cb752a6e5368119259e89a1f2a99f56848"
62
73
  }
package/src/functions.ts CHANGED
@@ -1,16 +1,18 @@
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
- ProofFormat,
6
- StatusListCredential,
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 { CredentialStatus, DIDDocument, IAgentContext, ICredentialPlugin, ProofFormat as VeramoProofFormat } from '@veramo/core'
11
+ import type { CredentialStatus, DIDDocument, IAgentContext, ICredentialPlugin, ProofFormat as VeramoProofFormat } from '@veramo/core'
12
12
 
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,
@@ -155,7 +157,7 @@ export async function checkStatusIndexFromStatusListCredential(args: {
155
157
 
156
158
  export async function createNewStatusList(
157
159
  args: CreateNewStatusListFuncArgs,
158
- context: IAgentContext<ICredentialPlugin & IIdentifierResolution>,
160
+ context: IAgentContext<(ICredentialPlugin | any) /*IvcdMCredentialPlugin is not available*/ & IIdentifierResolution>,
159
161
  ): Promise<StatusListResult> {
160
162
  const { type } = getAssertedValues(args)
161
163
  const implementation = getStatusListImplementation(type)
@@ -229,7 +231,7 @@ export async function statusList2021ToVerifiableCredential(
229
231
  vmRelationship: 'assertionMethod',
230
232
  offlineWhenNoDIDRegistered: true, // FIXME Fix identifier resolution for EBSI
231
233
  })
232
- const proofFormat: ProofFormat = args?.proofFormat ?? 'lds'
234
+ const proofFormat: CredentialProofFormat = args?.proofFormat ?? 'lds'
233
235
  assertValidProofType(StatusListType.StatusList2021, proofFormat)
234
236
  const veramoProofFormat: VeramoProofFormat = proofFormat as VeramoProofFormat
235
237
 
@@ -1,6 +1,6 @@
1
- import { IAgentContext, ICredentialPlugin } from '@veramo/core'
2
- import { IIdentifierResolution } from '@sphereon/ssi-sdk-ext.identifier-resolution'
3
- import {
1
+ import type { IAgentContext, ICredentialPlugin } from '@veramo/core'
2
+ import type { IIdentifierResolution } from '@sphereon/ssi-sdk-ext.identifier-resolution'
3
+ import type {
4
4
  CheckStatusIndexArgs,
5
5
  CreateStatusListArgs,
6
6
  Status2021,
@@ -1,6 +1,6 @@
1
- import { IAgentContext, ICredentialPlugin, IKeyManager } from '@veramo/core'
2
- import { CompactJWT, CWT, ProofFormat, StatusListType } from '@sphereon/ssi-types'
3
- import {
1
+ import type { IAgentContext, ICredentialPlugin, IKeyManager } from '@veramo/core'
2
+ import { type CompactJWT, type CWT, type CredentialProofFormat, StatusListType } from '@sphereon/ssi-types'
3
+ import type {
4
4
  CheckStatusIndexArgs,
5
5
  CreateStatusListArgs,
6
6
  SignedStatusListData,
@@ -11,10 +11,10 @@ import {
11
11
  UpdateStatusListIndexArgs,
12
12
  } from '../types'
13
13
  import { determineProofFormat, getAssertedValue, getAssertedValues } from '../utils'
14
- import { IStatusList } from './IStatusList'
14
+ import type { IStatusList } from './IStatusList'
15
15
  import { StatusList } from '@sd-jwt/jwt-status-list'
16
- import { IJwtService } from '@sphereon/ssi-sdk-ext.jwt-service'
17
- import { IIdentifierResolution } from '@sphereon/ssi-sdk-ext.identifier-resolution'
16
+ import type { IJwtService } from '@sphereon/ssi-sdk-ext.jwt-service'
17
+ import type { IIdentifierResolution } from '@sphereon/ssi-sdk-ext.identifier-resolution'
18
18
  import { createSignedJwt, decodeStatusListJWT } from './encoding/jwt'
19
19
  import { createSignedCbor, decodeStatusListCWT } from './encoding/cbor'
20
20
 
@@ -22,7 +22,7 @@ type IRequiredContext = IAgentContext<ICredentialPlugin & IJwtService & IIdentif
22
22
 
23
23
  export const DEFAULT_BITS_PER_STATUS = 1 // 1 bit is sufficient for 0x00 - "VALID" 0x01 - "INVALID" saving space in the process
24
24
  export const DEFAULT_LIST_LENGTH = 250000
25
- export const DEFAULT_PROOF_FORMAT = 'jwt' as ProofFormat
25
+ export const DEFAULT_PROOF_FORMAT = 'jwt' as CredentialProofFormat
26
26
 
27
27
  export class OAuthStatusListImplementation implements IStatusList {
28
28
  async createNewStatusList(args: CreateStatusListArgs, context: IRequiredContext): Promise<StatusListResult> {
@@ -1,18 +1,26 @@
1
- import { IAgentContext, ICredentialPlugin, ProofFormat as VeramoProofFormat } from '@veramo/core'
2
- import { IIdentifierResolution } from '@sphereon/ssi-sdk-ext.identifier-resolution'
3
- import { CredentialMapper, DocumentFormat, IIssuer, ProofFormat, StatusListCredential, StatusListType } from '@sphereon/ssi-types'
1
+ import type { IAgentContext, ICredentialPlugin, ProofFormat as VeramoProofFormat } from '@veramo/core'
2
+ import type { IIdentifierResolution } from '@sphereon/ssi-sdk-ext.identifier-resolution'
3
+ import {
4
+ CredentialMapper,
5
+ DocumentFormat,
6
+ type IIssuer,
7
+ type CredentialProofFormat,
8
+ type StatusListCredential,
9
+ StatusListType,
10
+ } from '@sphereon/ssi-types'
4
11
 
5
12
  import { StatusList } from '@sphereon/vc-status-list'
6
- import { IStatusList } from './IStatusList'
7
- import {
13
+ import type { IStatusList } from './IStatusList'
14
+ import type {
8
15
  CheckStatusIndexArgs,
9
16
  CreateStatusListArgs,
10
- Status2021,
11
17
  StatusListResult,
12
18
  ToStatusListDetailsArgs,
13
19
  UpdateStatusListFromEncodedListArgs,
14
20
  UpdateStatusListIndexArgs,
15
21
  } from '../types'
22
+
23
+ import { Status2021 } from '../types'
16
24
  import { assertValidProofType, getAssertedProperty, getAssertedValue, getAssertedValues } from '../utils'
17
25
 
18
26
  export const DEFAULT_LIST_LENGTH = 250000
@@ -24,7 +32,7 @@ export class StatusList2021Implementation implements IStatusList {
24
32
  context: IAgentContext<ICredentialPlugin & IIdentifierResolution>,
25
33
  ): Promise<StatusListResult> {
26
34
  const length = args?.length ?? DEFAULT_LIST_LENGTH
27
- const proofFormat: ProofFormat = args?.proofFormat ?? DEFAULT_PROOF_FORMAT
35
+ const proofFormat: CredentialProofFormat = args?.proofFormat ?? DEFAULT_PROOF_FORMAT
28
36
  assertValidProofType(StatusListType.StatusList2021, proofFormat)
29
37
  const veramoProofFormat: VeramoProofFormat = proofFormat as VeramoProofFormat
30
38
 
@@ -111,7 +119,7 @@ export class StatusList2021Implementation implements IStatusList {
111
119
  if (!args.statusList2021) {
112
120
  throw new Error('statusList2021 options required for type StatusList2021')
113
121
  }
114
- const proofFormat: ProofFormat = args?.proofFormat ?? DEFAULT_PROOF_FORMAT
122
+ const proofFormat: CredentialProofFormat = args?.proofFormat ?? DEFAULT_PROOF_FORMAT
115
123
  assertValidProofType(StatusListType.StatusList2021, proofFormat)
116
124
  const veramoProofFormat: VeramoProofFormat = proofFormat as VeramoProofFormat
117
125
 
@@ -164,7 +172,7 @@ export class StatusList2021Implementation implements IStatusList {
164
172
  const { issuer, credentialSubject } = uniform
165
173
  const id = getAssertedValue('id', uniform.id)
166
174
  const encodedList = getAssertedProperty('encodedList', credentialSubject)
167
- const proofFormat: ProofFormat = CredentialMapper.detectDocumentType(statusListPayload) === DocumentFormat.JWT ? 'jwt' : 'lds'
175
+ const proofFormat: CredentialProofFormat = CredentialMapper.detectDocumentType(statusListPayload) === DocumentFormat.JWT ? 'jwt' : 'lds'
168
176
 
169
177
  const statusPurpose = getAssertedProperty('statusPurpose', credentialSubject)
170
178
  const list = await StatusList.decode({ encodedList })
@@ -1,4 +1,4 @@
1
- import { IStatusList } from './IStatusList'
1
+ import type { IStatusList } from './IStatusList'
2
2
  import { StatusList2021Implementation } from './StatusList2021'
3
3
  import { OAuthStatusListImplementation } from './OAuthStatusList'
4
4
  import { StatusListType } from '@sphereon/ssi-types'
@@ -1,13 +1,24 @@
1
+ import type { BitsPerStatus } from '@sd-jwt/jwt-status-list'
1
2
  import { StatusList } from '@sd-jwt/jwt-status-list'
2
3
  import { deflate, inflate } from 'pako'
3
- import { com, kotlin } from '@sphereon/kmp-cbor'
4
+ import pkg from '@sphereon/kmp-mdoc-core'
5
+ const { com, kotlin } = pkg
4
6
  import base64url from 'base64url'
5
- import { IRequiredContext, SignedStatusListData } from '../../types'
6
- import { DecodedStatusListPayload, resolveIdentifier } from './common'
7
- import { BitsPerStatus } from '@sd-jwt/jwt-status-list/dist'
8
-
9
- const cbor = com.sphereon.cbor
10
- const kmp = com.sphereon.kmp
7
+ import type { IRequiredContext, SignedStatusListData } from '../../types'
8
+ import { type DecodedStatusListPayload, resolveIdentifier } from './common'
9
+
10
+ export type IKey = pkg.com.sphereon.crypto.IKey
11
+ export type CborItem<T> = pkg.com.sphereon.cbor.CborItem<T>
12
+ export const CborByteString = com.sphereon.cbor.CborByteString
13
+ export type CborByteStringType = pkg.com.sphereon.cbor.CborByteString
14
+ export const CborUInt = com.sphereon.cbor.CborUInt
15
+ export type CborUIntType = pkg.com.sphereon.cbor.CborUInt
16
+ export const CborString = com.sphereon.cbor.CborString
17
+ export type CborStringType = pkg.com.sphereon.cbor.CborString
18
+
19
+ // const cbor = cborpkg.com.sphereon.cbor
20
+ // const kmp = cborpkg.com.sphereon.kmp
21
+ // const kotlin = cborpkg.kotlin
11
22
  const decompressRawStatusList = (StatusList as any).decodeStatusList.bind(StatusList)
12
23
 
13
24
  const CWT_CLAIMS = {
@@ -33,23 +44,26 @@ export const createSignedCbor = async (
33
44
  const compressedList = deflate(encodeStatusList, { level: 9 })
34
45
  const compressedBytes = new Int8Array(compressedList)
35
46
 
36
- const statusListMap = new cbor.CborMap(
47
+ const statusListMap = new com.sphereon.cbor.CborMap(
37
48
  kotlin.collections.KtMutableMap.fromJsMap(
38
- new Map<com.sphereon.cbor.CborString, com.sphereon.cbor.CborItem<any>>([
39
- [new cbor.CborString('bits'), new cbor.CborUInt(kmp.LongKMP.fromNumber(statusList.getBitsPerStatus()))],
40
- [new cbor.CborString('lst'), new cbor.CborByteString(compressedBytes)],
49
+ new Map<CborStringType, CborItem<any>>([
50
+ [
51
+ new com.sphereon.cbor.CborString('bits'),
52
+ new com.sphereon.cbor.CborUInt(com.sphereon.kmp.LongKMP.fromNumber(statusList.getBitsPerStatus())),
53
+ ],
54
+ [new com.sphereon.cbor.CborString('lst'), new com.sphereon.cbor.CborByteString(compressedBytes)],
41
55
  ]),
42
56
  ),
43
57
  )
44
58
 
45
- const protectedHeader = new cbor.CborMap(
59
+ const protectedHeader = new com.sphereon.cbor.CborMap(
46
60
  kotlin.collections.KtMutableMap.fromJsMap(
47
- new Map([[new cbor.CborUInt(kmp.LongKMP.fromNumber(16)), new cbor.CborString('statuslist+cwt')]]), // "type"
61
+ new Map([[new com.sphereon.cbor.CborUInt(com.sphereon.kmp.LongKMP.fromNumber(16)), new com.sphereon.cbor.CborString('statuslist+cwt')]]), // "type"
48
62
  ),
49
63
  )
50
- const protectedHeaderEncoded = cbor.Cbor.encode(protectedHeader)
64
+ const protectedHeaderEncoded = com.sphereon.cbor.Cbor.encode(protectedHeader)
51
65
  const claimsMap = buildClaimsMap(id, issuerString, statusListMap, expiresAt)
52
- const claimsEncoded: Int8Array = cbor.Cbor.encode(claimsMap)
66
+ const claimsEncoded: Int8Array = com.sphereon.cbor.Cbor.encode(claimsMap)
53
67
 
54
68
  const signedCWT: string = await context.agent.keyManagerSign({
55
69
  keyRef: identifier.kmsKeyRef,
@@ -62,13 +76,13 @@ export const createSignedCbor = async (
62
76
  const signatureBytes = base64url.decode(signedCWT)
63
77
  const signatureInt8 = new Int8Array(Buffer.from(signatureBytes))
64
78
 
65
- const cwtArrayElements: Array<com.sphereon.cbor.CborItem<any>> = [
66
- new cbor.CborByteString(protectedHeaderEncodedInt8),
67
- new cbor.CborByteString(claimsEncodedInt8),
68
- new cbor.CborByteString(signatureInt8),
79
+ const cwtArrayElements: Array<CborItem<any>> = [
80
+ new CborByteString(protectedHeaderEncodedInt8),
81
+ new CborByteString(claimsEncodedInt8),
82
+ new CborByteString(signatureInt8),
69
83
  ]
70
- const cwtArray = new cbor.CborArray(kotlin.collections.KtMutableList.fromJsArray(cwtArrayElements))
71
- const cwtEncoded = cbor.Cbor.encode(cwtArray)
84
+ const cwtArray = new com.sphereon.cbor.CborArray(kotlin.collections.KtMutableList.fromJsArray(cwtArrayElements))
85
+ const cwtEncoded = com.sphereon.cbor.Cbor.encode(cwtArray)
72
86
  const cwtBuffer = Buffer.from(cwtEncoded)
73
87
  return {
74
88
  statusListCredential: base64url.encode(cwtBuffer),
@@ -79,40 +93,40 @@ export const createSignedCbor = async (
79
93
  function buildClaimsMap(
80
94
  id: string,
81
95
  issuerString: string,
82
- statusListMap: com.sphereon.cbor.CborMap<com.sphereon.cbor.CborString, com.sphereon.cbor.CborItem<any>>,
96
+ statusListMap: pkg.com.sphereon.cbor.CborMap<CborStringType, CborItem<any>>,
83
97
  expiresAt?: Date,
84
98
  ) {
85
99
  const ttl = 65535 // FIXME figure out what value should be / come from and what the difference is with exp
86
- const claimsEntries: Array<[com.sphereon.cbor.CborUInt, com.sphereon.cbor.CborItem<any>]> = [
87
- [new cbor.CborUInt(kmp.LongKMP.fromNumber(CWT_CLAIMS.SUBJECT)), new cbor.CborString(id)], // "sub"
88
- [new cbor.CborUInt(kmp.LongKMP.fromNumber(CWT_CLAIMS.ISSUER)), new cbor.CborString(issuerString)], // "iss"
100
+ const claimsEntries: Array<[CborUIntType, CborItem<any>]> = [
101
+ [new CborUInt(com.sphereon.kmp.LongKMP.fromNumber(CWT_CLAIMS.SUBJECT)), new com.sphereon.cbor.CborString(id)], // "sub"
102
+ [new CborUInt(com.sphereon.kmp.LongKMP.fromNumber(CWT_CLAIMS.ISSUER)), new com.sphereon.cbor.CborString(issuerString)], // "iss"
89
103
  [
90
- new cbor.CborUInt(kmp.LongKMP.fromNumber(CWT_CLAIMS.ISSUED_AT)),
91
- new cbor.CborUInt(kmp.LongKMP.fromNumber(Math.floor(Date.now() / 1000))), // "iat"
104
+ new CborUInt(com.sphereon.kmp.LongKMP.fromNumber(CWT_CLAIMS.ISSUED_AT)),
105
+ new CborUInt(com.sphereon.kmp.LongKMP.fromNumber(Math.floor(Date.now() / 1000))), // "iat"
92
106
  ],
93
107
  ]
94
108
 
95
109
  if (expiresAt) {
96
110
  claimsEntries.push([
97
- new cbor.CborUInt(kmp.LongKMP.fromNumber(CWT_CLAIMS.EXPIRATION)),
98
- new cbor.CborUInt(kmp.LongKMP.fromNumber(Math.floor(expiresAt.getTime() / 1000))), // "exp"
111
+ new com.sphereon.cbor.CborUInt(com.sphereon.kmp.LongKMP.fromNumber(CWT_CLAIMS.EXPIRATION)),
112
+ new com.sphereon.cbor.CborUInt(com.sphereon.kmp.LongKMP.fromNumber(Math.floor(expiresAt.getTime() / 1000))), // "exp"
99
113
  ])
100
114
  }
101
115
 
102
116
  if (ttl) {
103
117
  claimsEntries.push([
104
- new cbor.CborUInt(kmp.LongKMP.fromNumber(CWT_CLAIMS.TIME_TO_LIVE)),
105
- new cbor.CborUInt(kmp.LongKMP.fromNumber(ttl)), // "time to live"
118
+ new com.sphereon.cbor.CborUInt(com.sphereon.kmp.LongKMP.fromNumber(CWT_CLAIMS.TIME_TO_LIVE)),
119
+ new com.sphereon.cbor.CborUInt(com.sphereon.kmp.LongKMP.fromNumber(ttl)), // "time to live"
106
120
  ])
107
121
  }
108
122
 
109
- claimsEntries.push([new cbor.CborUInt(kmp.LongKMP.fromNumber(CWT_CLAIMS.STATUS_LIST)), statusListMap])
123
+ claimsEntries.push([new com.sphereon.cbor.CborUInt(com.sphereon.kmp.LongKMP.fromNumber(CWT_CLAIMS.STATUS_LIST)), statusListMap])
110
124
 
111
- const claimsMap = new cbor.CborMap(kotlin.collections.KtMutableMap.fromJsMap(new Map(claimsEntries)))
125
+ const claimsMap = new com.sphereon.cbor.CborMap(kotlin.collections.KtMutableMap.fromJsMap(new Map(claimsEntries)))
112
126
  return claimsMap
113
127
  }
114
128
 
115
- const getCborValueFromMap = <T>(map: Map<com.sphereon.cbor.CborItem<any>, com.sphereon.cbor.CborItem<any>>, key: number): T => {
129
+ const getCborValueFromMap = <T>(map: Map<CborItem<any>, CborItem<any>>, key: number): T => {
116
130
  const value = getCborOptionalValueFromMap<T>(map, key)
117
131
  if (value === undefined) {
118
132
  throw new Error(`Required claim ${key} not found`)
@@ -120,11 +134,8 @@ const getCborValueFromMap = <T>(map: Map<com.sphereon.cbor.CborItem<any>, com.sp
120
134
  return value
121
135
  }
122
136
 
123
- const getCborOptionalValueFromMap = <T>(
124
- map: Map<com.sphereon.cbor.CborItem<any>, com.sphereon.cbor.CborItem<any>>,
125
- key: number,
126
- ): T | undefined | never => {
127
- const value = map.get(new com.sphereon.cbor.CborUInt(kmp.LongKMP.fromNumber(key)))
137
+ const getCborOptionalValueFromMap = <T>(map: Map<CborItem<any>, CborItem<any>>, key: number): T | undefined | never => {
138
+ const value = map.get(new CborUInt(com.sphereon.kmp.LongKMP.fromNumber(key)))
128
139
  if (!value) {
129
140
  return undefined
130
141
  }
@@ -152,10 +163,10 @@ export const decodeStatusListCWT = (cwt: string): DecodedStatusListPayload => {
152
163
 
153
164
  const claimsMap = claims.value.asJsMapView()
154
165
 
155
- const statusListMap = claimsMap.get(new com.sphereon.cbor.CborUInt(kmp.LongKMP.fromNumber(65533))).value.asJsMapView()
166
+ const statusListMap = claimsMap.get(new CborUInt(com.sphereon.kmp.LongKMP.fromNumber(65533))).value.asJsMapView()
156
167
 
157
- const bits = Number(statusListMap.get(new com.sphereon.cbor.CborString('bits')).value) as BitsPerStatus
158
- const decoded = new Uint8Array(statusListMap.get(new com.sphereon.cbor.CborString('lst')).value)
168
+ const bits = Number(statusListMap.get(new CborString('bits')).value) as BitsPerStatus
169
+ const decoded = new Uint8Array(statusListMap.get(new CborString('lst')).value)
159
170
  const uint8Array = inflate(decoded)
160
171
  const rawStatusList = decompressRawStatusList(uint8Array, bits)
161
172
  const statusList = new StatusList(rawStatusList, bits)
@@ -1,4 +1,4 @@
1
- import { IRequiredContext } from '../../types'
1
+ import type { IRequiredContext } from '../../types'
2
2
  import { StatusList } from '@sd-jwt/jwt-status-list'
3
3
 
4
4
  export interface DecodedStatusListPayload {