@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/admin-api/admin-client.d.ts +0 -2
- package/dist/admin-api/admin-client.js +0 -4
- package/dist/admin-api/admin-types.d.ts +5 -2
- package/dist/index.browser.mjs +2 -2
- package/dist/index.browser.mjs.map +3 -3
- package/dist/index.cjs +73 -10
- package/dist/index.cjs.map +2 -2
- package/dist/index.mjs +73 -10
- package/dist/index.mjs.map +2 -2
- package/dist/sealed/index.d.ts +2 -2
- package/dist/sealed/index.js +1 -1
- package/dist/sealed/verify.d.ts +69 -6
- package/dist/sealed/verify.js +97 -8
- package/package.json +1 -1
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
|
-
|
|
7071
|
-
|
|
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
|
-
|
|
7105
|
-
|
|
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
|