UNPKG

@credo-ts/core

Version:

<p align="center"> <br /> <img alt="Credo Logo" src="https://github.com/openwallet-foundation/credo-ts/blob/c7886cb8377ceb8ee4efe8d264211e561a75072d/images/credo-logo.png" height="250px" /> </p> <h1 align="center"><b>Credo - Core</b></h1

1 lines • 3.44 kB
{"version":3,"file":"presentationTransformer.mjs","names":[],"sources":["../../../../src/modules/vc/jwt-vc/presentationTransformer.ts"],"sourcesContent":["import type { JwtPayloadOptions } from '../../../crypto/jose/jwt'\nimport { JwtPayload } from '../../../crypto/jose/jwt'\nimport { CredoError } from '../../../error'\nimport { isJsonObject } from '../../../types'\nimport { JsonTransformer } from '../../../utils'\nimport type { W3cJsonPresentation } from '../models/presentation/W3cJsonPresentation'\nimport { W3cPresentation } from '../models/presentation/W3cPresentation'\n\nexport function getJwtPayloadFromPresentation(presentation: W3cPresentation) {\n const vp = JsonTransformer.toJSON(presentation) as Partial<W3cJsonPresentation>\n\n const payloadOptions: JwtPayloadOptions = {\n additionalClaims: {\n vp,\n },\n }\n\n // Extract `iss` and remove holder id from vp\n if (presentation.holderId) {\n payloadOptions.iss = presentation.holderId\n\n if (typeof vp.holder === 'string') {\n // biome-ignore lint/performance/noDelete: no explanation\n delete vp.holder\n } else if (typeof vp.holder === 'object') {\n // biome-ignore lint/performance/noDelete: no explanation\n delete vp.holder.id\n if (Object.keys(vp.holder).length === 0) {\n // biome-ignore lint/performance/noDelete: no explanation\n delete vp.holder\n }\n }\n }\n\n // Extract `jti` and remove id from vp\n if (presentation.id) {\n payloadOptions.jti = presentation.id\n // biome-ignore lint/performance/noDelete: no explanation\n delete vp.id\n }\n\n return new JwtPayload(payloadOptions)\n}\n\nexport function getPresentationFromJwtPayload(jwtPayload: JwtPayload) {\n if (!('vp' in jwtPayload.additionalClaims) || !isJsonObject(jwtPayload.additionalClaims.vp)) {\n throw new CredoError(\"JWT does not contain a valid 'vp' claim\")\n }\n\n const jwtVp = jwtPayload.additionalClaims.vp\n\n // Validate vp.id and jti\n if (jwtVp.id && jwtPayload.jti !== jwtVp.id) {\n throw new CredoError('JWT jti and vp.id do not match')\n }\n\n // Validate vp.holder and iss\n if (\n (typeof jwtVp.holder === 'string' && jwtPayload.iss !== jwtVp.holder) ||\n (isJsonObject(jwtVp.holder) && jwtVp.holder.id && jwtPayload.iss !== jwtVp.holder.id)\n ) {\n throw new CredoError('JWT iss and vp.holder(.id) do not match')\n }\n\n const dataModelVp = {\n ...jwtVp,\n id: jwtPayload.jti,\n holder: jwtPayload.iss,\n }\n\n const vpInstance = JsonTransformer.fromJSON(dataModelVp, W3cPresentation)\n\n return vpInstance\n}\n"],"mappings":";;;;;;;;;;;;AAQA,SAAgB,8BAA8B,cAA+B;CAC3E,MAAM,KAAK,gBAAgB,OAAO,aAAa;CAE/C,MAAM,iBAAoC,EACxC,kBAAkB,EAChB,IACD,EACF;AAGD,KAAI,aAAa,UAAU;AACzB,iBAAe,MAAM,aAAa;AAElC,MAAI,OAAO,GAAG,WAAW,SAEvB,QAAO,GAAG;WACD,OAAO,GAAG,WAAW,UAAU;AAExC,UAAO,GAAG,OAAO;AACjB,OAAI,OAAO,KAAK,GAAG,OAAO,CAAC,WAAW,EAEpC,QAAO,GAAG;;;AAMhB,KAAI,aAAa,IAAI;AACnB,iBAAe,MAAM,aAAa;AAElC,SAAO,GAAG;;AAGZ,QAAO,IAAI,WAAW,eAAe;;AAGvC,SAAgB,8BAA8B,YAAwB;AACpE,KAAI,EAAE,QAAQ,WAAW,qBAAqB,CAAC,aAAa,WAAW,iBAAiB,GAAG,CACzF,OAAM,IAAI,WAAW,0CAA0C;CAGjE,MAAM,QAAQ,WAAW,iBAAiB;AAG1C,KAAI,MAAM,MAAM,WAAW,QAAQ,MAAM,GACvC,OAAM,IAAI,WAAW,iCAAiC;AAIxD,KACG,OAAO,MAAM,WAAW,YAAY,WAAW,QAAQ,MAAM,UAC7D,aAAa,MAAM,OAAO,IAAI,MAAM,OAAO,MAAM,WAAW,QAAQ,MAAM,OAAO,GAElF,OAAM,IAAI,WAAW,0CAA0C;CAGjE,MAAM,cAAc;EAClB,GAAG;EACH,IAAI,WAAW;EACf,QAAQ,WAAW;EACpB;AAID,QAFmB,gBAAgB,SAAS,aAAa,gBAAgB"}