burnledger 0.4.0 → 0.6.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/README.md +11 -4
- package/dist/cjs/anchor.d.ts +71 -0
- package/dist/cjs/anchor.d.ts.map +1 -0
- package/dist/cjs/anchor.js +279 -0
- package/dist/cjs/anchor.js.map +1 -0
- package/dist/cjs/client.d.ts +26 -2
- package/dist/cjs/client.d.ts.map +1 -1
- package/dist/cjs/client.js +27 -5
- package/dist/cjs/client.js.map +1 -1
- package/dist/cjs/enclave-seal.d.ts +101 -0
- package/dist/cjs/enclave-seal.d.ts.map +1 -0
- package/dist/cjs/enclave-seal.js +479 -0
- package/dist/cjs/enclave-seal.js.map +1 -0
- package/dist/cjs/errors.d.ts +42 -1
- package/dist/cjs/errors.d.ts.map +1 -1
- package/dist/cjs/errors.js +44 -2
- package/dist/cjs/errors.js.map +1 -1
- package/dist/cjs/http.d.ts +21 -1
- package/dist/cjs/http.d.ts.map +1 -1
- package/dist/cjs/http.js +76 -12
- package/dist/cjs/http.js.map +1 -1
- package/dist/cjs/index.browser.d.ts +2 -4
- package/dist/cjs/index.browser.d.ts.map +1 -1
- package/dist/cjs/index.browser.js.map +1 -1
- package/dist/cjs/index.d.ts +16 -11
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +20 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/keys.d.ts +66 -0
- package/dist/cjs/keys.d.ts.map +1 -1
- package/dist/cjs/keys.js +128 -3
- package/dist/cjs/keys.js.map +1 -1
- package/dist/cjs/models.d.ts +41 -3
- package/dist/cjs/models.d.ts.map +1 -1
- package/dist/cjs/models.js +25 -4
- package/dist/cjs/models.js.map +1 -1
- package/dist/cjs/verify.d.ts +72 -6
- package/dist/cjs/verify.d.ts.map +1 -1
- package/dist/cjs/verify.js +392 -62
- package/dist/cjs/verify.js.map +1 -1
- package/dist/cjs/web-verifier.d.ts +54 -5
- package/dist/cjs/web-verifier.d.ts.map +1 -1
- package/dist/cjs/web-verifier.js +36 -3
- package/dist/cjs/web-verifier.js.map +1 -1
- package/dist/esm/anchor.d.ts +71 -0
- package/dist/esm/anchor.d.ts.map +1 -0
- package/dist/esm/anchor.js +275 -0
- package/dist/esm/anchor.js.map +1 -0
- package/dist/esm/cli.d.ts +45 -14
- package/dist/esm/cli.d.ts.map +1 -1
- package/dist/esm/cli.js +357 -50
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/client.d.ts +26 -2
- package/dist/esm/client.d.ts.map +1 -1
- package/dist/esm/client.js +27 -5
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/enclave-seal.d.ts +101 -0
- package/dist/esm/enclave-seal.d.ts.map +1 -0
- package/dist/esm/enclave-seal.js +472 -0
- package/dist/esm/enclave-seal.js.map +1 -0
- package/dist/esm/errors.d.ts +42 -1
- package/dist/esm/errors.d.ts.map +1 -1
- package/dist/esm/errors.js +43 -1
- package/dist/esm/errors.js.map +1 -1
- package/dist/esm/http.d.ts +21 -1
- package/dist/esm/http.d.ts.map +1 -1
- package/dist/esm/http.js +75 -12
- package/dist/esm/http.js.map +1 -1
- package/dist/esm/index.browser.d.ts +2 -4
- package/dist/esm/index.browser.d.ts.map +1 -1
- package/dist/esm/index.browser.js.map +1 -1
- package/dist/esm/index.d.ts +16 -11
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +11 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/keys.d.ts +66 -0
- package/dist/esm/keys.d.ts.map +1 -1
- package/dist/esm/keys.js +125 -3
- package/dist/esm/keys.js.map +1 -1
- package/dist/esm/models.d.ts +41 -3
- package/dist/esm/models.d.ts.map +1 -1
- package/dist/esm/models.js +24 -4
- package/dist/esm/models.js.map +1 -1
- package/dist/esm/verify.d.ts +72 -6
- package/dist/esm/verify.d.ts.map +1 -1
- package/dist/esm/verify.js +390 -63
- package/dist/esm/verify.js.map +1 -1
- package/dist/esm/web-verifier.d.ts +54 -5
- package/dist/esm/web-verifier.d.ts.map +1 -1
- package/dist/esm/web-verifier.js +40 -3
- package/dist/esm/web-verifier.js.map +1 -1
- package/package.json +1 -1
- package/src/anchor.ts +330 -0
- package/src/cli.ts +389 -54
- package/src/client.ts +46 -4
- package/src/enclave-seal.ts +582 -0
- package/src/errors.ts +47 -2
- package/src/http.ts +79 -12
- package/src/index.browser.ts +2 -2
- package/src/index.ts +28 -9
- package/src/keys.ts +176 -3
- package/src/models.ts +72 -7
- package/src/verify.ts +467 -72
- package/src/web-verifier.ts +58 -5
package/dist/esm/http.d.ts
CHANGED
|
@@ -1,19 +1,32 @@
|
|
|
1
1
|
/** HTTP transport layer wrapping native fetch.
|
|
2
2
|
*
|
|
3
3
|
* Handles: Bearer auth, response envelope unwrapping, retry on 5xx/transport
|
|
4
|
-
* errors
|
|
4
|
+
* errors and on 429, and raw byte streaming for PDFs.
|
|
5
|
+
*
|
|
6
|
+
* Retry delay: a `Retry-After` header (delta-seconds or HTTP-date) is honoured
|
|
7
|
+
* when the server sends one and it is at most `MAX_RETRY_AFTER`; otherwise
|
|
8
|
+
* exponential backoff with jitter. A 429 with no usable `Retry-After`, one
|
|
9
|
+
* beyond the cap, or one on the last attempt throws `RateLimitError` with
|
|
10
|
+
* `retryAfter` populated so the caller can decide.
|
|
5
11
|
*/
|
|
12
|
+
/** Longest Retry-After, in seconds, the transport will wait on before
|
|
13
|
+
* throwing instead: a server asking for minutes gets the error and the
|
|
14
|
+
* number rather than a promise nobody can cancel. */
|
|
15
|
+
export declare const MAX_RETRY_AFTER = 30;
|
|
6
16
|
export interface TransportOptions {
|
|
7
17
|
baseUrl: string;
|
|
8
18
|
apiKey: string;
|
|
9
19
|
timeout: number;
|
|
10
20
|
maxRetries: number;
|
|
21
|
+
/** Team to act as. Omit to let the API use the caller's default team. */
|
|
22
|
+
teamId?: string;
|
|
11
23
|
}
|
|
12
24
|
export declare class Transport {
|
|
13
25
|
private readonly baseUrl;
|
|
14
26
|
private readonly apiKey;
|
|
15
27
|
private readonly timeout;
|
|
16
28
|
private readonly maxRetries;
|
|
29
|
+
private readonly teamId?;
|
|
17
30
|
constructor(opts: TransportOptions);
|
|
18
31
|
/** Make a request and return the unwrapped `data` field. */
|
|
19
32
|
request(method: string, path: string, opts?: {
|
|
@@ -32,4 +45,11 @@ export declare class Transport {
|
|
|
32
45
|
authenticated?: boolean;
|
|
33
46
|
}): Promise<Uint8Array>;
|
|
34
47
|
}
|
|
48
|
+
/** Seconds to wait per the Retry-After header (RFC 9110 §10.2.3).
|
|
49
|
+
*
|
|
50
|
+
* Accepts both forms the header allows: non-negative delta-seconds and an
|
|
51
|
+
* HTTP-date, converted to seconds from now (a date already past reads as 0).
|
|
52
|
+
* Anything else is treated as absent.
|
|
53
|
+
*/
|
|
54
|
+
export declare function parseRetryAfter(resp: Response): number | undefined;
|
|
35
55
|
//# sourceMappingURL=http.d.ts.map
|
package/dist/esm/http.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH;;qDAEqD;AACrD,eAAO,MAAM,eAAe,KAAK,CAAC;AAElC,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAKpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;IAEjC,YAAY,IAAI,EAAE,gBAAgB,EAMjC;IAED,4DAA4D;IACtD,OAAO,CACX,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;QACL,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;QACzC,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,GACA,OAAO,CAAC,OAAO,CAAC,CAGlB;IAED,6EAA6E;IACvE,UAAU,CACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;QACL,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;QACzC,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,GACA,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA0GlC;IAED,+DAA+D;IACzD,YAAY,CAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,GACjC,OAAO,CAAC,UAAU,CAAC,CA6BrB;CACF;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAYlE"}
|
package/dist/esm/http.js
CHANGED
|
@@ -1,19 +1,35 @@
|
|
|
1
1
|
/** HTTP transport layer wrapping native fetch.
|
|
2
2
|
*
|
|
3
3
|
* Handles: Bearer auth, response envelope unwrapping, retry on 5xx/transport
|
|
4
|
-
* errors
|
|
4
|
+
* errors and on 429, and raw byte streaming for PDFs.
|
|
5
|
+
*
|
|
6
|
+
* Retry delay: a `Retry-After` header (delta-seconds or HTTP-date) is honoured
|
|
7
|
+
* when the server sends one and it is at most `MAX_RETRY_AFTER`; otherwise
|
|
8
|
+
* exponential backoff with jitter. A 429 with no usable `Retry-After`, one
|
|
9
|
+
* beyond the cap, or one on the last attempt throws `RateLimitError` with
|
|
10
|
+
* `retryAfter` populated so the caller can decide.
|
|
5
11
|
*/
|
|
6
12
|
import { raiseForError } from "./errors.js";
|
|
13
|
+
/** Longest Retry-After, in seconds, the transport will wait on before
|
|
14
|
+
* throwing instead: a server asking for minutes gets the error and the
|
|
15
|
+
* number rather than a promise nobody can cancel. */
|
|
16
|
+
export const MAX_RETRY_AFTER = 30;
|
|
7
17
|
export class Transport {
|
|
8
18
|
baseUrl;
|
|
9
19
|
apiKey;
|
|
10
20
|
timeout;
|
|
11
21
|
maxRetries;
|
|
22
|
+
// Which team the caller is acting as. The API resolves scope from this
|
|
23
|
+
// header and otherwise falls back to the caller's default team, so a member
|
|
24
|
+
// of more than one team who does not send it silently acts as whichever they
|
|
25
|
+
// joined first.
|
|
26
|
+
teamId;
|
|
12
27
|
constructor(opts) {
|
|
13
28
|
this.baseUrl = opts.baseUrl.replace(/\/+$/, "");
|
|
14
29
|
this.apiKey = opts.apiKey;
|
|
15
30
|
this.timeout = opts.timeout;
|
|
16
31
|
this.maxRetries = opts.maxRetries;
|
|
32
|
+
this.teamId = opts.teamId;
|
|
17
33
|
}
|
|
18
34
|
/** Make a request and return the unwrapped `data` field. */
|
|
19
35
|
async request(method, path, opts) {
|
|
@@ -28,6 +44,12 @@ export class Transport {
|
|
|
28
44
|
};
|
|
29
45
|
if (authenticated) {
|
|
30
46
|
headers["Authorization"] = `Bearer ${this.apiKey}`;
|
|
47
|
+
// Alongside the key, never without it: the header names the scope the
|
|
48
|
+
// caller is acting in, which is meaningless for an unauthenticated
|
|
49
|
+
// request and is not a second credential.
|
|
50
|
+
if (this.teamId) {
|
|
51
|
+
headers["X-Team-ID"] = this.teamId;
|
|
52
|
+
}
|
|
31
53
|
}
|
|
32
54
|
let url = `${this.baseUrl}${path}`;
|
|
33
55
|
if (opts?.params) {
|
|
@@ -48,13 +70,13 @@ export class Transport {
|
|
|
48
70
|
headers["Idempotency-Key"] = randomIdempotencyKey();
|
|
49
71
|
}
|
|
50
72
|
let lastError;
|
|
73
|
+
// Delay before the next attempt when the server named one; undefined
|
|
74
|
+
// means fall back to backoff.
|
|
75
|
+
let retryAfter;
|
|
51
76
|
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
52
77
|
if (attempt > 0) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
const base = 500 * 2 ** (attempt - 1);
|
|
56
|
-
const jitter = base * 0.25 * (Math.random() * 2 - 1);
|
|
57
|
-
await sleep(base + jitter);
|
|
78
|
+
await sleep(retryDelayMs(attempt, retryAfter));
|
|
79
|
+
retryAfter = undefined;
|
|
58
80
|
}
|
|
59
81
|
const controller = new AbortController();
|
|
60
82
|
const timer = setTimeout(() => controller.abort(), this.timeout * 1000);
|
|
@@ -78,8 +100,17 @@ export class Transport {
|
|
|
78
100
|
if (resp.status === 204) {
|
|
79
101
|
return {};
|
|
80
102
|
}
|
|
103
|
+
retryAfter = parseRetryAfter(resp);
|
|
81
104
|
if (resp.status === 429) {
|
|
82
|
-
|
|
105
|
+
// Only on the server's say-so: without Retry-After there is no delay
|
|
106
|
+
// known to be enough, and beyond the cap the caller gets the number
|
|
107
|
+
// (RateLimitError.retryAfter) rather than a hung promise.
|
|
108
|
+
if (retryAfter !== undefined &&
|
|
109
|
+
retryAfter <= MAX_RETRY_AFTER &&
|
|
110
|
+
attempt < this.maxRetries) {
|
|
111
|
+
lastError = new Error(`Server error ${resp.status}`);
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
83
114
|
const errorBody = await safeJson(resp);
|
|
84
115
|
raiseForError(resp.status, errorBody, retryAfter);
|
|
85
116
|
}
|
|
@@ -101,6 +132,11 @@ export class Transport {
|
|
|
101
132
|
const headers = {};
|
|
102
133
|
if (authenticated) {
|
|
103
134
|
headers["Authorization"] = `Bearer ${this.apiKey}`;
|
|
135
|
+
// A downloaded certificate is as team-scoped as the JSON one; omitting
|
|
136
|
+
// the header here would hand a member their default team's PDF.
|
|
137
|
+
if (this.teamId) {
|
|
138
|
+
headers["X-Team-ID"] = this.teamId;
|
|
139
|
+
}
|
|
104
140
|
}
|
|
105
141
|
const url = `${this.baseUrl}${path}`;
|
|
106
142
|
const controller = new AbortController();
|
|
@@ -119,12 +155,39 @@ export class Transport {
|
|
|
119
155
|
return new Uint8Array(await resp.arrayBuffer());
|
|
120
156
|
}
|
|
121
157
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
158
|
+
/** Seconds to wait per the Retry-After header (RFC 9110 §10.2.3).
|
|
159
|
+
*
|
|
160
|
+
* Accepts both forms the header allows: non-negative delta-seconds and an
|
|
161
|
+
* HTTP-date, converted to seconds from now (a date already past reads as 0).
|
|
162
|
+
* Anything else is treated as absent.
|
|
163
|
+
*/
|
|
164
|
+
export function parseRetryAfter(resp) {
|
|
165
|
+
const raw = resp.headers.get("Retry-After")?.trim();
|
|
166
|
+
if (!raw)
|
|
125
167
|
return undefined;
|
|
126
|
-
|
|
127
|
-
|
|
168
|
+
if (/^\d+(\.\d+)?$/.test(raw)) {
|
|
169
|
+
return Number(raw);
|
|
170
|
+
}
|
|
171
|
+
// Every HTTP-date form (IMF-fixdate, RFC 850, asctime) opens with a weekday
|
|
172
|
+
// name; Date.parse alone would also read "-3" or "2099" as a year.
|
|
173
|
+
if (!/^[A-Za-z]{3}/.test(raw))
|
|
174
|
+
return undefined;
|
|
175
|
+
const when = Date.parse(raw);
|
|
176
|
+
if (Number.isNaN(when))
|
|
177
|
+
return undefined;
|
|
178
|
+
return Math.max(0, (when - Date.now()) / 1000);
|
|
179
|
+
}
|
|
180
|
+
/** Milliseconds to sleep before retry `attempt` (1-based). A server-supplied
|
|
181
|
+
* delay within the cap wins; otherwise exponential backoff with ±25% jitter so
|
|
182
|
+
* coordinated 5xx events don't produce a synchronized retry storm from every
|
|
183
|
+
* client at the same instant. */
|
|
184
|
+
function retryDelayMs(attempt, retryAfter) {
|
|
185
|
+
if (retryAfter !== undefined && retryAfter <= MAX_RETRY_AFTER) {
|
|
186
|
+
return retryAfter * 1000;
|
|
187
|
+
}
|
|
188
|
+
const base = Math.min(500 * 2 ** (attempt - 1), MAX_RETRY_AFTER * 1000);
|
|
189
|
+
const jitter = base * 0.25 * (Math.random() * 2 - 1);
|
|
190
|
+
return base + jitter;
|
|
128
191
|
}
|
|
129
192
|
async function safeJson(resp) {
|
|
130
193
|
// Read once. resp.json() consumes the stream on failure too — calling
|
package/dist/esm/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C;;qDAEqD;AACrD,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAWlC,MAAM,OAAO,SAAS;IACH,OAAO,CAAS;IAChB,MAAM,CAAS;IACf,OAAO,CAAS;IAChB,UAAU,CAAS;IACpC,uEAAuE;IACvE,4EAA4E;IAC5E,6EAA6E;IAC7E,gBAAgB;IACC,MAAM,CAAU;IAEjC,YAAY,IAAsB;QAChC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,4DAA4D;IAC5D,KAAK,CAAC,OAAO,CACX,MAAc,EACd,IAAY,EACZ,IAIC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC3D,OAAQ,QAAoC,CAAC,IAAI,CAAC;IACpD,CAAC;IAED,6EAA6E;IAC7E,KAAK,CAAC,UAAU,CACd,MAAc,EACd,IAAY,EACZ,IAIC;QAED,MAAM,aAAa,GAAG,IAAI,EAAE,aAAa,IAAI,IAAI,CAAC;QAClD,MAAM,OAAO,GAA2B;YACtC,MAAM,EAAE,kBAAkB;SAC3B,CAAC;QACF,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;YACnD,sEAAsE;YACtE,mEAAmE;YACnE,0CAA0C;YAC1C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;YACrC,CAAC;QACH,CAAC;QAED,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QACnC,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC;YACjB,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC;YACjC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjD,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,CAAC;YACD,GAAG,IAAI,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;QAC7B,CAAC;QAED,MAAM,IAAI,GACR,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACnE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;QAC/C,CAAC;QACD,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;YACpC,yEAAyE;YACzE,yEAAyE;YACzE,sBAAsB;YACtB,OAAO,CAAC,iBAAiB,CAAC,GAAG,oBAAoB,EAAE,CAAC;QACtD,CAAC;QAED,IAAI,SAA4B,CAAC;QACjC,qEAAqE;QACrE,8BAA8B;QAC9B,IAAI,UAA8B,CAAC;QAEnC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YAC5D,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,MAAM,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;gBAC/C,UAAU,GAAG,SAAS,CAAC;YACzB,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,UAAU,CACtB,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EACxB,IAAI,CAAC,OAAO,GAAG,IAAI,CACpB,CAAC;YAEF,IAAI,IAAc,CAAC;YACnB,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;oBACtB,MAAM;oBACN,OAAO;oBACP,IAAI;oBACJ,MAAM,EAAE,UAAU,CAAC,MAAM;iBAC1B,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,SAAS,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBAChE,SAAS;YACX,CAAC;oBAAS,CAAC;gBACT,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACxB,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACxB,qEAAqE;gBACrE,oEAAoE;gBACpE,0DAA0D;gBAC1D,IACE,UAAU,KAAK,SAAS;oBACxB,UAAU,IAAI,eAAe;oBAC7B,OAAO,GAAG,IAAI,CAAC,UAAU,EACzB,CAAC;oBACD,SAAS,GAAG,IAAI,KAAK,CAAC,gBAAgB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;oBACrD,SAAS;gBACX,CAAC;gBACD,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACvC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;YACpD,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpD,SAAS,GAAG,IAAI,KAAK,CAAC,gBAAgB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;gBACrD,SAAS;YACX,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;gBACvB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACvC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YACxC,CAAC;YAED,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAA4B,CAAC;QACxD,CAAC;QAED,MAAM,IAAI,KAAK,CACb,wBAAwB,IAAI,CAAC,UAAU,GAAG,CAAC,cAAc,SAAS,EAAE,OAAO,EAAE,CAC9E,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,KAAK,CAAC,YAAY,CAChB,MAAc,EACd,IAAY,EACZ,IAAkC;QAElC,MAAM,aAAa,GAAG,IAAI,EAAE,aAAa,IAAI,IAAI,CAAC;QAClD,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;YACnD,uEAAuE;YACvE,gEAAgE;YAChE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;YACrC,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QAExE,IAAI,IAAc,CAAC;QACnB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1E,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YACvB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;YACvC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACxC,CAAC;QAED,OAAO,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAClD,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAAc;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,CAAC;IACpD,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IACD,4EAA4E;IAC5E,mEAAmE;IACnE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACzC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;AACjD,CAAC;AAED;;;iCAGiC;AACjC,SAAS,YAAY,CAAC,OAAe,EAAE,UAA8B;IACnE,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,IAAI,eAAe,EAAE,CAAC;QAC9D,OAAO,UAAU,GAAG,IAAI,CAAC;IAC3B,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,OAAO,IAAI,GAAG,MAAM,CAAC;AACvB,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAc;IACpC,sEAAsE;IACtE,qEAAqE;IACrE,6BAA6B;IAC7B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;SAC1D,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,4EAA4E;AAC5E,uEAAuE;AACvE,SAAS,oBAAoB;IAC3B,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAC7B,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,YAAY;IAC1C,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,aAAa;IAC3C,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzE,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;AACnG,CAAC"}
|
|
@@ -16,7 +16,7 @@ export { Paginator } from "./pagination.js";
|
|
|
16
16
|
export type { CryptoOps } from "./crypto.js";
|
|
17
17
|
export type { PublicKeyInfo } from "./verify.js";
|
|
18
18
|
export { issuanceBytes, hexToBytes, bytesToHex } from "./verify.js";
|
|
19
|
-
import type { PublicKeyInfo } from "./verify.js";
|
|
19
|
+
import type { PublicKeyInfo, PublicKeyOptions } from "./verify.js";
|
|
20
20
|
import type { VerificationResult, TransparencyResult } from "./models.js";
|
|
21
21
|
type Cert = Record<string, unknown>;
|
|
22
22
|
/** Verify all signatures on a deletion certificate offline. */
|
|
@@ -24,9 +24,7 @@ export declare function verifyCertificate(certificate: Cert, publicKeys: Map<str
|
|
|
24
24
|
/** Verify the transparency proof embedded in a certificate. */
|
|
25
25
|
export declare function verifyTransparency(certificate: Cert, publicKeys: Map<string, PublicKeyInfo>): Promise<TransparencyResult>;
|
|
26
26
|
/** Construct a PublicKeyInfo from a hex-encoded Ed25519 public key. */
|
|
27
|
-
export declare function publicKeyFromHex(hexKey: string, opts?:
|
|
28
|
-
revoked?: boolean;
|
|
29
|
-
}): Promise<PublicKeyInfo>;
|
|
27
|
+
export declare function publicKeyFromHex(hexKey: string, opts?: PublicKeyOptions): Promise<PublicKeyInfo>;
|
|
30
28
|
/** Verify a Merkle consistency proof between two tree states (RFC 6962). */
|
|
31
29
|
export declare function verifyConsistency(oldSize: number, newSize: number, oldRoot: Uint8Array, newRoot: Uint8Array, proof: Uint8Array[]): Promise<boolean>;
|
|
32
30
|
//# sourceMappingURL=index.browser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.browser.d.ts","sourceRoot":"","sources":["../../src/index.browser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EACL,eAAe,EACf,QAAQ,EACR,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,eAAe,EACf,cAAc,EACd,WAAW,EACX,YAAY,EACZ,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAElD,YAAY,EACV,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,SAAS,EACT,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,MAAM,EACN,iBAAiB,EACjB,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,OAAO,EACP,cAAc,EACd,QAAQ,EACR,cAAc,EACd,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAIrB,OAAO,EAAE,WAAW,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAElF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AASpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.browser.d.ts","sourceRoot":"","sources":["../../src/index.browser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EACL,eAAe,EACf,QAAQ,EACR,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,eAAe,EACf,cAAc,EACd,WAAW,EACX,YAAY,EACZ,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAElD,YAAY,EACV,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,SAAS,EACT,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,MAAM,EACN,iBAAiB,EACjB,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,OAAO,EACP,cAAc,EACd,QAAQ,EACR,cAAc,EACd,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAIrB,OAAO,EAAE,WAAW,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAElF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AASpE,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE1E,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEpC,+DAA+D;AAC/D,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,IAAI,EACjB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GACrC,OAAO,CAAC,kBAAkB,CAAC,CAE7B;AAED,+DAA+D;AAC/D,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,IAAI,EACjB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GACrC,OAAO,CAAC,kBAAkB,CAAC,CAE7B;AAED,uEAAuE;AACvE,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,gBAAgB,GACtB,OAAO,CAAC,aAAa,CAAC,CAExB;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,UAAU,EACnB,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,UAAU,EAAE,GAClB,OAAO,CAAC,OAAO,CAAC,CAElB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.browser.js","sourceRoot":"","sources":["../../src/index.browser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EACL,eAAe,EACf,QAAQ,EACR,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,eAAe,EACf,cAAc,EACd,WAAW,EACX,YAAY,EACZ,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AA8BtC,2EAA2E;AAC3E,0EAA0E;AAC1E,OAAO,EAAE,WAAW,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAElF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEpE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,iBAAiB,IAAI,kBAAkB,EACvC,kBAAkB,IAAI,mBAAmB,EACzC,iBAAiB,IAAI,kBAAkB,EACvC,gBAAgB,IAAI,iBAAiB,GACtC,MAAM,aAAa,CAAC;AAMrB,+DAA+D;AAC/D,MAAM,UAAU,iBAAiB,CAC/B,WAAiB,EACjB,UAAsC;IAEtC,OAAO,kBAAkB,CAAC,aAAa,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;AACpE,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,kBAAkB,CAChC,WAAiB,EACjB,UAAsC;IAEtC,OAAO,mBAAmB,CAAC,aAAa,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;AACrE,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,gBAAgB,CAC9B,MAAc,EACd,
|
|
1
|
+
{"version":3,"file":"index.browser.js","sourceRoot":"","sources":["../../src/index.browser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EACL,eAAe,EACf,QAAQ,EACR,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,eAAe,EACf,cAAc,EACd,WAAW,EACX,YAAY,EACZ,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AA8BtC,2EAA2E;AAC3E,0EAA0E;AAC1E,OAAO,EAAE,WAAW,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAElF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEpE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,iBAAiB,IAAI,kBAAkB,EACvC,kBAAkB,IAAI,mBAAmB,EACzC,iBAAiB,IAAI,kBAAkB,EACvC,gBAAgB,IAAI,iBAAiB,GACtC,MAAM,aAAa,CAAC;AAMrB,+DAA+D;AAC/D,MAAM,UAAU,iBAAiB,CAC/B,WAAiB,EACjB,UAAsC;IAEtC,OAAO,kBAAkB,CAAC,aAAa,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;AACpE,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,kBAAkB,CAChC,WAAiB,EACjB,UAAsC;IAEtC,OAAO,mBAAmB,CAAC,aAAa,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;AACrE,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,gBAAgB,CAC9B,MAAc,EACd,IAAuB;IAEvB,OAAO,iBAAiB,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AACxD,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,OAAe,EACf,OAAmB,EACnB,OAAmB,EACnB,KAAmB;IAEnB,OAAO,kBAAkB,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AACtF,CAAC"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
/** BurnLedger TypeScript SDK — public API (Node.js entry point). */
|
|
2
|
-
export { BurnLedger } from "./client.js";
|
|
2
|
+
export { BurnLedger, MAX_BATCH_REVOKE } from "./client.js";
|
|
3
3
|
export type { BurnLedgerOptions } from "./client.js";
|
|
4
|
-
export { BurnLedgerError, ApiError, AuthenticationError, NotFoundError, ConflictError, ValidationError, RateLimitError, ServerError, TimeoutError, VerificationError, } from "./errors.js";
|
|
4
|
+
export { BurnLedgerError, ApiError, AuthenticationError, NotFoundError, ConflictError, ValidationError, RateLimitError, ServerError, TimeoutError, VerificationError, CERTIFICATE_REVOKED, UNSUPPORTED_FORMAT_VERSION, } from "./errors.js";
|
|
5
5
|
export { Transport } from "./http.js";
|
|
6
6
|
export type { TransportOptions } from "./http.js";
|
|
7
|
-
export type {
|
|
7
|
+
export type { PublicKeyOptions } from "./verify.js";
|
|
8
|
+
export type { ProofMode, AttestationStatus, CertificateStatus, TransparencyStatus, HealthStatus, TransportSecurity, ReadOnlyEnforcement, ConnectorType, HashScope, LogEntryType, VerificationResult, TransparencyResult, ApiKeyRole, System, SystemAttestation, Attestation, VerificationSystem, VerifyResult, CertificateResponse, RevocationStatus, Webhook, SignedTreeHead, LogEntry, InclusionProof, ConsistencyProof, BatchAttestationResponse, BatchAttestationError, BatchRevokeResponse, BatchRevokeError, MonthlyCount, CertificateStats, WebhookRotateResponse, WebhookDelivery, ApiKeyListItem, ApiKeyResponse, PlanUsage, Profile, SystemHealth, } from "./models.js";
|
|
8
9
|
export { parseSystem, parseCertificateResponse, parseWebhook } from "./models.js";
|
|
9
10
|
export { Paginator } from "./pagination.js";
|
|
10
11
|
export type { CryptoOps } from "./crypto.js";
|
|
11
12
|
export type { PublicKeyInfo } from "./verify.js";
|
|
12
13
|
export { issuanceBytes, hexToBytes, bytesToHex } from "./verify.js";
|
|
13
|
-
import type { PublicKeyInfo } from "./verify.js";
|
|
14
|
+
import type { PublicKeyInfo, PublicKeyOptions } from "./verify.js";
|
|
14
15
|
import type { VerificationResult, TransparencyResult } from "./models.js";
|
|
15
16
|
type Cert = Record<string, unknown>;
|
|
16
17
|
/** Verify all signatures on a deletion certificate offline. */
|
|
@@ -33,14 +34,18 @@ export declare function verifyTransparency(certificate: Cert, publicKeys: Map<st
|
|
|
33
34
|
* all, and every key they built looked unconditionally active. Widening only;
|
|
34
35
|
* `revoked` still works and still means "unusable".
|
|
35
36
|
*/
|
|
36
|
-
export declare function publicKeyFromHex(hexKey: string, opts?:
|
|
37
|
-
revoked?: boolean;
|
|
38
|
-
keyStatus?: string;
|
|
39
|
-
notBefore?: string;
|
|
40
|
-
notAfter?: string;
|
|
41
|
-
compromisedFrom?: string;
|
|
42
|
-
}): Promise<PublicKeyInfo>;
|
|
37
|
+
export declare function publicKeyFromHex(hexKey: string, opts?: PublicKeyOptions): Promise<PublicKeyInfo>;
|
|
43
38
|
/** Verify a Merkle consistency proof between two tree states (RFC 6962). */
|
|
44
39
|
export declare function verifyConsistency(oldSize: number, newSize: number, oldRoot: Uint8Array, newRoot: Uint8Array, proof: Uint8Array[]): Promise<boolean>;
|
|
45
40
|
export { verifyWebhookSignature, isTimestampFresh } from "./webhooks.js";
|
|
41
|
+
/**
|
|
42
|
+
* Client-side connection-config sealing.
|
|
43
|
+
*
|
|
44
|
+
* Node only, and absent from the browser entry point on purpose: verifying an
|
|
45
|
+
* attestation document needs X.509 chain building, which browsers do not
|
|
46
|
+
* expose, and sealing a datastore credential is not something a browser should
|
|
47
|
+
* be doing.
|
|
48
|
+
*/
|
|
49
|
+
export { EnclaveAttestationError, ENVELOPE_MAGIC, HEADER_SIZE, NITRO_ROOT_G1_PEM, sealConnectionConfig, sealToKey, verifyEnclaveConfigSealKey, } from "./enclave-seal.js";
|
|
50
|
+
export type { SealOptions } from "./enclave-seal.js";
|
|
46
51
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** BurnLedger TypeScript SDK — public API (Node.js entry point). */
|
|
2
|
-
export { BurnLedger } from "./client.js";
|
|
3
|
-
export { BurnLedgerError, ApiError, AuthenticationError, NotFoundError, ConflictError, ValidationError, RateLimitError, ServerError, TimeoutError, VerificationError, } from "./errors.js";
|
|
2
|
+
export { BurnLedger, MAX_BATCH_REVOKE } from "./client.js";
|
|
3
|
+
export { BurnLedgerError, ApiError, AuthenticationError, NotFoundError, ConflictError, ValidationError, RateLimitError, ServerError, TimeoutError, VerificationError, CERTIFICATE_REVOKED, UNSUPPORTED_FORMAT_VERSION, } from "./errors.js";
|
|
4
4
|
export { Transport } from "./http.js";
|
|
5
5
|
// Raw-JSON → model parsers, for consumers that fetch API responses outside
|
|
6
6
|
// the client (the dashboard's paginated list hooks) but render SDK types.
|
|
@@ -43,4 +43,13 @@ export function verifyConsistency(oldSize, newSize, oldRoot, newRoot, proof) {
|
|
|
43
43
|
return _verifyConsistency(nodeCrypto, oldSize, newSize, oldRoot, newRoot, proof);
|
|
44
44
|
}
|
|
45
45
|
export { verifyWebhookSignature, isTimestampFresh } from "./webhooks.js";
|
|
46
|
+
/**
|
|
47
|
+
* Client-side connection-config sealing.
|
|
48
|
+
*
|
|
49
|
+
* Node only, and absent from the browser entry point on purpose: verifying an
|
|
50
|
+
* attestation document needs X.509 chain building, which browsers do not
|
|
51
|
+
* expose, and sealing a datastore credential is not something a browser should
|
|
52
|
+
* be doing.
|
|
53
|
+
*/
|
|
54
|
+
export { EnclaveAttestationError, ENVELOPE_MAGIC, HEADER_SIZE, NITRO_ROOT_G1_PEM, sealConnectionConfig, sealToKey, verifyEnclaveConfigSealKey, } from "./enclave-seal.js";
|
|
46
55
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAEpE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG3D,OAAO,EACL,eAAe,EACf,QAAQ,EACR,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,eAAe,EACf,cAAc,EACd,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AA8CtC,2EAA2E;AAC3E,0EAA0E;AAC1E,OAAO,EAAE,WAAW,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAElF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,iBAAiB,IAAI,kBAAkB,EACvC,2BAA2B,IAAI,4BAA4B,EAC3D,kBAAkB,IAAI,mBAAmB,EACzC,iBAAiB,IAAI,kBAAkB,EACvC,gBAAgB,IAAI,iBAAiB,GACtC,MAAM,aAAa,CAAC;AAMrB,+DAA+D;AAC/D,MAAM,UAAU,iBAAiB,CAC/B,WAAiB,EACjB,UAAsC;IAEtC,OAAO,kBAAkB,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;AACjE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CACzC,WAAiB,EACjB,UAAsC,EACtC,MAAuC,EACvC,GAAU;IAEV,OAAO,4BAA4B,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;AACxF,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,kBAAkB,CAChC,WAAiB,EACjB,UAAsC;IAEtC,OAAO,mBAAmB,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;AAClE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAc,EACd,IAAuB;IAEvB,OAAO,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,OAAe,EACf,OAAmB,EACnB,OAAmB,EACnB,KAAmB;IAEnB,OAAO,kBAAkB,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AACnF,CAAC;AAED,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEzE;;;;;;;GAOG;AACH,OAAO,EACL,uBAAuB,EACvB,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,SAAS,EACT,0BAA0B,GAC3B,MAAM,mBAAmB,CAAC"}
|
package/dist/esm/keys.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { CryptoOps } from "./crypto.js";
|
|
1
2
|
export type KeyEntry = {
|
|
2
3
|
key_id: string;
|
|
3
4
|
public_key: string;
|
|
@@ -9,6 +10,24 @@ export type KeyEntry = {
|
|
|
9
10
|
not_after?: string | null;
|
|
10
11
|
compromised_from?: string | null;
|
|
11
12
|
};
|
|
13
|
+
/**
|
|
14
|
+
* The published key set as /.well-known/burnledger-keys serves it: the `keys`
|
|
15
|
+
* array, and BESIDE it — in the same object — the fields of a signed
|
|
16
|
+
* key_list.v3 statement when the server signs one (ADR-017 §5a). A body with no
|
|
17
|
+
* `signature` is the unsigned list the endpoint has always served; that is not
|
|
18
|
+
* an error, it is the state of the world before §5a is deployed.
|
|
19
|
+
*
|
|
20
|
+
* Mirrors core.KeyListDocument.
|
|
21
|
+
*/
|
|
22
|
+
export type KeyListDocument = {
|
|
23
|
+
keys: KeyEntry[];
|
|
24
|
+
statement_issued_at?: string;
|
|
25
|
+
statement_expires_at?: string;
|
|
26
|
+
sth_tree_size?: number;
|
|
27
|
+
sth_root_hash?: string;
|
|
28
|
+
signature?: string;
|
|
29
|
+
key_id?: string;
|
|
30
|
+
};
|
|
12
31
|
/**
|
|
13
32
|
* Normalize a parsed keys file to an array of key entries. Accepts a bare
|
|
14
33
|
* JSON array (the generated keys.json shape), a { "keys": [...] } envelope,
|
|
@@ -16,4 +35,51 @@ export type KeyEntry = {
|
|
|
16
35
|
* actually publishes. Throws on any other shape.
|
|
17
36
|
*/
|
|
18
37
|
export declare function parseKeyEntries(parsed: unknown): KeyEntry[];
|
|
38
|
+
/**
|
|
39
|
+
* Read a published key set in any shape this project has ever served — a bare
|
|
40
|
+
* array, a {"keys": [...]} object, or either inside the API's {"data": ...}
|
|
41
|
+
* envelope — keeping the statement fields when the object forms carry them.
|
|
42
|
+
* Mirrors core.ParseKeyListDocument, so this CLI, the Go CLI and the browser
|
|
43
|
+
* cannot disagree about which files are key sets.
|
|
44
|
+
*/
|
|
45
|
+
export declare function parseKeyListDocument(parsed: unknown): KeyListDocument;
|
|
46
|
+
/** Verdicts about a key list. Mirrors core.KeyListResult, plus the one the CLI
|
|
47
|
+
* adds (SIGNING_KEY_NOT_IN_LIST) because core never reaches it: VerifyKeyList
|
|
48
|
+
* is told which key to trust, and this is the case where there is none to offer. */
|
|
49
|
+
export declare const KEY_LIST_VALID = "VALID";
|
|
50
|
+
export declare const KEY_LIST_MALFORMED = "MALFORMED_KEY_LIST";
|
|
51
|
+
export declare const KEY_LIST_SIGNING_KEY_UNUSABLE = "KEY_LIST_SIGNING_KEY_UNUSABLE";
|
|
52
|
+
export declare const KEY_LIST_INVALID_SIGNATURE = "INVALID_KEY_LIST_SIGNATURE";
|
|
53
|
+
export declare const KEY_LIST_STALE = "KEY_LIST_STALE";
|
|
54
|
+
export declare const KEY_LIST_SIGNING_KEY_ABSENT = "SIGNING_KEY_NOT_IN_LIST";
|
|
55
|
+
/**
|
|
56
|
+
* What a run learned about where the key statuses and dates came from.
|
|
57
|
+
* Mirrors keyListEvidence in cmd/cli/keys.go: it is not a pass/fail input to
|
|
58
|
+
* certificate verification, it qualifies one. An auditor reading
|
|
59
|
+
* KEY_COMPROMISED needs to know whether that word arrived as evidence they can
|
|
60
|
+
* keep or as JSON from an endpoint trusted for one TCP connection.
|
|
61
|
+
*/
|
|
62
|
+
export interface KeyListEvidence {
|
|
63
|
+
/** Whether the file carried a signed statement at all. */
|
|
64
|
+
present: boolean;
|
|
65
|
+
result?: string;
|
|
66
|
+
/** The trusted key was taken from the list itself — trust-on-first-use, not proof. */
|
|
67
|
+
selfSigned: boolean;
|
|
68
|
+
/** statement_expires_at, normalized to the form Go prints. */
|
|
69
|
+
expiresAt?: string;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Check a key-list statement the way cmd/cli/keys.go does, so four verifiers
|
|
73
|
+
* agree: the trusted key is looked up IN THE LIST ITSELF (trust-on-first-use,
|
|
74
|
+
* and selfSigned says so), then core.VerifyKeyList's order — the list parses
|
|
75
|
+
* and has no duplicate, the signing key is usable at `now` under ADR-017's
|
|
76
|
+
* table, the signature verifies over the published entries, and only then
|
|
77
|
+
* freshness. A stale verdict is never returned for a signature never tested.
|
|
78
|
+
*
|
|
79
|
+
* THROWS where the Go CLI exits 2: an entry that does not parse, a key_id that
|
|
80
|
+
* is not sha256(public_key), or a statement whose fields will not read. Someone
|
|
81
|
+
* signed something the reader cannot read, and continuing as though the file
|
|
82
|
+
* were merely unsigned would throw that fact away.
|
|
83
|
+
*/
|
|
84
|
+
export declare function verifyKeyList(crypto: CryptoOps, doc: KeyListDocument, now: Date): Promise<KeyListEvidence>;
|
|
19
85
|
//# sourceMappingURL=keys.d.ts.map
|
package/dist/esm/keys.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/keys.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/keys.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAU7C,MAAM,MAAM,QAAQ,GAAG;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB;;0BAEsB;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,QAAQ,EAAE,CAE3D;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,eAAe,CAQrE;AAED;;oFAEoF;AACpF,eAAO,MAAM,cAAc,UAAU,CAAC;AACtC,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,eAAO,MAAM,6BAA6B,kCAAkC,CAAC;AAC7E,eAAO,MAAM,0BAA0B,+BAA+B,CAAC;AACvE,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAC/C,eAAO,MAAM,2BAA2B,4BAA4B,CAAC;AAErE;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,0DAA0D;IAC1D,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sFAAsF;IACtF,UAAU,EAAE,OAAO,CAAC;IACpB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAoBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,IAAI,GACR,OAAO,CAAC,eAAe,CAAC,CAmE1B"}
|
package/dist/esm/keys.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
// Public-key file parsing shared by the CLI
|
|
1
|
+
// Public-key file parsing shared by the CLI and the browser verifier, and the
|
|
2
|
+
// key_list.v3 verdict (ADR-017 §5a) — unit-testable in isolation.
|
|
3
|
+
import { buildKeyListPayload, evaluateKey, formatTimestamp, hexToBytes, keyIsUsable, publicKeyFromHex, } from "./verify.js";
|
|
2
4
|
/**
|
|
3
5
|
* Normalize a parsed keys file to an array of key entries. Accepts a bare
|
|
4
6
|
* JSON array (the generated keys.json shape), a { "keys": [...] } envelope,
|
|
@@ -6,11 +8,131 @@
|
|
|
6
8
|
* actually publishes. Throws on any other shape.
|
|
7
9
|
*/
|
|
8
10
|
export function parseKeyEntries(parsed) {
|
|
11
|
+
return parseKeyListDocument(parsed).keys;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Read a published key set in any shape this project has ever served — a bare
|
|
15
|
+
* array, a {"keys": [...]} object, or either inside the API's {"data": ...}
|
|
16
|
+
* envelope — keeping the statement fields when the object forms carry them.
|
|
17
|
+
* Mirrors core.ParseKeyListDocument, so this CLI, the Go CLI and the browser
|
|
18
|
+
* cannot disagree about which files are key sets.
|
|
19
|
+
*/
|
|
20
|
+
export function parseKeyListDocument(parsed) {
|
|
9
21
|
const root = parsed?.data ?? parsed;
|
|
10
|
-
|
|
22
|
+
if (Array.isArray(root))
|
|
23
|
+
return { keys: root };
|
|
24
|
+
const entries = root?.keys;
|
|
11
25
|
if (!Array.isArray(entries)) {
|
|
12
26
|
throw new Error('--keys file must be a JSON array of keys or a {"keys": [...]} object');
|
|
13
27
|
}
|
|
14
|
-
return
|
|
28
|
+
return root;
|
|
29
|
+
}
|
|
30
|
+
/** Verdicts about a key list. Mirrors core.KeyListResult, plus the one the CLI
|
|
31
|
+
* adds (SIGNING_KEY_NOT_IN_LIST) because core never reaches it: VerifyKeyList
|
|
32
|
+
* is told which key to trust, and this is the case where there is none to offer. */
|
|
33
|
+
export const KEY_LIST_VALID = "VALID";
|
|
34
|
+
export const KEY_LIST_MALFORMED = "MALFORMED_KEY_LIST";
|
|
35
|
+
export const KEY_LIST_SIGNING_KEY_UNUSABLE = "KEY_LIST_SIGNING_KEY_UNUSABLE";
|
|
36
|
+
export const KEY_LIST_INVALID_SIGNATURE = "INVALID_KEY_LIST_SIGNATURE";
|
|
37
|
+
export const KEY_LIST_STALE = "KEY_LIST_STALE";
|
|
38
|
+
export const KEY_LIST_SIGNING_KEY_ABSENT = "SIGNING_KEY_NOT_IN_LIST";
|
|
39
|
+
/** The whole-second RFC 3339 form every published key date uses
|
|
40
|
+
* (core.KeyTimeFormat). Entry dates are validated against it strictly, as
|
|
41
|
+
* core.KeyEntry.PublicKeyInfo does, so a date Go refuses is refused here. */
|
|
42
|
+
const KEY_TIME_RE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/;
|
|
43
|
+
function requireKeyTime(keyId, field, value) {
|
|
44
|
+
if (typeof value !== "string" || !KEY_TIME_RE.test(value)) {
|
|
45
|
+
throw new Error(`key ${keyId}: ${field} is not YYYY-MM-DDTHH:MM:SSZ`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function requireHex(field, value, bytes) {
|
|
49
|
+
if (typeof value !== "string" || value.length !== bytes * 2 || !/^[0-9a-fA-F]+$/.test(value)) {
|
|
50
|
+
throw new Error(`key list: ${field} is not ${bytes} bytes of hex`);
|
|
51
|
+
}
|
|
52
|
+
return hexToBytes(value);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Check a key-list statement the way cmd/cli/keys.go does, so four verifiers
|
|
56
|
+
* agree: the trusted key is looked up IN THE LIST ITSELF (trust-on-first-use,
|
|
57
|
+
* and selfSigned says so), then core.VerifyKeyList's order — the list parses
|
|
58
|
+
* and has no duplicate, the signing key is usable at `now` under ADR-017's
|
|
59
|
+
* table, the signature verifies over the published entries, and only then
|
|
60
|
+
* freshness. A stale verdict is never returned for a signature never tested.
|
|
61
|
+
*
|
|
62
|
+
* THROWS where the Go CLI exits 2: an entry that does not parse, a key_id that
|
|
63
|
+
* is not sha256(public_key), or a statement whose fields will not read. Someone
|
|
64
|
+
* signed something the reader cannot read, and continuing as though the file
|
|
65
|
+
* were merely unsigned would throw that fact away.
|
|
66
|
+
*/
|
|
67
|
+
export async function verifyKeyList(crypto, doc, now) {
|
|
68
|
+
if (doc.keys.length === 0)
|
|
69
|
+
throw new Error("keys file contains no keys");
|
|
70
|
+
const signed = doc.signature !== undefined && doc.signature !== "";
|
|
71
|
+
const keys = new Map();
|
|
72
|
+
let duplicate = false;
|
|
73
|
+
for (const e of doc.keys) {
|
|
74
|
+
if (typeof e.public_key !== "string")
|
|
75
|
+
throw new Error(`key ${e.key_id}: public_key is not a string`);
|
|
76
|
+
const pki = await publicKeyFromHex(crypto, e.public_key, {
|
|
77
|
+
keyStatus: e.key_status,
|
|
78
|
+
notBefore: e.not_before,
|
|
79
|
+
notAfter: e.not_after ?? undefined,
|
|
80
|
+
compromisedFrom: e.compromised_from ?? undefined,
|
|
81
|
+
});
|
|
82
|
+
// The strict Go loader rules — key_id is sha256(public_key), dates are
|
|
83
|
+
// whole-second UTC — apply to a SIGNED list, whose statement signs the
|
|
84
|
+
// published strings. An unsigned list keeps this CLI's existing
|
|
85
|
+
// tolerance (an absent key_id is allowed, and the map is keyed on the
|
|
86
|
+
// derived id either way); tightening the unsigned path would refuse files
|
|
87
|
+
// it accepts today.
|
|
88
|
+
if (signed) {
|
|
89
|
+
if (e.key_id !== pki.keyId) {
|
|
90
|
+
throw new Error(`key_id ${e.key_id} does not match sha256(public_key) (${pki.keyId})`);
|
|
91
|
+
}
|
|
92
|
+
if (e.not_before != null && e.not_before !== "")
|
|
93
|
+
requireKeyTime(e.key_id, "not_before", e.not_before);
|
|
94
|
+
if (e.not_after != null)
|
|
95
|
+
requireKeyTime(e.key_id, "not_after", e.not_after);
|
|
96
|
+
if (e.compromised_from != null)
|
|
97
|
+
requireKeyTime(e.key_id, "compromised_from", e.compromised_from);
|
|
98
|
+
}
|
|
99
|
+
if (keys.has(pki.keyId))
|
|
100
|
+
duplicate = true;
|
|
101
|
+
keys.set(pki.keyId, pki);
|
|
102
|
+
}
|
|
103
|
+
if (!signed) {
|
|
104
|
+
return { present: false, selfSigned: false };
|
|
105
|
+
}
|
|
106
|
+
// The statement's own fields. Refused rather than defaulted: a zero
|
|
107
|
+
// statement_expires_at would read as "expired", which is an answer.
|
|
108
|
+
requireHex("sth_root_hash", doc.sth_root_hash, 32);
|
|
109
|
+
const signature = requireHex("signature", doc.signature, 64);
|
|
110
|
+
if (typeof doc.key_id !== "string" || doc.key_id === "")
|
|
111
|
+
throw new Error("key list: key_id is missing");
|
|
112
|
+
if (typeof doc.sth_tree_size !== "number" || !Number.isInteger(doc.sth_tree_size) || doc.sth_tree_size < 0) {
|
|
113
|
+
throw new Error("key list: sth_tree_size is not a non-negative integer");
|
|
114
|
+
}
|
|
115
|
+
const issued = formatTimestamp(doc.statement_issued_at);
|
|
116
|
+
const expires = formatTimestamp(doc.statement_expires_at);
|
|
117
|
+
const evidence = { present: true, selfSigned: false, expiresAt: expires };
|
|
118
|
+
const signingKey = keys.get(doc.key_id);
|
|
119
|
+
if (signingKey === undefined) {
|
|
120
|
+
return { ...evidence, result: KEY_LIST_SIGNING_KEY_ABSENT };
|
|
121
|
+
}
|
|
122
|
+
evidence.selfSigned = true;
|
|
123
|
+
if (duplicate)
|
|
124
|
+
return { ...evidence, result: KEY_LIST_MALFORMED };
|
|
125
|
+
const at = formatTimestamp(now.toISOString());
|
|
126
|
+
if (!keyIsUsable(evaluateKey(signingKey, Math.floor(Date.parse(at) / 1000)))) {
|
|
127
|
+
return { ...evidence, result: KEY_LIST_SIGNING_KEY_UNUSABLE };
|
|
128
|
+
}
|
|
129
|
+
const payload = buildKeyListPayload(doc);
|
|
130
|
+
if (!(await crypto.ed25519Verify(signingKey.keyBytes, payload, signature))) {
|
|
131
|
+
return { ...evidence, result: KEY_LIST_INVALID_SIGNATURE };
|
|
132
|
+
}
|
|
133
|
+
if (at < issued || at >= expires) {
|
|
134
|
+
return { ...evidence, result: KEY_LIST_STALE };
|
|
135
|
+
}
|
|
136
|
+
return { ...evidence, result: KEY_LIST_VALID };
|
|
15
137
|
}
|
|
16
138
|
//# sourceMappingURL=keys.js.map
|
package/dist/esm/keys.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/keys.ts"],"names":[],"mappings":"AAAA,8EAA8E;
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/keys.ts"],"names":[],"mappings":"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"}
|