{"version":3,"file":"ecPublicKey.mjs","names":[],"sources":["../../../../../../src/modules/kms/jwk/kty/ec/ecPublicKey.ts"],"sourcesContent":["import {\n  AffinePoint,\n  CurveParams,\n  isValidCompressedPublicKeyFormat,\n  isValidDecompressedPublicKeyFormat,\n  Secp256k1,\n  Secp256r1,\n  Secp384r1,\n  Secp521r1,\n} from 'ec-compression'\nimport { TypedArrayEncoder } from '../../../../../utils'\nimport { KeyManagementError } from '../../../error/KeyManagementError'\nimport type { KmsJwkPublicEc } from './ecJwk'\n\n// CurveParams for ec-compression lib\nexport const ecCrvToCurveParams: Record<KmsJwkPublicEc['crv'], CurveParams> = {\n  'P-256': Secp256r1,\n  'P-384': Secp384r1,\n  'P-521': Secp521r1,\n  secp256k1: Secp256k1,\n}\n\nexport function ecPublicJwkToPublicKey(\n  publicJwk: KmsJwkPublicEc,\n  { compressed = false }: { compressed?: boolean } = {}\n): Uint8Array {\n  const xAsBytes = TypedArrayEncoder.fromBase64Url(publicJwk.x)\n  const yAsBytes = TypedArrayEncoder.fromBase64Url(publicJwk.y)\n\n  const affinePoint = new AffinePoint(xAsBytes, yAsBytes, publicJwk.crv)\n\n  return compressed ? affinePoint.compressedForm : affinePoint.decompressedForm\n}\n\nexport function ecPublicKeyToPublicJwk<Crv extends KmsJwkPublicEc['crv']>(publicKey: Uint8Array, crv: Crv) {\n  const curveParams = ecCrvToCurveParams[crv]\n\n  if (!curveParams) {\n    throw new KeyManagementError(`kty EC with crv '${crv}' is not supported for creating jwk based on public key bytes`)\n  }\n\n  let affinePoint: AffinePoint\n\n  if (isValidCompressedPublicKeyFormat(publicKey, curveParams)) {\n    affinePoint = AffinePoint.fromCompressedPoint(publicKey, curveParams)\n  } else if (isValidDecompressedPublicKeyFormat(publicKey, curveParams)) {\n    affinePoint = AffinePoint.fromDecompressedPoint(publicKey, curveParams)\n  } else {\n    throw new KeyManagementError(\n      `public key for kty EC with crv '${crv}' is neither a valid compressed or uncompressed key. Key prefix '${publicKey[0]}', key length '${publicKey.length}'`\n    )\n  }\n\n  const jwk = {\n    kty: 'EC',\n    crv,\n    x: TypedArrayEncoder.toBase64Url(affinePoint.xBytes),\n    y: TypedArrayEncoder.toBase64Url(affinePoint.yBytes),\n  } satisfies KmsJwkPublicEc & { crv: Crv }\n\n  return jwk\n}\n"],"mappings":";;;;;AAeA,MAAa,qBAAiE;CAC5E,SAAS;CACT,SAAS;CACT,SAAS;CACT,WAAW;AACb;AAEA,SAAgB,uBACd,WACA,EAAE,aAAa,UAAoC,CAAC,GACxC;CACZ,MAAM,WAAW,kBAAkB,cAAc,UAAU,CAAC;CAC5D,MAAM,WAAW,kBAAkB,cAAc,UAAU,CAAC;CAE5D,MAAM,cAAc,IAAI,YAAY,UAAU,UAAU,UAAU,GAAG;CAErE,OAAO,aAAa,YAAY,iBAAiB,YAAY;AAC/D;AAEA,SAAgB,uBAA0D,WAAuB,KAAU;CACzG,MAAM,cAAc,mBAAmB;CAEvC,IAAI,CAAC,aACH,MAAM,IAAI,mBAAmB,oBAAoB,IAAI,8DAA8D;CAGrH,IAAI;CAEJ,IAAI,iCAAiC,WAAW,WAAW,GACzD,cAAc,YAAY,oBAAoB,WAAW,WAAW;MAC/D,IAAI,mCAAmC,WAAW,WAAW,GAClE,cAAc,YAAY,sBAAsB,WAAW,WAAW;MAEtE,MAAM,IAAI,mBACR,mCAAmC,IAAI,mEAAmE,UAAU,GAAG,iBAAiB,UAAU,OAAO,EAC3J;CAUF,OAAO;EANL,KAAK;EACL;EACA,GAAG,kBAAkB,YAAY,YAAY,MAAM;EACnD,GAAG,kBAAkB,YAAY,YAAY,MAAM;CAG5C;AACX"}