{"version":3,"file":"utils.mjs","names":[],"sources":["../../src/shared/utils.ts"],"sourcesContent":["import {\n  AgentContext,\n  ClaimFormat,\n  CredoError,\n  type DcqlQuery,\n  type DidPurpose,\n  DidsApi,\n  getPublicJwkFromVerificationMethod,\n  Kms,\n  SignatureSuiteRegistry,\n  X509Certificate,\n} from '@credo-ts/core'\nimport type { Jwk, JwtSigner } from '@openid4vc/oauth2'\nimport type { OpenId4VcJwtIssuer, OpenId4VcJwtIssuerEncoded } from './models'\n\n/**\n * Returns the JWA Signature Algorithms that are supported by the wallet.\n */\nexport function getSupportedJwaSignatureAlgorithms(agentContext: AgentContext): Kms.KnownJwaSignatureAlgorithm[] {\n  const kms = agentContext.resolve(Kms.KeyManagementApi)\n\n  // If we can sign with an algorithm we assume it's supported (also for verification)\n  const supportedJwaSignatureAlgorithms = Object.values(Kms.KnownJwaSignatureAlgorithms).filter(\n    (algorithm) => kms.supportedBackendsForOperation({ operation: 'sign', algorithm }).length > 0\n  )\n\n  return supportedJwaSignatureAlgorithms\n}\n\nexport async function getPublicJwkFromDid(\n  agentContext: AgentContext,\n  didUrl: string,\n  allowedPurposes: DidPurpose[] = ['authentication']\n) {\n  const didsApi = agentContext.dependencyManager.resolve(DidsApi)\n  const didDocument = await didsApi.resolveDidDocument(didUrl)\n  const verificationMethod = didDocument.dereferenceKey(didUrl, allowedPurposes)\n\n  return getPublicJwkFromVerificationMethod(verificationMethod)\n}\n\nexport function encodeJwtIssuer(jwtIssuer: OpenId4VcJwtIssuer): OpenId4VcJwtIssuerEncoded {\n  if (jwtIssuer.method === 'jwk') {\n    return {\n      method: 'jwk',\n      jwk: jwtIssuer.jwk.toJson(),\n    }\n  }\n\n  if (jwtIssuer.method === 'x5c') {\n    return {\n      method: 'x5c',\n      leafCertificateKeyId: jwtIssuer.x5c[0].keyId,\n      x5c: jwtIssuer.x5c.map((c) => c.toString('base64')),\n    }\n  }\n\n  return jwtIssuer\n}\n\nexport function decodeJwtIssuer(encodedJwtIssuer: OpenId4VcJwtIssuerEncoded): OpenId4VcJwtIssuer {\n  if (encodedJwtIssuer.method === 'jwk') {\n    return {\n      method: 'jwk',\n      jwk: Kms.PublicJwk.fromUnknown(encodedJwtIssuer.jwk),\n    }\n  }\n\n  if (encodedJwtIssuer.method === 'x5c') {\n    return {\n      method: 'x5c',\n      x5c: encodedJwtIssuer.x5c.map((e, i) => {\n        const c = X509Certificate.fromEncodedCertificate(e)\n        if (i === 0) c.keyId = encodedJwtIssuer.leafCertificateKeyId\n        return c\n      }),\n    }\n  }\n\n  return encodedJwtIssuer\n}\n\nexport async function credoJwtIssuerToOpenId4VcJwtIssuer(\n  agentContext: AgentContext,\n  createJwtIssuer: OpenId4VcJwtIssuer\n): Promise<JwtSigner> {\n  if (createJwtIssuer.method === 'did') {\n    const dids = agentContext.resolve(DidsApi)\n    const { publicJwk } = await dids.resolveVerificationMethodFromCreatedDidRecord(createJwtIssuer.didUrl)\n\n    return {\n      method: createJwtIssuer.method,\n      didUrl: createJwtIssuer.didUrl,\n      alg: publicJwk.signatureAlgorithm,\n      kid: publicJwk.keyId,\n    }\n  }\n  if (createJwtIssuer.method === 'x5c') {\n    const leafCertificate = createJwtIssuer.x5c[0]\n    if (!leafCertificate) {\n      throw new CredoError('Unable to extract leaf certificate, x5c certificate chain is empty')\n    }\n\n    return {\n      ...createJwtIssuer,\n      x5c: createJwtIssuer.x5c.map((certificate) => certificate.toString('base64')),\n      alg: leafCertificate.publicJwk.signatureAlgorithm,\n      kid: leafCertificate.publicJwk.keyId,\n    }\n  }\n  if (createJwtIssuer.method === 'jwk') {\n    return {\n      ...createJwtIssuer,\n      publicJwk: createJwtIssuer.jwk.toJson() as Jwk,\n      alg: createJwtIssuer.jwk.signatureAlgorithm,\n    }\n  }\n\n  throw new CredoError(`Unsupported jwt issuer method '${(createJwtIssuer as OpenId4VcJwtIssuer).method}'`)\n}\n\nexport function getProofTypeFromPublicJwk(agentContext: AgentContext, key: Kms.PublicJwk) {\n  const signatureSuiteRegistry = agentContext.dependencyManager.resolve(SignatureSuiteRegistry)\n\n  const supportedSignatureSuites = signatureSuiteRegistry.getAllByPublicJwkType(key)\n  if (supportedSignatureSuites.length === 0) {\n    throw new CredoError(`Couldn't find a supported signature suite for the given key ${key.jwkTypeHumanDescription}.`)\n  }\n\n  return supportedSignatureSuites[0].proofType\n}\n\nexport function parseIfJson<T>(input: T): T | Record<string, unknown> {\n  if (typeof input !== 'string') {\n    return input\n  }\n\n  try {\n    // Try to parse the string as JSON\n    return JSON.parse(input)\n  } catch (_error) {\n    /* empty */\n  }\n\n  return input\n}\n\nexport function dcqlCredentialQueryToPresentationFormat(credential: DcqlQuery['credentials'][number]) {\n  switch (credential.format) {\n    case 'dc+sd-jwt':\n      return ClaimFormat.SdJwtDc\n    case 'vc+sd-jwt':\n      if (credential.meta && 'type_values' in credential.meta) {\n        return ClaimFormat.SdJwtW3cVp\n      }\n\n      return ClaimFormat.SdJwtDc\n    case 'jwt_vc_json':\n      return ClaimFormat.JwtVp\n    case 'ldp_vc':\n      return ClaimFormat.LdpVp\n    case 'mso_mdoc':\n      return ClaimFormat.MsoMdoc\n  }\n}\n"],"mappings":";;;;;;AAkBA,SAAgB,mCAAmC,cAA8D;CAC/G,MAAM,MAAM,aAAa,QAAQ,IAAI,iBAAiB;AAOtD,QAJwC,OAAO,OAAO,IAAI,4BAA4B,CAAC,QACpF,cAAc,IAAI,8BAA8B;EAAE,WAAW;EAAQ;EAAW,CAAC,CAAC,SAAS,EAC7F;;AAKH,eAAsB,oBACpB,cACA,QACA,kBAAgC,CAAC,iBAAiB,EAClD;AAKA,QAAO,oCAHa,MADJ,aAAa,kBAAkB,QAAQ,QAAQ,CAC7B,mBAAmB,OAAO,EACrB,eAAe,QAAQ,gBAAgB,CAEjB;;AAG/D,SAAgB,gBAAgB,WAA0D;AACxF,KAAI,UAAU,WAAW,MACvB,QAAO;EACL,QAAQ;EACR,KAAK,UAAU,IAAI,QAAQ;EAC5B;AAGH,KAAI,UAAU,WAAW,MACvB,QAAO;EACL,QAAQ;EACR,sBAAsB,UAAU,IAAI,GAAG;EACvC,KAAK,UAAU,IAAI,KAAK,MAAM,EAAE,SAAS,SAAS,CAAC;EACpD;AAGH,QAAO;;AAGT,SAAgB,gBAAgB,kBAAiE;AAC/F,KAAI,iBAAiB,WAAW,MAC9B,QAAO;EACL,QAAQ;EACR,KAAK,IAAI,UAAU,YAAY,iBAAiB,IAAI;EACrD;AAGH,KAAI,iBAAiB,WAAW,MAC9B,QAAO;EACL,QAAQ;EACR,KAAK,iBAAiB,IAAI,KAAK,GAAG,MAAM;GACtC,MAAM,IAAI,gBAAgB,uBAAuB,EAAE;AACnD,OAAI,MAAM,EAAG,GAAE,QAAQ,iBAAiB;AACxC,UAAO;IACP;EACH;AAGH,QAAO;;AAGT,eAAsB,mCACpB,cACA,iBACoB;AACpB,KAAI,gBAAgB,WAAW,OAAO;EAEpC,MAAM,EAAE,cAAc,MADT,aAAa,QAAQ,QAAQ,CACT,8CAA8C,gBAAgB,OAAO;AAEtG,SAAO;GACL,QAAQ,gBAAgB;GACxB,QAAQ,gBAAgB;GACxB,KAAK,UAAU;GACf,KAAK,UAAU;GAChB;;AAEH,KAAI,gBAAgB,WAAW,OAAO;EACpC,MAAM,kBAAkB,gBAAgB,IAAI;AAC5C,MAAI,CAAC,gBACH,OAAM,IAAI,WAAW,qEAAqE;AAG5F,SAAO;GACL,GAAG;GACH,KAAK,gBAAgB,IAAI,KAAK,gBAAgB,YAAY,SAAS,SAAS,CAAC;GAC7E,KAAK,gBAAgB,UAAU;GAC/B,KAAK,gBAAgB,UAAU;GAChC;;AAEH,KAAI,gBAAgB,WAAW,MAC7B,QAAO;EACL,GAAG;EACH,WAAW,gBAAgB,IAAI,QAAQ;EACvC,KAAK,gBAAgB,IAAI;EAC1B;AAGH,OAAM,IAAI,WAAW,kCAAmC,gBAAuC,OAAO,GAAG;;AAG3G,SAAgB,0BAA0B,cAA4B,KAAoB;CAGxF,MAAM,2BAFyB,aAAa,kBAAkB,QAAQ,uBAAuB,CAErC,sBAAsB,IAAI;AAClF,KAAI,yBAAyB,WAAW,EACtC,OAAM,IAAI,WAAW,+DAA+D,IAAI,wBAAwB,GAAG;AAGrH,QAAO,yBAAyB,GAAG;;AAkBrC,SAAgB,wCAAwC,YAA8C;AACpG,SAAQ,WAAW,QAAnB;EACE,KAAK,YACH,QAAO,YAAY;EACrB,KAAK;AACH,OAAI,WAAW,QAAQ,iBAAiB,WAAW,KACjD,QAAO,YAAY;AAGrB,UAAO,YAAY;EACrB,KAAK,cACH,QAAO,YAAY;EACrB,KAAK,SACH,QAAO,YAAY;EACrB,KAAK,WACH,QAAO,YAAY"}