@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.
- package/LICENSE +190 -0
- package/NOTICE +10 -0
- package/README.md +183 -0
- package/dist/src/base64url.d.ts +2 -0
- package/dist/src/base64url.js +115 -0
- package/dist/src/base64url.js.map +1 -0
- package/dist/src/bounds.d.ts +50 -0
- package/dist/src/bounds.js +114 -0
- package/dist/src/bounds.js.map +1 -0
- package/dist/src/compact.d.ts +19 -0
- package/dist/src/compact.js +111 -0
- package/dist/src/compact.js.map +1 -0
- package/dist/src/digest.d.ts +8 -0
- package/dist/src/digest.js +116 -0
- package/dist/src/digest.js.map +1 -0
- package/dist/src/ed25519.d.ts +7 -0
- package/dist/src/ed25519.js +61 -0
- package/dist/src/ed25519.js.map +1 -0
- package/dist/src/error.d.ts +15 -0
- package/dist/src/error.js +34 -0
- package/dist/src/error.js.map +1 -0
- package/dist/src/facts.d.ts +104 -0
- package/dist/src/facts.js +6 -0
- package/dist/src/facts.js.map +1 -0
- package/dist/src/index.d.ts +16 -0
- package/dist/src/index.js +31 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/jcs.d.ts +3 -0
- package/dist/src/jcs.js +285 -0
- package/dist/src/jcs.js.map +1 -0
- package/dist/src/json.d.ts +25 -0
- package/dist/src/json.js +473 -0
- package/dist/src/json.js.map +1 -0
- package/dist/src/jwk.d.ts +14 -0
- package/dist/src/jwk.js +77 -0
- package/dist/src/jwk.js.map +1 -0
- package/dist/src/selector.d.ts +16 -0
- package/dist/src/selector.js +142 -0
- package/dist/src/selector.js.map +1 -0
- package/dist/src/uri.d.ts +4 -0
- package/dist/src/uri.js +280 -0
- package/dist/src/uri.js.map +1 -0
- package/dist/src/v1.d.ts +211 -0
- package/dist/src/v1.js +2206 -0
- package/dist/src/v1.js.map +1 -0
- package/dist/src/v2.d.ts +291 -0
- package/dist/src/v2.js +2300 -0
- package/dist/src/v2.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { fail } from "./error.js";
|
|
2
|
+
import { jcsEncode } from "./jcs.js";
|
|
3
|
+
import { utf8Str } from "./json.js";
|
|
4
|
+
import { typedProject } from "./digest.js";
|
|
5
|
+
import { resolve, MAXIMUM_BOUNDS } from "./bounds.js";
|
|
6
|
+
const SELECTOR_KINDS = new Set(["all", "equals", "one_of"]);
|
|
7
|
+
const SELECTOR_MEMBER_SETS = new Set(["kind", "kind,path,value", "kind,path,values"]);
|
|
8
|
+
// Validate + parse a selector from a decoded tagged object. Rejects unknown members, bad shapes.
|
|
9
|
+
export function parseSelector(obj, bounds = MAXIMUM_BOUNDS) {
|
|
10
|
+
if (obj.t !== "object")
|
|
11
|
+
fail("selector: object");
|
|
12
|
+
const kindV = obj.v.get("kind");
|
|
13
|
+
if (!kindV || kindV.t !== "string")
|
|
14
|
+
fail("selector: kind");
|
|
15
|
+
const kind = utf8Str(kindV.v);
|
|
16
|
+
if (!SELECTOR_KINDS.has(kind))
|
|
17
|
+
fail("selector: kind closed set");
|
|
18
|
+
const memberSet = [...obj.v.keys()].sort().join(",");
|
|
19
|
+
if (!SELECTOR_MEMBER_SETS.has(memberSet))
|
|
20
|
+
fail("selector: member set");
|
|
21
|
+
// The reference accepts kind:"all" on any recognized member set. The
|
|
22
|
+
// path/value(s) are inert and need not satisfy the active-kind shapes.
|
|
23
|
+
if (kind === "all")
|
|
24
|
+
return { kind: "all" };
|
|
25
|
+
// equals / one_of need path + value/values.
|
|
26
|
+
if (kind === "equals") {
|
|
27
|
+
if (obj.v.size !== 3)
|
|
28
|
+
fail("selector: equals members");
|
|
29
|
+
const path = parsePath(obj.v.get("path"), bounds);
|
|
30
|
+
const value = obj.v.get("value") ?? fail("selector: value");
|
|
31
|
+
validateSelectorValue(value, bounds);
|
|
32
|
+
return { kind: "equals", path, value };
|
|
33
|
+
}
|
|
34
|
+
// one_of
|
|
35
|
+
if (obj.v.size !== 3)
|
|
36
|
+
fail("selector: one_of members");
|
|
37
|
+
const path = parsePath(obj.v.get("path"), bounds);
|
|
38
|
+
const valuesV = obj.v.get("values") ?? fail("selector: values");
|
|
39
|
+
if (valuesV.t !== "array")
|
|
40
|
+
fail("selector: values array");
|
|
41
|
+
if (valuesV.v.length < 1 || valuesV.v.length > resolve(bounds, "one_of_values")) {
|
|
42
|
+
fail("selector: values count");
|
|
43
|
+
}
|
|
44
|
+
const values = valuesV.v.map((v) => { validateSelectorValue(v, bounds); return v; });
|
|
45
|
+
return { kind: "one_of", path, values };
|
|
46
|
+
}
|
|
47
|
+
function parsePath(pathV, bounds) {
|
|
48
|
+
if (!pathV || pathV.t !== "array")
|
|
49
|
+
fail("selector: path array");
|
|
50
|
+
if (pathV.v.length < 1 || pathV.v.length > resolve(bounds, "path_segments")) {
|
|
51
|
+
fail("selector: path length");
|
|
52
|
+
}
|
|
53
|
+
const names = [];
|
|
54
|
+
for (const seg of pathV.v) {
|
|
55
|
+
if (seg.t !== "string")
|
|
56
|
+
fail("selector: path segment string");
|
|
57
|
+
const b = seg.v;
|
|
58
|
+
if (b.length < 1 || b.length > resolve(bounds, "key_bytes"))
|
|
59
|
+
fail("selector: path segment bytes");
|
|
60
|
+
names.push(utf8Str(b));
|
|
61
|
+
}
|
|
62
|
+
return names;
|
|
63
|
+
}
|
|
64
|
+
function validateSelectorValue(v, bounds) {
|
|
65
|
+
// Per-node bounds on selector values (depth, members, items, string, magnitude).
|
|
66
|
+
checkNode(v, 1, bounds);
|
|
67
|
+
}
|
|
68
|
+
function checkNode(v, depth, bounds) {
|
|
69
|
+
if (depth > resolve(bounds, "depth"))
|
|
70
|
+
fail("selector: value depth");
|
|
71
|
+
switch (v.t) {
|
|
72
|
+
case "string":
|
|
73
|
+
if (v.v.length > resolve(bounds, "string_bytes"))
|
|
74
|
+
fail("selector: string bytes");
|
|
75
|
+
return;
|
|
76
|
+
case "int":
|
|
77
|
+
if (Math.abs(v.v) > resolve(bounds, "integer_magnitude"))
|
|
78
|
+
fail("selector: int magnitude");
|
|
79
|
+
return;
|
|
80
|
+
case "float":
|
|
81
|
+
if (Math.abs(v.v) > resolve(bounds, "float_magnitude"))
|
|
82
|
+
fail("selector: float magnitude");
|
|
83
|
+
return;
|
|
84
|
+
case "array": {
|
|
85
|
+
if (v.v.length > resolve(bounds, "array_items"))
|
|
86
|
+
fail("selector: array items");
|
|
87
|
+
for (const item of v.v)
|
|
88
|
+
checkNode(item, depth + 1, bounds);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
case "object": {
|
|
92
|
+
if (v.v.size > resolve(bounds, "object_members"))
|
|
93
|
+
fail("selector: object members");
|
|
94
|
+
for (const [, val] of v.v)
|
|
95
|
+
checkNode(val, depth + 1, bounds);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
default: return;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Semantic identity = JCS of the typed-projected form. Returns canonical bytes for comparison.
|
|
102
|
+
export function semanticIdentity(value) {
|
|
103
|
+
return jcsEncode(typedProject(value));
|
|
104
|
+
}
|
|
105
|
+
// Traverse a path over an OBJECT (paths never index arrays). Returns the value or undefined.
|
|
106
|
+
function traversePath(root, path) {
|
|
107
|
+
let cur = root;
|
|
108
|
+
for (const name of path) {
|
|
109
|
+
if (!cur || cur.t !== "object")
|
|
110
|
+
return undefined;
|
|
111
|
+
cur = cur.v.get(name);
|
|
112
|
+
}
|
|
113
|
+
return cur;
|
|
114
|
+
}
|
|
115
|
+
// Does this selector match the given cast_arguments? equals/one_of REQUIRE the path to exist
|
|
116
|
+
// (REQ1-SELECTOR-path-required): missing path → no match (not an error).
|
|
117
|
+
export function selectorMatches(sel, castArguments) {
|
|
118
|
+
if (sel.kind === "all")
|
|
119
|
+
return true;
|
|
120
|
+
const target = traversePath(castArguments, sel.path);
|
|
121
|
+
if (target === undefined)
|
|
122
|
+
return false; // path required
|
|
123
|
+
const targetId = semanticIdentity(target);
|
|
124
|
+
if (sel.kind === "equals") {
|
|
125
|
+
return bytesEqual(semanticIdentity(sel.value), targetId);
|
|
126
|
+
}
|
|
127
|
+
// one_of
|
|
128
|
+
for (const v of sel.values) {
|
|
129
|
+
if (bytesEqual(semanticIdentity(v), targetId))
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
function bytesEqual(a, b) {
|
|
135
|
+
if (a.length !== b.length)
|
|
136
|
+
return false;
|
|
137
|
+
for (let i = 0; i < a.length; i++)
|
|
138
|
+
if (a[i] !== b[i])
|
|
139
|
+
return false;
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=selector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selector.js","sourceRoot":"","sources":["../../src/selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,OAAO,EAAe,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAe,cAAc,EAAkB,MAAM,aAAa,CAAC;AAiBnF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC5D,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,CAAC,CAAC;AAEtF,iGAAiG;AACjG,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,SAAiB,cAAc;IACxE,IAAI,GAAG,CAAC,CAAC,KAAK,QAAQ;QAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,KAAK,QAAQ;QAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrD,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC;QAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACvE,qEAAqE;IACrE,uEAAuE;IACvE,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC3C,4CAA4C;IAC5C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;YAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC5D,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACrC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACzC,CAAC;IACD,SAAS;IACT,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;QAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAChE,IAAI,OAAO,CAAC,CAAC,KAAK,OAAO;QAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAC1D,IAAI,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,eAA4B,CAAC,EAAE,CAAC;QAC7F,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACjC,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,qBAAqB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,SAAS,CAAC,KAAyB,EAAE,MAAc;IAC1D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,KAAK,OAAO;QAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAChE,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,eAA4B,CAAC,EAAE,CAAC;QACzF,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAChC,CAAC;IACD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC;QAC1B,IAAI,GAAG,CAAC,CAAC,KAAK,QAAQ;YAAE,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC9D,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAChB,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,WAAwB,CAAC;YAAE,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC/G,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,qBAAqB,CAAC,CAAS,EAAE,MAAc;IACtD,iFAAiF;IACjF,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,SAAS,CAAC,CAAS,EAAE,KAAa,EAAE,MAAc;IACzD,IAAI,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,OAAoB,CAAC;QAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACjF,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACZ,KAAK,QAAQ;YACX,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,cAA2B,CAAC;gBAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAC9F,OAAO;QACT,KAAK,KAAK;YACR,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,mBAAgC,CAAC;gBAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACvG,OAAO;QACT,KAAK,OAAO;YACV,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,iBAA8B,CAAC;gBAAE,IAAI,CAAC,2BAA2B,CAAC,CAAC;YACvG,OAAO;QACT,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,aAA0B,CAAC;gBAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAC5F,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC;gBAAE,SAAS,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,gBAA6B,CAAC;gBAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC;YAChG,KAAK,MAAM,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;gBAAE,SAAS,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QACD,OAAO,CAAC,CAAC,OAAO;IAClB,CAAC;AACH,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,6FAA6F;AAC7F,SAAS,YAAY,CAAC,IAAY,EAAE,IAAc;IAChD,IAAI,GAAG,GAAuB,IAAI,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACjD,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,6FAA6F;AAC7F,yEAAyE;AACzE,MAAM,UAAU,eAAe,CAAC,GAAa,EAAE,aAAqB;IAClE,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,CAAC,gBAAgB;IACxD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,UAAU,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC3D,CAAC;IACD,SAAS;IACT,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC3B,IAAI,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;IAC7D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,CAAa,EAAE,CAAa;IAC9C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IACnE,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type Result } from "./error.js";
|
|
2
|
+
import { type Bounds } from "./bounds.js";
|
|
3
|
+
export declare function uriNormalize(input: Uint8Array, bounds?: Bounds): Result<Uint8Array>;
|
|
4
|
+
export declare function localLoopbackHttpUriNormalize(input: Uint8Array, bounds?: Bounds): Result<Uint8Array>;
|
package/dist/src/uri.js
ADDED
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { fail, ok, err } from "./error.js";
|
|
2
|
+
import { coerceBounds, resolve, MAXIMUM_BOUNDS } from "./bounds.js";
|
|
3
|
+
import { utf8Str, strUtf8 } from "./json.js";
|
|
4
|
+
// Bounded HTTPS URI normalization (spec/bap-v1.md § URI normalization, L201-219; RFC 3986 §6).
|
|
5
|
+
// No DNS, IDNA, or network work (REQ1-URI-no-network). Both expected and proof URIs MUST already
|
|
6
|
+
// equal the normal form (REQ1-URI-pre-normalized). Reject-list: HTTP, other scheme, authority-less
|
|
7
|
+
// form, malformed percent escapes, ambiguous authority/port, control/non-ASCII, out-of-range ports
|
|
8
|
+
// (REQ1-URI-reject-list).
|
|
9
|
+
//
|
|
10
|
+
// Normalization: lowercase scheme + host; uppercase percent hex; decode only percent-encoded
|
|
11
|
+
// unreserved octets; preserve percent-encoded reserved octets as path data; remove complete dot
|
|
12
|
+
// segments; empty path → "/"; drop port 443; preserve a valid nondefault port + all other path bytes.
|
|
13
|
+
export function uriNormalize(input, bounds = MAXIMUM_BOUNDS) {
|
|
14
|
+
try {
|
|
15
|
+
return ok(strUtf8(normalize(input, coerceBounds(bounds))));
|
|
16
|
+
}
|
|
17
|
+
catch (e) {
|
|
18
|
+
if (e instanceof Error && e.name === "InvalidError")
|
|
19
|
+
return err();
|
|
20
|
+
throw e;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function localLoopbackHttpUriNormalize(input, bounds = MAXIMUM_BOUNDS) {
|
|
24
|
+
try {
|
|
25
|
+
return ok(strUtf8(normalizeLocalLoopbackHttp(input, coerceBounds(bounds))));
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
if (e instanceof Error && e.name === "InvalidError")
|
|
29
|
+
return err();
|
|
30
|
+
throw e;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function normalizeLocalLoopbackHttp(input, bounds) {
|
|
34
|
+
if (input.length > resolve(bounds, "uri_bytes"))
|
|
35
|
+
fail("uri: byte bound");
|
|
36
|
+
const uri = utf8Str(input);
|
|
37
|
+
if (!bytesEqualUtf8(input, uri) || !/^[\x21-\x7E]+$/.test(uri))
|
|
38
|
+
fail("uri: ASCII");
|
|
39
|
+
const match = /^([A-Za-z][A-Za-z0-9+.-]*):\/\/([^/?#]*)([^?#]*)$/.exec(uri);
|
|
40
|
+
if (match === null || match[1].toLowerCase() !== "http")
|
|
41
|
+
fail("uri: scheme");
|
|
42
|
+
const authorityMatch = /^(127\.0\.0\.1|\[::1\])(?::([0-9]+))?$/.exec(match[2]);
|
|
43
|
+
if (authorityMatch === null)
|
|
44
|
+
fail("uri: loopback authority");
|
|
45
|
+
const host = authorityMatch[1];
|
|
46
|
+
let port = "";
|
|
47
|
+
if (authorityMatch[2] !== undefined) {
|
|
48
|
+
const value = Number(authorityMatch[2]);
|
|
49
|
+
if (!Number.isSafeInteger(value) || value < 1 || value > 65535)
|
|
50
|
+
fail("uri: port");
|
|
51
|
+
if (value !== 80)
|
|
52
|
+
port = `:${value}`;
|
|
53
|
+
}
|
|
54
|
+
const normalized = `http://${host}${port}${normalizePath(match[3], true)}`;
|
|
55
|
+
if (strUtf8(normalized).length > resolve(bounds, "uri_bytes"))
|
|
56
|
+
fail("uri: byte bound");
|
|
57
|
+
return normalized;
|
|
58
|
+
}
|
|
59
|
+
function normalize(input, bounds) {
|
|
60
|
+
if (input.length > resolve(bounds, "uri_bytes"))
|
|
61
|
+
fail("uri: byte bound");
|
|
62
|
+
const uri = utf8Str(input);
|
|
63
|
+
// UTF-8 validity (re-encode check) + ASCII-only (REQ1-URI-reject-list: control/non-ASCII invalid).
|
|
64
|
+
if (!bytesEqualUtf8(input, uri))
|
|
65
|
+
fail("uri: UTF-8");
|
|
66
|
+
if (!/^[\x21-\x7E]+$/.test(uri))
|
|
67
|
+
fail("uri: ASCII");
|
|
68
|
+
const match = /^([A-Za-z][A-Za-z0-9+.-]*):\/\/([^/?#]*)([^?#]*)$/.exec(uri);
|
|
69
|
+
if (match === null)
|
|
70
|
+
fail("uri: hierarchical shape");
|
|
71
|
+
if (match[1].toLowerCase() !== "https")
|
|
72
|
+
fail("uri: scheme");
|
|
73
|
+
const authority = match[2];
|
|
74
|
+
if (authority.length === 0 || authority.includes("@"))
|
|
75
|
+
fail("uri: authority");
|
|
76
|
+
let host = "";
|
|
77
|
+
let port = "";
|
|
78
|
+
if (authority.startsWith("[")) {
|
|
79
|
+
const close = authority.indexOf("]");
|
|
80
|
+
if (close <= 1)
|
|
81
|
+
fail("uri: IPv6 host");
|
|
82
|
+
const literal = authority.slice(1, close);
|
|
83
|
+
const kind = ipv6Kind(literal);
|
|
84
|
+
if (kind === null)
|
|
85
|
+
fail("uri: IP-literal syntax");
|
|
86
|
+
host = kind === "future" ? `[${literal}]` : `[${literal.toLowerCase()}]`;
|
|
87
|
+
const suffix = authority.slice(close + 1);
|
|
88
|
+
if (suffix !== "" && !/^:\d+$/.test(suffix))
|
|
89
|
+
fail("uri: IPv6 port");
|
|
90
|
+
port = suffix.slice(1);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
const colonCount = (authority.match(/:/g) ?? []).length;
|
|
94
|
+
if (colonCount > 1)
|
|
95
|
+
fail("uri: host/port ambiguity");
|
|
96
|
+
const separator = authority.lastIndexOf(":");
|
|
97
|
+
if (separator >= 0) {
|
|
98
|
+
host = authority.slice(0, separator);
|
|
99
|
+
port = authority.slice(separator + 1);
|
|
100
|
+
if (port.length === 0)
|
|
101
|
+
fail("uri: empty port");
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
host = authority;
|
|
105
|
+
}
|
|
106
|
+
if (host.length === 0)
|
|
107
|
+
fail("uri: host");
|
|
108
|
+
if (/^[0-9.]+$/.test(host)) {
|
|
109
|
+
if (!isCanonicalIpv4(host))
|
|
110
|
+
fail("uri: IPv4 syntax");
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
assertRegName(host);
|
|
114
|
+
host = lowercaseOutsideEscapes(normalizePercentEncoding(host));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (port !== "") {
|
|
118
|
+
if (!/^\d+$/.test(port))
|
|
119
|
+
fail("uri: port");
|
|
120
|
+
const portNumber = Number(port);
|
|
121
|
+
if (portNumber < 1 || portNumber > 65535)
|
|
122
|
+
fail("uri: port range");
|
|
123
|
+
port = portNumber === 443 ? "" : `:${portNumber}`;
|
|
124
|
+
}
|
|
125
|
+
return `https://${host}${port}${normalizePath(match[3], true)}`;
|
|
126
|
+
}
|
|
127
|
+
function normalizePath(path, enforcePchar = false) {
|
|
128
|
+
const raw = path === "" ? "/" : path;
|
|
129
|
+
if (enforcePchar) {
|
|
130
|
+
for (const ch of raw) {
|
|
131
|
+
if (ch !== "%" && !/[A-Za-z0-9\-._~!$&'()*+,;=:@/]/.test(ch))
|
|
132
|
+
fail("uri: path character");
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const normalized = removeDotSegments(normalizePercentEncoding(raw));
|
|
136
|
+
if (!normalized.startsWith("/"))
|
|
137
|
+
fail("uri: absolute path");
|
|
138
|
+
return normalized;
|
|
139
|
+
}
|
|
140
|
+
function bytesEqualUtf8(bytes, s) {
|
|
141
|
+
return strUtf8(s).length === bytes.length && strUtf8(s).every((b, i) => b === bytes[i]);
|
|
142
|
+
}
|
|
143
|
+
function isCanonicalIpv4(host) {
|
|
144
|
+
const octets = host.split(".");
|
|
145
|
+
return (octets.length === 4 &&
|
|
146
|
+
octets.every((o) => /^(?:0|[1-9]\d{0,2})$/.test(o) && Number(o) <= 255));
|
|
147
|
+
}
|
|
148
|
+
const REG_NAME_CHAR = /[A-Za-z0-9\-._~!$&'()*+,;=]/;
|
|
149
|
+
function assertRegName(host) {
|
|
150
|
+
for (let i = 0; i < host.length; i++) {
|
|
151
|
+
const ch = host[i];
|
|
152
|
+
if (REG_NAME_CHAR.test(ch))
|
|
153
|
+
continue;
|
|
154
|
+
if (ch === "%" &&
|
|
155
|
+
i + 2 < host.length &&
|
|
156
|
+
/^[0-9A-Fa-f]{2}$/.test(host.slice(i + 1, i + 3))) {
|
|
157
|
+
i += 2;
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
fail("uri: reg-name");
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const UNRESERVED = /[A-Za-z0-9\-._~]/;
|
|
164
|
+
function normalizePercentEncoding(value) {
|
|
165
|
+
let result = "";
|
|
166
|
+
for (let i = 0; i < value.length; i++) {
|
|
167
|
+
if (value[i] !== "%") {
|
|
168
|
+
result += value[i];
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
if (i + 2 >= value.length || !/^[0-9A-Fa-f]{2}$/.test(value.slice(i + 1, i + 3))) {
|
|
172
|
+
fail("uri: escape");
|
|
173
|
+
}
|
|
174
|
+
const octet = Number.parseInt(value.slice(i + 1, i + 3), 16);
|
|
175
|
+
const ch = String.fromCharCode(octet);
|
|
176
|
+
result += UNRESERVED.test(ch)
|
|
177
|
+
? ch
|
|
178
|
+
: `%${octet.toString(16).toUpperCase().padStart(2, "0")}`;
|
|
179
|
+
i += 2;
|
|
180
|
+
}
|
|
181
|
+
return result;
|
|
182
|
+
}
|
|
183
|
+
function lowercaseOutsideEscapes(value) {
|
|
184
|
+
let result = "";
|
|
185
|
+
for (let i = 0; i < value.length; i++) {
|
|
186
|
+
if (value[i] === "%") {
|
|
187
|
+
result += value.slice(i, i + 3);
|
|
188
|
+
i += 2;
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
result += value[i].toLowerCase();
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return result;
|
|
195
|
+
}
|
|
196
|
+
// RFC 3986 §6.2.2.3 dot-segment removal (the canonical algorithm).
|
|
197
|
+
function removeDotSegments(path) {
|
|
198
|
+
let input = path;
|
|
199
|
+
let output = "";
|
|
200
|
+
while (input.length > 0) {
|
|
201
|
+
if (input.startsWith("../"))
|
|
202
|
+
input = input.slice(3);
|
|
203
|
+
else if (input.startsWith("./"))
|
|
204
|
+
input = input.slice(2);
|
|
205
|
+
else if (input.startsWith("/./"))
|
|
206
|
+
input = input.slice(2);
|
|
207
|
+
else if (input === "/.")
|
|
208
|
+
input = "/";
|
|
209
|
+
else if (input.startsWith("/../")) {
|
|
210
|
+
input = input.slice(3);
|
|
211
|
+
output = output.replace(/\/?[^/]*$/, "");
|
|
212
|
+
}
|
|
213
|
+
else if (input === "/..") {
|
|
214
|
+
input = "/";
|
|
215
|
+
output = output.replace(/\/?[^/]*$/, "");
|
|
216
|
+
}
|
|
217
|
+
else if (input === "." || input === "..") {
|
|
218
|
+
input = "";
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
const startAt = input.startsWith("/") ? 1 : 0;
|
|
222
|
+
const nextSlash = input.indexOf("/", startAt);
|
|
223
|
+
const end = nextSlash === -1 ? input.length : nextSlash;
|
|
224
|
+
output += input.slice(0, end);
|
|
225
|
+
input = input.slice(end);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return output;
|
|
229
|
+
}
|
|
230
|
+
function ipv6Kind(literal) {
|
|
231
|
+
if (/^[0-9A-Fa-f:.]+$/.test(literal) && validIpv6Literal(literal))
|
|
232
|
+
return 6;
|
|
233
|
+
if (/^v[0-9A-Fa-f]+\.[A-Za-z0-9._~!$&'()*+,;=:-]+$/.test(literal))
|
|
234
|
+
return "future";
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
// Structural IPv6 validation mirroring the reference (uri.ex:181-226 valid_ipv6_literal? /
|
|
238
|
+
// ipv6_side_length / ipv6_groups_length). Rejects malformed literals like ":::", "1:2:3:4:5:6:7:8:9"
|
|
239
|
+
// (too many groups), and a "::" that does not actually compress (< 8 groups required). The prior
|
|
240
|
+
// implementation only checked the character class, so structurally-invalid literals normalized.
|
|
241
|
+
function validIpv6Literal(literal) {
|
|
242
|
+
const parts = literal.split("::");
|
|
243
|
+
if (parts.length === 1) {
|
|
244
|
+
return ipv6SideLength(parts[0]) === 8;
|
|
245
|
+
}
|
|
246
|
+
if (parts.length === 2) {
|
|
247
|
+
const left = ipv6SideLength(parts[0]);
|
|
248
|
+
const right = ipv6SideLength(parts[1]);
|
|
249
|
+
if (left === null || right === null)
|
|
250
|
+
return false;
|
|
251
|
+
return left + right < 8;
|
|
252
|
+
}
|
|
253
|
+
return false; // multiple "::" compressions
|
|
254
|
+
}
|
|
255
|
+
// Count groups on one side of "::". Returns null if any group is malformed.
|
|
256
|
+
function ipv6SideLength(side) {
|
|
257
|
+
if (side === "")
|
|
258
|
+
return 0;
|
|
259
|
+
const groups = side.split(":");
|
|
260
|
+
let total = 0;
|
|
261
|
+
for (let i = 0; i < groups.length; i++) {
|
|
262
|
+
const group = groups[i];
|
|
263
|
+
const isLast = i === groups.length - 1;
|
|
264
|
+
if (group.includes(".")) {
|
|
265
|
+
// An IPv4-style group is valid ONLY in the tail position (reference ipv6_groups_length checks
|
|
266
|
+
// non-last groups as hex-only via valid_hex_group?). A non-tail IPv4 group is a malformed
|
|
267
|
+
// literal the reference rejects.
|
|
268
|
+
if (!isLast || !isCanonicalIpv4(group))
|
|
269
|
+
return null;
|
|
270
|
+
total += 2;
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
if (!(group.length >= 1 && group.length <= 4) || !/^[0-9A-Fa-f]+$/.test(group))
|
|
274
|
+
return null;
|
|
275
|
+
total += 1;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return total;
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=uri.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uri.js","sourceRoot":"","sources":["../../src/uri.ts"],"names":[],"mappings":"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"}
|
package/dist/src/v1.d.ts
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { type Result } from "./error.js";
|
|
2
|
+
import { type Tagged } from "./json.js";
|
|
3
|
+
import { base64urlDecode, base64urlEncode } from "./base64url.js";
|
|
4
|
+
import { type SigningInput } from "./compact.js";
|
|
5
|
+
import { jwkEncodePublic, jwkDecodePublic, thumbprint } from "./jwk.js";
|
|
6
|
+
import { sha256 } from "./ed25519.js";
|
|
7
|
+
import { REQUEST_PREFIX, typedProject } from "./digest.js";
|
|
8
|
+
import { parseSelector, selectorMatches, type Selector } from "./selector.js";
|
|
9
|
+
import { uriNormalize } from "./uri.js";
|
|
10
|
+
import { boundsNew, boundsMaximum, MAXIMUM_BOUNDS, MAXIMA, type Bounds, type MaximaKey } from "./bounds.js";
|
|
11
|
+
import type { GrantFacts, EnvelopeFacts, ChainFacts, AnchorFacts, KeyTransitionFacts, AnchoredExportFacts, GrantDecoded, ProofDecoded, KeyLocator } from "./facts.js";
|
|
12
|
+
export declare const ROW_PREFIX: Uint8Array<ArrayBuffer>;
|
|
13
|
+
export declare const ARCHIVE_PREFIX: Uint8Array<ArrayBufferLike>;
|
|
14
|
+
export interface TrustedIssuer {
|
|
15
|
+
readonly keyId: string;
|
|
16
|
+
readonly publicKey: Uint8Array;
|
|
17
|
+
}
|
|
18
|
+
export interface ExpectedGrant {
|
|
19
|
+
readonly issuer: string;
|
|
20
|
+
readonly audience: string;
|
|
21
|
+
readonly evaluationTime: number;
|
|
22
|
+
readonly clockSkew: number;
|
|
23
|
+
readonly bounds?: Bounds;
|
|
24
|
+
}
|
|
25
|
+
export interface HistoricalPublicKey {
|
|
26
|
+
readonly keyId: string;
|
|
27
|
+
readonly publicKey: Uint8Array;
|
|
28
|
+
readonly validFrom: number;
|
|
29
|
+
readonly validBefore: number | null;
|
|
30
|
+
}
|
|
31
|
+
export interface ExpectedAnchor {
|
|
32
|
+
readonly anchorId: string;
|
|
33
|
+
readonly anchoredAt: number;
|
|
34
|
+
readonly chainId: string;
|
|
35
|
+
readonly sequence: number;
|
|
36
|
+
readonly chainHash: Uint8Array;
|
|
37
|
+
readonly keyId: string;
|
|
38
|
+
readonly keyFingerprint: Uint8Array;
|
|
39
|
+
readonly bounds?: Bounds;
|
|
40
|
+
}
|
|
41
|
+
export interface ExpectedKeyTransition {
|
|
42
|
+
readonly transitionId: string;
|
|
43
|
+
readonly chainId: string;
|
|
44
|
+
readonly effectiveAt: number;
|
|
45
|
+
readonly currentKeyId: string;
|
|
46
|
+
readonly currentKeyFingerprint: Uint8Array;
|
|
47
|
+
readonly nextKeyId: string;
|
|
48
|
+
readonly nextKeyFingerprint: Uint8Array;
|
|
49
|
+
readonly bounds?: Bounds;
|
|
50
|
+
}
|
|
51
|
+
export interface ConsumptionEntry {
|
|
52
|
+
readonly chainId: string;
|
|
53
|
+
readonly sequence: number;
|
|
54
|
+
readonly previousHash: Uint8Array;
|
|
55
|
+
readonly commitment: Uint8Array;
|
|
56
|
+
}
|
|
57
|
+
export interface ChainInput {
|
|
58
|
+
readonly rows: Uint8Array[];
|
|
59
|
+
readonly chainId: string;
|
|
60
|
+
readonly firstSequence: number;
|
|
61
|
+
readonly lastSequence: number;
|
|
62
|
+
readonly rowCount: number;
|
|
63
|
+
readonly previousHash: Uint8Array;
|
|
64
|
+
readonly lastHash: Uint8Array;
|
|
65
|
+
}
|
|
66
|
+
export interface ExpectedChain {
|
|
67
|
+
readonly chainId: string;
|
|
68
|
+
readonly firstSequence: number;
|
|
69
|
+
readonly lastSequence: number;
|
|
70
|
+
readonly rowCount: number;
|
|
71
|
+
readonly previousHash: Uint8Array;
|
|
72
|
+
readonly lastHash: Uint8Array;
|
|
73
|
+
readonly bounds?: Bounds;
|
|
74
|
+
}
|
|
75
|
+
export interface ExpectedRequest {
|
|
76
|
+
readonly trustedIssuer: TrustedIssuer;
|
|
77
|
+
readonly issuer: string;
|
|
78
|
+
readonly audience: string;
|
|
79
|
+
readonly method: string;
|
|
80
|
+
readonly targetUri: string;
|
|
81
|
+
readonly invocationId: string;
|
|
82
|
+
readonly operation: string;
|
|
83
|
+
readonly castArguments: Tagged;
|
|
84
|
+
readonly evaluationTime: number;
|
|
85
|
+
readonly clockSkew: number;
|
|
86
|
+
readonly proofMaxAge: number;
|
|
87
|
+
readonly nonce: {
|
|
88
|
+
kind: "not_required";
|
|
89
|
+
} | {
|
|
90
|
+
kind: "required";
|
|
91
|
+
value: string;
|
|
92
|
+
};
|
|
93
|
+
readonly bounds?: Bounds;
|
|
94
|
+
}
|
|
95
|
+
export type SelectorInput = "all" | {
|
|
96
|
+
readonly kind: "all";
|
|
97
|
+
} | {
|
|
98
|
+
readonly kind: "equals";
|
|
99
|
+
readonly path: string[];
|
|
100
|
+
readonly value: Tagged;
|
|
101
|
+
} | {
|
|
102
|
+
readonly kind: "one_of";
|
|
103
|
+
readonly path: string[];
|
|
104
|
+
readonly values: Tagged[];
|
|
105
|
+
};
|
|
106
|
+
export interface OperationInput {
|
|
107
|
+
readonly name: string;
|
|
108
|
+
readonly selectors: SelectorInput[];
|
|
109
|
+
}
|
|
110
|
+
export interface GrantProducer {
|
|
111
|
+
readonly keyId: string;
|
|
112
|
+
readonly issuer: string;
|
|
113
|
+
readonly grantId: string;
|
|
114
|
+
readonly audiences: string[];
|
|
115
|
+
readonly issuedAt: number;
|
|
116
|
+
readonly notBefore: number;
|
|
117
|
+
readonly expiresAt: number;
|
|
118
|
+
readonly holderThumbprint: string;
|
|
119
|
+
readonly operations: OperationInput[];
|
|
120
|
+
}
|
|
121
|
+
export interface ProofProducer {
|
|
122
|
+
readonly holderPublicKey: Uint8Array;
|
|
123
|
+
readonly proofId: string;
|
|
124
|
+
readonly method: string;
|
|
125
|
+
readonly targetUri: string;
|
|
126
|
+
readonly issuedAt: number;
|
|
127
|
+
readonly invocationId: string;
|
|
128
|
+
readonly operation: string;
|
|
129
|
+
readonly grantCompact: Uint8Array;
|
|
130
|
+
readonly castArguments: Tagged;
|
|
131
|
+
readonly nonce?: string;
|
|
132
|
+
}
|
|
133
|
+
export interface BoundaryAnchorProducer {
|
|
134
|
+
readonly anchorId: string;
|
|
135
|
+
readonly anchoredAt: number;
|
|
136
|
+
readonly chainId: string;
|
|
137
|
+
readonly sequence: number;
|
|
138
|
+
readonly chainHash: Uint8Array;
|
|
139
|
+
readonly keyId: string;
|
|
140
|
+
readonly publicKey: Uint8Array;
|
|
141
|
+
}
|
|
142
|
+
export interface KeyTransitionProducer {
|
|
143
|
+
readonly transitionId: string;
|
|
144
|
+
readonly chainId: string;
|
|
145
|
+
readonly effectiveAt: number;
|
|
146
|
+
readonly currentKeyId: string;
|
|
147
|
+
readonly currentPublicKey: Uint8Array;
|
|
148
|
+
readonly nextKeyId: string;
|
|
149
|
+
readonly nextPublicKey: Uint8Array;
|
|
150
|
+
}
|
|
151
|
+
export interface AnchoredExportInput {
|
|
152
|
+
readonly rows: Uint8Array[];
|
|
153
|
+
readonly startAnchor: Uint8Array;
|
|
154
|
+
readonly endAnchor: Uint8Array;
|
|
155
|
+
readonly transitions: Uint8Array[];
|
|
156
|
+
readonly chainId: string;
|
|
157
|
+
readonly firstSequence: number;
|
|
158
|
+
readonly lastSequence: number;
|
|
159
|
+
readonly rowCount: number;
|
|
160
|
+
readonly previousHash: Uint8Array;
|
|
161
|
+
readonly lastHash: Uint8Array;
|
|
162
|
+
}
|
|
163
|
+
export interface ExpectedExport {
|
|
164
|
+
readonly chain: ExpectedChain;
|
|
165
|
+
readonly digest: Uint8Array;
|
|
166
|
+
readonly startAnchor: ExpectedAnchor;
|
|
167
|
+
readonly endAnchor: ExpectedAnchor;
|
|
168
|
+
readonly transitions: ExpectedKeyTransition[];
|
|
169
|
+
readonly objectVersion: string;
|
|
170
|
+
readonly bounds?: Bounds;
|
|
171
|
+
}
|
|
172
|
+
export interface ArchivedObject {
|
|
173
|
+
readonly chunks: Uint8Array[];
|
|
174
|
+
readonly version: string;
|
|
175
|
+
}
|
|
176
|
+
export interface HistoricalKeyChain {
|
|
177
|
+
readonly keys: HistoricalPublicKey[];
|
|
178
|
+
}
|
|
179
|
+
export declare function untrustedKeyLocator(compact: Uint8Array, bounds?: Bounds): Result<KeyLocator>;
|
|
180
|
+
export declare function decodeGrant(compact: Uint8Array, bounds?: Bounds): Result<GrantDecoded>;
|
|
181
|
+
export declare function decodeProof(compact: Uint8Array, bounds?: Bounds): Result<ProofDecoded>;
|
|
182
|
+
export declare function decodeLocalLoopbackHttpProof(compact: Uint8Array, bounds?: Bounds): Result<ProofDecoded>;
|
|
183
|
+
export declare function verifyGrant(compact: Uint8Array, trusted: TrustedIssuer, expected: ExpectedGrant): Result<GrantFacts>;
|
|
184
|
+
export declare function checkEnvelope(grantCompact: Uint8Array, proofCompact: Uint8Array, expected: ExpectedRequest): Result<EnvelopeFacts>;
|
|
185
|
+
export declare function checkLocalLoopbackHttpEnvelope(grantCompact: Uint8Array, proofCompact: Uint8Array, expected: ExpectedRequest): Result<EnvelopeFacts>;
|
|
186
|
+
export declare function requestDigest(operation: string, castArguments: Tagged, bounds?: Bounds): Result<Uint8Array>;
|
|
187
|
+
export interface EncodedConsumptionEntry {
|
|
188
|
+
readonly bytes: Uint8Array;
|
|
189
|
+
readonly hash: Uint8Array;
|
|
190
|
+
}
|
|
191
|
+
export declare function encodeConsumptionEntry(entry: ConsumptionEntry, bounds?: Bounds): Result<EncodedConsumptionEntry>;
|
|
192
|
+
export declare function checkChain(chain: ChainInput, expected: ExpectedChain): Result<ChainFacts>;
|
|
193
|
+
export declare function grantSigningInput(grant: GrantProducer, bounds?: Bounds): Result<SigningInput>;
|
|
194
|
+
export declare function proofSigningInput(proof: ProofProducer, bounds?: Bounds): Result<SigningInput>;
|
|
195
|
+
export declare function localLoopbackHttpProofSigningInput(proof: ProofProducer, bounds?: Bounds): Result<SigningInput>;
|
|
196
|
+
export declare function assembleCompact(input: SigningInput, signature: Uint8Array, bounds?: Bounds): Result<Uint8Array>;
|
|
197
|
+
export declare function assembleLocalLoopbackHttpCompact(input: SigningInput, signature: Uint8Array, bounds?: Bounds): Result<Uint8Array>;
|
|
198
|
+
export declare function boundaryAnchorSigningInput(anchor: BoundaryAnchorProducer, bounds?: Bounds): Result<SigningInput>;
|
|
199
|
+
export declare function keyTransitionSigningInput(t: KeyTransitionProducer, bounds?: Bounds): Result<SigningInput>;
|
|
200
|
+
export interface EncodedAnchoredExport {
|
|
201
|
+
readonly archive: Uint8Array;
|
|
202
|
+
readonly digest: Uint8Array;
|
|
203
|
+
}
|
|
204
|
+
export declare function encodeAnchoredExport(input: AnchoredExportInput, expected: ExpectedExport): Result<EncodedAnchoredExport>;
|
|
205
|
+
export declare function verifyHistoricalAnchor(compact: Uint8Array, key: HistoricalPublicKey, expected: ExpectedAnchor): Result<AnchorFacts>;
|
|
206
|
+
export declare function verifyKeyTransition(compact: Uint8Array, oldKey: HistoricalPublicKey, newKey: HistoricalPublicKey, expected: ExpectedKeyTransition): Result<KeyTransitionFacts>;
|
|
207
|
+
export declare function verifyAnchoredExport(archived: ArchivedObject, keyChain: HistoricalKeyChain, expected: ExpectedExport): Result<AnchoredExportFacts>;
|
|
208
|
+
export { jwkEncodePublic, jwkDecodePublic, thumbprint, sha256, base64urlDecode, base64urlEncode };
|
|
209
|
+
export { boundsNew, boundsMaximum, MAXIMUM_BOUNDS, MAXIMA };
|
|
210
|
+
export { uriNormalize, parseSelector, selectorMatches, typedProject, REQUEST_PREFIX };
|
|
211
|
+
export type { Bounds, SigningInput, Selector, MaximaKey };
|