@grantex/sdk 0.6.0 → 0.7.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 +185 -185
- package/NOTICE +16 -16
- package/README.md +974 -947
- package/dist/authorization-details.d.ts +86 -0
- package/dist/authorization-details.d.ts.map +1 -0
- package/dist/authorization-details.js +209 -0
- package/dist/authorization-details.js.map +1 -0
- package/dist/canonical.d.ts +47 -0
- package/dist/canonical.d.ts.map +1 -0
- package/dist/canonical.js +163 -0
- package/dist/canonical.js.map +1 -0
- package/dist/caps/index.d.ts +19 -0
- package/dist/caps/index.d.ts.map +1 -0
- package/dist/caps/index.js +19 -0
- package/dist/caps/index.js.map +1 -0
- package/dist/caps/limits.d.ts +40 -0
- package/dist/caps/limits.d.ts.map +1 -0
- package/dist/caps/limits.js +109 -0
- package/dist/caps/limits.js.map +1 -0
- package/dist/caps/memory.d.ts +15 -0
- package/dist/caps/memory.d.ts.map +1 -0
- package/dist/caps/memory.js +57 -0
- package/dist/caps/memory.js.map +1 -0
- package/dist/caps/meter.d.ts +107 -0
- package/dist/caps/meter.d.ts.map +1 -0
- package/dist/caps/meter.js +200 -0
- package/dist/caps/meter.js.map +1 -0
- package/dist/caps/postgres.d.ts +64 -0
- package/dist/caps/postgres.d.ts.map +1 -0
- package/dist/caps/postgres.js +221 -0
- package/dist/caps/postgres.js.map +1 -0
- package/dist/caps/redis.d.ts +45 -0
- package/dist/caps/redis.d.ts.map +1 -0
- package/dist/caps/redis.js +173 -0
- package/dist/caps/redis.js.map +1 -0
- package/dist/client.d.ts +12 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +517 -57
- package/dist/client.js.map +1 -1
- package/dist/decisions/action.d.ts +51 -0
- package/dist/decisions/action.d.ts.map +1 -0
- package/dist/decisions/action.js +237 -0
- package/dist/decisions/action.js.map +1 -0
- package/dist/decisions/index.d.ts +11 -0
- package/dist/decisions/index.d.ts.map +1 -0
- package/dist/decisions/index.js +8 -0
- package/dist/decisions/index.js.map +1 -0
- package/dist/decisions/verify.d.ts +103 -0
- package/dist/decisions/verify.d.ts.map +1 -0
- package/dist/decisions/verify.js +277 -0
- package/dist/decisions/verify.js.map +1 -0
- package/dist/denials.d.ts +132 -0
- package/dist/denials.d.ts.map +1 -0
- package/dist/denials.js +129 -0
- package/dist/denials.js.map +1 -0
- package/dist/evidence/build.d.ts +63 -0
- package/dist/evidence/build.d.ts.map +1 -0
- package/dist/evidence/build.js +201 -0
- package/dist/evidence/build.js.map +1 -0
- package/dist/evidence/canonical.d.ts +3 -0
- package/dist/evidence/canonical.d.ts.map +1 -0
- package/dist/evidence/canonical.js +3 -0
- package/dist/evidence/canonical.js.map +1 -0
- package/dist/evidence/checks.d.ts +13 -0
- package/dist/evidence/checks.d.ts.map +1 -0
- package/dist/evidence/checks.js +406 -0
- package/dist/evidence/checks.js.map +1 -0
- package/dist/evidence/document.d.ts +8 -0
- package/dist/evidence/document.d.ts.map +1 -0
- package/dist/evidence/document.js +298 -0
- package/dist/evidence/document.js.map +1 -0
- package/dist/evidence/hashing.d.ts +37 -0
- package/dist/evidence/hashing.d.ts.map +1 -0
- package/dist/evidence/hashing.js +106 -0
- package/dist/evidence/hashing.js.map +1 -0
- package/dist/evidence/index.d.ts +24 -0
- package/dist/evidence/index.d.ts.map +1 -0
- package/dist/evidence/index.js +24 -0
- package/dist/evidence/index.js.map +1 -0
- package/dist/evidence/result.d.ts +88 -0
- package/dist/evidence/result.d.ts.map +1 -0
- package/dist/evidence/result.js +88 -0
- package/dist/evidence/result.js.map +1 -0
- package/dist/evidence/schema-1.0.d.ts +2 -0
- package/dist/evidence/schema-1.0.d.ts.map +1 -0
- package/dist/evidence/schema-1.0.js +1398 -0
- package/dist/evidence/schema-1.0.js.map +1 -0
- package/dist/evidence/schema.d.ts +13 -0
- package/dist/evidence/schema.d.ts.map +1 -0
- package/dist/evidence/schema.js +264 -0
- package/dist/evidence/schema.js.map +1 -0
- package/dist/evidence/signature.d.ts +23 -0
- package/dist/evidence/signature.d.ts.map +1 -0
- package/dist/evidence/signature.js +136 -0
- package/dist/evidence/signature.js.map +1 -0
- package/dist/evidence/trace.d.ts +23 -0
- package/dist/evidence/trace.d.ts.map +1 -0
- package/dist/evidence/trace.js +69 -0
- package/dist/evidence/trace.js.map +1 -0
- package/dist/evidence/verify.d.ts +29 -0
- package/dist/evidence/verify.d.ts.map +1 -0
- package/dist/evidence/verify.js +163 -0
- package/dist/evidence/verify.js.map +1 -0
- package/dist/http.d.ts +12 -1
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +11 -5
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +16 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -2
- package/dist/index.js.map +1 -1
- package/dist/manifest.d.ts +178 -9
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +379 -16
- package/dist/manifest.js.map +1 -1
- package/dist/purpose.d.ts +29 -0
- package/dist/purpose.d.ts.map +1 -0
- package/dist/purpose.js +60 -0
- package/dist/purpose.js.map +1 -0
- package/dist/resources/agents.js +3 -3
- package/dist/resources/agents.js.map +1 -1
- package/dist/resources/anomalies.d.ts +3 -1
- package/dist/resources/anomalies.d.ts.map +1 -1
- package/dist/resources/anomalies.js +7 -1
- package/dist/resources/anomalies.js.map +1 -1
- package/dist/resources/audit.js +1 -1
- package/dist/resources/audit.js.map +1 -1
- package/dist/resources/budgets.js +2 -2
- package/dist/resources/budgets.js.map +1 -1
- package/dist/resources/credentials.js +1 -1
- package/dist/resources/credentials.js.map +1 -1
- package/dist/resources/decisions.d.ts +69 -0
- package/dist/resources/decisions.d.ts.map +1 -0
- package/dist/resources/decisions.js +115 -0
- package/dist/resources/decisions.js.map +1 -0
- package/dist/resources/domains.js +2 -2
- package/dist/resources/domains.js.map +1 -1
- package/dist/resources/dpdp.js +4 -4
- package/dist/resources/dpdp.js.map +1 -1
- package/dist/resources/grants.js +2 -2
- package/dist/resources/grants.js.map +1 -1
- package/dist/resources/policies.js +3 -3
- package/dist/resources/policies.js.map +1 -1
- package/dist/resources/scim.js +5 -5
- package/dist/resources/scim.js.map +1 -1
- package/dist/resources/tokens.d.ts.map +1 -1
- package/dist/resources/tokens.js +5 -1
- package/dist/resources/tokens.js.map +1 -1
- package/dist/resources/vault.js +2 -2
- package/dist/resources/vault.js.map +1 -1
- package/dist/resources/webauthn.d.ts +6 -1
- package/dist/resources/webauthn.d.ts.map +1 -1
- package/dist/resources/webauthn.js +5 -1
- package/dist/resources/webauthn.js.map +1 -1
- package/dist/resources/webhooks.js +1 -1
- package/dist/resources/webhooks.js.map +1 -1
- package/dist/revocations/feed.d.ts +61 -0
- package/dist/revocations/feed.d.ts.map +1 -0
- package/dist/revocations/feed.js +282 -0
- package/dist/revocations/feed.js.map +1 -0
- package/dist/revocations/index.d.ts +20 -0
- package/dist/revocations/index.d.ts.map +1 -0
- package/dist/revocations/index.js +19 -0
- package/dist/revocations/index.js.map +1 -0
- package/dist/revocations/set.d.ts +59 -0
- package/dist/revocations/set.d.ts.map +1 -0
- package/dist/revocations/set.js +87 -0
- package/dist/revocations/set.js.map +1 -0
- package/dist/scopes.d.ts +26 -0
- package/dist/scopes.d.ts.map +1 -0
- package/dist/scopes.js +37 -0
- package/dist/scopes.js.map +1 -0
- package/dist/types.d.ts +121 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -1
- package/dist/types.js.map +1 -1
- package/dist/verify.d.ts +31 -2
- package/dist/verify.d.ts.map +1 -1
- package/dist/verify.js +236 -29
- package/dist/verify.js.map +1 -1
- package/package.json +92 -84
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strict parsing of evidence package bytes.
|
|
3
|
+
*
|
|
4
|
+
* A package is valid only as its own RFC 8785 canonical form (optionally
|
|
5
|
+
* followed by one line feed). Anything a JSON parser would silently resolve -
|
|
6
|
+
* a duplicate member, a byte-order mark, whitespace, another spelling of a
|
|
7
|
+
* number - is refused, so every byte of a package is significant. The parser
|
|
8
|
+
* accepts exactly the JSON text Python's `json.loads` accepts, so both SDKs
|
|
9
|
+
* reach the same verdict.
|
|
10
|
+
*/
|
|
11
|
+
import { CanonicalizationError, canonicalize } from './canonical.js';
|
|
12
|
+
import { VerificationCode, VerificationFailure } from './result.js';
|
|
13
|
+
export const DEFAULT_MAX_BYTES = 64 * 1024 * 1024;
|
|
14
|
+
const NUMBER_BYTES = new Set(Array.from('-+.eE0123456789', (c) => c.charCodeAt(0)));
|
|
15
|
+
const NUMBER_OPENERS = new Set(Array.from(':,[', (c) => c.charCodeAt(0)));
|
|
16
|
+
const SIMPLE_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
17
|
+
/** A string as RFC 8785 writes it (used for paths and messages). */
|
|
18
|
+
export function jsonText(value) {
|
|
19
|
+
try {
|
|
20
|
+
return canonicalize(value);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return JSON.stringify(value);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/** Append a member name or array index to a field path. */
|
|
27
|
+
export function formatPath(base, key) {
|
|
28
|
+
if (typeof key === 'number')
|
|
29
|
+
return `${base}[${key}]`;
|
|
30
|
+
if (SIMPLE_NAME.test(key))
|
|
31
|
+
return base ? `${base}.${key}` : key;
|
|
32
|
+
return `${base}[${jsonText(key)}]`;
|
|
33
|
+
}
|
|
34
|
+
class ParseError extends Error {
|
|
35
|
+
}
|
|
36
|
+
class DuplicateKey extends Error {
|
|
37
|
+
member;
|
|
38
|
+
constructor(member) {
|
|
39
|
+
super(member);
|
|
40
|
+
this.member = member;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
class BadConstant extends Error {
|
|
44
|
+
}
|
|
45
|
+
const NUMBER = /-?(?:0|[1-9][0-9]*)(?:\.[0-9]+)?(?:[eE][-+]?[0-9]+)?/y;
|
|
46
|
+
class Parser {
|
|
47
|
+
text;
|
|
48
|
+
index = 0;
|
|
49
|
+
constructor(text) {
|
|
50
|
+
this.text = text;
|
|
51
|
+
}
|
|
52
|
+
parse() {
|
|
53
|
+
this.skip();
|
|
54
|
+
const value = this.value();
|
|
55
|
+
this.skip();
|
|
56
|
+
if (this.index !== this.text.length)
|
|
57
|
+
throw new ParseError(`extra data at ${this.index}`);
|
|
58
|
+
return value;
|
|
59
|
+
}
|
|
60
|
+
skip() {
|
|
61
|
+
const t = this.text;
|
|
62
|
+
while (this.index < t.length) {
|
|
63
|
+
const c = t.charCodeAt(this.index);
|
|
64
|
+
if (c === 0x20 || c === 0x09 || c === 0x0a || c === 0x0d)
|
|
65
|
+
this.index++;
|
|
66
|
+
else
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
value() {
|
|
71
|
+
const t = this.text;
|
|
72
|
+
const c = t[this.index];
|
|
73
|
+
if (c === '{')
|
|
74
|
+
return this.object();
|
|
75
|
+
if (c === '[')
|
|
76
|
+
return this.array();
|
|
77
|
+
if (c === '"')
|
|
78
|
+
return this.string();
|
|
79
|
+
if (t.startsWith('null', this.index)) {
|
|
80
|
+
this.index += 4;
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
if (t.startsWith('true', this.index)) {
|
|
84
|
+
this.index += 4;
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
if (t.startsWith('false', this.index)) {
|
|
88
|
+
this.index += 5;
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
if (t.startsWith('NaN', this.index) || t.startsWith('Infinity', this.index) || t.startsWith('-Infinity', this.index)) {
|
|
92
|
+
throw new BadConstant(t.startsWith('NaN', this.index) ? 'NaN' : 'Infinity');
|
|
93
|
+
}
|
|
94
|
+
NUMBER.lastIndex = this.index;
|
|
95
|
+
const match = NUMBER.exec(t);
|
|
96
|
+
if (!match)
|
|
97
|
+
throw new ParseError(`unexpected character at ${this.index}`);
|
|
98
|
+
this.index += match[0].length;
|
|
99
|
+
return Number(match[0]);
|
|
100
|
+
}
|
|
101
|
+
object() {
|
|
102
|
+
const t = this.text;
|
|
103
|
+
const out = Object.create(null);
|
|
104
|
+
this.index++;
|
|
105
|
+
this.skip();
|
|
106
|
+
if (t[this.index] === '}') {
|
|
107
|
+
this.index++;
|
|
108
|
+
return out;
|
|
109
|
+
}
|
|
110
|
+
for (;;) {
|
|
111
|
+
if (t[this.index] !== '"')
|
|
112
|
+
throw new ParseError(`expected member name at ${this.index}`);
|
|
113
|
+
const name = this.string();
|
|
114
|
+
this.skip();
|
|
115
|
+
if (t[this.index] !== ':')
|
|
116
|
+
throw new ParseError(`expected ':' at ${this.index}`);
|
|
117
|
+
this.index++;
|
|
118
|
+
this.skip();
|
|
119
|
+
const value = this.value();
|
|
120
|
+
if (Object.prototype.hasOwnProperty.call(out, name))
|
|
121
|
+
throw new DuplicateKey(name);
|
|
122
|
+
out[name] = value;
|
|
123
|
+
this.skip();
|
|
124
|
+
const next = t[this.index];
|
|
125
|
+
this.index++;
|
|
126
|
+
if (next === '}')
|
|
127
|
+
return out;
|
|
128
|
+
if (next !== ',')
|
|
129
|
+
throw new ParseError(`expected ',' or '}' at ${this.index - 1}`);
|
|
130
|
+
this.skip();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
array() {
|
|
134
|
+
const t = this.text;
|
|
135
|
+
const out = [];
|
|
136
|
+
this.index++;
|
|
137
|
+
this.skip();
|
|
138
|
+
if (t[this.index] === ']') {
|
|
139
|
+
this.index++;
|
|
140
|
+
return out;
|
|
141
|
+
}
|
|
142
|
+
for (;;) {
|
|
143
|
+
out.push(this.value());
|
|
144
|
+
this.skip();
|
|
145
|
+
const next = t[this.index];
|
|
146
|
+
this.index++;
|
|
147
|
+
if (next === ']')
|
|
148
|
+
return out;
|
|
149
|
+
if (next !== ',')
|
|
150
|
+
throw new ParseError(`expected ',' or ']' at ${this.index - 1}`);
|
|
151
|
+
this.skip();
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
string() {
|
|
155
|
+
const t = this.text;
|
|
156
|
+
let out = '';
|
|
157
|
+
let start = ++this.index;
|
|
158
|
+
for (;;) {
|
|
159
|
+
if (this.index >= t.length)
|
|
160
|
+
throw new ParseError('unterminated string');
|
|
161
|
+
const code = t.charCodeAt(this.index);
|
|
162
|
+
if (code === 0x22) {
|
|
163
|
+
out += t.slice(start, this.index);
|
|
164
|
+
this.index++;
|
|
165
|
+
return out;
|
|
166
|
+
}
|
|
167
|
+
if (code < 0x20)
|
|
168
|
+
throw new ParseError(`control character in string at ${this.index}`);
|
|
169
|
+
if (code !== 0x5c) {
|
|
170
|
+
this.index++;
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
out += t.slice(start, this.index);
|
|
174
|
+
const escape = t[this.index + 1];
|
|
175
|
+
this.index += 2;
|
|
176
|
+
switch (escape) {
|
|
177
|
+
case '"':
|
|
178
|
+
out += '"';
|
|
179
|
+
break;
|
|
180
|
+
case '\\':
|
|
181
|
+
out += '\\';
|
|
182
|
+
break;
|
|
183
|
+
case '/':
|
|
184
|
+
out += '/';
|
|
185
|
+
break;
|
|
186
|
+
case 'b':
|
|
187
|
+
out += String.fromCharCode(0x08);
|
|
188
|
+
break;
|
|
189
|
+
case 'f':
|
|
190
|
+
out += String.fromCharCode(0x0c);
|
|
191
|
+
break;
|
|
192
|
+
case 'n':
|
|
193
|
+
out += String.fromCharCode(0x0a);
|
|
194
|
+
break;
|
|
195
|
+
case 'r':
|
|
196
|
+
out += String.fromCharCode(0x0d);
|
|
197
|
+
break;
|
|
198
|
+
case 't':
|
|
199
|
+
out += String.fromCharCode(0x09);
|
|
200
|
+
break;
|
|
201
|
+
case 'u': {
|
|
202
|
+
const hex = t.slice(this.index, this.index + 4);
|
|
203
|
+
if (!/^[0-9a-fA-F]{4}$/.test(hex))
|
|
204
|
+
throw new ParseError(`invalid escape at ${this.index}`);
|
|
205
|
+
out += String.fromCharCode(parseInt(hex, 16));
|
|
206
|
+
this.index += 4;
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
default:
|
|
210
|
+
throw new ParseError(`invalid escape at ${this.index - 1}`);
|
|
211
|
+
}
|
|
212
|
+
start = this.index;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function hasBadNumber(value) {
|
|
217
|
+
const stack = [value];
|
|
218
|
+
while (stack.length) {
|
|
219
|
+
const item = stack.pop();
|
|
220
|
+
if (typeof item === 'number') {
|
|
221
|
+
if (!Number.isFinite(item))
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
else if (Array.isArray(item)) {
|
|
225
|
+
stack.push(...item);
|
|
226
|
+
}
|
|
227
|
+
else if (item !== null && typeof item === 'object') {
|
|
228
|
+
stack.push(...Object.values(item));
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
function inNumber(buffer, index) {
|
|
234
|
+
let start = index;
|
|
235
|
+
while (start > 0 && NUMBER_BYTES.has(buffer[start - 1]))
|
|
236
|
+
start--;
|
|
237
|
+
if (start === 0 || !NUMBER_OPENERS.has(buffer[start - 1]))
|
|
238
|
+
return false;
|
|
239
|
+
return start < index || (index < buffer.length && NUMBER_BYTES.has(buffer[index]));
|
|
240
|
+
}
|
|
241
|
+
/** Parse package bytes, refusing anything that is not canonical JSON. */
|
|
242
|
+
export function parseCanonical(data, maxBytes = DEFAULT_MAX_BYTES) {
|
|
243
|
+
if (data.length > maxBytes) {
|
|
244
|
+
throw new VerificationFailure(VerificationCode.TOO_LARGE, `package is ${data.length} bytes; the limit is ${maxBytes}`);
|
|
245
|
+
}
|
|
246
|
+
if (data.length >= 3 && data[0] === 0xef && data[1] === 0xbb && data[2] === 0xbf) {
|
|
247
|
+
throw new VerificationFailure(VerificationCode.MALFORMED_JSON, 'package starts with a byte-order mark');
|
|
248
|
+
}
|
|
249
|
+
let text;
|
|
250
|
+
try {
|
|
251
|
+
text = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true }).decode(data);
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
throw new VerificationFailure(VerificationCode.MALFORMED_JSON, 'package is not UTF-8');
|
|
255
|
+
}
|
|
256
|
+
let value;
|
|
257
|
+
try {
|
|
258
|
+
value = new Parser(text).parse();
|
|
259
|
+
}
|
|
260
|
+
catch (err) {
|
|
261
|
+
if (err instanceof DuplicateKey) {
|
|
262
|
+
throw new VerificationFailure(VerificationCode.DUPLICATE_KEY, `member ${jsonText(err.member)} appears more than once in one object`);
|
|
263
|
+
}
|
|
264
|
+
if (err instanceof BadConstant) {
|
|
265
|
+
throw new VerificationFailure(VerificationCode.NON_CANONICAL_NUMBER, `${err.message} is not a JSON number`);
|
|
266
|
+
}
|
|
267
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
268
|
+
throw new VerificationFailure(VerificationCode.MALFORMED_JSON, `package is not valid JSON: ${message}`);
|
|
269
|
+
}
|
|
270
|
+
if (hasBadNumber(value)) {
|
|
271
|
+
throw new VerificationFailure(VerificationCode.NON_CANONICAL_NUMBER, 'a number has no exact IEEE-754 double form');
|
|
272
|
+
}
|
|
273
|
+
let canonical;
|
|
274
|
+
try {
|
|
275
|
+
canonical = new TextEncoder().encode(canonicalize(value));
|
|
276
|
+
}
|
|
277
|
+
catch (err) {
|
|
278
|
+
if (err instanceof CanonicalizationError || err instanceof RangeError) {
|
|
279
|
+
throw new VerificationFailure(VerificationCode.NON_CANONICAL_DOCUMENT, `package has no canonical form: ${err.message}`);
|
|
280
|
+
}
|
|
281
|
+
throw err;
|
|
282
|
+
}
|
|
283
|
+
const body = data.length > 0 && data[data.length - 1] === 0x0a ? data.subarray(0, data.length - 1) : data;
|
|
284
|
+
let same = body.length === canonical.length;
|
|
285
|
+
let index = 0;
|
|
286
|
+
const limit = Math.min(body.length, canonical.length);
|
|
287
|
+
while (index < limit && body[index] === canonical[index])
|
|
288
|
+
index++;
|
|
289
|
+
same = same && index === limit;
|
|
290
|
+
if (!same) {
|
|
291
|
+
if (inNumber(body, index)) {
|
|
292
|
+
throw new VerificationFailure(VerificationCode.NON_CANONICAL_NUMBER, `number at byte ${index} is not in RFC 8785 form`);
|
|
293
|
+
}
|
|
294
|
+
throw new VerificationFailure(VerificationCode.NON_CANONICAL_DOCUMENT, `package bytes differ from their RFC 8785 form at byte ${index}`);
|
|
295
|
+
}
|
|
296
|
+
return value;
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=document.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document.js","sourceRoot":"","sources":["../../src/evidence/document.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** Classes of value that are keyed per case unless disclosed (sorted). */
|
|
2
|
+
export declare const IDENTIFIER_CLASSES: readonly ['approver', 'content', 'principal', 'record', 'subject'];
|
|
3
|
+
export type IdentifierClass = (typeof IDENTIFIER_CLASSES)[number];
|
|
4
|
+
export type PseudonymClass = Exclude<IdentifierClass, 'content'>;
|
|
5
|
+
/** Metadata member only the auth service writes; `/v1/audit/log` refuses it. */
|
|
6
|
+
export declare const PLATFORM_MARKER = "grantex:platform";
|
|
7
|
+
type Json = Record<string, unknown>;
|
|
8
|
+
/** `sha256:` followed by the lower-case hex SHA-256 of `data`. */
|
|
9
|
+
export declare function digestBytes(data: Uint8Array | string): string;
|
|
10
|
+
/** Digest of the RFC 8785 canonical form of a JSON value. */
|
|
11
|
+
export declare function digest(value: unknown): string;
|
|
12
|
+
/** `chain.genesis`: digest of `{case, format, privacy, version}`. */
|
|
13
|
+
export declare function headerHash(pkg: Json): string;
|
|
14
|
+
/** Digest of an entry with its `hash` member removed. */
|
|
15
|
+
export declare function entryHash(entry: Json): string;
|
|
16
|
+
/** `chain.root`: digest of `{alg, canonicalization, genesis, head, length}`. */
|
|
17
|
+
export declare function chainRoot(chain: Json): string;
|
|
18
|
+
/** The decision-grant `action_hash`: `"sha256:" + base64url(SHA-256(JCS(action)))`. */
|
|
19
|
+
export declare function decisionActionHash(action: Json): string;
|
|
20
|
+
/** Hash of an auth-service audit entry, exactly as the audit chain stores it. */
|
|
21
|
+
export declare function auditEntryHash(entry: Json): string;
|
|
22
|
+
/** `HMAC-SHA256(tenantKey, JCS(["grantex-evidence-case-v1", tenantId, caseId]))`. */
|
|
23
|
+
export declare function caseKey(tenantKey: Uint8Array, tenantId: string, caseId: string): Buffer;
|
|
24
|
+
/** `"pz:" + base64url(HMAC(caseKey, JCS(["pseudonym-v1", class, value])))`. */
|
|
25
|
+
export declare function pseudonym(key: Uint8Array, identifierClass: PseudonymClass, value: string): string;
|
|
26
|
+
/** Stable per-case pseudonym for an identifier (derives the case key first). */
|
|
27
|
+
export declare function pseudonymise(tenantKey: Uint8Array, tenantId: string, caseId: string, identifierClass: PseudonymClass, value: string): string;
|
|
28
|
+
/** `"hmac-sha256:" + hex(HMAC(caseKey, JCS(["content-v1", digest])))`: tool input/output digests. */
|
|
29
|
+
export declare function keyedContentDigest(key: Uint8Array, valueDigest: string): string;
|
|
30
|
+
/** `"ak:" + base64url(HMAC(caseKey, JCS(["action-v1", action_hash])))`: replaces `action_hash` while the subject is pseudonymised. */
|
|
31
|
+
export declare function actionReference(key: Uint8Array, actionHash: string): string;
|
|
32
|
+
/** Whether `value` has the pseudonym form `pz:` + 43 base64url characters. */
|
|
33
|
+
export declare function isPseudonym(value: unknown): boolean;
|
|
34
|
+
/** Whether `value` has the form `ak:` + 43 base64url characters. */
|
|
35
|
+
export declare function isActionReference(value: unknown): boolean;
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=hashing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hashing.d.ts","sourceRoot":"","sources":["../../src/evidence/hashing.ts"],"names":[],"mappings":"AASA,0EAA0E;AAC1E,eAAO,MAAM,kBAAkB,YAAI,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAU,CAAC;AACrG,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAClE,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;AAEjE,gFAAgF;AAChF,eAAO,MAAM,eAAe,qBAAqB,CAAC;AAOlD,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAIpC,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,MAAM,CAE7D;AAED,6DAA6D;AAC7D,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE7C;AAQD,qEAAqE;AACrE,wBAAgB,UAAU,CAAC,GAAG,EAAE,IAAI,GAAG,MAAM,CAE5C;AAED,yDAAyD;AACzD,wBAAgB,SAAS,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,CAI7C;AAED,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,CAE7C;AAED,uFAAuF;AACvF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,IAAI,GAAG,MAAM,CAEvD;AAED,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,CAgBlD;AAED,qFAAqF;AACrF,wBAAgB,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGvF;AAMD,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKjG;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5I;AAED,qGAAqG;AACrG,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED,sIAAsI;AACtI,wBAAgB,eAAe,CAAC,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEnD;AAED,oEAAoE;AACpE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEzD"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hashes and keyed pseudonyms used by evidence packages (spec/evidence-package.md,
|
|
3
|
+
* "Identifiers and privacy" and "Hash chain"). Every keyed value is an
|
|
4
|
+
* HMAC-SHA256 under a per-case key over the RFC 8785 form of a JSON array.
|
|
5
|
+
* Mirrors `grantex.evidence._hashing` in the Python SDK.
|
|
6
|
+
*/
|
|
7
|
+
import { createHash, createHmac } from 'node:crypto';
|
|
8
|
+
import { canonicalize } from './canonical.js';
|
|
9
|
+
/** Classes of value that are keyed per case unless disclosed (sorted). */
|
|
10
|
+
export const IDENTIFIER_CLASSES = ['approver', 'content', 'principal', 'record', 'subject'];
|
|
11
|
+
/** Metadata member only the auth service writes; `/v1/audit/log` refuses it. */
|
|
12
|
+
export const PLATFORM_MARKER = 'grantex:platform';
|
|
13
|
+
const PSEUDONYM = /^pz:[A-Za-z0-9_-]{43}$/;
|
|
14
|
+
const ACTION_REF = /^ak:[A-Za-z0-9_-]{43}$/;
|
|
15
|
+
const HEADER_MEMBERS = ['case', 'format', 'privacy', 'version'];
|
|
16
|
+
const CHAIN_MEMBERS = ['alg', 'canonicalization', 'genesis', 'head', 'length'];
|
|
17
|
+
const utf8 = (text) => Buffer.from(text, 'utf8');
|
|
18
|
+
/** `sha256:` followed by the lower-case hex SHA-256 of `data`. */
|
|
19
|
+
export function digestBytes(data) {
|
|
20
|
+
return `sha256:${createHash('sha256').update(data).digest('hex')}`;
|
|
21
|
+
}
|
|
22
|
+
/** Digest of the RFC 8785 canonical form of a JSON value. */
|
|
23
|
+
export function digest(value) {
|
|
24
|
+
return digestBytes(utf8(canonicalize(value)));
|
|
25
|
+
}
|
|
26
|
+
function pick(source, names) {
|
|
27
|
+
const out = {};
|
|
28
|
+
for (const name of names)
|
|
29
|
+
out[name] = source[name];
|
|
30
|
+
return out;
|
|
31
|
+
}
|
|
32
|
+
/** `chain.genesis`: digest of `{case, format, privacy, version}`. */
|
|
33
|
+
export function headerHash(pkg) {
|
|
34
|
+
return digest(pick(pkg, HEADER_MEMBERS));
|
|
35
|
+
}
|
|
36
|
+
/** Digest of an entry with its `hash` member removed. */
|
|
37
|
+
export function entryHash(entry) {
|
|
38
|
+
const copy = {};
|
|
39
|
+
for (const [name, value] of Object.entries(entry))
|
|
40
|
+
if (name !== 'hash')
|
|
41
|
+
copy[name] = value;
|
|
42
|
+
return digest(copy);
|
|
43
|
+
}
|
|
44
|
+
/** `chain.root`: digest of `{alg, canonicalization, genesis, head, length}`. */
|
|
45
|
+
export function chainRoot(chain) {
|
|
46
|
+
return digest(pick(chain, CHAIN_MEMBERS));
|
|
47
|
+
}
|
|
48
|
+
/** The decision-grant `action_hash`: `"sha256:" + base64url(SHA-256(JCS(action)))`. */
|
|
49
|
+
export function decisionActionHash(action) {
|
|
50
|
+
return `sha256:${createHash('sha256').update(utf8(canonicalize(action))).digest('base64url')}`;
|
|
51
|
+
}
|
|
52
|
+
/** Hash of an auth-service audit entry, exactly as the audit chain stores it. */
|
|
53
|
+
export function auditEntryHash(entry) {
|
|
54
|
+
const c = (value) => canonicalize(value);
|
|
55
|
+
const text = '{'
|
|
56
|
+
+ `"id":${c(entry['id'])},`
|
|
57
|
+
+ `"agentId":${c(entry['agentId'])},`
|
|
58
|
+
+ `"agentDid":${c(entry['agentDid'])},`
|
|
59
|
+
+ `"grantId":${c(entry['grantId'])},`
|
|
60
|
+
+ `"principalId":${c(entry['principalId'])},`
|
|
61
|
+
+ `"developerId":${c(entry['developerId'])},`
|
|
62
|
+
+ `"action":${c(entry['action'])},`
|
|
63
|
+
+ `"metadata":${c(entry['metadata'])},`
|
|
64
|
+
+ `"timestamp":${c(entry['timestamp'])},`
|
|
65
|
+
+ `"prevHash":${c(entry['prevHash'] ?? null)},`
|
|
66
|
+
+ `"status":${c(entry['status'])}`
|
|
67
|
+
+ '}';
|
|
68
|
+
return createHash('sha256').update(utf8(text)).digest('hex');
|
|
69
|
+
}
|
|
70
|
+
/** `HMAC-SHA256(tenantKey, JCS(["grantex-evidence-case-v1", tenantId, caseId]))`. */
|
|
71
|
+
export function caseKey(tenantKey, tenantId, caseId) {
|
|
72
|
+
if (tenantKey.length < 32)
|
|
73
|
+
throw new Error('pseudonymisation key must be at least 32 bytes');
|
|
74
|
+
return createHmac('sha256', tenantKey).update(utf8(canonicalize(['grantex-evidence-case-v1', tenantId, caseId]))).digest();
|
|
75
|
+
}
|
|
76
|
+
function mac(key, parts) {
|
|
77
|
+
return createHmac('sha256', key).update(utf8(canonicalize(parts))).digest();
|
|
78
|
+
}
|
|
79
|
+
/** `"pz:" + base64url(HMAC(caseKey, JCS(["pseudonym-v1", class, value])))`. */
|
|
80
|
+
export function pseudonym(key, identifierClass, value) {
|
|
81
|
+
if (!['approver', 'principal', 'record', 'subject'].includes(identifierClass)) {
|
|
82
|
+
throw new Error(`not an identifier class: ${String(identifierClass)}`);
|
|
83
|
+
}
|
|
84
|
+
return `pz:${mac(key, ['pseudonym-v1', identifierClass, value]).toString('base64url')}`;
|
|
85
|
+
}
|
|
86
|
+
/** Stable per-case pseudonym for an identifier (derives the case key first). */
|
|
87
|
+
export function pseudonymise(tenantKey, tenantId, caseId, identifierClass, value) {
|
|
88
|
+
return pseudonym(caseKey(tenantKey, tenantId, caseId), identifierClass, value);
|
|
89
|
+
}
|
|
90
|
+
/** `"hmac-sha256:" + hex(HMAC(caseKey, JCS(["content-v1", digest])))`: tool input/output digests. */
|
|
91
|
+
export function keyedContentDigest(key, valueDigest) {
|
|
92
|
+
return `hmac-sha256:${mac(key, ['content-v1', valueDigest]).toString('hex')}`;
|
|
93
|
+
}
|
|
94
|
+
/** `"ak:" + base64url(HMAC(caseKey, JCS(["action-v1", action_hash])))`: replaces `action_hash` while the subject is pseudonymised. */
|
|
95
|
+
export function actionReference(key, actionHash) {
|
|
96
|
+
return `ak:${mac(key, ['action-v1', actionHash]).toString('base64url')}`;
|
|
97
|
+
}
|
|
98
|
+
/** Whether `value` has the pseudonym form `pz:` + 43 base64url characters. */
|
|
99
|
+
export function isPseudonym(value) {
|
|
100
|
+
return typeof value === 'string' && PSEUDONYM.test(value);
|
|
101
|
+
}
|
|
102
|
+
/** Whether `value` has the form `ak:` + 43 base64url characters. */
|
|
103
|
+
export function isActionReference(value) {
|
|
104
|
+
return typeof value === 'string' && ACTION_REF.test(value);
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=hashing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hashing.js","sourceRoot":"","sources":["../../src/evidence/hashing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evidence packages: build, canonicalise and verify (PRD G-5).
|
|
3
|
+
*
|
|
4
|
+
* One JSON document per case: the grant chain root to leaf with purposes and
|
|
5
|
+
* caps, every tool call with keyed input and output digests and the upstream
|
|
6
|
+
* records it returned, run context (model, prompt, policy and schema
|
|
7
|
+
* versions), policy evaluations with inputs, recommendations and screening
|
|
8
|
+
* dispositions with citations, human decisions and revocations - in a hash
|
|
9
|
+
* chain whose root is recorded in the auth service's audit chain and may be
|
|
10
|
+
* signed by the service. Specified in `spec/evidence-package.md`; the Python
|
|
11
|
+
* SDK (`grantex.evidence`) implements the same rules, and both are tested
|
|
12
|
+
* against `spec/examples/evidence/`.
|
|
13
|
+
*/
|
|
14
|
+
export { buildPackage, anchorAuditEntry, attachAnchor, attachSignature, serializePackage, type BuiltPackage, type EvidenceRecord, type PrivacySettings, } from './build.js';
|
|
15
|
+
export { CanonicalizationError, canonicalize } from './canonical.js';
|
|
16
|
+
export { MAX_CLOCK_SKEW_MS, type SemanticSummary } from './checks.js';
|
|
17
|
+
export { DEFAULT_MAX_BYTES } from './document.js';
|
|
18
|
+
export { IDENTIFIER_CLASSES, PLATFORM_MARKER, actionReference, auditEntryHash, caseKey, chainRoot, decisionActionHash, digest, digestBytes, entryHash, headerHash, isActionReference, isPseudonym, keyedContentDigest, pseudonym, pseudonymise, type IdentifierClass, type PseudonymClass, } from './hashing.js';
|
|
19
|
+
export { EvidenceBuildError, VerificationCode, VerificationFailure, verificationResultToJson, type VerificationCodeValue, type VerificationResult, } from './result.js';
|
|
20
|
+
export { isValidTimestamp, timestampMs } from './schema.js';
|
|
21
|
+
export { SIGNATURE_TYPE, protectedHeader, signRoot, signedPayload, signingInput, verifySignature, type EvidenceSignature } from './signature.js';
|
|
22
|
+
export { upstreamRecordsFor, type UpstreamRecordTrace } from './trace.js';
|
|
23
|
+
export { FORMAT, SUPPORTED_VERSIONS, checkDocument, verifyPackage, type VerifyOptions } from './verify.js';
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/evidence/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,eAAe,GACrB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,cAAc,EACd,OAAO,EACP,SAAS,EACT,kBAAkB,EAClB,MAAM,EACN,WAAW,EACX,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,WAAW,EACX,kBAAkB,EAClB,SAAS,EACT,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,GACxB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACjJ,OAAO,EAAE,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evidence packages: build, canonicalise and verify (PRD G-5).
|
|
3
|
+
*
|
|
4
|
+
* One JSON document per case: the grant chain root to leaf with purposes and
|
|
5
|
+
* caps, every tool call with keyed input and output digests and the upstream
|
|
6
|
+
* records it returned, run context (model, prompt, policy and schema
|
|
7
|
+
* versions), policy evaluations with inputs, recommendations and screening
|
|
8
|
+
* dispositions with citations, human decisions and revocations - in a hash
|
|
9
|
+
* chain whose root is recorded in the auth service's audit chain and may be
|
|
10
|
+
* signed by the service. Specified in `spec/evidence-package.md`; the Python
|
|
11
|
+
* SDK (`grantex.evidence`) implements the same rules, and both are tested
|
|
12
|
+
* against `spec/examples/evidence/`.
|
|
13
|
+
*/
|
|
14
|
+
export { buildPackage, anchorAuditEntry, attachAnchor, attachSignature, serializePackage, } from './build.js';
|
|
15
|
+
export { CanonicalizationError, canonicalize } from './canonical.js';
|
|
16
|
+
export { MAX_CLOCK_SKEW_MS } from './checks.js';
|
|
17
|
+
export { DEFAULT_MAX_BYTES } from './document.js';
|
|
18
|
+
export { IDENTIFIER_CLASSES, PLATFORM_MARKER, actionReference, auditEntryHash, caseKey, chainRoot, decisionActionHash, digest, digestBytes, entryHash, headerHash, isActionReference, isPseudonym, keyedContentDigest, pseudonym, pseudonymise, } from './hashing.js';
|
|
19
|
+
export { EvidenceBuildError, VerificationCode, VerificationFailure, verificationResultToJson, } from './result.js';
|
|
20
|
+
export { isValidTimestamp, timestampMs } from './schema.js';
|
|
21
|
+
export { SIGNATURE_TYPE, protectedHeader, signRoot, signedPayload, signingInput, verifySignature } from './signature.js';
|
|
22
|
+
export { upstreamRecordsFor } from './trace.js';
|
|
23
|
+
export { FORMAT, SUPPORTED_VERSIONS, checkDocument, verifyPackage } from './verify.js';
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/evidence/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,gBAAgB,GAIjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAwB,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,cAAc,EACd,OAAO,EACP,SAAS,EACT,kBAAkB,EAClB,MAAM,EACN,WAAW,EACX,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,WAAW,EACX,kBAAkB,EAClB,SAAS,EACT,YAAY,GAGb,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,GAGzB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAA0B,MAAM,gBAAgB,CAAC;AACjJ,OAAO,EAAE,kBAAkB,EAA4B,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAsB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/** Verification codes, results and errors for evidence packages. */
|
|
2
|
+
export declare const VerificationCode: {
|
|
3
|
+
readonly MISSING_ROOT: 'missing_root';
|
|
4
|
+
readonly TOO_LARGE: 'too_large';
|
|
5
|
+
readonly MALFORMED_JSON: 'malformed_json';
|
|
6
|
+
readonly DUPLICATE_KEY: 'duplicate_key';
|
|
7
|
+
readonly NON_CANONICAL_NUMBER: 'non_canonical_number';
|
|
8
|
+
readonly NON_CANONICAL_DOCUMENT: 'non_canonical_document';
|
|
9
|
+
readonly UNSUPPORTED_FORMAT: 'unsupported_format';
|
|
10
|
+
readonly UNSUPPORTED_VERSION: 'unsupported_version';
|
|
11
|
+
readonly SCHEMA_VIOLATION: 'schema_violation';
|
|
12
|
+
readonly PRIVACY_VIOLATION: 'privacy_violation';
|
|
13
|
+
readonly GENESIS_MISMATCH: 'genesis_mismatch';
|
|
14
|
+
readonly SEQUENCE_MISMATCH: 'sequence_mismatch';
|
|
15
|
+
readonly LINK_MISMATCH: 'link_mismatch';
|
|
16
|
+
readonly ENTRY_HASH_MISMATCH: 'entry_hash_mismatch';
|
|
17
|
+
readonly HEAD_MISMATCH: 'head_mismatch';
|
|
18
|
+
readonly LENGTH_MISMATCH: 'length_mismatch';
|
|
19
|
+
readonly ROOT_MISMATCH: 'root_mismatch';
|
|
20
|
+
readonly GRANT_CHAIN_BROKEN: 'grant_chain_broken';
|
|
21
|
+
readonly ENTRIES_OUT_OF_ORDER: 'entries_out_of_order';
|
|
22
|
+
readonly DUPLICATE_IDENTIFIER: 'duplicate_identifier';
|
|
23
|
+
readonly DANGLING_REFERENCE: 'dangling_reference';
|
|
24
|
+
readonly CASE_MISMATCH: 'case_mismatch';
|
|
25
|
+
readonly ACTION_HASH_MISMATCH: 'action_hash_mismatch';
|
|
26
|
+
readonly DECISION_INCONSISTENT: 'decision_inconsistent';
|
|
27
|
+
readonly VALIDITY_VIOLATION: 'validity_violation';
|
|
28
|
+
readonly AUTHORITY_VIOLATION: 'authority_violation';
|
|
29
|
+
readonly TOOL_CALL_INCONSISTENT: 'tool_call_inconsistent';
|
|
30
|
+
readonly ROOT_NOT_TRUSTED: 'root_not_trusted';
|
|
31
|
+
readonly ANCHOR_MISSING: 'anchor_missing';
|
|
32
|
+
readonly ANCHOR_HASH_MISMATCH: 'anchor_hash_mismatch';
|
|
33
|
+
readonly ANCHOR_MISMATCH: 'anchor_mismatch';
|
|
34
|
+
readonly ANCHOR_NOT_TRUSTED: 'anchor_not_trusted';
|
|
35
|
+
readonly SIGNATURE_MISSING: 'signature_missing';
|
|
36
|
+
readonly SIGNATURE_UNVERIFIED: 'signature_unverified';
|
|
37
|
+
readonly SIGNATURE_KEY_UNKNOWN: 'signature_key_unknown';
|
|
38
|
+
readonly SIGNATURE_INVALID: 'signature_invalid';
|
|
39
|
+
};
|
|
40
|
+
export type VerificationCodeValue = (typeof VerificationCode)[keyof typeof VerificationCode];
|
|
41
|
+
export interface FailureLocation {
|
|
42
|
+
entryIndex?: number | null;
|
|
43
|
+
fieldPath?: string | null;
|
|
44
|
+
expected?: string | null;
|
|
45
|
+
actual?: string | null;
|
|
46
|
+
}
|
|
47
|
+
/** The first failed check. Thrown internally, reported in the result. */
|
|
48
|
+
export declare class VerificationFailure extends Error {
|
|
49
|
+
readonly code: VerificationCodeValue;
|
|
50
|
+
readonly entryIndex: number | null;
|
|
51
|
+
readonly fieldPath: string | null;
|
|
52
|
+
readonly expected: string | null;
|
|
53
|
+
readonly actual: string | null;
|
|
54
|
+
constructor(code: VerificationCodeValue, message: string, location?: FailureLocation);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Outcome of `verifyPackage`. `ok` is true only when every check passed;
|
|
58
|
+
* otherwise `code` names the first check that failed and `entryIndex`,
|
|
59
|
+
* `fieldPath`, `expected` and `actual` locate it where that is meaningful.
|
|
60
|
+
*/
|
|
61
|
+
export interface VerificationResult {
|
|
62
|
+
ok: boolean;
|
|
63
|
+
code: VerificationCodeValue | null;
|
|
64
|
+
message: string;
|
|
65
|
+
entryIndex: number | null;
|
|
66
|
+
fieldPath: string | null;
|
|
67
|
+
expected: string | null;
|
|
68
|
+
actual: string | null;
|
|
69
|
+
root: string | null;
|
|
70
|
+
entryCount: number | null;
|
|
71
|
+
/** `absent`, `internal-consistency-only`, `pinned` (matches a caller-supplied anchor hash) or `signed`. */
|
|
72
|
+
anchorStatus: 'absent' | 'internal-consistency-only' | 'pinned' | 'signed';
|
|
73
|
+
/** `absent`, `unchecked` or `verified`. Only a verified service signature proves who exported the package. */
|
|
74
|
+
signatureStatus: 'absent' | 'unchecked' | 'verified';
|
|
75
|
+
signatureKid: string | null;
|
|
76
|
+
unsourcedInputs: number;
|
|
77
|
+
lateEntries: number;
|
|
78
|
+
tenantAssertedEntries: number;
|
|
79
|
+
}
|
|
80
|
+
/** JSON form of a result, identical to the Python SDK's `VerificationResult.to_dict()`. */
|
|
81
|
+
export declare function verificationResultToJson(result: VerificationResult): Record<string, unknown>;
|
|
82
|
+
/** A package could not be built from the given input. */
|
|
83
|
+
export declare class EvidenceBuildError extends Error {
|
|
84
|
+
readonly code: string;
|
|
85
|
+
readonly fieldPath: string | null;
|
|
86
|
+
constructor(code: string, message: string, fieldPath?: string | null);
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=result.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/evidence/result.ts"],"names":[],"mappings":"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"}
|