@sphereon/ssi-sdk.credential-vcdm 0.33.1-feature.jose.vcdm.56 → 0.33.1-feature.jose.vcdm.58

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.js CHANGED
@@ -111,14 +111,15 @@ var W3cMessageHandler = class extends AbstractMessageHandler {
111
111
  }
112
112
  };
113
113
 
114
- // src/action-handler.ts
114
+ // src/vcdmCredentialPlugin.ts
115
115
  import { schema } from "@veramo/core";
116
- import { isDefined as isDefined2, MANDATORY_CREDENTIAL_CONTEXT, processEntryToArray } from "@veramo/utils";
117
116
  import Debug2 from "debug";
118
117
 
119
118
  // src/functions.ts
120
- import { isDefined } from "@veramo/utils";
119
+ import { isDefined, processEntryToArray } from "@veramo/utils";
121
120
  import { decodeJWT } from "did-jwt";
121
+ import { addVcdmContextIfNeeded, isVcdm1Credential, isVcdm2Credential, VCDM_CREDENTIAL_CONTEXT_V1, VCDM_CREDENTIAL_CONTEXT_V2 } from "@sphereon/ssi-types";
122
+ import { getKey } from "@sphereon/ssi-sdk-ext.did-utils";
122
123
  function extractIssuer2(input, options = {}) {
123
124
  if (!isDefined(input)) {
124
125
  return "";
@@ -148,15 +149,12 @@ function removeDIDParameters(did) {
148
149
  return did.replace(/\?.*$/, "");
149
150
  }
150
151
  __name(removeDIDParameters, "removeDIDParameters");
151
- function pickSigningKey(identifier, keyRef) {
152
- let key;
153
- if (!keyRef) {
154
- key = identifier.keys.find((k) => k.type === "Secp256k1" || k.type === "Ed25519" || k.type === "Secp256r1");
155
- if (!key) throw Error("key_not_found: No signing key for " + identifier.did);
156
- } else {
157
- key = identifier.keys.find((k) => k.kid === keyRef);
158
- if (!key) throw Error("key_not_found: No signing key for " + identifier.did + " with kid " + keyRef);
159
- }
152
+ async function pickSigningKey({ identifier, kmsKeyRef }, context) {
153
+ const key = await getKey({
154
+ identifier,
155
+ vmRelationship: "assertionMethod",
156
+ kmsKeyRef
157
+ }, context);
160
158
  return key;
161
159
  }
162
160
  __name(pickSigningKey, "pickSigningKey");
@@ -171,8 +169,96 @@ async function isRevoked(credential, context) {
171
169
  throw new Error(`invalid_setup: The credential status can't be verified because there is no ICredentialStatusVerifier plugin installed.`);
172
170
  }
173
171
  __name(isRevoked, "isRevoked");
172
+ function preProcessCredentialPayload({ credential, now = /* @__PURE__ */ new Date() }) {
173
+ const credentialContext = addVcdmContextIfNeeded(credential?.["@context"]);
174
+ const isVdcm1 = isVcdm1Credential(credential);
175
+ const isVdcm2 = isVcdm2Credential(credential);
176
+ const credentialType = processEntryToArray(credential?.type, "VerifiableCredential");
177
+ let issuanceDate = credential?.validFrom ?? credential?.issuanceDate ?? (typeof now === "number" ? new Date(now) : now).toISOString();
178
+ let expirationDate = credential?.validUntil ?? credential?.expirationDate;
179
+ if (issuanceDate instanceof Date) {
180
+ issuanceDate = issuanceDate.toISOString();
181
+ }
182
+ const credentialPayload = {
183
+ ...credential,
184
+ "@context": credentialContext,
185
+ type: credentialType,
186
+ ...isVdcm1 && {
187
+ issuanceDate
188
+ },
189
+ ...isVdcm1 && expirationDate && {
190
+ expirationDate
191
+ },
192
+ ...isVdcm2 && {
193
+ validFrom: issuanceDate
194
+ },
195
+ ...isVdcm2 && expirationDate && {
196
+ validUntil: expirationDate
197
+ }
198
+ };
199
+ if (isVdcm1) {
200
+ delete credentialPayload.validFrom;
201
+ delete credentialPayload.validUntil;
202
+ } else if (isVdcm2) {
203
+ delete credentialPayload.issuanceDate;
204
+ delete credentialPayload.expirationDate;
205
+ }
206
+ const issuer = extractIssuer2(credentialPayload, {
207
+ removeParameters: true
208
+ });
209
+ if (!issuer || typeof issuer === "undefined") {
210
+ throw new Error("invalid_argument: args.credential.issuer must not be empty");
211
+ }
212
+ return {
213
+ credential: credentialPayload,
214
+ issuer,
215
+ now
216
+ };
217
+ }
218
+ __name(preProcessCredentialPayload, "preProcessCredentialPayload");
219
+ function preProcessPresentation(args) {
220
+ const { presentation, now = /* @__PURE__ */ new Date() } = args;
221
+ const credentials = presentation?.verifiableCredential ?? [];
222
+ const v1Credential = credentials.find((cred) => typeof cred === "object" && cred["@context"].includes(VCDM_CREDENTIAL_CONTEXT_V1)) ? VCDM_CREDENTIAL_CONTEXT_V1 : void 0;
223
+ const v2Credential = credentials.find((cred) => typeof cred === "object" && cred["@context"].includes(VCDM_CREDENTIAL_CONTEXT_V2)) ? VCDM_CREDENTIAL_CONTEXT_V2 : void 0;
224
+ const presentationContext = addVcdmContextIfNeeded(args?.presentation?.["@context"] ?? [], v2Credential ?? v1Credential ?? VCDM_CREDENTIAL_CONTEXT_V2);
225
+ const presentationType = processEntryToArray(args?.presentation?.type, "VerifiablePresentation");
226
+ let issuanceDate = presentation?.validFrom ?? presentation?.issuanceDate ?? (typeof now === "number" ? new Date(now) : now).toISOString();
227
+ if (issuanceDate instanceof Date) {
228
+ issuanceDate = issuanceDate.toISOString();
229
+ }
230
+ const presentationPayload = {
231
+ ...presentation,
232
+ "@context": presentationContext,
233
+ type: presentationType,
234
+ ...v1Credential && {
235
+ issuanceDate
236
+ },
237
+ ...v2Credential && {
238
+ validFrom: issuanceDate
239
+ }
240
+ };
241
+ if (!isDefined(presentationPayload.holder) || !presentationPayload.holder) {
242
+ throw new Error("invalid_argument: args.presentation.holderDID must not be empty");
243
+ }
244
+ if (presentationPayload.verifiableCredential) {
245
+ presentationPayload.verifiableCredential = presentationPayload.verifiableCredential.map((cred) => {
246
+ if (typeof cred !== "string" && cred.proof.jwt) {
247
+ return cred.proof.jwt;
248
+ } else {
249
+ return cred;
250
+ }
251
+ });
252
+ }
253
+ return {
254
+ presentation: presentationPayload,
255
+ holder: removeDIDParameters(presentationPayload.holder)
256
+ };
257
+ }
258
+ __name(preProcessPresentation, "preProcessPresentation");
174
259
 
175
- // src/action-handler.ts
260
+ // src/vcdmCredentialPlugin.ts
261
+ import { asArray as asArray2 } from "@sphereon/ssi-sdk.core";
176
262
  var debug2 = Debug2("sphereon:ssi-sdk:vcdm");
177
263
  var VcdmCredentialPlugin = class {
178
264
  static {
@@ -217,29 +303,10 @@ var VcdmCredentialPlugin = class {
217
303
  /** {@inheritdoc @veramo/core#ICredentialIssuer.createVerifiableCredential} */
218
304
  async createVerifiableCredential(args, context) {
219
305
  let {
220
- credential,
221
- proofFormat,
222
- /* keyRef, removeOriginalFields,*/
223
- now
224
- /*, ...otherOptions */
306
+ proofFormat
307
+ /* keyRef, removeOriginalFields, now , ...otherOptions */
225
308
  } = args;
226
- const credentialContext = processEntryToArray(credential["@context"], MANDATORY_CREDENTIAL_CONTEXT);
227
- const credentialType = processEntryToArray(credential.type, "VerifiableCredential");
228
- now = typeof now === "number" ? new Date(now * 1e3) : now;
229
- if (!Object.getOwnPropertyNames(credential).includes("issuanceDate")) {
230
- credential.issuanceDate = (now instanceof Date ? now : /* @__PURE__ */ new Date()).toISOString();
231
- }
232
- credential = {
233
- ...credential,
234
- "@context": credentialContext,
235
- type: credentialType
236
- };
237
- const issuer = extractIssuer2(credential, {
238
- removeParameters: true
239
- });
240
- if (!issuer || typeof issuer === "undefined") {
241
- throw new Error("invalid_argument: credential.issuer must not be empty");
242
- }
309
+ const { credential, issuer, now } = preProcessCredentialPayload(args);
243
310
  try {
244
311
  await context.agent.didManagerGet({
245
312
  did: issuer
@@ -253,10 +320,14 @@ var VcdmCredentialPlugin = class {
253
320
  if (issuer2.canIssueCredentialType({
254
321
  proofFormat
255
322
  })) {
256
- return await issuer2.createVerifiableCredential(args, context);
323
+ return await issuer2.createVerifiableCredential({
324
+ ...args,
325
+ credential,
326
+ now
327
+ }, context);
257
328
  }
258
329
  }
259
- throw new Error("invalid_setup: No issuer found for the requested proof format");
330
+ throw new Error(`invalid_setup: No issuer found for the requested proof format: ${proofFormat}, supported: ${issuers.map((i) => i.getTypeProofFormat()).join(",")}`);
260
331
  }
261
332
  __name(findAndIssueCredential, "findAndIssueCredential");
262
333
  const verifiableCredential = await findAndIssueCredential(this.issuers);
@@ -285,7 +356,7 @@ var VcdmCredentialPlugin = class {
285
356
  return issuer.verifyCredential(args, context);
286
357
  }
287
358
  }
288
- return Promise.reject(Error("invalid_setup: No issuer found for the provided credential"));
359
+ return Promise.reject(Error(`invalid_setup: No verifier found for the provided credential credential type: ${JSON.stringify(args.credential.type)} proof type ${asArray2(args.credential.proof)?.[0]?.type} supported: ${issuers.map((i) => i.getTypeProofFormat()).join(",")}`));
289
360
  }
290
361
  __name(findAndVerifyCredential, "findAndVerifyCredential");
291
362
  verificationResult = await findAndVerifyCredential(this.issuers);
@@ -303,36 +374,21 @@ var VcdmCredentialPlugin = class {
303
374
  }
304
375
  /** {@inheritdoc @veramo/core#ICredentialIssuer.createVerifiablePresentation} */
305
376
  async createVerifiablePresentation(args, context) {
306
- let { presentation, proofFormat } = args;
307
- const presentationContext = processEntryToArray(args?.presentation?.["@context"], MANDATORY_CREDENTIAL_CONTEXT);
308
- const presentationType = processEntryToArray(args?.presentation?.type, "VerifiablePresentation");
309
- presentation = {
310
- ...presentation,
311
- "@context": presentationContext,
312
- type: presentationType
313
- };
314
- if (!isDefined2(presentation.holder)) {
315
- throw new Error("invalid_argument: presentation.holder must not be empty");
316
- }
317
- if (presentation.verifiableCredential) {
318
- presentation.verifiableCredential = presentation.verifiableCredential.map((cred) => {
319
- if (typeof cred !== "string" && cred.proof.jwt) {
320
- return cred.proof.jwt;
321
- } else {
322
- return cred;
323
- }
324
- });
325
- }
377
+ const { proofFormat } = args;
378
+ const { presentation } = preProcessPresentation(args);
326
379
  let verifiablePresentation;
327
380
  async function findAndCreatePresentation(issuers) {
328
381
  for (const issuer of issuers) {
329
382
  if (issuer.canIssueCredentialType({
330
383
  proofFormat
331
384
  })) {
332
- return await issuer.createVerifiablePresentation(args, context);
385
+ return await issuer.createVerifiablePresentation({
386
+ ...args,
387
+ presentation
388
+ }, context);
333
389
  }
334
390
  }
335
- throw new Error("invalid_setup: No issuer found for the requested proof format");
391
+ throw new Error(`invalid_setup: No issuer found for the requested proof format: ${proofFormat}, supported: ${issuers.map((i) => i.getTypeProofFormat()).join(",")}`);
336
392
  }
337
393
  __name(findAndCreatePresentation, "findAndCreatePresentation");
338
394
  verifiablePresentation = await findAndCreatePresentation(this.issuers);
@@ -370,6 +426,8 @@ export {
370
426
  extractIssuer2 as extractIssuer,
371
427
  isRevoked,
372
428
  pickSigningKey,
429
+ preProcessCredentialPayload,
430
+ preProcessPresentation,
373
431
  removeDIDParameters
374
432
  };
375
433
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/message-handler.ts","../src/action-handler.ts","../src/functions.ts","../src/index.ts"],"sourcesContent":["import type {\n IAgentContext,\n ICredentialVerifier,\n IResolver,\n VerifiableCredential,\n VerifiablePresentation,\n} from '@veramo/core'\nimport { AbstractMessageHandler, Message } from '@veramo/message-handler'\nimport { asArray, computeEntryHash, decodeCredentialToObject, extractIssuer } from '@veramo/utils'\n\nimport {\n normalizeCredential,\n normalizePresentation,\n validateJwtCredentialPayload,\n validateJwtPresentationPayload,\n}// @ts-ignore\nfrom 'did-jwt-vc'\n\nimport { v4 as uuidv4 } from 'uuid'\nimport Debug from 'debug'\n\nconst debug = Debug('sphereon:vcdm:message-handler')\n\n/**\n * These types are used by `@veramo/data-store` when storing Verifiable Credentials and Presentations\n *\n * @internal\n */\nexport const MessageTypes = {\n /** Represents a Verifiable Credential */\n vc: 'w3c.vc',\n /** Represents a Verifiable Presentation */\n vp: 'w3c.vp',\n}\n\n/**\n * Represents the requirements that this plugin has.\n * The agent that is using this plugin is expected to provide these methods.\n *\n * This interface can be used for static type checks, to make sure your application is properly initialized.\n */\nexport type IContext = IAgentContext<IResolver & ICredentialVerifier>\n\n/**\n * An implementation of the {@link @veramo/message-handler#AbstractMessageHandler}.\n *\n * This plugin can handle incoming W3C Verifiable Credentials and Presentations and prepare them\n * for internal storage as {@link @veramo/message-handler#Message} types.\n *\n * The current version can only handle `JWT` encoded\n *\n * @remarks {@link @veramo/core#IDataStore | IDataStore }\n *\n * @public\n */\nexport class W3cMessageHandler extends AbstractMessageHandler {\n async handle(message: Message, context: IContext): Promise<Message> {\n const meta = message.getLastMetaData()\n\n // console.log(JSON.stringify(message, null, 2))\n\n //FIXME: messages should not be expected to be only JWT\n if (meta?.type === 'JWT' && message.raw) {\n const { data } = message\n\n try {\n validateJwtPresentationPayload(data)\n\n //FIXME: flagging this for potential privacy leaks\n debug('JWT is', MessageTypes.vp)\n const presentation = normalizePresentation(message.raw)\n const credentials = presentation.verifiableCredential\n\n message.id = computeEntryHash(message.raw)\n message.type = MessageTypes.vp\n message.from = presentation.holder\n message.to = presentation.verifier?.[0]\n\n if (presentation.tag) {\n message.threadId = presentation.tag\n }\n\n message.createdAt = presentation.issuanceDate\n message.presentations = [presentation]\n message.credentials = credentials\n\n return message\n } catch (e) {}\n\n try {\n validateJwtCredentialPayload(data)\n //FIXME: flagging this for potential privacy leaks\n debug('JWT is', MessageTypes.vc)\n const credential = normalizeCredential(message.raw)\n\n message.id = computeEntryHash(message.raw)\n message.type = MessageTypes.vc\n message.from = credential.issuer.id\n message.to = credential.credentialSubject.id\n\n if (credential.tag) {\n message.threadId = credential.tag\n }\n\n message.createdAt = credential.issuanceDate\n message.credentials = [credential]\n return message\n } catch (e) {}\n }\n\n // LDS Verification and Handling\n if (message.type === MessageTypes.vc && message.data) {\n // verify credential\n const credential = message.data as VerifiableCredential\n\n const result = await context.agent.verifyCredential({ credential })\n if (result.verified) {\n message.id = computeEntryHash(message.raw || message.id || uuidv4())\n message.type = MessageTypes.vc\n message.from = extractIssuer(credential)\n message.to = credential.credentialSubject.id\n\n if (credential.tag) {\n message.threadId = credential.tag\n }\n\n message.createdAt = credential.issuanceDate\n message.credentials = [credential]\n return message\n } else {\n throw new Error(result.error?.message)\n }\n }\n\n if (message.type === MessageTypes.vp && message.data) {\n // verify presentation\n const presentation = message.data as VerifiablePresentation\n\n // throws on error.\n const result = await context.agent.verifyPresentation({\n presentation,\n // FIXME: HARDCODED CHALLENGE VERIFICATION FOR NOW\n challenge: 'VERAMO',\n domain: 'VERAMO',\n })\n if (result.verified) {\n message.id = computeEntryHash(message.raw || message.id || uuidv4())\n message.type = MessageTypes.vp\n message.from = presentation.holder\n // message.to = presentation.verifier?.[0]\n\n if (presentation.tag) {\n message.threadId = presentation.tag\n }\n\n // message.createdAt = presentation.issuanceDate\n message.presentations = [presentation]\n message.credentials = asArray(presentation.verifiableCredential).map(decodeCredentialToObject)\n return message\n } else {\n throw new Error(result.error?.message)\n }\n }\n\n return super.handle(message, context)\n }\n}\n","import type { IAgentPlugin, IIdentifier, IVerifyResult, VerifiableCredential, VerifiablePresentation } from '@veramo/core'\nimport { schema } from '@veramo/core'\n\nimport type {\n ICreateVerifiableCredentialLDArgs,\n ICreateVerifiablePresentationLDArgs,\n IVcdmCredentialPlugin,\n IVcdmCredentialProvider,\n IVcdmIssuerAgentContext,\n IVcdmVerifierAgentContext,\n IVerifyCredentialLDArgs,\n IVerifyPresentationLDArgs,\n} from './types'\n\nimport { isDefined, MANDATORY_CREDENTIAL_CONTEXT, processEntryToArray } from '@veramo/utils'\nimport Debug from 'debug'\nimport { extractIssuer, isRevoked } from './functions'\nimport type { W3CVerifiableCredential, W3CVerifiablePresentation } from '@sphereon/ssi-types'\nimport type { VerifiableCredentialSP, VerifiablePresentationSP } from '@sphereon/ssi-sdk.core'\n\nconst debug = Debug('sphereon:ssi-sdk:vcdm')\n\n/**\n * A plugin that implements the {@link @sphereon/ssi-sdk.credential-vcdm#IVcdmCredentialPlugin} methods.\n *\n * @public\n */\nexport class VcdmCredentialPlugin implements IAgentPlugin {\n readonly methods: IVcdmCredentialPlugin\n readonly schema = {\n components: {\n schemas: {\n ...schema.ICredentialIssuer.components.schemas,\n ...schema.ICredentialVerifier.components.schemas,\n },\n methods: {\n ...schema.ICredentialIssuer.components.methods,\n ...schema.ICredentialVerifier.components.methods,\n },\n },\n }\n private issuers: IVcdmCredentialProvider[]\n\n constructor(options: { issuers: IVcdmCredentialProvider[] }) {\n this.issuers = options.issuers\n this.methods = {\n listUsableProofFormats: this.listUsableProofFormats.bind(this),\n createVerifiableCredential: this.createVerifiableCredential.bind(this),\n verifyCredential: this.verifyCredential.bind(this),\n createVerifiablePresentation: this.createVerifiablePresentation.bind(this),\n verifyPresentation: this.verifyPresentation.bind(this),\n }\n }\n\n async listUsableProofFormats(did: IIdentifier, context: IVcdmIssuerAgentContext): Promise<string[]> {\n const signingOptions: string[] = []\n const keys = did.keys\n for (const key of keys) {\n for (const issuer of this.issuers) {\n if (issuer.matchKeyForType(key)) {\n signingOptions.push(issuer.getTypeProofFormat())\n }\n }\n }\n return signingOptions\n }\n\n /** {@inheritdoc @veramo/core#ICredentialIssuer.createVerifiableCredential} */\n async createVerifiableCredential(args: ICreateVerifiableCredentialLDArgs, context: IVcdmIssuerAgentContext): Promise<VerifiableCredentialSP> {\n let { credential, proofFormat, /* keyRef, removeOriginalFields,*/ now /*, ...otherOptions */ } = args\n const credentialContext = processEntryToArray(credential['@context'], MANDATORY_CREDENTIAL_CONTEXT)\n const credentialType = processEntryToArray(credential.type, 'VerifiableCredential')\n\n // only add issuanceDate for JWT\n now = typeof now === 'number' ? new Date(now * 1000) : now\n if (!Object.getOwnPropertyNames(credential).includes('issuanceDate')) {\n credential.issuanceDate = (now instanceof Date ? now : new Date()).toISOString()\n }\n\n credential = {\n ...credential,\n '@context': credentialContext,\n type: credentialType,\n }\n\n //FIXME: if the identifier is not found, the error message should reflect that.\n const issuer = extractIssuer(credential, { removeParameters: true })\n if (!issuer || typeof issuer === 'undefined') {\n throw new Error('invalid_argument: credential.issuer must not be empty')\n }\n\n try {\n await context.agent.didManagerGet({ did: issuer })\n } catch (e) {\n throw new Error(`invalid_argument: credential.issuer must be a DID managed by this agent. ${e}`)\n }\n try {\n async function findAndIssueCredential(issuers: IVcdmCredentialProvider[]) {\n for (const issuer of issuers) {\n if (issuer.canIssueCredentialType({ proofFormat })) {\n return await issuer.createVerifiableCredential(args, context)\n }\n }\n throw new Error('invalid_setup: No issuer found for the requested proof format')\n }\n const verifiableCredential = await findAndIssueCredential(this.issuers)\n return verifiableCredential\n } catch (error) {\n debug(error)\n return Promise.reject(error)\n }\n }\n\n /** {@inheritdoc @veramo/core#ICredentialVerifier.verifyCredential} */\n async verifyCredential(args: IVerifyCredentialLDArgs, context: IVcdmVerifierAgentContext): Promise<IVerifyResult> {\n let { credential, policies /*, ...otherOptions*/ } = args\n let verifiedCredential: VerifiableCredential\n let verificationResult: IVerifyResult | undefined = { verified: false }\n\n async function findAndVerifyCredential(issuers: IVcdmCredentialProvider[]): Promise<IVerifyResult> {\n for (const issuer of issuers) {\n if (issuer.canVerifyDocumentType({ document: credential as W3CVerifiableCredential })) {\n return issuer.verifyCredential(args, context)\n }\n }\n return Promise.reject(Error('invalid_setup: No issuer found for the provided credential'))\n }\n verificationResult = await findAndVerifyCredential(this.issuers)\n verifiedCredential = <VerifiableCredential>credential\n\n if (policies?.credentialStatus !== false && (await isRevoked(verifiedCredential, context as any))) {\n verificationResult = {\n verified: false,\n error: {\n message: 'revoked: The credential was revoked by the issuer',\n errorCode: 'revoked',\n },\n }\n }\n\n return verificationResult\n }\n\n /** {@inheritdoc @veramo/core#ICredentialIssuer.createVerifiablePresentation} */\n async createVerifiablePresentation(args: ICreateVerifiablePresentationLDArgs, context: IVcdmIssuerAgentContext): Promise<VerifiablePresentationSP> {\n let {\n presentation,\n proofFormat,\n /* domain,\n challenge,\n removeOriginalFields,\n keyRef,*/\n // save,\n /*now,*/\n /*...otherOptions*/\n } = args\n const presentationContext: string[] = processEntryToArray(args?.presentation?.['@context'], MANDATORY_CREDENTIAL_CONTEXT)\n const presentationType = processEntryToArray(args?.presentation?.type, 'VerifiablePresentation')\n presentation = {\n ...presentation,\n '@context': presentationContext,\n type: presentationType,\n }\n\n if (!isDefined(presentation.holder)) {\n throw new Error('invalid_argument: presentation.holder must not be empty')\n }\n\n if (presentation.verifiableCredential) {\n presentation.verifiableCredential = presentation.verifiableCredential.map((cred) => {\n // map JWT credentials to their canonical form\n if (typeof cred !== 'string' && cred.proof.jwt) {\n return cred.proof.jwt\n } else {\n return cred\n }\n })\n }\n\n let verifiablePresentation: VerifiablePresentation | undefined\n\n async function findAndCreatePresentation(issuers: IVcdmCredentialProvider[]) {\n for (const issuer of issuers) {\n if (issuer.canIssueCredentialType({ proofFormat })) {\n return await issuer.createVerifiablePresentation(args, context)\n }\n }\n throw new Error('invalid_setup: No issuer found for the requested proof format')\n }\n\n verifiablePresentation = await findAndCreatePresentation(this.issuers)\n return verifiablePresentation as VerifiablePresentationSP // fixme: this is a hack to get around the fact that the return type is not correct.\n }\n\n /** {@inheritdoc @veramo/core#ICredentialVerifier.verifyPresentation} */\n async verifyPresentation(args: IVerifyPresentationLDArgs, context: IVcdmVerifierAgentContext): Promise<IVerifyResult> {\n let { presentation /*domain, challenge, fetchRemoteContexts, policies, ...otherOptions*/ } = args\n async function findAndVerifyPresentation(issuers: IVcdmCredentialProvider[]): Promise<IVerifyResult> {\n for (const issuer of issuers) {\n if (issuer.canVerifyDocumentType({ document: presentation as W3CVerifiablePresentation })) {\n return issuer.verifyPresentation(args, context)\n }\n }\n throw new Error('invalid_setup: No verifier found for the provided presentation')\n }\n const result = await findAndVerifyPresentation(this.issuers)\n return result\n }\n}\n","import {\n CredentialPayload,\n IAgentContext, ICredentialStatusVerifier,\n IIdentifier,\n IKey,\n IssuerType,\n PresentationPayload,\n VerifiableCredential,\n W3CVerifiableCredential,\n W3CVerifiablePresentation\n} from '@veramo/core'\nimport { isDefined } from '@veramo/utils'\nimport { decodeJWT } from 'did-jwt'\n\n/**\n * Decodes a credential or presentation and returns the issuer ID\n * `iss` from a JWT or `issuer`/`issuer.id` from a VC or `holder` from a VP\n *\n * @param input - the credential or presentation whose issuer/holder needs to be extracted.\n * @param options - options for the extraction\n * removeParameters - Remove all DID parameters from the issuer ID\n *\n * @beta This API may change without a BREAKING CHANGE notice.\n */\nexport function extractIssuer(\n input?:\n | W3CVerifiableCredential\n | W3CVerifiablePresentation\n | CredentialPayload\n | PresentationPayload\n | null,\n options: { removeParameters?: boolean } = {}\n): string {\n if (!isDefined(input)) {\n return ''\n } else if (typeof input === 'string') {\n // JWT\n try {\n const { payload } = decodeJWT(input.split(`~`)[0])\n const iss = payload.iss ?? ''\n return !!options.removeParameters ? removeDIDParameters(iss) : iss\n } catch (e: any) {\n return ''\n }\n } else {\n // JSON\n let iss: IssuerType\n if (input.issuer) {\n iss = input.issuer\n } else if (input.holder) {\n iss = input.holder\n } else {\n iss = ''\n }\n if (typeof iss !== 'string') iss = iss.id ?? ''\n return !!options.removeParameters ? removeDIDParameters(iss) : iss\n }\n}\n\n\n/**\n * Remove all DID parameters from a DID url after the query part (?)\n *\n * @param did - the DID URL\n *\n * @beta This API may change without a BREAKING CHANGE notice.\n */\nexport function removeDIDParameters(did: string): string {\n return did.replace(/\\?.*$/, '')\n}\n\n\nexport function pickSigningKey(identifier: IIdentifier, keyRef?: string): IKey {\n let key: IKey | undefined\n\n if (!keyRef) {\n key = identifier.keys.find((k) => k.type === 'Secp256k1' || k.type === 'Ed25519' || k.type === 'Secp256r1')\n if (!key) throw Error('key_not_found: No signing key for ' + identifier.did)\n } else {\n key = identifier.keys.find((k) => k.kid === keyRef)\n if (!key) throw Error('key_not_found: No signing key for ' + identifier.did + ' with kid ' + keyRef)\n }\n\n return key as IKey\n}\n\nexport async function isRevoked(credential: VerifiableCredential, context: IAgentContext<ICredentialStatusVerifier>): Promise<boolean> {\n if (!credential.credentialStatus) return false\n\n if (typeof context.agent.checkCredentialStatus === 'function') {\n const status = await context.agent.checkCredentialStatus({ credential })\n return status?.revoked == true || status?.verified === false\n }\n\n throw new Error(`invalid_setup: The credential status can't be verified because there is no ICredentialStatusVerifier plugin installed.`)\n}\n","/**\n * Provides a {@link @veramo/credential-w3c#CredentialPlugin | plugin} for the {@link @veramo/core#Agent} that\n * implements\n * {@link @veramo/core#ICredentialIssuer} interface.\n *\n * Provides a {@link @veramo/credential-w3c#W3cMessageHandler | plugin} for the\n * {@link @veramo/message-handler#MessageHandler} that verifies Credentials and Presentations in a message.\n *\n * @packageDocumentation\n */\nexport type * from './types'\nexport { W3cMessageHandler, MessageTypes } from './message-handler'\nimport { VcdmCredentialPlugin } from './action-handler'\n\n/**\n * @deprecated please use {@link VcdmCredentialPlugin} instead\n * @public\n */\nconst CredentialIssuer = VcdmCredentialPlugin\nexport { CredentialIssuer, VcdmCredentialPlugin }\n\n// For backward compatibility, re-export the plugin types that were moved to core in v4\nexport type { ICredentialIssuer, ICredentialVerifier } from '@veramo/core'\n\nexport * from './functions'\n"],"mappings":"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","names":["AbstractMessageHandler","asArray","computeEntryHash","decodeCredentialToObject","extractIssuer","normalizeCredential","normalizePresentation","validateJwtCredentialPayload","validateJwtPresentationPayload","v4","uuidv4","Debug","debug","Debug","MessageTypes","vc","vp","W3cMessageHandler","AbstractMessageHandler","handle","message","context","meta","getLastMetaData","type","raw","data","validateJwtPresentationPayload","presentation","normalizePresentation","credentials","verifiableCredential","id","computeEntryHash","from","holder","to","verifier","tag","threadId","createdAt","issuanceDate","presentations","e","validateJwtCredentialPayload","credential","normalizeCredential","issuer","credentialSubject","result","agent","verifyCredential","verified","uuidv4","extractIssuer","Error","error","verifyPresentation","challenge","domain","asArray","map","decodeCredentialToObject","schema","isDefined","MANDATORY_CREDENTIAL_CONTEXT","processEntryToArray","Debug","isDefined","decodeJWT","extractIssuer","input","options","isDefined","payload","decodeJWT","split","iss","removeParameters","removeDIDParameters","e","issuer","holder","id","did","replace","pickSigningKey","identifier","keyRef","key","keys","find","k","type","Error","kid","isRevoked","credential","context","credentialStatus","agent","checkCredentialStatus","status","revoked","verified","debug","Debug","VcdmCredentialPlugin","methods","schema","components","schemas","ICredentialIssuer","ICredentialVerifier","issuers","constructor","options","listUsableProofFormats","bind","createVerifiableCredential","verifyCredential","createVerifiablePresentation","verifyPresentation","did","context","signingOptions","keys","key","issuer","matchKeyForType","push","getTypeProofFormat","args","credential","proofFormat","now","credentialContext","processEntryToArray","MANDATORY_CREDENTIAL_CONTEXT","credentialType","type","Date","Object","getOwnPropertyNames","includes","issuanceDate","toISOString","extractIssuer","removeParameters","Error","agent","didManagerGet","e","findAndIssueCredential","canIssueCredentialType","verifiableCredential","error","Promise","reject","policies","verifiedCredential","verificationResult","verified","findAndVerifyCredential","canVerifyDocumentType","document","credentialStatus","isRevoked","message","errorCode","presentation","presentationContext","presentationType","isDefined","holder","map","cred","proof","jwt","verifiablePresentation","findAndCreatePresentation","findAndVerifyPresentation","result","CredentialIssuer","VcdmCredentialPlugin"]}
1
+ {"version":3,"sources":["../src/message-handler.ts","../src/vcdmCredentialPlugin.ts","../src/functions.ts","../src/index.ts"],"sourcesContent":["import type {\n IAgentContext,\n ICredentialVerifier,\n IResolver,\n VerifiableCredential,\n VerifiablePresentation,\n} from '@veramo/core'\nimport { AbstractMessageHandler, Message } from '@veramo/message-handler'\nimport { asArray, computeEntryHash, decodeCredentialToObject, extractIssuer } from '@veramo/utils'\n\nimport {\n normalizeCredential,\n normalizePresentation,\n validateJwtCredentialPayload,\n validateJwtPresentationPayload,\n}// @ts-ignore\nfrom 'did-jwt-vc'\n\nimport { v4 as uuidv4 } from 'uuid'\nimport Debug from 'debug'\n\nconst debug = Debug('sphereon:vcdm:message-handler')\n\n/**\n * These types are used by `@veramo/data-store` when storing Verifiable Credentials and Presentations\n *\n * @internal\n */\nexport const MessageTypes = {\n /** Represents a Verifiable Credential */\n vc: 'w3c.vc',\n /** Represents a Verifiable Presentation */\n vp: 'w3c.vp',\n}\n\n/**\n * Represents the requirements that this plugin has.\n * The agent that is using this plugin is expected to provide these methods.\n *\n * This interface can be used for static type checks, to make sure your application is properly initialized.\n */\nexport type IContext = IAgentContext<IResolver & ICredentialVerifier>\n\n/**\n * An implementation of the {@link @veramo/message-handler#AbstractMessageHandler}.\n *\n * This plugin can handle incoming W3C Verifiable Credentials and Presentations and prepare them\n * for internal storage as {@link @veramo/message-handler#Message} types.\n *\n * The current version can only handle `JWT` encoded\n *\n * @remarks {@link @veramo/core#IDataStore | IDataStore }\n *\n * @public\n */\nexport class W3cMessageHandler extends AbstractMessageHandler {\n async handle(message: Message, context: IContext): Promise<Message> {\n const meta = message.getLastMetaData()\n\n // console.log(JSON.stringify(message, null, 2))\n\n //FIXME: messages should not be expected to be only JWT\n if (meta?.type === 'JWT' && message.raw) {\n const { data } = message\n\n try {\n validateJwtPresentationPayload(data)\n\n //FIXME: flagging this for potential privacy leaks\n debug('JWT is', MessageTypes.vp)\n const presentation = normalizePresentation(message.raw)\n const credentials = presentation.verifiableCredential\n\n message.id = computeEntryHash(message.raw)\n message.type = MessageTypes.vp\n message.from = presentation.holder\n message.to = presentation.verifier?.[0]\n\n if (presentation.tag) {\n message.threadId = presentation.tag\n }\n\n message.createdAt = presentation.issuanceDate\n message.presentations = [presentation]\n message.credentials = credentials\n\n return message\n } catch (e) {}\n\n try {\n validateJwtCredentialPayload(data)\n //FIXME: flagging this for potential privacy leaks\n debug('JWT is', MessageTypes.vc)\n const credential = normalizeCredential(message.raw)\n\n message.id = computeEntryHash(message.raw)\n message.type = MessageTypes.vc\n message.from = credential.issuer.id\n message.to = credential.credentialSubject.id\n\n if (credential.tag) {\n message.threadId = credential.tag\n }\n\n message.createdAt = credential.issuanceDate\n message.credentials = [credential]\n return message\n } catch (e) {}\n }\n\n // LDS Verification and Handling\n if (message.type === MessageTypes.vc && message.data) {\n // verify credential\n const credential = message.data as VerifiableCredential\n\n const result = await context.agent.verifyCredential({ credential })\n if (result.verified) {\n message.id = computeEntryHash(message.raw || message.id || uuidv4())\n message.type = MessageTypes.vc\n message.from = extractIssuer(credential)\n message.to = credential.credentialSubject.id\n\n if (credential.tag) {\n message.threadId = credential.tag\n }\n\n message.createdAt = credential.issuanceDate\n message.credentials = [credential]\n return message\n } else {\n throw new Error(result.error?.message)\n }\n }\n\n if (message.type === MessageTypes.vp && message.data) {\n // verify presentation\n const presentation = message.data as VerifiablePresentation\n\n // throws on error.\n const result = await context.agent.verifyPresentation({\n presentation,\n // FIXME: HARDCODED CHALLENGE VERIFICATION FOR NOW\n challenge: 'VERAMO',\n domain: 'VERAMO',\n })\n if (result.verified) {\n message.id = computeEntryHash(message.raw || message.id || uuidv4())\n message.type = MessageTypes.vp\n message.from = presentation.holder\n // message.to = presentation.verifier?.[0]\n\n if (presentation.tag) {\n message.threadId = presentation.tag\n }\n\n // message.createdAt = presentation.issuanceDate\n message.presentations = [presentation]\n message.credentials = asArray(presentation.verifiableCredential).map(decodeCredentialToObject)\n return message\n } else {\n throw new Error(result.error?.message)\n }\n }\n\n return super.handle(message, context)\n }\n}\n","import type { IAgentPlugin, IIdentifier, IVerifyResult, VerifiableCredential } from '@veramo/core'\nimport { schema } from '@veramo/core'\n\nimport type {\n ICreateVerifiableCredentialLDArgs,\n ICreateVerifiablePresentationLDArgs,\n IVcdmCredentialPlugin,\n IVcdmCredentialProvider,\n IVcdmIssuerAgentContext,\n IVcdmVerifierAgentContext,\n IVerifyCredentialLDArgs,\n IVerifyPresentationLDArgs,\n} from './types'\nimport Debug from 'debug'\nimport { isRevoked, preProcessCredentialPayload, preProcessPresentation } from './functions'\nimport type { W3CVerifiableCredential, W3CVerifiablePresentation } from '@sphereon/ssi-types'\nimport { asArray, VerifiableCredentialSP, VerifiablePresentationSP } from '@sphereon/ssi-sdk.core'\n\nconst debug = Debug('sphereon:ssi-sdk:vcdm')\n\n/**\n * A plugin that implements the {@link @sphereon/ssi-sdk.credential-vcdm#IVcdmCredentialPlugin} methods.\n *\n * @public\n */\nexport class VcdmCredentialPlugin implements IAgentPlugin {\n readonly methods: IVcdmCredentialPlugin\n readonly schema = {\n components: {\n schemas: {\n ...schema.ICredentialIssuer.components.schemas,\n ...schema.ICredentialVerifier.components.schemas,\n },\n methods: {\n ...schema.ICredentialIssuer.components.methods,\n ...schema.ICredentialVerifier.components.methods,\n },\n },\n }\n private issuers: IVcdmCredentialProvider[]\n\n constructor(options: { issuers: IVcdmCredentialProvider[] }) {\n this.issuers = options.issuers\n this.methods = {\n listUsableProofFormats: this.listUsableProofFormats.bind(this),\n createVerifiableCredential: this.createVerifiableCredential.bind(this),\n verifyCredential: this.verifyCredential.bind(this),\n createVerifiablePresentation: this.createVerifiablePresentation.bind(this),\n verifyPresentation: this.verifyPresentation.bind(this),\n }\n }\n\n async listUsableProofFormats(did: IIdentifier, context: IVcdmIssuerAgentContext): Promise<string[]> {\n const signingOptions: string[] = []\n const keys = did.keys\n for (const key of keys) {\n for (const issuer of this.issuers) {\n if (issuer.matchKeyForType(key)) {\n signingOptions.push(issuer.getTypeProofFormat())\n }\n }\n }\n return signingOptions\n }\n\n /** {@inheritdoc @veramo/core#ICredentialIssuer.createVerifiableCredential} */\n async createVerifiableCredential(args: ICreateVerifiableCredentialLDArgs, context: IVcdmIssuerAgentContext): Promise<VerifiableCredentialSP> {\n let { proofFormat /* keyRef, removeOriginalFields, now , ...otherOptions */ } = args\n const { credential, issuer, now } = preProcessCredentialPayload(args)\n\n try {\n await context.agent.didManagerGet({ did: issuer })\n } catch (e) {\n throw new Error(`invalid_argument: credential.issuer must be a DID managed by this agent. ${e}`)\n }\n try {\n async function findAndIssueCredential(issuers: IVcdmCredentialProvider[]) {\n for (const issuer of issuers) {\n if (issuer.canIssueCredentialType({ proofFormat })) {\n return await issuer.createVerifiableCredential({ ...args, credential, now }, context)\n }\n }\n throw new Error(\n `invalid_setup: No issuer found for the requested proof format: ${proofFormat}, supported: ${issuers.map((i) => i.getTypeProofFormat()).join(',')}`,\n )\n }\n const verifiableCredential = await findAndIssueCredential(this.issuers)\n return verifiableCredential\n } catch (error) {\n debug(error)\n return Promise.reject(error)\n }\n }\n\n /** {@inheritdoc @veramo/core#ICredentialVerifier.verifyCredential} */\n async verifyCredential(args: IVerifyCredentialLDArgs, context: IVcdmVerifierAgentContext): Promise<IVerifyResult> {\n let { credential, policies /*, ...otherOptions*/ } = args\n let verifiedCredential: VerifiableCredential\n let verificationResult: IVerifyResult | undefined = { verified: false }\n\n async function findAndVerifyCredential(issuers: IVcdmCredentialProvider[]): Promise<IVerifyResult> {\n for (const issuer of issuers) {\n if (issuer.canVerifyDocumentType({ document: credential as W3CVerifiableCredential })) {\n return issuer.verifyCredential(args, context)\n }\n }\n return Promise.reject(\n Error(\n `invalid_setup: No verifier found for the provided credential credential type: ${JSON.stringify(args.credential.type)} proof type ${asArray(args.credential.proof)?.[0]?.type} supported: ${issuers.map((i) => i.getTypeProofFormat()).join(',')}`,\n ),\n )\n }\n verificationResult = await findAndVerifyCredential(this.issuers)\n verifiedCredential = <VerifiableCredential>credential\n\n if (policies?.credentialStatus !== false && (await isRevoked(verifiedCredential, context as any))) {\n verificationResult = {\n verified: false,\n error: {\n message: 'revoked: The credential was revoked by the issuer',\n errorCode: 'revoked',\n },\n }\n }\n\n return verificationResult\n }\n\n /** {@inheritdoc @veramo/core#ICredentialIssuer.createVerifiablePresentation} */\n async createVerifiablePresentation(args: ICreateVerifiablePresentationLDArgs, context: IVcdmIssuerAgentContext): Promise<VerifiablePresentationSP> {\n const { proofFormat } = args\n const { presentation } = preProcessPresentation(args)\n\n let verifiablePresentation: VerifiablePresentationSP\n\n async function findAndCreatePresentation(issuers: IVcdmCredentialProvider[]) {\n for (const issuer of issuers) {\n if (issuer.canIssueCredentialType({ proofFormat })) {\n return await issuer.createVerifiablePresentation({ ...args, presentation }, context)\n }\n }\n throw new Error(\n `invalid_setup: No issuer found for the requested proof format: ${proofFormat}, supported: ${issuers.map((i) => i.getTypeProofFormat()).join(',')}`,\n )\n }\n\n verifiablePresentation = await findAndCreatePresentation(this.issuers)\n return verifiablePresentation\n }\n\n /** {@inheritdoc @veramo/core#ICredentialVerifier.verifyPresentation} */\n async verifyPresentation(args: IVerifyPresentationLDArgs, context: IVcdmVerifierAgentContext): Promise<IVerifyResult> {\n let { presentation /*domain, challenge, fetchRemoteContexts, policies, ...otherOptions*/ } = args\n async function findAndVerifyPresentation(issuers: IVcdmCredentialProvider[]): Promise<IVerifyResult> {\n for (const issuer of issuers) {\n if (issuer.canVerifyDocumentType({ document: presentation as W3CVerifiablePresentation })) {\n return issuer.verifyPresentation(args, context)\n }\n }\n throw new Error('invalid_setup: No verifier found for the provided presentation')\n }\n const result = await findAndVerifyPresentation(this.issuers)\n return result\n }\n}\n","import type {\n CredentialPayload,\n IAgentContext,\n ICredentialStatusVerifier,\n IDIDManager,\n IIdentifier,\n IResolver,\n IssuerType,\n PresentationPayload,\n VerifiableCredential,\n W3CVerifiableCredential,\n W3CVerifiablePresentation,\n} from '@veramo/core'\nimport { _ExtendedIKey, isDefined, processEntryToArray } from '@veramo/utils'\nimport { decodeJWT } from 'did-jwt'\nimport {\n addVcdmContextIfNeeded,\n isVcdm1Credential,\n isVcdm2Credential,\n VCDM_CREDENTIAL_CONTEXT_V1,\n VCDM_CREDENTIAL_CONTEXT_V2,\n} from '@sphereon/ssi-types'\nimport { ICreateVerifiablePresentationLDArgs } from './types'\nimport { getKey } from '@sphereon/ssi-sdk-ext.did-utils'\n\n/**\n * Decodes a credential or presentation and returns the issuer ID\n * `iss` from a JWT or `issuer`/`issuer.id` from a VC or `holder` from a VP\n *\n * @param input - the credential or presentation whose issuer/holder needs to be extracted.\n * @param options - options for the extraction\n * removeParameters - Remove all DID parameters from the issuer ID\n *\n * @beta This API may change without a BREAKING CHANGE notice.\n */\nexport function extractIssuer(\n input?: W3CVerifiableCredential | W3CVerifiablePresentation | CredentialPayload | PresentationPayload | null,\n options: { removeParameters?: boolean } = {},\n): string {\n if (!isDefined(input)) {\n return ''\n } else if (typeof input === 'string') {\n // JWT\n try {\n const { payload } = decodeJWT(input.split(`~`)[0])\n const iss = payload.iss ?? ''\n return !!options.removeParameters ? removeDIDParameters(iss) : iss\n } catch (e: any) {\n return ''\n }\n } else {\n // JSON\n let iss: IssuerType\n if (input.issuer) {\n iss = input.issuer\n } else if (input.holder) {\n iss = input.holder\n } else {\n iss = ''\n }\n if (typeof iss !== 'string') iss = iss.id ?? ''\n return !!options.removeParameters ? removeDIDParameters(iss) : iss\n }\n}\n\n/**\n * Remove all DID parameters from a DID url after the query part (?)\n *\n * @param did - the DID URL\n *\n * @beta This API may change without a BREAKING CHANGE notice.\n */\nexport function removeDIDParameters(did: string): string {\n return did.replace(/\\?.*$/, '')\n}\n\nexport async function pickSigningKey(\n { identifier, kmsKeyRef }: { identifier: IIdentifier; kmsKeyRef?: string },\n context: IAgentContext<IResolver & IDIDManager>,\n): Promise<_ExtendedIKey> {\n const key = await getKey({ identifier, vmRelationship: 'assertionMethod', kmsKeyRef: kmsKeyRef }, context)\n return key\n}\n\nexport async function isRevoked(credential: VerifiableCredential, context: IAgentContext<ICredentialStatusVerifier>): Promise<boolean> {\n if (!credential.credentialStatus) return false\n\n if (typeof context.agent.checkCredentialStatus === 'function') {\n const status = await context.agent.checkCredentialStatus({ credential })\n return status?.revoked == true || status?.verified === false\n }\n\n throw new Error(`invalid_setup: The credential status can't be verified because there is no ICredentialStatusVerifier plugin installed.`)\n}\n\nexport function preProcessCredentialPayload({ credential, now = new Date() }: { credential: CredentialPayload; now?: number | Date }) {\n const credentialContext = addVcdmContextIfNeeded(credential?.['@context'])\n const isVdcm1 = isVcdm1Credential(credential)\n const isVdcm2 = isVcdm2Credential(credential)\n const credentialType = processEntryToArray(credential?.type, 'VerifiableCredential')\n let issuanceDate = credential?.validFrom ?? credential?.issuanceDate ?? (typeof now === 'number' ? new Date(now) : now).toISOString()\n let expirationDate = credential?.validUntil ?? credential?.expirationDate\n if (issuanceDate instanceof Date) {\n issuanceDate = issuanceDate.toISOString()\n }\n const credentialPayload: CredentialPayload = {\n ...credential,\n '@context': credentialContext,\n type: credentialType,\n ...(isVdcm1 && { issuanceDate }),\n ...(isVdcm1 && expirationDate && { expirationDate }),\n ...(isVdcm2 && { validFrom: issuanceDate }),\n ...(isVdcm2 && expirationDate && { validUntil: expirationDate }),\n }\n if (isVdcm1) {\n delete credentialPayload.validFrom\n delete credentialPayload.validUntil\n } else if (isVdcm2) {\n delete credentialPayload.issuanceDate\n delete credentialPayload.expirationDate\n }\n\n // debug(JSON.stringify(credentialPayload))\n\n const issuer = extractIssuer(credentialPayload, { removeParameters: true })\n if (!issuer || typeof issuer === 'undefined') {\n throw new Error('invalid_argument: args.credential.issuer must not be empty')\n }\n return { credential: credentialPayload, issuer, now }\n}\n\nexport function preProcessPresentation(args: ICreateVerifiablePresentationLDArgs) {\n const { presentation, now = new Date() } = args\n const credentials = presentation?.verifiableCredential ?? []\n const v1Credential = credentials.find((cred) => typeof cred === 'object' && cred['@context'].includes(VCDM_CREDENTIAL_CONTEXT_V1))\n ? VCDM_CREDENTIAL_CONTEXT_V1\n : undefined\n const v2Credential = credentials.find((cred) => typeof cred === 'object' && cred['@context'].includes(VCDM_CREDENTIAL_CONTEXT_V2))\n ? VCDM_CREDENTIAL_CONTEXT_V2\n : undefined\n const presentationContext = addVcdmContextIfNeeded(\n args?.presentation?.['@context'] ?? [],\n v2Credential ?? v1Credential ?? VCDM_CREDENTIAL_CONTEXT_V2,\n )\n const presentationType = processEntryToArray(args?.presentation?.type, 'VerifiablePresentation')\n\n let issuanceDate = presentation?.validFrom ?? presentation?.issuanceDate ?? (typeof now === 'number' ? new Date(now) : now).toISOString()\n if (issuanceDate instanceof Date) {\n issuanceDate = issuanceDate.toISOString()\n }\n const presentationPayload: PresentationPayload = {\n ...presentation,\n '@context': presentationContext,\n type: presentationType,\n ...(v1Credential && { issuanceDate }), // V1 only for JWT, but we remove it in the jsonld processor anyway\n ...(v2Credential && { validFrom: issuanceDate }),\n }\n // Workaround for bug in TypeError: Cannot read property 'length' of undefined\n // at VeramoEd25519Signature2018.preSigningPresModification\n /*if (!presentation.verifier) {\n presentation.verifier = []\n }*/\n\n if (!isDefined(presentationPayload.holder) || !presentationPayload.holder) {\n throw new Error('invalid_argument: args.presentation.holderDID must not be empty')\n }\n if (presentationPayload.verifiableCredential) {\n presentationPayload.verifiableCredential = presentationPayload.verifiableCredential.map((cred) => {\n // map JWT credentials to their canonical form\n if (typeof cred !== 'string' && cred.proof.jwt) {\n return cred.proof.jwt\n } else {\n return cred\n }\n })\n }\n return { presentation: presentationPayload, holder: removeDIDParameters(presentationPayload.holder) }\n}\n","/**\n * Provides a {@link @veramo/credential-w3c#CredentialPlugin | plugin} for the {@link @veramo/core#Agent} that\n * implements\n * {@link @veramo/core#ICredentialIssuer} interface.\n *\n * Provides a {@link @veramo/credential-w3c#W3cMessageHandler | plugin} for the\n * {@link @veramo/message-handler#MessageHandler} that verifies Credentials and Presentations in a message.\n *\n * @packageDocumentation\n */\nexport type * from './types'\nexport { W3cMessageHandler, MessageTypes } from './message-handler'\nimport { VcdmCredentialPlugin } from './vcdmCredentialPlugin'\n\n/**\n * @deprecated please use {@link VcdmCredentialPlugin} instead\n * @public\n */\nconst CredentialIssuer = VcdmCredentialPlugin\nexport { CredentialIssuer, VcdmCredentialPlugin }\n\n// For backward compatibility, re-export the plugin types that were moved to core in v4\nexport type { ICredentialIssuer, ICredentialVerifier } from '@veramo/core'\n\nexport * from './functions'\n"],"mappings":"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","names":["AbstractMessageHandler","asArray","computeEntryHash","decodeCredentialToObject","extractIssuer","normalizeCredential","normalizePresentation","validateJwtCredentialPayload","validateJwtPresentationPayload","v4","uuidv4","Debug","debug","Debug","MessageTypes","vc","vp","W3cMessageHandler","AbstractMessageHandler","handle","message","context","meta","getLastMetaData","type","raw","data","validateJwtPresentationPayload","presentation","normalizePresentation","credentials","verifiableCredential","id","computeEntryHash","from","holder","to","verifier","tag","threadId","createdAt","issuanceDate","presentations","e","validateJwtCredentialPayload","credential","normalizeCredential","issuer","credentialSubject","result","agent","verifyCredential","verified","uuidv4","extractIssuer","Error","error","verifyPresentation","challenge","domain","asArray","map","decodeCredentialToObject","schema","Debug","isDefined","processEntryToArray","decodeJWT","addVcdmContextIfNeeded","isVcdm1Credential","isVcdm2Credential","VCDM_CREDENTIAL_CONTEXT_V1","VCDM_CREDENTIAL_CONTEXT_V2","getKey","extractIssuer","input","options","isDefined","payload","decodeJWT","split","iss","removeParameters","removeDIDParameters","e","issuer","holder","id","did","replace","pickSigningKey","identifier","kmsKeyRef","context","key","getKey","vmRelationship","isRevoked","credential","credentialStatus","agent","checkCredentialStatus","status","revoked","verified","Error","preProcessCredentialPayload","now","Date","credentialContext","addVcdmContextIfNeeded","isVdcm1","isVcdm1Credential","isVdcm2","isVcdm2Credential","credentialType","processEntryToArray","type","issuanceDate","validFrom","toISOString","expirationDate","validUntil","credentialPayload","preProcessPresentation","args","presentation","credentials","verifiableCredential","v1Credential","find","cred","includes","VCDM_CREDENTIAL_CONTEXT_V1","undefined","v2Credential","VCDM_CREDENTIAL_CONTEXT_V2","presentationContext","presentationType","presentationPayload","map","proof","jwt","asArray","debug","Debug","VcdmCredentialPlugin","methods","schema","components","schemas","ICredentialIssuer","ICredentialVerifier","issuers","constructor","options","listUsableProofFormats","bind","createVerifiableCredential","verifyCredential","createVerifiablePresentation","verifyPresentation","did","context","signingOptions","keys","key","issuer","matchKeyForType","push","getTypeProofFormat","args","proofFormat","credential","now","preProcessCredentialPayload","agent","didManagerGet","e","Error","findAndIssueCredential","canIssueCredentialType","map","i","join","verifiableCredential","error","Promise","reject","policies","verifiedCredential","verificationResult","verified","findAndVerifyCredential","canVerifyDocumentType","document","JSON","stringify","type","asArray","proof","credentialStatus","isRevoked","message","errorCode","presentation","preProcessPresentation","verifiablePresentation","findAndCreatePresentation","findAndVerifyPresentation","result","CredentialIssuer","VcdmCredentialPlugin"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sphereon/ssi-sdk.credential-vcdm",
3
3
  "description": "Plugin for working with W3C Verifiable Credentials DataModel 1 and 2 Credentials & Presentations.",
4
- "version": "0.33.1-feature.jose.vcdm.56+91d93e08",
4
+ "version": "0.33.1-feature.jose.vcdm.58+8e673073",
5
5
  "source": "src/index.ts",
6
6
  "type": "module",
7
7
  "main": "./dist/index.cjs",
@@ -28,10 +28,12 @@
28
28
  "generate-plugin-schema": "tsx ../../packages/dev/bin/sphereon.js dev generate-plugin-schema"
29
29
  },
30
30
  "dependencies": {
31
- "@sphereon/ssi-sdk.agent-config": "0.33.1-feature.jose.vcdm.56+91d93e08",
32
- "@sphereon/ssi-sdk.core": "0.33.1-feature.jose.vcdm.56+91d93e08",
33
- "@sphereon/ssi-sdk.vc-status-list": "0.33.1-feature.jose.vcdm.56+91d93e08",
34
- "@sphereon/ssi-types": "0.33.1-feature.jose.vcdm.56+91d93e08",
31
+ "@sphereon/ssi-sdk-ext.did-utils": "workspace:*",
32
+ "@sphereon/ssi-sdk-ext.key-utils": "workspace:*",
33
+ "@sphereon/ssi-sdk.agent-config": "0.33.1-feature.jose.vcdm.58+8e673073",
34
+ "@sphereon/ssi-sdk.core": "0.33.1-feature.jose.vcdm.58+8e673073",
35
+ "@sphereon/ssi-sdk.vc-status-list": "0.33.1-feature.jose.vcdm.58+8e673073",
36
+ "@sphereon/ssi-types": "0.33.1-feature.jose.vcdm.58+8e673073",
35
37
  "@veramo/core": "4.2.0",
36
38
  "@veramo/message-handler": "4.2.0",
37
39
  "@veramo/utils": "4.2.0",
@@ -43,9 +45,9 @@
43
45
  "uuid": "^9.0.1"
44
46
  },
45
47
  "devDependencies": {
46
- "@sphereon/ssi-sdk-ext.did-provider-key": "0.28.1-feature.esm.cjs.18",
47
- "@sphereon/ssi-sdk-ext.key-manager": "0.28.1-feature.esm.cjs.18",
48
- "@sphereon/ssi-sdk-ext.kms-local": "0.28.1-feature.esm.cjs.18",
48
+ "@sphereon/ssi-sdk-ext.did-provider-key": "0.28.1-feature.jose.vcdm.25",
49
+ "@sphereon/ssi-sdk-ext.key-manager": "0.28.1-feature.jose.vcdm.25",
50
+ "@sphereon/ssi-sdk-ext.kms-local": "0.28.1-feature.jose.vcdm.25",
49
51
  "@types/debug": "4.1.8",
50
52
  "@types/uuid": "9.0.2",
51
53
  "@veramo/did-manager": "4.2.0",
@@ -89,5 +91,5 @@
89
91
  "node_modules",
90
92
  "src"
91
93
  ],
92
- "gitHead": "91d93e08da04a7556887981c96f1c032f4cdcf75"
94
+ "gitHead": "8e673073daa8f1ebd1e75249a5a0646d076a91aa"
93
95
  }
@@ -1,7 +1,7 @@
1
1
  import { beforeAll, describe, expect, test } from 'vitest'
2
2
 
3
3
  import { CredentialPayload, ICredentialPlugin, IDIDManager, IIdentifier, IKeyManager, IResolver, PresentationPayload, TAgent } from '@veramo/core'
4
- import { VcdmCredentialPlugin } from '../action-handler.js'
4
+ import { VcdmCredentialPlugin } from '../vcdmCredentialPlugin'
5
5
  import { CredentialProviderJWT } from '../../../credential-jwt/src'
6
6
 
7
7
  import { getDidKeyResolver, SphereonKeyDidProvider } from '@sphereon/ssi-sdk-ext.did-provider-key'
@@ -13,17 +13,18 @@ import { SphereonKeyManagementSystem } from '@sphereon/ssi-sdk-ext.kms-local'
13
13
  import { DIDManager, MemoryDIDStore } from '@veramo/did-manager'
14
14
  import { EthrDIDProvider } from '@veramo/did-provider-ethr'
15
15
  import { DIDResolverPlugin } from '@veramo/did-resolver'
16
+ import { IVcdmCredentialPlugin } from '../types'
16
17
 
17
18
  const infuraProjectId = '3586660d179141e3801c3895de1c2eba'
18
19
 
19
20
  let didKeyIdentifier: IIdentifier
20
21
  let didEthrIdentifier: IIdentifier
21
- let agent: TAgent<IResolver & IKeyManager & IDIDManager & ICredentialPlugin>
22
+ let agent: TAgent<IResolver & IKeyManager & IDIDManager & IVcdmCredentialPlugin>
22
23
 
23
24
  describe('@sphereon/ssi-sdk.credential-vcdm', () => {
24
25
  beforeAll(async () => {
25
26
  const jwt = new CredentialProviderJWT()
26
- agent = await createAgent<IResolver & IKeyManager & IDIDManager & ICredentialPlugin>({
27
+ agent = await createAgent<IResolver & IKeyManager & IDIDManager & IVcdmCredentialPlugin>({
27
28
  plugins: [
28
29
  new SphereonKeyManager({
29
30
  store: new MemoryKeyStore(),
@@ -79,7 +80,6 @@ describe('@sphereon/ssi-sdk.credential-vcdm', () => {
79
80
 
80
81
  const vc = await agent.createVerifiableCredential({
81
82
  credential,
82
- save: false,
83
83
  proofFormat: 'jwt',
84
84
  })
85
85
  expect(vc.id).toEqual('vc1')
@@ -107,7 +107,6 @@ describe('@sphereon/ssi-sdk.credential-vcdm', () => {
107
107
  },
108
108
  },
109
109
  },
110
- save: false,
111
110
  proofFormat: 'jwt',
112
111
  })
113
112
 
@@ -121,7 +120,6 @@ describe('@sphereon/ssi-sdk.credential-vcdm', () => {
121
120
 
122
121
  const vp = await agent.createVerifiablePresentation({
123
122
  presentation,
124
- save: false,
125
123
  proofFormat: 'jwt',
126
124
  })
127
125