burnledger 0.8.1 → 0.9.1
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/README.md +144 -2
- package/dist/cjs/anchor.d.ts +5 -3
- package/dist/cjs/anchor.d.ts.map +1 -1
- package/dist/cjs/anchor.js +10 -4
- package/dist/cjs/anchor.js.map +1 -1
- package/dist/cjs/client.d.ts +95 -0
- package/dist/cjs/client.d.ts.map +1 -1
- package/dist/cjs/client.js +175 -54
- package/dist/cjs/client.js.map +1 -1
- package/dist/cjs/customer-keys.d.ts +73 -1
- package/dist/cjs/customer-keys.d.ts.map +1 -1
- package/dist/cjs/customer-keys.js +329 -3
- package/dist/cjs/customer-keys.js.map +1 -1
- package/dist/cjs/enclave-registration.d.ts +165 -0
- package/dist/cjs/enclave-registration.d.ts.map +1 -0
- package/dist/cjs/enclave-registration.js +287 -0
- package/dist/cjs/enclave-registration.js.map +1 -0
- package/dist/cjs/enclave-seal.d.ts +43 -0
- package/dist/cjs/enclave-seal.d.ts.map +1 -1
- package/dist/cjs/enclave-seal.js +62 -1
- package/dist/cjs/enclave-seal.js.map +1 -1
- package/dist/cjs/errors.d.ts +10 -0
- package/dist/cjs/errors.d.ts.map +1 -1
- package/dist/cjs/errors.js +11 -1
- package/dist/cjs/errors.js.map +1 -1
- package/dist/cjs/index.browser.d.ts +7 -3
- package/dist/cjs/index.browser.d.ts.map +1 -1
- package/dist/cjs/index.browser.js +6 -3
- package/dist/cjs/index.browser.js.map +1 -1
- package/dist/cjs/index.d.ts +22 -10
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +75 -6
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/key-group.d.ts +80 -0
- package/dist/cjs/key-group.d.ts.map +1 -0
- package/dist/cjs/key-group.js +136 -0
- package/dist/cjs/key-group.js.map +1 -0
- package/dist/cjs/models.d.ts +60 -0
- package/dist/cjs/models.d.ts.map +1 -1
- package/dist/cjs/models.js +63 -0
- package/dist/cjs/models.js.map +1 -1
- package/dist/cjs/node-runtime.d.ts +40 -0
- package/dist/cjs/node-runtime.d.ts.map +1 -0
- package/dist/cjs/node-runtime.js +42 -0
- package/dist/cjs/node-runtime.js.map +1 -0
- package/dist/cjs/status-document.d.ts +25 -0
- package/dist/cjs/status-document.d.ts.map +1 -0
- package/dist/cjs/status-document.js +62 -0
- package/dist/cjs/status-document.js.map +1 -0
- package/dist/cjs/verify.d.ts +108 -3
- package/dist/cjs/verify.d.ts.map +1 -1
- package/dist/cjs/verify.js +451 -171
- package/dist/cjs/verify.js.map +1 -1
- package/dist/cjs/web-verifier.d.ts +23 -3
- package/dist/cjs/web-verifier.d.ts.map +1 -1
- package/dist/cjs/web-verifier.js +31 -5
- package/dist/cjs/web-verifier.js.map +1 -1
- package/dist/cjs/webhooks.d.ts +9 -2
- package/dist/cjs/webhooks.d.ts.map +1 -1
- package/dist/cjs/webhooks.js +29 -11
- package/dist/cjs/webhooks.js.map +1 -1
- package/dist/esm/anchor.d.ts +5 -3
- package/dist/esm/anchor.d.ts.map +1 -1
- package/dist/esm/anchor.js +10 -4
- package/dist/esm/anchor.js.map +1 -1
- package/dist/esm/cli.d.ts +30 -17
- package/dist/esm/cli.d.ts.map +1 -1
- package/dist/esm/cli.js +142 -83
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/client.d.ts +95 -0
- package/dist/esm/client.d.ts.map +1 -1
- package/dist/esm/client.js +175 -21
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/customer-keys.d.ts +73 -1
- package/dist/esm/customer-keys.d.ts.map +1 -1
- package/dist/esm/customer-keys.js +323 -3
- package/dist/esm/customer-keys.js.map +1 -1
- package/dist/esm/enclave-registration.d.ts +165 -0
- package/dist/esm/enclave-registration.d.ts.map +1 -0
- package/dist/esm/enclave-registration.js +277 -0
- package/dist/esm/enclave-registration.js.map +1 -0
- package/dist/esm/enclave-seal.d.ts +43 -0
- package/dist/esm/enclave-seal.d.ts.map +1 -1
- package/dist/esm/enclave-seal.js +61 -1
- package/dist/esm/enclave-seal.js.map +1 -1
- package/dist/esm/errors.d.ts +10 -0
- package/dist/esm/errors.d.ts.map +1 -1
- package/dist/esm/errors.js +10 -0
- package/dist/esm/errors.js.map +1 -1
- package/dist/esm/index.browser.d.ts +7 -3
- package/dist/esm/index.browser.d.ts.map +1 -1
- package/dist/esm/index.browser.js +6 -3
- package/dist/esm/index.browser.js.map +1 -1
- package/dist/esm/index.d.ts +22 -10
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +30 -8
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/key-group.d.ts +80 -0
- package/dist/esm/key-group.d.ts.map +1 -0
- package/dist/esm/key-group.js +130 -0
- package/dist/esm/key-group.js.map +1 -0
- package/dist/esm/models.d.ts +60 -0
- package/dist/esm/models.d.ts.map +1 -1
- package/dist/esm/models.js +59 -0
- package/dist/esm/models.js.map +1 -1
- package/dist/esm/node-runtime.d.ts +40 -0
- package/dist/esm/node-runtime.d.ts.map +1 -0
- package/dist/esm/node-runtime.js +38 -0
- package/dist/esm/node-runtime.js.map +1 -0
- package/dist/esm/status-document.d.ts +25 -0
- package/dist/esm/status-document.d.ts.map +1 -0
- package/dist/esm/status-document.js +59 -0
- package/dist/esm/status-document.js.map +1 -0
- package/dist/esm/verify.d.ts +108 -3
- package/dist/esm/verify.d.ts.map +1 -1
- package/dist/esm/verify.js +448 -171
- package/dist/esm/verify.js.map +1 -1
- package/dist/esm/web-verifier.d.ts +23 -3
- package/dist/esm/web-verifier.d.ts.map +1 -1
- package/dist/esm/web-verifier.js +27 -5
- package/dist/esm/web-verifier.js.map +1 -1
- package/dist/esm/webhooks.d.ts +9 -2
- package/dist/esm/webhooks.d.ts.map +1 -1
- package/dist/esm/webhooks.js +29 -11
- package/dist/esm/webhooks.js.map +1 -1
- package/package.json +1 -1
- package/src/anchor.ts +10 -4
- package/src/cli.ts +145 -78
- package/src/client.ts +241 -25
- package/src/customer-keys.ts +373 -3
- package/src/enclave-registration.ts +402 -0
- package/src/enclave-seal.ts +108 -1
- package/src/errors.ts +11 -0
- package/src/index.browser.ts +9 -3
- package/src/index.ts +48 -6
- package/src/key-group.ts +181 -0
- package/src/models.ts +131 -0
- package/src/node-runtime.ts +57 -0
- package/src/status-document.ts +59 -0
- package/src/verify.ts +565 -177
- package/src/web-verifier.ts +36 -3
- package/src/webhooks.ts +28 -11
package/dist/cjs/models.js
CHANGED
|
@@ -24,6 +24,10 @@ exports.parseApiKeyListItem = parseApiKeyListItem;
|
|
|
24
24
|
exports.parseApiKeyResponse = parseApiKeyResponse;
|
|
25
25
|
exports.parseProfile = parseProfile;
|
|
26
26
|
exports.parseSystemHealth = parseSystemHealth;
|
|
27
|
+
exports.parseKeyEnrollmentStatement = parseKeyEnrollmentStatement;
|
|
28
|
+
exports.parseTeamAuthorizationCertificate = parseTeamAuthorizationCertificate;
|
|
29
|
+
exports.parseSystemRegistrationCertificate = parseSystemRegistrationCertificate;
|
|
30
|
+
exports.parseKeyEnrollmentResult = parseKeyEnrollmentResult;
|
|
27
31
|
// ---------------------------------------------------------------------------
|
|
28
32
|
// Timestamp parsing
|
|
29
33
|
// ---------------------------------------------------------------------------
|
|
@@ -109,6 +113,7 @@ function parseCertificateResponse(d) {
|
|
|
109
113
|
revocationReason: d.revocation_reason ?? undefined,
|
|
110
114
|
certificate: d.certificate,
|
|
111
115
|
statusStatement: d.status_statement ?? undefined,
|
|
116
|
+
nsmAttestation: d.nsm_attestation ?? undefined,
|
|
112
117
|
};
|
|
113
118
|
}
|
|
114
119
|
function parseRevocationStatus(d) {
|
|
@@ -273,4 +278,62 @@ function parseSystemHealth(d) {
|
|
|
273
278
|
healthError: d.health_error ?? undefined,
|
|
274
279
|
};
|
|
275
280
|
}
|
|
281
|
+
/** Go encodes [N]byte as an array of numbers; anything else here is a response
|
|
282
|
+
* this SDK cannot read, and is refused rather than coerced. */
|
|
283
|
+
function bytesFromInts(v, field, length) {
|
|
284
|
+
if (!Array.isArray(v) ||
|
|
285
|
+
v.length !== length ||
|
|
286
|
+
!v.every((b) => Number.isInteger(b) && b >= 0 && b <= 255)) {
|
|
287
|
+
throw new Error(`${field} is not ${length} bytes`);
|
|
288
|
+
}
|
|
289
|
+
return new Uint8Array(v);
|
|
290
|
+
}
|
|
291
|
+
function bytesFromBase64(v, field) {
|
|
292
|
+
if (typeof v !== "string")
|
|
293
|
+
throw new Error(`${field} is not base64`);
|
|
294
|
+
const bin = atob(v);
|
|
295
|
+
const out = new Uint8Array(bin.length);
|
|
296
|
+
for (let i = 0; i < bin.length; i++)
|
|
297
|
+
out[i] = bin.charCodeAt(i);
|
|
298
|
+
return out;
|
|
299
|
+
}
|
|
300
|
+
function parseKeyEnrollmentStatement(d) {
|
|
301
|
+
const group = (d.group ?? {});
|
|
302
|
+
return {
|
|
303
|
+
assertedTeamId: d.asserted_team_id,
|
|
304
|
+
customerKeyId: d.customer_key_id,
|
|
305
|
+
threshold: group.threshold,
|
|
306
|
+
members: (group.members ?? []).map((m, i) => bytesFromBase64(m, `enrollment.group.members[${i}]`)),
|
|
307
|
+
enrolledAt: parseDt(d.enrolled_at),
|
|
308
|
+
enclavePcr0: d.enclave_pcr0,
|
|
309
|
+
signature: bytesFromInts(d.signature, "enrollment.signature", 64),
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
function parseTeamAuthorizationCertificate(d) {
|
|
313
|
+
return {
|
|
314
|
+
assertedTeamId: d.asserted_team_id,
|
|
315
|
+
customerKeyId: d.customer_key_id,
|
|
316
|
+
notBefore: parseDt(d.not_before),
|
|
317
|
+
notAfter: parseDt(d.not_after),
|
|
318
|
+
prevKeyId: d.prev_key_id || undefined,
|
|
319
|
+
signature: bytesFromInts(d.signature, "authorization.signature", 64),
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
function parseSystemRegistrationCertificate(d) {
|
|
323
|
+
return {
|
|
324
|
+
systemId: d.system_id,
|
|
325
|
+
configDigest: bytesFromInts(d.config_digest, "registration.config_digest", 32),
|
|
326
|
+
queryTemplateHash: bytesFromInts(d.query_template_hash, "registration.query_template_hash", 32),
|
|
327
|
+
connectorType: d.connector_type,
|
|
328
|
+
customerKeyId: d.customer_key_id,
|
|
329
|
+
registeredAt: parseDt(d.registered_at),
|
|
330
|
+
signature: bytesFromInts(d.signature, "registration.signature", 64),
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
function parseKeyEnrollmentResult(d) {
|
|
334
|
+
return {
|
|
335
|
+
enrollment: parseKeyEnrollmentStatement(d.enrollment ?? {}),
|
|
336
|
+
authorization: parseTeamAuthorizationCertificate(d.authorization ?? {}),
|
|
337
|
+
};
|
|
338
|
+
}
|
|
276
339
|
//# sourceMappingURL=models.js.map
|
package/dist/cjs/models.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/models.ts"],"names":[],"mappings":";AAAA;;;;GAIG
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/models.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** The Node-only capabilities the shared client needs, injected at the entry.
|
|
2
|
+
*
|
|
3
|
+
* WHY THIS EXISTS. `client.ts` is imported by BOTH entry points — the Node one
|
|
4
|
+
* (index.ts) and the browser one (index.browser.ts). A few of its methods are
|
|
5
|
+
* Node-only by nature: key enrolment and system registration (ADR-025 §2 makes a
|
|
6
|
+
* client the customer runs locally the only place enrolment can happen), and
|
|
7
|
+
* `savePdf`, which writes to a filesystem path. Their implementations live in
|
|
8
|
+
* `enclave-registration.ts`, `enclave-seal.ts` (and, through them, `key-group.ts`
|
|
9
|
+
* and `crypto-node.ts`) and in `node:fs/promises` — all of which import
|
|
10
|
+
* `node:crypto` or another Node builtin.
|
|
11
|
+
*
|
|
12
|
+
* If the client named any of those modules directly — even behind a dynamic
|
|
13
|
+
* `import("./enclave-registration.js")` — a browser bundler following the browser
|
|
14
|
+
* entry's graph would drag `node:crypto` into the bundle and fail the build (the
|
|
15
|
+
* dashboard's vite build did exactly this). So the client never names them. The
|
|
16
|
+
* Node entry registers a loader for them here on import; the browser entry never
|
|
17
|
+
* does. A browser caller of a Node-only method therefore gets a clear error, and
|
|
18
|
+
* a browser bundle of the browser entry reaches no Node builtin at all.
|
|
19
|
+
*
|
|
20
|
+
* The imports below are type-only, so they are erased at build and add nothing to
|
|
21
|
+
* any bundle.
|
|
22
|
+
*/
|
|
23
|
+
import type * as RegistrationModule from "./enclave-registration.js";
|
|
24
|
+
import type * as EnclaveSealModule from "./enclave-seal.js";
|
|
25
|
+
/** The Node-only surface the client reaches through {@link loadNodeRuntime}. */
|
|
26
|
+
export interface NodeRuntime {
|
|
27
|
+
readonly registration: typeof RegistrationModule;
|
|
28
|
+
readonly seal: typeof EnclaveSealModule;
|
|
29
|
+
/** `node:fs/promises`' `writeFile`, narrowed to what `savePdf` needs. */
|
|
30
|
+
writeFile(path: string, data: Uint8Array): Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
type NodeRuntimeLoader = () => Promise<NodeRuntime>;
|
|
33
|
+
/** Register the Node runtime. Called once by the Node entry point (index.ts) on
|
|
34
|
+
* import; never by the browser entry. */
|
|
35
|
+
export declare function setNodeRuntimeLoader(load: NodeRuntimeLoader): void;
|
|
36
|
+
/** Load the Node-only runtime, or throw if it was never registered — the case in
|
|
37
|
+
* a browser bundle built from `burnledger/browser`. */
|
|
38
|
+
export declare function loadNodeRuntime(): Promise<NodeRuntime>;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=node-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-runtime.d.ts","sourceRoot":"","sources":["../../src/node-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,KAAK,kBAAkB,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,KAAK,iBAAiB,MAAM,mBAAmB,CAAC;AAE5D,gFAAgF;AAChF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,YAAY,EAAE,OAAO,kBAAkB,CAAC;IACjD,QAAQ,CAAC,IAAI,EAAE,OAAO,iBAAiB,CAAC;IACxC,yEAAyE;IACzE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;AAED,KAAK,iBAAiB,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;AAIpD;yCACyC;AACzC,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAElE;AAED;uDACuD;AACvD,wBAAgB,eAAe,IAAI,OAAO,CAAC,WAAW,CAAC,CAUtD"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** The Node-only capabilities the shared client needs, injected at the entry.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS. `client.ts` is imported by BOTH entry points — the Node one
|
|
5
|
+
* (index.ts) and the browser one (index.browser.ts). A few of its methods are
|
|
6
|
+
* Node-only by nature: key enrolment and system registration (ADR-025 §2 makes a
|
|
7
|
+
* client the customer runs locally the only place enrolment can happen), and
|
|
8
|
+
* `savePdf`, which writes to a filesystem path. Their implementations live in
|
|
9
|
+
* `enclave-registration.ts`, `enclave-seal.ts` (and, through them, `key-group.ts`
|
|
10
|
+
* and `crypto-node.ts`) and in `node:fs/promises` — all of which import
|
|
11
|
+
* `node:crypto` or another Node builtin.
|
|
12
|
+
*
|
|
13
|
+
* If the client named any of those modules directly — even behind a dynamic
|
|
14
|
+
* `import("./enclave-registration.js")` — a browser bundler following the browser
|
|
15
|
+
* entry's graph would drag `node:crypto` into the bundle and fail the build (the
|
|
16
|
+
* dashboard's vite build did exactly this). So the client never names them. The
|
|
17
|
+
* Node entry registers a loader for them here on import; the browser entry never
|
|
18
|
+
* does. A browser caller of a Node-only method therefore gets a clear error, and
|
|
19
|
+
* a browser bundle of the browser entry reaches no Node builtin at all.
|
|
20
|
+
*
|
|
21
|
+
* The imports below are type-only, so they are erased at build and add nothing to
|
|
22
|
+
* any bundle.
|
|
23
|
+
*/
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.setNodeRuntimeLoader = setNodeRuntimeLoader;
|
|
26
|
+
exports.loadNodeRuntime = loadNodeRuntime;
|
|
27
|
+
let loader;
|
|
28
|
+
/** Register the Node runtime. Called once by the Node entry point (index.ts) on
|
|
29
|
+
* import; never by the browser entry. */
|
|
30
|
+
function setNodeRuntimeLoader(load) {
|
|
31
|
+
loader = load;
|
|
32
|
+
}
|
|
33
|
+
/** Load the Node-only runtime, or throw if it was never registered — the case in
|
|
34
|
+
* a browser bundle built from `burnledger/browser`. */
|
|
35
|
+
function loadNodeRuntime() {
|
|
36
|
+
if (loader === undefined) {
|
|
37
|
+
return Promise.reject(new Error("this operation is Node-only (key enrolment, system registration and " +
|
|
38
|
+
'savePdf); import BurnLedger from "burnledger", not "burnledger/browser".'));
|
|
39
|
+
}
|
|
40
|
+
return loader();
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=node-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-runtime.js","sourceRoot":"","sources":["../../src/node-runtime.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;;;;AAeH,IAAI,MAAqC,CAAC;AAE1C;yCACyC;AACzC,8BAAqC,IAAuB;IAC1D,MAAM,GAAG,IAAI,CAAC;AAChB,CAAC;AAED;uDACuD;AACvD;IACE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC,MAAM,CACnB,IAAI,KAAK,CACP,sEAAsE;YACpE,0EAA0E,CAC7E,CACF,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,EAAE,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Reading a status statement as the status endpoint serves it, before anything
|
|
2
|
+
* verifies it. Shared by the CLI and the /verify page's status button, so the two
|
|
3
|
+
* agree on what counts as a statement: an answer that is not one is silence
|
|
4
|
+
* about revocation, while a statement that is one and fails is a refusal. */
|
|
5
|
+
type StatusStatement = Record<string, unknown>;
|
|
6
|
+
/** The API wraps every response in {"data": ...}; a caller may hand over either
|
|
7
|
+
* the envelope or the document inside it. Mirrors
|
|
8
|
+
* core.ParseCertificateStatusDocument, so this CLI and the Go one cannot
|
|
9
|
+
* disagree about which shape the endpoint returns. Exported for testing.
|
|
10
|
+
*
|
|
11
|
+
* A document that does not parse THROWS, and the caller turns that into a
|
|
12
|
+
* warning and a VALID_REVOCATION_UNKNOWN verdict. That is deliberate: an answer
|
|
13
|
+
* this build cannot read is silence about revocation, not a finding about the
|
|
14
|
+
* certificate. Handing a half-read document to the verifier instead would
|
|
15
|
+
* report "status statement signature is invalid" — a claim about the issuer —
|
|
16
|
+
* when what actually happened is that something returned nonsense.
|
|
17
|
+
*
|
|
18
|
+
* `status` itself is NOT validated against a known set. A statement saying
|
|
19
|
+
* SUSPENDED is a statement this build cannot read, and the verifier already has
|
|
20
|
+
* the right answer for that: it authenticates the signature first, then reports
|
|
21
|
+
* VALID_REVOCATION_UNKNOWN. Refusing it here would discard the statement before
|
|
22
|
+
* anyone authenticated it. */
|
|
23
|
+
export declare function unwrapStatusStatement(parsed: unknown): StatusStatement;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=status-document.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-document.d.ts","sourceRoot":"","sources":["../../src/status-document.ts"],"names":[],"mappings":"AAAA;;;6EAG6E;AAE7E,KAAK,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE/C;;;;;;;;;;;;;;;;8BAgB8B;AAC9B,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,eAAe,CAoBtE"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** Reading a status statement as the status endpoint serves it, before anything
|
|
3
|
+
* verifies it. Shared by the CLI and the /verify page's status button, so the two
|
|
4
|
+
* agree on what counts as a statement: an answer that is not one is silence
|
|
5
|
+
* about revocation, while a statement that is one and fails is a refusal. */
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.unwrapStatusStatement = unwrapStatusStatement;
|
|
8
|
+
/** The API wraps every response in {"data": ...}; a caller may hand over either
|
|
9
|
+
* the envelope or the document inside it. Mirrors
|
|
10
|
+
* core.ParseCertificateStatusDocument, so this CLI and the Go one cannot
|
|
11
|
+
* disagree about which shape the endpoint returns. Exported for testing.
|
|
12
|
+
*
|
|
13
|
+
* A document that does not parse THROWS, and the caller turns that into a
|
|
14
|
+
* warning and a VALID_REVOCATION_UNKNOWN verdict. That is deliberate: an answer
|
|
15
|
+
* this build cannot read is silence about revocation, not a finding about the
|
|
16
|
+
* certificate. Handing a half-read document to the verifier instead would
|
|
17
|
+
* report "status statement signature is invalid" — a claim about the issuer —
|
|
18
|
+
* when what actually happened is that something returned nonsense.
|
|
19
|
+
*
|
|
20
|
+
* `status` itself is NOT validated against a known set. A statement saying
|
|
21
|
+
* SUSPENDED is a statement this build cannot read, and the verifier already has
|
|
22
|
+
* the right answer for that: it authenticates the signature first, then reports
|
|
23
|
+
* VALID_REVOCATION_UNKNOWN. Refusing it here would discard the statement before
|
|
24
|
+
* anyone authenticated it. */
|
|
25
|
+
function unwrapStatusStatement(parsed) {
|
|
26
|
+
if (parsed === null || typeof parsed !== "object") {
|
|
27
|
+
throw new Error("status statement: response is not a JSON object");
|
|
28
|
+
}
|
|
29
|
+
let doc = parsed;
|
|
30
|
+
if (doc.certificate_id === undefined && doc.data !== null && typeof doc.data === "object") {
|
|
31
|
+
doc = doc.data;
|
|
32
|
+
}
|
|
33
|
+
for (const f of ["certificate_id", "status", "key_id"]) {
|
|
34
|
+
if (typeof doc[f] !== "string" || doc[f] === "")
|
|
35
|
+
throw new Error(`status statement: ${f} is missing`);
|
|
36
|
+
}
|
|
37
|
+
for (const f of ["statement_issued_at", "statement_expires_at"])
|
|
38
|
+
requireRfc3339(doc, f);
|
|
39
|
+
if (doc.revoked_at != null)
|
|
40
|
+
requireRfc3339(doc, "revoked_at");
|
|
41
|
+
if (typeof doc.sth_tree_size !== "number")
|
|
42
|
+
throw new Error("status statement: sth_tree_size is not a number");
|
|
43
|
+
// Refuse a short or long value rather than letting it through: a truncated
|
|
44
|
+
// signature or root hash that reaches the verifier is checked against bytes
|
|
45
|
+
// nobody sent.
|
|
46
|
+
requireHex(doc, "sth_root_hash", 32);
|
|
47
|
+
requireHex(doc, "signature", 64);
|
|
48
|
+
return doc;
|
|
49
|
+
}
|
|
50
|
+
function requireRfc3339(doc, field) {
|
|
51
|
+
const v = doc[field];
|
|
52
|
+
if (typeof v !== "string" || Number.isNaN(Date.parse(v))) {
|
|
53
|
+
throw new Error(`status statement: ${field} is not RFC 3339`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function requireHex(doc, field, bytes) {
|
|
57
|
+
const v = doc[field];
|
|
58
|
+
if (typeof v !== "string" || !new RegExp(`^[0-9a-fA-F]{${bytes * 2}}$`).test(v)) {
|
|
59
|
+
throw new Error(`status statement: ${field} is not ${bytes} bytes of hex`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=status-document.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-document.js","sourceRoot":"","sources":["../../src/status-document.ts"],"names":[],"mappings":";AAAA;;;6EAG6E;;;AAI7E;;;;;;;;;;;;;;;;8BAgB8B;AAC9B,+BAAsC,MAAe;IACnD,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,GAAG,GAAG,MAAyB,CAAC;IACpC,IAAI,GAAG,CAAC,cAAc,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC1F,GAAG,GAAG,GAAG,CAAC,IAAuB,CAAC;IACpC,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;QACvD,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACxG,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,sBAAsB,CAAC;QAAE,cAAc,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACxF,IAAI,GAAG,CAAC,UAAU,IAAI,IAAI;QAAE,cAAc,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC9D,IAAI,OAAO,GAAG,CAAC,aAAa,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IAC9G,2EAA2E;IAC3E,4EAA4E;IAC5E,eAAe;IACf,UAAU,CAAC,GAAG,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC;IACrC,UAAU,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;IACjC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,cAAc,CAAC,GAAoB,EAAE,KAAa;IACzD,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,qBAAqB,KAAK,kBAAkB,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,GAAoB,EAAE,KAAa,EAAE,KAAa;IACpE,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,IAAI,MAAM,CAAC,gBAAgB,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,MAAM,IAAI,KAAK,CAAC,qBAAqB,KAAK,WAAW,KAAK,eAAe,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC"}
|
package/dist/cjs/verify.d.ts
CHANGED
|
@@ -28,6 +28,9 @@ import type { TransparencyResult, VerificationResult } from "./models.js";
|
|
|
28
28
|
* script on the page could otherwise push a version onto it.
|
|
29
29
|
*/
|
|
30
30
|
export declare const KNOWN_FORMAT_VERSIONS: readonly string[];
|
|
31
|
+
/** Decode hex: whole bytes, digits in either case, nothing else. Anything else
|
|
32
|
+
* throws TypeError. It is exported, so its input is a boundary: reading a stray
|
|
33
|
+
* character as 0, as it once did, turned a typo into different bytes. */
|
|
31
34
|
export declare function hexToBytes(hex: string): Uint8Array;
|
|
32
35
|
export declare function bytesToHex(bytes: Uint8Array): string;
|
|
33
36
|
/** A signing key's disposition (ADR-017 §1).
|
|
@@ -110,8 +113,90 @@ export declare function evaluateKey(pki: PublicKeyInfo, anchor: number | null):
|
|
|
110
113
|
*/
|
|
111
114
|
export declare function certificateAnchor(certificate: Record<string, unknown>): number | null;
|
|
112
115
|
type Cert = Record<string, unknown>;
|
|
116
|
+
/**
|
|
117
|
+
* Require what ADR-025 lets a record prove: that a key group you name signed the
|
|
118
|
+
* registration the enclave checked each system against before measuring it.
|
|
119
|
+
*
|
|
120
|
+
* A pass means each required system is `certified` under one of
|
|
121
|
+
* `customerKeyIds`, in a record from an enclave image of wire protocol 12 or
|
|
122
|
+
* later — the first that registers a system only with that key group's
|
|
123
|
+
* signatures. A record from an earlier image (PRE_PROTOCOL_12_IMAGES), or one
|
|
124
|
+
* that names no image, fails: those images could say `certified` with no
|
|
125
|
+
* customer signature at all.
|
|
126
|
+
*
|
|
127
|
+
* Off unless asked for, because a record that says `authorization: none` is
|
|
128
|
+
* still a genuine record. Whoever relays requests to the enclave can always
|
|
129
|
+
* leave a registration out (ADR-025 §5, §8), and the enclave cannot refuse that
|
|
130
|
+
* for want of durable state. So "my systems must be certified" can be enforced
|
|
131
|
+
* in one place only: here, by the party relying on the record.
|
|
132
|
+
*/
|
|
133
|
+
export interface AuthorizationPolicy {
|
|
134
|
+
/** The system_ids that must be certified. Omitted: every system the record covers. */
|
|
135
|
+
readonly systems?: readonly string[];
|
|
136
|
+
/**
|
|
137
|
+
* The key groups you accept. Required: `certified` under a key id you did not
|
|
138
|
+
* name proves nothing to you, because the relay can enroll a key group of its
|
|
139
|
+
* own and the record would name that one.
|
|
140
|
+
*/
|
|
141
|
+
readonly customerKeyIds: readonly string[];
|
|
142
|
+
}
|
|
143
|
+
export interface VerifyOptions {
|
|
144
|
+
/**
|
|
145
|
+
* Refuse the record, with a VerificationError whose code is
|
|
146
|
+
* AUTHORIZATION_POLICY_FAILED, unless it meets this policy. Omitted: no
|
|
147
|
+
* requirement, and `authorization: none` verifies as it always has.
|
|
148
|
+
*/
|
|
149
|
+
readonly requireAuthorization?: AuthorizationPolicy;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* The enclave images that issued format 9.0 while running wire protocol 11 or
|
|
153
|
+
* earlier, by PCR0, as the published measurement history records them
|
|
154
|
+
* (website/docs/enclave-measurements/, docs/CONNECTOR-STATUS.md).
|
|
155
|
+
*
|
|
156
|
+
* Their `certified` is not evidence of a customer signature. Before protocol 12
|
|
157
|
+
* the enclave enrolled a key group with no proof that anyone held its keys, and
|
|
158
|
+
* registered a system for whoever relayed the authorization — so the host could
|
|
159
|
+
* make a genuine 9.0 record say `certified`, under a key id it chose, with no
|
|
160
|
+
* customer signature anywhere (reproduced by an independent re-review,
|
|
161
|
+
* 2026-09-13).
|
|
162
|
+
*
|
|
163
|
+
* THE SET IS CLOSED BY POLICY, NOT BY ENFORCEMENT: the release runbook forbids
|
|
164
|
+
* admitting or rolling back to an image of protocol 11 or earlier once any
|
|
165
|
+
* customer key is enrolled, and admitting one takes a KMS re-pin, which ADR-027
|
|
166
|
+
* leaves to the owner. The protocol-12 cutover's KMS tighten drops every
|
|
167
|
+
* measurement here from the signing key's policy, after which none of them can
|
|
168
|
+
* sign. v42 ran for seven minutes and is recorded as issuing nothing; it is here
|
|
169
|
+
* because it held the signing key while it ran.
|
|
170
|
+
*
|
|
171
|
+
* The Python SDK carries the same list, in _verify.py.
|
|
172
|
+
*/
|
|
173
|
+
export declare const PRE_PROTOCOL_12_IMAGES: ReadonlyMap<string, string>;
|
|
174
|
+
/**
|
|
175
|
+
* What a record's signed issuer.enclave_pcr0 makes of `certified`: whether the
|
|
176
|
+
* image that signed it could mark a system certified without the customer's
|
|
177
|
+
* signature. "protocol-12-or-later" is the inference the closed list licenses:
|
|
178
|
+
* a genuine 9.0 record under any other measurement was signed by a later image.
|
|
179
|
+
*/
|
|
180
|
+
export type IssuingImage = {
|
|
181
|
+
readonly kind: "unnamed";
|
|
182
|
+
} | {
|
|
183
|
+
readonly kind: "before-protocol-12";
|
|
184
|
+
readonly name: string;
|
|
185
|
+
readonly pcr0: string;
|
|
186
|
+
} | {
|
|
187
|
+
readonly kind: "protocol-12-or-later";
|
|
188
|
+
readonly pcr0: string;
|
|
189
|
+
};
|
|
190
|
+
export declare function issuingImage(certificate: Cert): IssuingImage;
|
|
191
|
+
/**
|
|
192
|
+
* What `certified` is evidence of, given the image that signed the record: the
|
|
193
|
+
* words every verifier prints after "certified under <key id> —". The Go CLI
|
|
194
|
+
* (cmd/cli/registration_image.go), both SDK CLIs and the /verify page state it
|
|
195
|
+
* identically, and testdata/registration_line_cases.json holds them to it.
|
|
196
|
+
*/
|
|
197
|
+
export declare function registrationQualifier(image: IssuingImage): string;
|
|
113
198
|
/** Verify all signatures on a deletion certificate offline. */
|
|
114
|
-
export declare function verifyCertificate(crypto: CryptoOps, certificate: Cert, publicKeys: Map<string, PublicKeyInfo
|
|
199
|
+
export declare function verifyCertificate(crypto: CryptoOps, certificate: Cert, publicKeys: Map<string, PublicKeyInfo>, options?: VerifyOptions): Promise<VerificationResult>;
|
|
115
200
|
/** Verify the transparency proof embedded in a certificate. */
|
|
116
201
|
export declare function verifyTransparency(crypto: CryptoOps, certificate: Cert, publicKeys: Map<string, PublicKeyInfo>): Promise<TransparencyResult>;
|
|
117
202
|
/** Reconstruct the certificate JSON as it existed at issuance time.
|
|
@@ -149,8 +234,11 @@ export declare function canonicalJson(obj: unknown): Uint8Array;
|
|
|
149
234
|
* Exported from this module so the timestamp_vectors.json suite can diff it
|
|
150
235
|
* against Go directly. It is deliberately not re-exported from index.ts, so it
|
|
151
236
|
* is not part of the published package surface.
|
|
237
|
+
*
|
|
238
|
+
* `field` names the value in a refusal. It defaults to the word these messages
|
|
239
|
+
* always used, for callers normalizing a time that is not a field of a document.
|
|
152
240
|
*/
|
|
153
|
-
export declare function formatTimestamp(ts: unknown): string;
|
|
241
|
+
export declare function formatTimestamp(ts: unknown, field?: string): string;
|
|
154
242
|
/**
|
|
155
243
|
* Port of Go's BuildTreeHeadPayload.
|
|
156
244
|
*
|
|
@@ -211,7 +299,24 @@ export declare const VALID_REVOCATION_UNKNOWN = "VALID_REVOCATION_UNKNOWN";
|
|
|
211
299
|
*
|
|
212
300
|
* The third row is the point: `verifyCertificate` answers VALID there, which
|
|
213
301
|
* reads as "not revoked" and is not something it checked.
|
|
302
|
+
*
|
|
303
|
+
* `options` is passed to {@link verifyCertificate} unchanged.
|
|
304
|
+
*/
|
|
305
|
+
export declare function verifyCertificateWithStatus(crypto: CryptoOps, certificate: Cert, publicKeys: Map<string, PublicKeyInfo>, status?: Record<string, unknown> | null, now?: Date, options?: VerifyOptions): Promise<string>;
|
|
306
|
+
/**
|
|
307
|
+
* The statement half of {@link verifyCertificateWithStatus}: authenticate a
|
|
308
|
+
* status statement about `certificateId` against the published keys, and read
|
|
309
|
+
* it at `now`. The /verify page's QR lookup has a record id and no record, and
|
|
310
|
+
* uses this so it shows what a signed, fresh statement says, never what the
|
|
311
|
+
* status endpoint claims.
|
|
312
|
+
*
|
|
313
|
+
* | input | result |
|
|
314
|
+
* |---|---|
|
|
315
|
+
* | fresh, REVOKED | throws VerificationError, code CERTIFICATE_REVOKED |
|
|
316
|
+
* | fresh, ACTIVE | the statement key's verdict: `"VALID"`, or a soft one |
|
|
317
|
+
* | stale, or a status this SDK does not know | `"VALID_REVOCATION_UNKNOWN"` |
|
|
318
|
+
* | unknown or unusable key, bad signature, another certificate | throws VerificationError |
|
|
214
319
|
*/
|
|
215
|
-
export declare function
|
|
320
|
+
export declare function verifyStatusStatement(crypto: CryptoOps, status: Record<string, unknown>, publicKeys: Map<string, PublicKeyInfo>, certificateId: unknown, now?: Date): Promise<string>;
|
|
216
321
|
export {};
|
|
217
322
|
//# sourceMappingURL=verify.d.ts.map
|
package/dist/cjs/verify.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/verify.ts"],"names":[],"mappings":"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"}
|