@bounded-authority-protocol/verifier 0.2.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.
Files changed (49) hide show
  1. package/LICENSE +190 -0
  2. package/NOTICE +10 -0
  3. package/README.md +183 -0
  4. package/dist/src/base64url.d.ts +2 -0
  5. package/dist/src/base64url.js +115 -0
  6. package/dist/src/base64url.js.map +1 -0
  7. package/dist/src/bounds.d.ts +50 -0
  8. package/dist/src/bounds.js +114 -0
  9. package/dist/src/bounds.js.map +1 -0
  10. package/dist/src/compact.d.ts +19 -0
  11. package/dist/src/compact.js +111 -0
  12. package/dist/src/compact.js.map +1 -0
  13. package/dist/src/digest.d.ts +8 -0
  14. package/dist/src/digest.js +116 -0
  15. package/dist/src/digest.js.map +1 -0
  16. package/dist/src/ed25519.d.ts +7 -0
  17. package/dist/src/ed25519.js +61 -0
  18. package/dist/src/ed25519.js.map +1 -0
  19. package/dist/src/error.d.ts +15 -0
  20. package/dist/src/error.js +34 -0
  21. package/dist/src/error.js.map +1 -0
  22. package/dist/src/facts.d.ts +104 -0
  23. package/dist/src/facts.js +6 -0
  24. package/dist/src/facts.js.map +1 -0
  25. package/dist/src/index.d.ts +16 -0
  26. package/dist/src/index.js +31 -0
  27. package/dist/src/index.js.map +1 -0
  28. package/dist/src/jcs.d.ts +3 -0
  29. package/dist/src/jcs.js +285 -0
  30. package/dist/src/jcs.js.map +1 -0
  31. package/dist/src/json.d.ts +25 -0
  32. package/dist/src/json.js +473 -0
  33. package/dist/src/json.js.map +1 -0
  34. package/dist/src/jwk.d.ts +14 -0
  35. package/dist/src/jwk.js +77 -0
  36. package/dist/src/jwk.js.map +1 -0
  37. package/dist/src/selector.d.ts +16 -0
  38. package/dist/src/selector.js +142 -0
  39. package/dist/src/selector.js.map +1 -0
  40. package/dist/src/uri.d.ts +4 -0
  41. package/dist/src/uri.js +280 -0
  42. package/dist/src/uri.js.map +1 -0
  43. package/dist/src/v1.d.ts +211 -0
  44. package/dist/src/v1.js +2206 -0
  45. package/dist/src/v1.js.map +1 -0
  46. package/dist/src/v2.d.ts +291 -0
  47. package/dist/src/v2.js +2300 -0
  48. package/dist/src/v2.js.map +1 -0
  49. package/package.json +46 -0
@@ -0,0 +1,473 @@
1
+ import { fail } from "./error.js";
2
+ import { resolve, MAXIMUM_BOUNDS } from "./bounds.js";
3
+ // Null-prototype object tag — markers are Object.create(null) instances, keyed by raw UTF-8 string.
4
+ // We store members as a Map keyed by the decoded string (UTF-8 byte sequence); insertion order is
5
+ // preserved (Map iteration order = insertion order in JS).
6
+ const MAX_INT = 9007199254740991;
7
+ const MAX_FLOAT = 9007199254740991;
8
+ // Safe byte access: returns -1 for out-of-bounds (so comparisons like `=== 0x22` are always safe).
9
+ function byteAt(src, pos) {
10
+ return pos < src.length ? src[pos] : -1;
11
+ }
12
+ export function jsonDecode(src, bounds = MAXIMUM_BOUNDS) {
13
+ const maxJsonBytes = resolve(bounds, "json_bytes");
14
+ if (src.length > maxJsonBytes)
15
+ fail("json: input exceeds json_bytes bound");
16
+ const ctx = { src, pos: 0, bounds, nodes: 0, depth: 0 };
17
+ skipWs(ctx);
18
+ const value = parseValue(ctx, 0);
19
+ // REQ1-JSON-single-value: after the value, only JSON whitespace may remain.
20
+ skipWs(ctx);
21
+ if (ctx.pos !== src.length)
22
+ fail("json: trailing bytes");
23
+ // total_nodes budget.
24
+ if (ctx.nodes > resolve(bounds, "total_nodes")) {
25
+ fail("json: total_nodes bound exceeded");
26
+ }
27
+ return value;
28
+ }
29
+ function node(ctx) {
30
+ ctx.nodes++;
31
+ }
32
+ // Per-node-type depth gate (mirrors the official Jcs.encode/Json.decode model, corpus_independent
33
+ // .mjs:1913): root value at level 0; a SCALAR is valid at level <= depth; a CONTAINER is valid at
34
+ // level < depth (its children sit at level+1). A uniform `level > depth` gate wrongly accepts a
35
+ // container at the deepest legal scalar level.
36
+ function parseValue(ctx, level) {
37
+ const src = ctx.src;
38
+ const c = src[ctx.pos];
39
+ if (c === undefined)
40
+ fail("json: unexpected end of input");
41
+ let v;
42
+ if (c === 0x22 /* " */) {
43
+ if (level > resolve(ctx.bounds, "depth"))
44
+ fail("json: depth bound");
45
+ v = parseString(ctx);
46
+ }
47
+ else if (c === 0x7b /* { */) {
48
+ if (level >= resolve(ctx.bounds, "depth"))
49
+ fail("json: depth bound");
50
+ v = parseObject(ctx, level + 1);
51
+ }
52
+ else if (c === 0x5b /* [ */) {
53
+ if (level >= resolve(ctx.bounds, "depth"))
54
+ fail("json: depth bound");
55
+ v = parseArray(ctx, level + 1);
56
+ }
57
+ else if (c === 0x74 /* t */ || c === 0x66 /* f */) {
58
+ if (level > resolve(ctx.bounds, "depth"))
59
+ fail("json: depth bound");
60
+ v = parseBool(ctx);
61
+ }
62
+ else if (c === 0x6e /* n */) {
63
+ if (level > resolve(ctx.bounds, "depth"))
64
+ fail("json: depth bound");
65
+ v = parseNull(ctx);
66
+ }
67
+ else if (c === 0x2d /* - */ || (c >= 0x30 && c <= 0x39)) {
68
+ if (level > resolve(ctx.bounds, "depth"))
69
+ fail("json: depth bound");
70
+ v = parseNumber(ctx);
71
+ }
72
+ else
73
+ fail("json: unexpected byte");
74
+ return v;
75
+ }
76
+ function parseNull(ctx) {
77
+ node(ctx);
78
+ expectLit(ctx, "null");
79
+ return { t: "null" };
80
+ }
81
+ function parseBool(ctx) {
82
+ node(ctx);
83
+ const c = ctx.src[ctx.pos];
84
+ if (c === 0x74 /* t */) {
85
+ expectLit(ctx, "true");
86
+ return { t: "bool", v: true };
87
+ }
88
+ expectLit(ctx, "false");
89
+ return { t: "bool", v: false };
90
+ }
91
+ function expectLit(ctx, lit) {
92
+ const src = ctx.src;
93
+ const pos = ctx.pos;
94
+ for (let i = 0; i < lit.length; i++) {
95
+ if (src[pos + i] !== lit.charCodeAt(i))
96
+ fail(`json: expected ${lit}`);
97
+ }
98
+ ctx.pos += lit.length;
99
+ }
100
+ function parseString(ctx) {
101
+ node(ctx);
102
+ const start = ctx.pos;
103
+ const bytes = scanString(ctx, start);
104
+ // RFC 8259 §2.5 / REQ1-JSON-no-normalization: a JSON string's bytes MUST be valid UTF-8. The
105
+ // scanner copies raw bytes (multi-byte sequences pass through); validate here so an invalid byte
106
+ // (e.g. a lone 0xff) rejects as InvalidError rather than producing a wrong JCS digest or a
107
+ // non-InvalidError TextDecoder throw at a later utf8Str conversion.
108
+ try {
109
+ DECODER.decode(bytes);
110
+ }
111
+ catch {
112
+ fail("json: string not valid UTF-8");
113
+ }
114
+ if (bytes.length > resolve(ctx.bounds, "string_bytes"))
115
+ fail("json: string_bytes bound");
116
+ return { t: "string", v: bytes };
117
+ }
118
+ // Scan a JSON string starting at the opening quote; return the decoded UTF-8 bytes. Validates escapes
119
+ // and rejects unpaired surrogates / non-UTF-8 (REQ1-JSON-no-normalization: preserve without normalizing,
120
+ // but the bytes must be valid UTF-8).
121
+ function scanString(ctx, start) {
122
+ const src = ctx.src;
123
+ // Skip opening quote.
124
+ ctx.pos = start + 1;
125
+ const out = [];
126
+ for (;;) {
127
+ const c = src[ctx.pos];
128
+ if (c === undefined)
129
+ fail("json: unterminated string");
130
+ if (c === 0x22 /* " */) {
131
+ ctx.pos++;
132
+ return new Uint8Array(out);
133
+ }
134
+ if (c === 0x5c /* \ */) {
135
+ const e = src[ctx.pos + 1];
136
+ if (e === undefined)
137
+ fail("json: bad escape");
138
+ ctx.pos += 2;
139
+ switch (e) {
140
+ case 0x22:
141
+ out.push(0x22);
142
+ break;
143
+ case 0x5c:
144
+ out.push(0x5c);
145
+ break;
146
+ case 0x2f:
147
+ out.push(0x2f);
148
+ break;
149
+ case 0x62:
150
+ out.push(0x08);
151
+ break;
152
+ case 0x66:
153
+ out.push(0x0c);
154
+ break;
155
+ case 0x6e:
156
+ out.push(0x0a);
157
+ break;
158
+ case 0x72:
159
+ out.push(0x0d);
160
+ break;
161
+ case 0x74:
162
+ out.push(0x09);
163
+ break;
164
+ case 0x75: { // \uXXXX — 4 hex digits; handle surrogate pairs.
165
+ const hi = parseHex4(ctx);
166
+ if (hi >= 0xd800 && hi <= 0xdbff) {
167
+ // High surrogate; require \uXXXX low surrogate.
168
+ if (src[ctx.pos] !== 0x5c || src[ctx.pos + 1] !== 0x75) {
169
+ fail("json: unpaired high surrogate");
170
+ }
171
+ ctx.pos += 2;
172
+ const lo = parseHex4(ctx);
173
+ if (lo < 0xdc00 || lo > 0xdfff)
174
+ fail("json: bad low surrogate");
175
+ const cp = 0x10000 + ((hi - 0xd800) << 10) + (lo - 0xdc00);
176
+ encodeUtf8(cp, out);
177
+ }
178
+ else if (hi >= 0xdc00 && hi <= 0xdfff) {
179
+ fail("json: unpaired low surrogate");
180
+ }
181
+ else {
182
+ encodeUtf8(hi, out);
183
+ }
184
+ break;
185
+ }
186
+ default: fail("json: bad escape");
187
+ }
188
+ }
189
+ else if (c < 0x20) {
190
+ fail("json: unescaped control byte");
191
+ }
192
+ else {
193
+ // Copy raw byte (UTF-8 multi-byte sequences pass through as-is; validity checked at decode).
194
+ out.push(c);
195
+ ctx.pos++;
196
+ }
197
+ }
198
+ }
199
+ function parseHex4(ctx) {
200
+ const src = ctx.src;
201
+ let v = 0;
202
+ for (let i = 0; i < 4; i++) {
203
+ const c = src[ctx.pos];
204
+ if (c === undefined)
205
+ fail("json: bad \\u escape");
206
+ let d;
207
+ if (c >= 0x30 && c <= 0x39)
208
+ d = c - 0x30;
209
+ else if (c >= 0x41 && c <= 0x46)
210
+ d = c - 0x41 + 10;
211
+ else if (c >= 0x61 && c <= 0x66)
212
+ d = c - 0x61 + 10;
213
+ else
214
+ fail("json: bad \\u hex");
215
+ v = (v << 4) | d;
216
+ ctx.pos++;
217
+ }
218
+ return v;
219
+ }
220
+ function encodeUtf8(cp, out) {
221
+ if (cp < 0x80)
222
+ out.push(cp);
223
+ else if (cp < 0x800) {
224
+ out.push(0xc0 | (cp >> 6));
225
+ out.push(0x80 | (cp & 0x3f));
226
+ }
227
+ else if (cp < 0x10000) {
228
+ out.push(0xe0 | (cp >> 12));
229
+ out.push(0x80 | ((cp >> 6) & 0x3f));
230
+ out.push(0x80 | (cp & 0x3f));
231
+ }
232
+ else {
233
+ out.push(0xf0 | (cp >> 18));
234
+ out.push(0x80 | ((cp >> 12) & 0x3f));
235
+ out.push(0x80 | ((cp >> 6) & 0x3f));
236
+ out.push(0x80 | (cp & 0x3f));
237
+ }
238
+ }
239
+ function parseNumber(ctx) {
240
+ node(ctx);
241
+ const src = ctx.src;
242
+ const start = ctx.pos;
243
+ // Scan the RFC 8259 number lexeme: optional -, int part, optional frac, optional exp.
244
+ let pos = start;
245
+ if (byteAt(src, pos) === 0x2d /* - */)
246
+ pos++;
247
+ // Integer part: 0 or [1-9][0-9]*
248
+ if (byteAt(src, pos) === 0x30)
249
+ pos++;
250
+ else {
251
+ const c = byteAt(src, pos);
252
+ if (c >= 0x31 && c <= 0x39) {
253
+ pos++;
254
+ let d = byteAt(src, pos);
255
+ while (d >= 0x30 && d <= 0x39) {
256
+ pos++;
257
+ d = byteAt(src, pos);
258
+ }
259
+ }
260
+ else
261
+ fail("json: bad number");
262
+ }
263
+ let isFloat = false;
264
+ if (byteAt(src, pos) === 0x2e /* . */) {
265
+ isFloat = true;
266
+ pos++;
267
+ const f = byteAt(src, pos);
268
+ if (!(f >= 0x30 && f <= 0x39))
269
+ fail("json: bad fraction");
270
+ let fd = byteAt(src, pos);
271
+ while (fd >= 0x30 && fd <= 0x39) {
272
+ pos++;
273
+ fd = byteAt(src, pos);
274
+ }
275
+ }
276
+ const ec = byteAt(src, pos);
277
+ if (ec === 0x65 /* e */ || ec === 0x45 /* E */) {
278
+ isFloat = true;
279
+ pos++;
280
+ const sign = byteAt(src, pos);
281
+ if (sign === 0x2b || sign === 0x2d)
282
+ pos++;
283
+ const e = byteAt(src, pos);
284
+ if (!(e >= 0x30 && e <= 0x39))
285
+ fail("json: bad exponent");
286
+ let ed = byteAt(src, pos);
287
+ while (ed >= 0x30 && ed <= 0x39) {
288
+ pos++;
289
+ ed = byteAt(src, pos);
290
+ }
291
+ }
292
+ const lexemeEnd = pos;
293
+ const lexeme = src.subarray(start, lexemeEnd);
294
+ // REQ1-JSON-raw-lexeme: 64-byte ceiling on the lexeme.
295
+ if (lexeme.length > resolve(ctx.bounds, "number_lexeme_bytes")) {
296
+ fail("json: number lexeme exceeds bound");
297
+ }
298
+ ctx.pos = lexemeEnd;
299
+ const text = asciiStr(lexeme);
300
+ if (isFloat) {
301
+ // REQ1-JSON-raw-lexeme: check the magnitude of the RAW lexeme by decimal arithmetic BEFORE
302
+ // Number() conversion. A lexeme like "9007199254740991.0001" rounds to the max binary64 value
303
+ // under Number(), so a post-conversion Math.abs(n) > MAX check accepts it — defeating the exact
304
+ // bound. The reference (json.ex magnitude_within?) compares the lexeme's significant digits
305
+ // against the maximum's digit string. Mirror that here.
306
+ if (!lexemeMagnitudeWithin(text, MAX_FLOAT))
307
+ fail("json: float magnitude bound");
308
+ const n = Number(text);
309
+ if (!Number.isFinite(n))
310
+ fail("json: float not finite");
311
+ return { t: "float", v: n };
312
+ }
313
+ if (!lexemeMagnitudeWithin(text, MAX_INT))
314
+ fail("json: integer magnitude bound");
315
+ const n = Number(text);
316
+ if (!Number.isSafeInteger(n))
317
+ fail("json: integer magnitude bound or unsafe");
318
+ return { t: "int", v: n };
319
+ }
320
+ // Exact decimal magnitude check of a number lexeme against `maximum`, mirroring the reference
321
+ // (json.ex:298-349 magnitude_within? / compare_boundary). Returns true if |value| <= maximum.
322
+ // Compares the lexeme's significant digits by their effective integer position — NOT the float
323
+ // value (which loses precision). Handles sign, fraction, and exponent exactly.
324
+ function lexemeMagnitudeWithin(text, maximum) {
325
+ const unsigned = text[0] === "-" || text[0] === "+" ? text.slice(1) : text;
326
+ // Split mantissa / exponent (sign already validated by the scanner).
327
+ let mantissa = unsigned;
328
+ let exponent = 0;
329
+ const eIdx = unsigned.search(/[eE]/);
330
+ if (eIdx !== -1) {
331
+ mantissa = unsigned.slice(0, eIdx);
332
+ exponent = parseInt(unsigned.slice(eIdx + 1), 10);
333
+ }
334
+ let integerDigits = mantissa;
335
+ let fractionDigits = "";
336
+ const dotIdx = mantissa.indexOf(".");
337
+ if (dotIdx !== -1) {
338
+ integerDigits = mantissa.slice(0, dotIdx);
339
+ fractionDigits = mantissa.slice(dotIdx + 1);
340
+ }
341
+ const digits = (integerDigits + fractionDigits).replace(/^0+/, "");
342
+ if (digits === "")
343
+ return true; // value is zero
344
+ const maximumDigits = String(maximum);
345
+ // Effective integer-position of the last significant digit (reference's integer_length).
346
+ const integerLength = digits.length + exponent - fractionDigits.length;
347
+ if (integerLength < maximumDigits.length)
348
+ return true;
349
+ if (integerLength > maximumDigits.length)
350
+ return false;
351
+ // Same digit-count boundary: compare the leading integer_part (padded/truncated to maximum's
352
+ // length) then require the leftover fractional_part to be all-zero if equal (compare_boundary).
353
+ const maximumLength = maximumDigits.length;
354
+ let integerPart;
355
+ let fractionalPart;
356
+ if (digits.length >= maximumLength) {
357
+ integerPart = digits.slice(0, maximumLength);
358
+ fractionalPart = digits.slice(maximumLength);
359
+ }
360
+ else {
361
+ integerPart = digits + "0".repeat(maximumLength - digits.length);
362
+ fractionalPart = "";
363
+ }
364
+ return integerPart < maximumDigits || (integerPart === maximumDigits && /^[0]*$/.test(fractionalPart));
365
+ }
366
+ // Null-prototype object parse: Object.create(null) shape; duplicate keys reject at every depth.
367
+ function parseObject(ctx, childLevel) {
368
+ node(ctx);
369
+ const src = ctx.src;
370
+ ctx.pos++; // skip {
371
+ const members = new Map();
372
+ let count = 0;
373
+ skipWs(ctx);
374
+ if (src[ctx.pos] === 0x7d /* } */) {
375
+ ctx.pos++;
376
+ return { t: "object", v: members };
377
+ }
378
+ for (;;) {
379
+ skipWs(ctx);
380
+ if (src[ctx.pos] !== 0x22 /* " */)
381
+ fail("json: expected member name");
382
+ const nameBytes = scanString(ctx, ctx.pos);
383
+ if (nameBytes.length > resolve(ctx.bounds, "key_bytes"))
384
+ fail("json: key_bytes bound");
385
+ // A member name's bytes MUST be valid UTF-8 (RFC 8259 §2.5 / REQ1-JSON-no-normalization).
386
+ // Validate before utf8Str so a lone 0xff in a name fails closed as InvalidError rather than
387
+ // throwing a non-InvalidError TypeError via the fatal TextDecoder (matches parseString above).
388
+ try {
389
+ DECODER.decode(nameBytes);
390
+ }
391
+ catch {
392
+ fail("json: member name not valid UTF-8");
393
+ }
394
+ const nameStr = utf8Str(nameBytes);
395
+ // REQ1-JSON-no-duplicate: reject before map conversion.
396
+ if (members.has(nameStr))
397
+ fail("json: duplicate member");
398
+ skipWs(ctx);
399
+ if (src[ctx.pos] !== 0x3a /* : */)
400
+ fail("json: expected colon");
401
+ ctx.pos++;
402
+ skipWs(ctx);
403
+ const value = parseValue(ctx, childLevel);
404
+ members.set(nameStr, value);
405
+ count++;
406
+ if (count > resolve(ctx.bounds, "object_members"))
407
+ fail("json: object_members bound");
408
+ skipWs(ctx);
409
+ const sep = src[ctx.pos];
410
+ if (sep === 0x2c /* , */) {
411
+ ctx.pos++;
412
+ continue;
413
+ }
414
+ if (sep === 0x7d /* } */) {
415
+ ctx.pos++;
416
+ break;
417
+ }
418
+ fail("json: expected , or }");
419
+ }
420
+ return { t: "object", v: members };
421
+ }
422
+ function parseArray(ctx, childLevel) {
423
+ node(ctx);
424
+ const src = ctx.src;
425
+ ctx.pos++; // skip [
426
+ const items = [];
427
+ skipWs(ctx);
428
+ if (src[ctx.pos] === 0x5d /* ] */) {
429
+ ctx.pos++;
430
+ return { t: "array", v: items };
431
+ }
432
+ for (;;) {
433
+ skipWs(ctx);
434
+ const value = parseValue(ctx, childLevel);
435
+ items.push(value);
436
+ if (items.length > resolve(ctx.bounds, "array_items"))
437
+ fail("json: array_items bound");
438
+ skipWs(ctx);
439
+ const sep = src[ctx.pos];
440
+ if (sep === 0x2c /* , */) {
441
+ ctx.pos++;
442
+ continue;
443
+ }
444
+ if (sep === 0x5d /* ] */) {
445
+ ctx.pos++;
446
+ break;
447
+ }
448
+ fail("json: expected , or ]");
449
+ }
450
+ return { t: "array", v: items };
451
+ }
452
+ const WS = new Set([0x20, 0x09, 0x0a, 0x0d]);
453
+ function skipWs(ctx) {
454
+ const src = ctx.src;
455
+ while (WS.has(src[ctx.pos] ?? -1))
456
+ ctx.pos++;
457
+ }
458
+ function asciiStr(bytes) {
459
+ let s = "";
460
+ for (let i = 0; i < bytes.length; i++)
461
+ s += String.fromCharCode(bytes[i]);
462
+ return s;
463
+ }
464
+ // UTF-8 decode (TextDecoder is allowed in the library path — it is a pure transformation, not I/O).
465
+ const DECODER = new TextDecoder("utf-8", { fatal: true });
466
+ const ENCODER = new TextEncoder();
467
+ export function utf8Str(bytes) {
468
+ return DECODER.decode(bytes);
469
+ }
470
+ export function strUtf8(s) {
471
+ return ENCODER.encode(s);
472
+ }
473
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type Result } from "./error.js";
2
+ import { type Bounds } from "./bounds.js";
3
+ export interface OkpPublic {
4
+ readonly crv: "Ed25519";
5
+ readonly kty: "OKP";
6
+ readonly x: string;
7
+ }
8
+ export declare function jwkEncodePublic(rawKey: Uint8Array, bounds?: Bounds): Uint8Array;
9
+ export declare function jwkDecodePublic(input: Uint8Array, bounds?: Bounds): Result<Uint8Array>;
10
+ export declare function jwkFromPublicKey(rawKey: Uint8Array): OkpPublic;
11
+ export declare function thumbprintPreimage(jwk: OkpPublic): Uint8Array;
12
+ export declare function thumbprint(jwk: OkpPublic): string;
13
+ export declare function thumbprintRaw(jwk: OkpPublic): Uint8Array;
14
+ export declare function publicKeyThumbprintRaw(rawKey: Uint8Array): Uint8Array;
@@ -0,0 +1,77 @@
1
+ import { fail, assert, ok, err } from "./error.js";
2
+ import { base64urlDecode, base64urlEncode } from "./base64url.js";
3
+ import { sha256 } from "./ed25519.js";
4
+ import { jcsEncode } from "./jcs.js";
5
+ import { jsonDecode, strUtf8, utf8Str } from "./json.js";
6
+ import { resolve, MAXIMUM_BOUNDS } from "./bounds.js";
7
+ // Encode a raw 32-byte Ed25519 public key as the canonical OKP JCS JSON bytes.
8
+ export function jwkEncodePublic(rawKey, bounds = MAXIMUM_BOUNDS) {
9
+ assert(rawKey.length === 32, "jwk.encode_public: public key width must be 32");
10
+ const jwk = jwkFromPublicKey(rawKey);
11
+ // The encoded form is the JCS of {crv, kty, x} in lexicographic order. Build the tagged object.
12
+ const members = new Map([
13
+ ["crv", { t: "string", v: strUtf8(jwk.crv) }],
14
+ ["kty", { t: "string", v: strUtf8(jwk.kty) }],
15
+ ["x", { t: "string", v: strUtf8(jwk.x) }],
16
+ ]);
17
+ void resolve(bounds, "jcs_bytes");
18
+ return jcsEncode({ t: "object", v: members }, bounds);
19
+ }
20
+ // Decode an OKP public JWK from bytes (the JSON text). Returns the raw 32-byte key.
21
+ export function jwkDecodePublic(input, bounds = MAXIMUM_BOUNDS) {
22
+ // Decode the JSON, then validate the closed OKP shape.
23
+ try {
24
+ const value = jsonDecode(input, bounds);
25
+ if (value.t !== "object")
26
+ fail("jwk.decode_public: not an object");
27
+ const obj = value.v;
28
+ if (obj.size !== 3)
29
+ fail("jwk.decode_public: closed members");
30
+ const crv = obj.get("crv");
31
+ const kty = obj.get("kty");
32
+ const x = obj.get("x");
33
+ if (!crv || !kty || !x)
34
+ fail("jwk.decode_public: missing member");
35
+ if (crv.t !== "string" || utf8Str(crv.v) !== "Ed25519")
36
+ fail("jwk.decode_public: crv");
37
+ if (kty.t !== "string" || utf8Str(kty.v) !== "OKP")
38
+ fail("jwk.decode_public: kty");
39
+ if (x.t !== "string")
40
+ fail("jwk.decode_public: x");
41
+ const raw = base64urlDecode(x.v);
42
+ if (raw.length !== 32)
43
+ fail("jwk.decode_public: x width");
44
+ return ok(raw);
45
+ }
46
+ catch (e) {
47
+ if (e instanceof Error && e.name === "InvalidError")
48
+ return err();
49
+ throw e;
50
+ }
51
+ }
52
+ export function jwkFromPublicKey(rawKey) {
53
+ assert(rawKey.length === 32, "jwk: public key width");
54
+ return { crv: "Ed25519", kty: "OKP", x: utf8Str(base64urlEncode(rawKey)) };
55
+ }
56
+ // RFC 7638 thumbprint preimage: the JCS bytes of {crv, kty, x} (lexicographic order).
57
+ export function thumbprintPreimage(jwk) {
58
+ const members = new Map([
59
+ ["crv", { t: "string", v: strUtf8(jwk.crv) }],
60
+ ["kty", { t: "string", v: strUtf8(jwk.kty) }],
61
+ ["x", { t: "string", v: strUtf8(jwk.x) }],
62
+ ]);
63
+ return jcsEncode({ t: "object", v: members });
64
+ }
65
+ // Thumbprint as base64url SHA-256 of the preimage.
66
+ export function thumbprint(jwk) {
67
+ return utf8Str(base64urlEncode(sha256(thumbprintPreimage(jwk))));
68
+ }
69
+ // Raw 32-byte thumbprint.
70
+ export function thumbprintRaw(jwk) {
71
+ return sha256(thumbprintPreimage(jwk));
72
+ }
73
+ // Raw 32-byte thumbprint directly from a raw 32-byte public key.
74
+ export function publicKeyThumbprintRaw(rawKey) {
75
+ return thumbprintRaw(jwkFromPublicKey(rawKey));
76
+ }
77
+ //# sourceMappingURL=jwk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwk.js","sourceRoot":"","sources":["../../src/jwk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type Tagged } from "./json.js";
2
+ import { type Bounds } from "./bounds.js";
3
+ export type Selector = {
4
+ readonly kind: "all";
5
+ } | {
6
+ readonly kind: "equals";
7
+ readonly path: string[];
8
+ readonly value: Tagged;
9
+ } | {
10
+ readonly kind: "one_of";
11
+ readonly path: string[];
12
+ readonly values: Tagged[];
13
+ };
14
+ export declare function parseSelector(obj: Tagged, bounds?: Bounds): Selector;
15
+ export declare function semanticIdentity(value: Tagged): Uint8Array;
16
+ export declare function selectorMatches(sel: Selector, castArguments: Tagged): boolean;