@calimero-network/mero-js 19.27.1 → 21.0.0

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.cjs CHANGED
@@ -100,6 +100,7 @@ __export(index_exports, {
100
100
  signRoutingChallenge: () => signRoutingChallenge,
101
101
  signWarrant: () => signWarrant,
102
102
  transportKeyBinding: () => transportKeyBinding,
103
+ trustedMeasurementsFromReleases: () => trustedMeasurementsFromReleases,
103
104
  withCap: () => withCap,
104
105
  withRetry: () => withRetry,
105
106
  withoutCap: () => withoutCap
@@ -1977,10 +1978,6 @@ var AdminApiClient = class {
1977
1978
  async getUsage() {
1978
1979
  return this.httpClient.get("/admin-api/usage");
1979
1980
  }
1980
- /** Node TLS certificate, PEM text (GET /admin-api/certificate). */
1981
- async getCertificate() {
1982
- return this.httpClient.get("/admin-api/certificate", { parse: "text" });
1983
- }
1984
1981
  // ---- Group / context / namespace membership ----
1985
1982
  /** Create a standalone group (POST /admin-api/groups). */
1986
1983
  async createGroup(request) {
@@ -7173,17 +7170,32 @@ async function defaultNonceSource(deviceSecret) {
7173
7170
 
7174
7171
  // src/sealed/verify.ts
7175
7172
  var MEASUREMENT_HEX = /^[0-9a-f]{96}$/;
7173
+ var REGISTERS = ["mrtd", "rtmr0", "rtmr1", "rtmr2", "rtmr3"];
7176
7174
  function createQuoteVerifier(options) {
7177
- const allowedMrtd = measurements(options.allowedMrtd, "allowedMrtd");
7178
- if (allowedMrtd.length === 0) {
7179
- throw new Error("allowedMrtd is empty, so no quote would ever be accepted");
7180
- }
7175
+ const allowedMrtd = measurements(options.allowedMrtd ?? [], "allowedMrtd");
7176
+ const allowedImages = (options.allowedMeasurements ?? []).map((image, index) => {
7177
+ const label = `allowedMeasurements[${index}]`;
7178
+ return REGISTERS.map((register) => measurements([image?.[register] ?? ""], `${label}.${register}`)[0]).join();
7179
+ });
7181
7180
  const allowedRtmr = [
7182
7181
  measurements(options.allowedRtmr0 ?? [], "allowedRtmr0"),
7183
7182
  measurements(options.allowedRtmr1 ?? [], "allowedRtmr1"),
7184
7183
  measurements(options.allowedRtmr2 ?? [], "allowedRtmr2"),
7185
7184
  measurements(options.allowedRtmr3 ?? [], "allowedRtmr3")
7186
7185
  ];
7186
+ if (options.allowedMeasurements !== void 0 && allowedImages.length === 0) {
7187
+ throw new Error("allowedMeasurements is empty, so no quote would ever be accepted");
7188
+ }
7189
+ if (allowedImages.length === 0) {
7190
+ if (allowedMrtd.length === 0) {
7191
+ throw new Error("No image is trusted: give allowedMeasurements, or allowedMrtd with allowedRtmr1-3");
7192
+ }
7193
+ if (allowedRtmr.slice(1).some((list) => list.length === 0)) {
7194
+ throw new Error(
7195
+ "allowedMrtd alone does not name an image: the MRTD measures the TD firmware, which images share, and the image is in RTMR1-3. Give allowedMeasurements, or allowedRtmr1-3 too"
7196
+ );
7197
+ }
7198
+ }
7187
7199
  const allowedStatuses = options.allowedTcbStatuses ?? ["UpToDate"];
7188
7200
  const now = options.now ?? Date.now;
7189
7201
  const verifier = async ({
@@ -7209,8 +7221,14 @@ function createQuoteVerifier(options) {
7209
7221
  throw new Error(`The platform's TCB status is ${verified.status}, which is not accepted`);
7210
7222
  }
7211
7223
  const td = tdReport(verified.report);
7212
- if (!allowedMrtd.includes(hex(td.mrTd))) {
7213
- throw new Error(`MRTD ${hex(td.mrTd)} is not an image this verifier trusts`);
7224
+ const measured = [td.mrTd, td.rtMr0, td.rtMr1, td.rtMr2, td.rtMr3].map((register) => hex(register));
7225
+ if (allowedImages.length > 0 && !allowedImages.includes(measured.join())) {
7226
+ throw new Error(
7227
+ `The measurements (MRTD ${measured[0]}, RTMR0-3 ${measured.slice(1).join(", ")}) are not an image this verifier trusts`
7228
+ );
7229
+ }
7230
+ if (allowedMrtd.length > 0 && !allowedMrtd.includes(measured[0])) {
7231
+ throw new Error(`MRTD ${measured[0]} is not an image this verifier trusts`);
7214
7232
  }
7215
7233
  const registers = [td.rtMr0, td.rtMr1, td.rtMr2, td.rtMr3];
7216
7234
  registers.forEach((register, index) => {
@@ -7247,6 +7265,51 @@ function fromBase64(value) {
7247
7265
  for (let i = 0; i < binary.length; i += 1) bytes[i] = binary.charCodeAt(i);
7248
7266
  return bytes;
7249
7267
  }
7268
+ var TCB_STATUSES = [
7269
+ "UpToDate",
7270
+ "SWHardeningNeeded",
7271
+ "ConfigurationNeeded",
7272
+ "ConfigurationAndSWHardeningNeeded",
7273
+ "OutOfDate",
7274
+ "OutOfDateConfigurationNeeded"
7275
+ ];
7276
+ function trustedMeasurementsFromReleases(releases, { profile }) {
7277
+ if (releases.length === 0) {
7278
+ throw new Error("No release given, so no image would be trusted");
7279
+ }
7280
+ let statuses;
7281
+ const allowedMeasurements = releases.map((release, index) => {
7282
+ const name = release?.tag ?? `releases[${index}]`;
7283
+ if (release?.role !== void 0 && release.role !== "node") {
7284
+ throw new Error(`${name} lists the measurements of a ${release.role}, not of a node image`);
7285
+ }
7286
+ const image = release?.profiles?.[profile];
7287
+ if (!image) {
7288
+ const known = Object.keys(release?.profiles ?? {}).join(", ") || "none";
7289
+ throw new Error(`${name} has no profile ${JSON.stringify(profile)} (it has: ${known})`);
7290
+ }
7291
+ const accepted = (image.allowed_tcb_statuses ?? ["uptodate"]).map((status) => tcbStatus(status, name));
7292
+ statuses = statuses === void 0 ? accepted : statuses.filter((status) => accepted.includes(status));
7293
+ return {
7294
+ mrtd: image.mrtd,
7295
+ rtmr0: image.rtmr0,
7296
+ rtmr1: image.rtmr1,
7297
+ rtmr2: image.rtmr2,
7298
+ rtmr3: image.rtmr3
7299
+ };
7300
+ });
7301
+ if (!statuses || statuses.length === 0) {
7302
+ throw new Error("The releases given accept no TCB status in common");
7303
+ }
7304
+ return { allowedMeasurements, allowedTcbStatuses: statuses };
7305
+ }
7306
+ function tcbStatus(status, release) {
7307
+ const known = TCB_STATUSES.find((candidate) => candidate.toLowerCase() === String(status).toLowerCase());
7308
+ if (!known) {
7309
+ throw new Error(`${release} accepts TCB status ${JSON.stringify(status)}, which this verifier does not know`);
7310
+ }
7311
+ return known;
7312
+ }
7250
7313
 
7251
7314
  // src/namespace-op/namespace-op.ts
7252
7315
  var SIGNED_NAMESPACE_OP_SCHEMA_VERSION = 8;