@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.mjs CHANGED
@@ -1869,10 +1869,6 @@ var AdminApiClient = class {
1869
1869
  async getUsage() {
1870
1870
  return this.httpClient.get("/admin-api/usage");
1871
1871
  }
1872
- /** Node TLS certificate, PEM text (GET /admin-api/certificate). */
1873
- async getCertificate() {
1874
- return this.httpClient.get("/admin-api/certificate", { parse: "text" });
1875
- }
1876
1872
  // ---- Group / context / namespace membership ----
1877
1873
  /** Create a standalone group (POST /admin-api/groups). */
1878
1874
  async createGroup(request) {
@@ -7065,17 +7061,32 @@ async function defaultNonceSource(deviceSecret) {
7065
7061
 
7066
7062
  // src/sealed/verify.ts
7067
7063
  var MEASUREMENT_HEX = /^[0-9a-f]{96}$/;
7064
+ var REGISTERS = ["mrtd", "rtmr0", "rtmr1", "rtmr2", "rtmr3"];
7068
7065
  function createQuoteVerifier(options) {
7069
- const allowedMrtd = measurements(options.allowedMrtd, "allowedMrtd");
7070
- if (allowedMrtd.length === 0) {
7071
- throw new Error("allowedMrtd is empty, so no quote would ever be accepted");
7072
- }
7066
+ const allowedMrtd = measurements(options.allowedMrtd ?? [], "allowedMrtd");
7067
+ const allowedImages = (options.allowedMeasurements ?? []).map((image, index) => {
7068
+ const label = `allowedMeasurements[${index}]`;
7069
+ return REGISTERS.map((register) => measurements([image?.[register] ?? ""], `${label}.${register}`)[0]).join();
7070
+ });
7073
7071
  const allowedRtmr = [
7074
7072
  measurements(options.allowedRtmr0 ?? [], "allowedRtmr0"),
7075
7073
  measurements(options.allowedRtmr1 ?? [], "allowedRtmr1"),
7076
7074
  measurements(options.allowedRtmr2 ?? [], "allowedRtmr2"),
7077
7075
  measurements(options.allowedRtmr3 ?? [], "allowedRtmr3")
7078
7076
  ];
7077
+ if (options.allowedMeasurements !== void 0 && allowedImages.length === 0) {
7078
+ throw new Error("allowedMeasurements is empty, so no quote would ever be accepted");
7079
+ }
7080
+ if (allowedImages.length === 0) {
7081
+ if (allowedMrtd.length === 0) {
7082
+ throw new Error("No image is trusted: give allowedMeasurements, or allowedMrtd with allowedRtmr1-3");
7083
+ }
7084
+ if (allowedRtmr.slice(1).some((list) => list.length === 0)) {
7085
+ throw new Error(
7086
+ "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"
7087
+ );
7088
+ }
7089
+ }
7079
7090
  const allowedStatuses = options.allowedTcbStatuses ?? ["UpToDate"];
7080
7091
  const now = options.now ?? Date.now;
7081
7092
  const verifier = async ({
@@ -7101,8 +7112,14 @@ function createQuoteVerifier(options) {
7101
7112
  throw new Error(`The platform's TCB status is ${verified.status}, which is not accepted`);
7102
7113
  }
7103
7114
  const td = tdReport(verified.report);
7104
- if (!allowedMrtd.includes(hex(td.mrTd))) {
7105
- throw new Error(`MRTD ${hex(td.mrTd)} is not an image this verifier trusts`);
7115
+ const measured = [td.mrTd, td.rtMr0, td.rtMr1, td.rtMr2, td.rtMr3].map((register) => hex(register));
7116
+ if (allowedImages.length > 0 && !allowedImages.includes(measured.join())) {
7117
+ throw new Error(
7118
+ `The measurements (MRTD ${measured[0]}, RTMR0-3 ${measured.slice(1).join(", ")}) are not an image this verifier trusts`
7119
+ );
7120
+ }
7121
+ if (allowedMrtd.length > 0 && !allowedMrtd.includes(measured[0])) {
7122
+ throw new Error(`MRTD ${measured[0]} is not an image this verifier trusts`);
7106
7123
  }
7107
7124
  const registers = [td.rtMr0, td.rtMr1, td.rtMr2, td.rtMr3];
7108
7125
  registers.forEach((register, index) => {
@@ -7139,6 +7156,51 @@ function fromBase64(value) {
7139
7156
  for (let i = 0; i < binary.length; i += 1) bytes[i] = binary.charCodeAt(i);
7140
7157
  return bytes;
7141
7158
  }
7159
+ var TCB_STATUSES = [
7160
+ "UpToDate",
7161
+ "SWHardeningNeeded",
7162
+ "ConfigurationNeeded",
7163
+ "ConfigurationAndSWHardeningNeeded",
7164
+ "OutOfDate",
7165
+ "OutOfDateConfigurationNeeded"
7166
+ ];
7167
+ function trustedMeasurementsFromReleases(releases, { profile }) {
7168
+ if (releases.length === 0) {
7169
+ throw new Error("No release given, so no image would be trusted");
7170
+ }
7171
+ let statuses;
7172
+ const allowedMeasurements = releases.map((release, index) => {
7173
+ const name = release?.tag ?? `releases[${index}]`;
7174
+ if (release?.role !== void 0 && release.role !== "node") {
7175
+ throw new Error(`${name} lists the measurements of a ${release.role}, not of a node image`);
7176
+ }
7177
+ const image = release?.profiles?.[profile];
7178
+ if (!image) {
7179
+ const known = Object.keys(release?.profiles ?? {}).join(", ") || "none";
7180
+ throw new Error(`${name} has no profile ${JSON.stringify(profile)} (it has: ${known})`);
7181
+ }
7182
+ const accepted = (image.allowed_tcb_statuses ?? ["uptodate"]).map((status) => tcbStatus(status, name));
7183
+ statuses = statuses === void 0 ? accepted : statuses.filter((status) => accepted.includes(status));
7184
+ return {
7185
+ mrtd: image.mrtd,
7186
+ rtmr0: image.rtmr0,
7187
+ rtmr1: image.rtmr1,
7188
+ rtmr2: image.rtmr2,
7189
+ rtmr3: image.rtmr3
7190
+ };
7191
+ });
7192
+ if (!statuses || statuses.length === 0) {
7193
+ throw new Error("The releases given accept no TCB status in common");
7194
+ }
7195
+ return { allowedMeasurements, allowedTcbStatuses: statuses };
7196
+ }
7197
+ function tcbStatus(status, release) {
7198
+ const known = TCB_STATUSES.find((candidate) => candidate.toLowerCase() === String(status).toLowerCase());
7199
+ if (!known) {
7200
+ throw new Error(`${release} accepts TCB status ${JSON.stringify(status)}, which this verifier does not know`);
7201
+ }
7202
+ return known;
7203
+ }
7142
7204
 
7143
7205
  // src/namespace-op/namespace-op.ts
7144
7206
  var SIGNED_NAMESPACE_OP_SCHEMA_VERSION = 8;
@@ -7545,6 +7607,7 @@ export {
7545
7607
  signRoutingChallenge,
7546
7608
  signWarrant,
7547
7609
  transportKeyBinding,
7610
+ trustedMeasurementsFromReleases,
7548
7611
  withCap,
7549
7612
  withRetry,
7550
7613
  withoutCap