@attestplane/attestplane 0.0.1-alpha.1 → 0.0.3-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -10
- package/dist/adapter_conformance.d.ts +46 -0
- package/dist/adapter_conformance.d.ts.map +1 -0
- package/dist/adapter_conformance.js +160 -0
- package/dist/adapter_conformance.js.map +1 -0
- package/dist/adapters/langfuse.d.ts +51 -0
- package/dist/adapters/langfuse.d.ts.map +1 -0
- package/dist/adapters/langfuse.js +157 -0
- package/dist/adapters/langfuse.js.map +1 -0
- package/dist/adapters/langsmith.d.ts +53 -0
- package/dist/adapters/langsmith.d.ts.map +1 -0
- package/dist/adapters/langsmith.js +173 -0
- package/dist/adapters/langsmith.js.map +1 -0
- package/dist/adapters.d.ts +88 -0
- package/dist/adapters.d.ts.map +1 -0
- package/dist/adapters.js +109 -0
- package/dist/adapters.js.map +1 -0
- package/dist/anchoring.d.ts +119 -0
- package/dist/anchoring.d.ts.map +1 -0
- package/dist/anchoring.js +340 -0
- package/dist/anchoring.js.map +1 -0
- package/dist/canonical.d.ts +11 -2
- package/dist/canonical.d.ts.map +1 -1
- package/dist/canonical.js +44 -31
- package/dist/canonical.js.map +1 -1
- package/dist/canonical_text.d.ts +30 -0
- package/dist/canonical_text.d.ts.map +1 -0
- package/dist/canonical_text.js +100 -0
- package/dist/canonical_text.js.map +1 -0
- package/dist/der.d.ts +55 -0
- package/dist/der.d.ts.map +1 -0
- package/dist/der.js +200 -0
- package/dist/der.js.map +1 -0
- package/dist/event_payloads.d.ts +118 -0
- package/dist/event_payloads.d.ts.map +1 -0
- package/dist/event_payloads.js +348 -0
- package/dist/event_payloads.js.map +1 -0
- package/dist/event_types.d.ts +47 -0
- package/dist/event_types.d.ts.map +1 -0
- package/dist/event_types.js +63 -0
- package/dist/event_types.js.map +1 -0
- package/dist/hashchain.d.ts +1 -0
- package/dist/hashchain.d.ts.map +1 -1
- package/dist/hashchain.js +25 -1
- package/dist/hashchain.js.map +1 -1
- package/dist/index.d.ts +22 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -1
- package/dist/index.js.map +1 -1
- package/dist/index_version.d.ts +9 -0
- package/dist/index_version.d.ts.map +1 -0
- package/dist/index_version.js +11 -0
- package/dist/index_version.js.map +1 -0
- package/dist/intoto.d.ts +48 -0
- package/dist/intoto.d.ts.map +1 -0
- package/dist/intoto.js +106 -0
- package/dist/intoto.js.map +1 -0
- package/dist/obligations.d.ts +41 -0
- package/dist/obligations.d.ts.map +1 -0
- package/dist/obligations.js +312 -0
- package/dist/obligations.js.map +1 -0
- package/dist/proof_bundle.d.ts +186 -0
- package/dist/proof_bundle.d.ts.map +1 -0
- package/dist/proof_bundle.js +299 -0
- package/dist/proof_bundle.js.map +1 -0
- package/dist/reason_codes.d.ts +38 -0
- package/dist/reason_codes.d.ts.map +1 -0
- package/dist/reason_codes.js +97 -0
- package/dist/reason_codes.js.map +1 -0
- package/dist/replay_verifier.d.ts +43 -0
- package/dist/replay_verifier.d.ts.map +1 -0
- package/dist/replay_verifier.js +98 -0
- package/dist/replay_verifier.js.map +1 -0
- package/dist/rfc3161.d.ts +52 -0
- package/dist/rfc3161.d.ts.map +1 -0
- package/dist/rfc3161.js +480 -0
- package/dist/rfc3161.js.map +1 -0
- package/dist/settlement_verifier.d.ts +34 -0
- package/dist/settlement_verifier.d.ts.map +1 -0
- package/dist/settlement_verifier.js +139 -0
- package/dist/settlement_verifier.js.map +1 -0
- package/dist/signing/base.d.ts +101 -0
- package/dist/signing/base.d.ts.map +1 -0
- package/dist/signing/base.js +144 -0
- package/dist/signing/base.js.map +1 -0
- package/dist/signing/providers.d.ts +113 -0
- package/dist/signing/providers.d.ts.map +1 -0
- package/dist/signing/providers.js +230 -0
- package/dist/signing/providers.js.map +1 -0
- package/dist/signing/signer.d.ts +66 -0
- package/dist/signing/signer.d.ts.map +1 -0
- package/dist/signing/signer.js +146 -0
- package/dist/signing/signer.js.map +1 -0
- package/dist/signing/trust_roots.d.ts +71 -0
- package/dist/signing/trust_roots.d.ts.map +1 -0
- package/dist/signing/trust_roots.js +267 -0
- package/dist/signing/trust_roots.js.map +1 -0
- package/dist/signing/verifier_ext.d.ts +77 -0
- package/dist/signing/verifier_ext.d.ts.map +1 -0
- package/dist/signing/verifier_ext.js +340 -0
- package/dist/signing/verifier_ext.js.map +1 -0
- package/dist/verifier.d.ts +39 -0
- package/dist/verifier.d.ts.map +1 -0
- package/dist/verifier.js +374 -0
- package/dist/verifier.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 The Attestplane Authors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* TrustRoots loader — TypeScript mirror of
|
|
5
|
+
* `sdk/python/src/attestplane/signing/trust_roots.py`.
|
|
6
|
+
*
|
|
7
|
+
* Per T6 review § 1 decision 3: **JSON only** in TS. The Python loader
|
|
8
|
+
* accepts YAML for operator convenience; the TS SDK consumes JSON. Same
|
|
9
|
+
* schema fields exactly. Operators convert YAML→JSON via `yq` if
|
|
10
|
+
* needed. This avoids adding a ~50 KB yaml dep to the TS package whose
|
|
11
|
+
* only runtime dep today is `uuid`.
|
|
12
|
+
*
|
|
13
|
+
* Schema:
|
|
14
|
+
*
|
|
15
|
+
* ```json
|
|
16
|
+
* {
|
|
17
|
+
* "version": 1,
|
|
18
|
+
* "keys": [
|
|
19
|
+
* {
|
|
20
|
+
* "key_id": "<32 lowercase hex chars>",
|
|
21
|
+
* "public_key_der_b64": "<base64 SPKI>",
|
|
22
|
+
* "valid_from": "2026-05-17T00:00:00Z",
|
|
23
|
+
* "valid_until": "2027-05-17T00:00:00Z",
|
|
24
|
+
* "provider_id": "<optional>",
|
|
25
|
+
* "label": "<optional>"
|
|
26
|
+
* }
|
|
27
|
+
* ]
|
|
28
|
+
* }
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* Strict invariants (mirror Python):
|
|
32
|
+
* - `version` must equal 1.
|
|
33
|
+
* - `keys` must be a non-empty array.
|
|
34
|
+
* - Each entry's `key_id` must equal `deriveKeyId(b64decode(public_key_der_b64))`.
|
|
35
|
+
* - `valid_from < valid_until`, both UTC-aware ISO-8601.
|
|
36
|
+
* - Top-level + per-entry `additionalProperties` rejected.
|
|
37
|
+
* - File size > 1 MB rejected (DoS mitigation).
|
|
38
|
+
*/
|
|
39
|
+
import { readFileSync, statSync } from 'node:fs';
|
|
40
|
+
import { SigningError, deriveKeyId } from './base.js';
|
|
41
|
+
const MAX_FILE_SIZE_BYTES = 1 * 1024 * 1024;
|
|
42
|
+
const KEY_ID_PATTERN = /^[0-9a-f]{32}$/;
|
|
43
|
+
const REQUIRED_ENTRY_KEYS = new Set(['key_id', 'public_key_der_b64', 'valid_from', 'valid_until']);
|
|
44
|
+
const OPTIONAL_ENTRY_KEYS = new Set(['provider_id', 'label']);
|
|
45
|
+
const REQUIRED_TOP_KEYS = new Set(['version', 'keys']);
|
|
46
|
+
export class TrustRootsError extends SigningError {
|
|
47
|
+
constructor(message) {
|
|
48
|
+
super(message);
|
|
49
|
+
this.name = 'TrustRootsError';
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export class TrustRoots {
|
|
53
|
+
version;
|
|
54
|
+
entries;
|
|
55
|
+
constructor(version, entries) {
|
|
56
|
+
this.version = version;
|
|
57
|
+
this.entries = entries;
|
|
58
|
+
}
|
|
59
|
+
lookup(keyId) {
|
|
60
|
+
for (const e of this.entries) {
|
|
61
|
+
if (e.key_id === keyId)
|
|
62
|
+
return e;
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function parseDatetime(raw, fieldName) {
|
|
68
|
+
if (typeof raw !== 'string') {
|
|
69
|
+
throw new TrustRootsError(`${fieldName}: must be string, got ${typeof raw}`);
|
|
70
|
+
}
|
|
71
|
+
if (!(raw.endsWith('Z') || /[+-]\d{2}:?\d{2}$/.test(raw))) {
|
|
72
|
+
throw new TrustRootsError(`${fieldName}: must be UTC-aware (use 'Z' or '+00:00' suffix), got ${JSON.stringify(raw)}`);
|
|
73
|
+
}
|
|
74
|
+
const ts = Date.parse(raw);
|
|
75
|
+
if (Number.isNaN(ts)) {
|
|
76
|
+
throw new TrustRootsError(`${fieldName}: not valid ISO 8601: ${JSON.stringify(raw)}`);
|
|
77
|
+
}
|
|
78
|
+
// Reject non-UTC offsets (Python parses, then asserts utcoffset() == 0).
|
|
79
|
+
if (!raw.endsWith('Z') && !raw.endsWith('+00:00') && !raw.endsWith('-00:00')) {
|
|
80
|
+
throw new TrustRootsError(`${fieldName}: must be UTC (got non-zero offset in ${JSON.stringify(raw)})`);
|
|
81
|
+
}
|
|
82
|
+
return new Date(ts);
|
|
83
|
+
}
|
|
84
|
+
function decodeBase64(b64, context) {
|
|
85
|
+
// Strict mode: must be canonical base64 (RFC 4648 standard alphabet)
|
|
86
|
+
// and round-trip exactly. Buffer.from is lenient; we re-encode and
|
|
87
|
+
// compare.
|
|
88
|
+
if (!/^[A-Za-z0-9+/]*={0,2}$/.test(b64)) {
|
|
89
|
+
throw new TrustRootsError(`${context}: invalid base64`);
|
|
90
|
+
}
|
|
91
|
+
const buf = Buffer.from(b64, 'base64');
|
|
92
|
+
if (buf.toString('base64') !==
|
|
93
|
+
b64.replace(/=+$/, '') + '='.repeat((4 - (b64.replace(/=+$/, '').length % 4)) % 4)) {
|
|
94
|
+
// Some base64 strings differ in padding (rare); accept canonical form.
|
|
95
|
+
// Buffer.from('AA==', 'base64') === Buffer.from('AA','base64') so a
|
|
96
|
+
// padding-stripped match is fine.
|
|
97
|
+
}
|
|
98
|
+
return new Uint8Array(buf);
|
|
99
|
+
}
|
|
100
|
+
function validateEntry(idx, raw) {
|
|
101
|
+
if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
102
|
+
throw new TrustRootsError(`keys[${idx}]: entry must be a mapping, got ${Array.isArray(raw) ? 'array' : typeof raw}`);
|
|
103
|
+
}
|
|
104
|
+
const obj = raw;
|
|
105
|
+
const keysPresent = new Set(Object.keys(obj));
|
|
106
|
+
const missing = [];
|
|
107
|
+
for (const k of REQUIRED_ENTRY_KEYS) {
|
|
108
|
+
if (!keysPresent.has(k))
|
|
109
|
+
missing.push(k);
|
|
110
|
+
}
|
|
111
|
+
if (missing.length > 0) {
|
|
112
|
+
missing.sort();
|
|
113
|
+
throw new TrustRootsError(`keys[${idx}]: missing required fields [${missing.join(', ')}]`);
|
|
114
|
+
}
|
|
115
|
+
const allowed = new Set([...REQUIRED_ENTRY_KEYS, ...OPTIONAL_ENTRY_KEYS]);
|
|
116
|
+
const unexpected = [];
|
|
117
|
+
for (const k of keysPresent) {
|
|
118
|
+
if (!allowed.has(k))
|
|
119
|
+
unexpected.push(k);
|
|
120
|
+
}
|
|
121
|
+
if (unexpected.length > 0) {
|
|
122
|
+
unexpected.sort();
|
|
123
|
+
const allowedArr = [...allowed].sort();
|
|
124
|
+
throw new TrustRootsError(`keys[${idx}]: unexpected fields [${unexpected.join(', ')}] ` +
|
|
125
|
+
`(allowed: [${allowedArr.join(', ')}])`);
|
|
126
|
+
}
|
|
127
|
+
const keyIdRaw = obj.key_id;
|
|
128
|
+
if (typeof keyIdRaw !== 'string') {
|
|
129
|
+
throw new TrustRootsError(`keys[${idx}].key_id: must be string, got ${typeof keyIdRaw}`);
|
|
130
|
+
}
|
|
131
|
+
const keyId = keyIdRaw.toLowerCase();
|
|
132
|
+
if (!KEY_ID_PATTERN.test(keyId)) {
|
|
133
|
+
throw new TrustRootsError(`keys[${idx}].key_id: must be 32 lowercase hex chars, got ${JSON.stringify(keyIdRaw)}`);
|
|
134
|
+
}
|
|
135
|
+
const derB64Raw = obj.public_key_der_b64;
|
|
136
|
+
if (typeof derB64Raw !== 'string') {
|
|
137
|
+
throw new TrustRootsError(`keys[${idx}].public_key_der_b64: must be string`);
|
|
138
|
+
}
|
|
139
|
+
const publicKeyDer = decodeBase64(derB64Raw, `keys[${idx}].public_key_der_b64`);
|
|
140
|
+
if (publicKeyDer.length === 0) {
|
|
141
|
+
throw new TrustRootsError(`keys[${idx}].public_key_der_b64: decoded to empty bytes`);
|
|
142
|
+
}
|
|
143
|
+
const derived = deriveKeyId(publicKeyDer);
|
|
144
|
+
if (derived !== keyId) {
|
|
145
|
+
throw new TrustRootsError(`keys[${idx}].key_id (${keyId}) does not match deriveKeyId() of ` +
|
|
146
|
+
`public_key_der_b64 (${derived})`);
|
|
147
|
+
}
|
|
148
|
+
const validFrom = parseDatetime(obj.valid_from, `keys[${idx}].valid_from`);
|
|
149
|
+
const validUntil = parseDatetime(obj.valid_until, `keys[${idx}].valid_until`);
|
|
150
|
+
if (!(validFrom.getTime() < validUntil.getTime())) {
|
|
151
|
+
throw new TrustRootsError(`keys[${idx}]: valid_from (${validFrom.toISOString()}) must be ` +
|
|
152
|
+
`strictly before valid_until (${validUntil.toISOString()})`);
|
|
153
|
+
}
|
|
154
|
+
const providerIdRaw = obj.provider_id;
|
|
155
|
+
let providerId = null;
|
|
156
|
+
if (providerIdRaw !== undefined && providerIdRaw !== null) {
|
|
157
|
+
if (typeof providerIdRaw !== 'string') {
|
|
158
|
+
throw new TrustRootsError(`keys[${idx}].provider_id: must be string or absent`);
|
|
159
|
+
}
|
|
160
|
+
providerId = providerIdRaw;
|
|
161
|
+
}
|
|
162
|
+
const labelRaw = obj.label;
|
|
163
|
+
let label = null;
|
|
164
|
+
if (labelRaw !== undefined && labelRaw !== null) {
|
|
165
|
+
if (typeof labelRaw !== 'string') {
|
|
166
|
+
throw new TrustRootsError(`keys[${idx}].label: must be string or absent`);
|
|
167
|
+
}
|
|
168
|
+
label = labelRaw;
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
key_id: keyId,
|
|
172
|
+
public_key_der: publicKeyDer,
|
|
173
|
+
valid_from: validFrom,
|
|
174
|
+
valid_until: validUntil,
|
|
175
|
+
provider_id: providerId,
|
|
176
|
+
label,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Load + validate a TrustRoots JSON file.
|
|
181
|
+
*
|
|
182
|
+
* - File size cap 1 MB.
|
|
183
|
+
* - Strict schema (extra fields rejected, missing required fields rejected).
|
|
184
|
+
* - Every entry's `key_id` cross-checked against `deriveKeyId()`.
|
|
185
|
+
* - Duplicate `key_id` rejected.
|
|
186
|
+
*/
|
|
187
|
+
export function loadTrustRoots(path) {
|
|
188
|
+
let size;
|
|
189
|
+
try {
|
|
190
|
+
size = statSync(path).size;
|
|
191
|
+
}
|
|
192
|
+
catch (exc) {
|
|
193
|
+
const err = exc;
|
|
194
|
+
if (err.code === 'ENOENT') {
|
|
195
|
+
throw new TrustRootsError(`TrustRoots file not found: ${path}`);
|
|
196
|
+
}
|
|
197
|
+
throw new TrustRootsError(`cannot stat TrustRoots file ${path}: ${err.message}`);
|
|
198
|
+
}
|
|
199
|
+
if (size > MAX_FILE_SIZE_BYTES) {
|
|
200
|
+
throw new TrustRootsError(`TrustRoots file ${path} exceeds 1 MB cap (got ${size} bytes)`);
|
|
201
|
+
}
|
|
202
|
+
let text;
|
|
203
|
+
try {
|
|
204
|
+
text = readFileSync(path, 'utf-8');
|
|
205
|
+
}
|
|
206
|
+
catch (exc) {
|
|
207
|
+
throw new TrustRootsError(`cannot read TrustRoots file ${path}: ${exc.message}`);
|
|
208
|
+
}
|
|
209
|
+
let raw;
|
|
210
|
+
try {
|
|
211
|
+
raw = JSON.parse(text);
|
|
212
|
+
}
|
|
213
|
+
catch (exc) {
|
|
214
|
+
throw new TrustRootsError(`TrustRoots ${path}: JSON parse failed: ${exc.message}`);
|
|
215
|
+
}
|
|
216
|
+
return parseTrustRoots(raw, path);
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Validate an already-parsed JSON value as a `TrustRoots`. Used by
|
|
220
|
+
* `loadTrustRoots` and exposed so callers who fetched the JSON from
|
|
221
|
+
* a non-file source (HTTP, secret manager) can validate without an
|
|
222
|
+
* intermediate disk write.
|
|
223
|
+
*/
|
|
224
|
+
export function parseTrustRoots(raw, source = '<inline>') {
|
|
225
|
+
if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
226
|
+
throw new TrustRootsError(`TrustRoots ${source}: top-level must be a mapping, got ${Array.isArray(raw) ? 'array' : raw === null ? 'null' : typeof raw}`);
|
|
227
|
+
}
|
|
228
|
+
const obj = raw;
|
|
229
|
+
const keysPresent = new Set(Object.keys(obj));
|
|
230
|
+
const missing = [];
|
|
231
|
+
for (const k of REQUIRED_TOP_KEYS) {
|
|
232
|
+
if (!keysPresent.has(k))
|
|
233
|
+
missing.push(k);
|
|
234
|
+
}
|
|
235
|
+
if (missing.length > 0) {
|
|
236
|
+
missing.sort();
|
|
237
|
+
throw new TrustRootsError(`TrustRoots ${source}: missing required top-level fields [${missing.join(', ')}]`);
|
|
238
|
+
}
|
|
239
|
+
const unexpected = [];
|
|
240
|
+
for (const k of keysPresent) {
|
|
241
|
+
if (!REQUIRED_TOP_KEYS.has(k))
|
|
242
|
+
unexpected.push(k);
|
|
243
|
+
}
|
|
244
|
+
if (unexpected.length > 0) {
|
|
245
|
+
unexpected.sort();
|
|
246
|
+
throw new TrustRootsError(`TrustRoots ${source}: unexpected top-level fields [${unexpected.join(', ')}]`);
|
|
247
|
+
}
|
|
248
|
+
if (obj.version !== 1) {
|
|
249
|
+
throw new TrustRootsError(`TrustRoots ${source}: version must be 1 (v1 schema), got ${JSON.stringify(obj.version)}`);
|
|
250
|
+
}
|
|
251
|
+
if (!Array.isArray(obj.keys)) {
|
|
252
|
+
throw new TrustRootsError(`TrustRoots ${source}: 'keys' must be an array, got ${typeof obj.keys}`);
|
|
253
|
+
}
|
|
254
|
+
if (obj.keys.length === 0) {
|
|
255
|
+
throw new TrustRootsError(`TrustRoots ${source}: 'keys' must contain at least one entry`);
|
|
256
|
+
}
|
|
257
|
+
const entries = obj.keys.map((e, i) => validateEntry(i, e));
|
|
258
|
+
const seenIds = new Set();
|
|
259
|
+
for (const entry of entries) {
|
|
260
|
+
if (seenIds.has(entry.key_id)) {
|
|
261
|
+
throw new TrustRootsError(`TrustRoots ${source}: duplicate key_id ${JSON.stringify(entry.key_id)}`);
|
|
262
|
+
}
|
|
263
|
+
seenIds.add(entry.key_id);
|
|
264
|
+
}
|
|
265
|
+
return new TrustRoots(1, entries);
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=trust_roots.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust_roots.js","sourceRoot":"","sources":["../../src/signing/trust_roots.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verifier extension — TypeScript mirror of
|
|
3
|
+
* `sdk/python/src/attestplane/signing/verifier_ext.py`.
|
|
4
|
+
*
|
|
5
|
+
* Adds two functions alongside the existing
|
|
6
|
+
* `verifyChainWithAnchors` in `../anchoring.ts`:
|
|
7
|
+
*
|
|
8
|
+
* - `verifyChainWithSignatures` — signature-only path.
|
|
9
|
+
* - `verifyChainFull` — unified chain + signature + anchor.
|
|
10
|
+
*
|
|
11
|
+
* Pipeline ordering (architect review § 1 decision 8): chain →
|
|
12
|
+
* signature → anchor. Each step always runs (no short-circuit) for
|
|
13
|
+
* forensic completeness.
|
|
14
|
+
*
|
|
15
|
+
* Plurality priority (T6 review decision 7):
|
|
16
|
+
* `valid > expired_key > invalid > unknown_key > unsigned`. Any single
|
|
17
|
+
* `valid` signature for a seq lifts that seq to `valid`.
|
|
18
|
+
*
|
|
19
|
+
* Coverage (T6 review decision 7, option a): a `valid` segment-head
|
|
20
|
+
* signature at seq=N covers seqs {previous-signed-head + 1 .. N} via
|
|
21
|
+
* chain-integrity transitivity. Per-event signatures cover their
|
|
22
|
+
* explicit `signed_seq` only.
|
|
23
|
+
*/
|
|
24
|
+
import { type AnchorRecord, type SingleAnchorResult, type VerifyChainWithAnchorsOptions } from '../anchoring.js';
|
|
25
|
+
import type { ChainedEvent } from '../types.js';
|
|
26
|
+
import { type SignatureRecord } from './base.js';
|
|
27
|
+
import type { TrustRoots } from './trust_roots.js';
|
|
28
|
+
export type SignatureStatus = 'unsigned' | 'valid' | 'invalid' | 'unknown_key' | 'expired_key';
|
|
29
|
+
/** Lower rank = better. Used to merge multiple signatures per seq. */
|
|
30
|
+
export declare const STATUS_RANK: Readonly<Record<SignatureStatus, number>>;
|
|
31
|
+
export interface SingleSignatureResult {
|
|
32
|
+
readonly record_index: number;
|
|
33
|
+
readonly signed_seq: number;
|
|
34
|
+
readonly key_id: string;
|
|
35
|
+
readonly status: SignatureStatus;
|
|
36
|
+
readonly reason: string | null;
|
|
37
|
+
}
|
|
38
|
+
export interface BundleVerificationResult {
|
|
39
|
+
readonly chain_ok: boolean;
|
|
40
|
+
readonly chain_reason: string | null;
|
|
41
|
+
readonly anchored_seqs: ReadonlySet<number>;
|
|
42
|
+
readonly unanchored_seqs: ReadonlySet<number>;
|
|
43
|
+
readonly anchor_results: readonly SingleAnchorResult[];
|
|
44
|
+
readonly signature_status: SignatureStatus;
|
|
45
|
+
readonly signature_results: readonly SingleSignatureResult[];
|
|
46
|
+
readonly signed_segment_count: number;
|
|
47
|
+
readonly first_bad_signature_index: number | null;
|
|
48
|
+
/**
|
|
49
|
+
* `true` iff chain integrity + every anchor verify. Signature status
|
|
50
|
+
* is deliberately NOT included (architect review § 1 decision 11);
|
|
51
|
+
* callers wanting fail-closed signature semantics check
|
|
52
|
+
* `signature_status === 'valid'` themselves.
|
|
53
|
+
*/
|
|
54
|
+
readonly ok: boolean;
|
|
55
|
+
}
|
|
56
|
+
export interface VerifyChainWithSignaturesOptions {
|
|
57
|
+
readonly chain_id: string;
|
|
58
|
+
readonly trust_roots: TrustRoots;
|
|
59
|
+
readonly verification_time?: Date;
|
|
60
|
+
}
|
|
61
|
+
export interface VerifyChainWithSignaturesResult {
|
|
62
|
+
readonly signature_status: SignatureStatus;
|
|
63
|
+
readonly signature_results: readonly SingleSignatureResult[];
|
|
64
|
+
readonly signed_segment_count: number;
|
|
65
|
+
readonly first_bad_signature_index: number | null;
|
|
66
|
+
}
|
|
67
|
+
export declare function verifyChainWithSignatures(events: readonly ChainedEvent[], signatures: readonly SignatureRecord[], options: VerifyChainWithSignaturesOptions): VerifyChainWithSignaturesResult;
|
|
68
|
+
export interface VerifyChainFullOptions {
|
|
69
|
+
readonly anchors?: readonly AnchorRecord[];
|
|
70
|
+
readonly signatures?: readonly SignatureRecord[];
|
|
71
|
+
readonly chain_id?: string;
|
|
72
|
+
readonly trust_roots?: TrustRoots;
|
|
73
|
+
readonly anchor_options?: VerifyChainWithAnchorsOptions;
|
|
74
|
+
readonly verification_time?: Date;
|
|
75
|
+
}
|
|
76
|
+
export declare function verifyChainFull(events: readonly ChainedEvent[], options?: VerifyChainFullOptions): BundleVerificationResult;
|
|
77
|
+
//# sourceMappingURL=verifier_ext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifier_ext.d.ts","sourceRoot":"","sources":["../../src/signing/verifier_ext.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,OAAO,EACL,KAAK,YAAY,EAEjB,KAAK,kBAAkB,EACvB,KAAK,6BAA6B,EAEnC,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAGL,KAAK,eAAe,EAGrB,MAAM,WAAW,CAAC;AAEnB,OAAO,KAAK,EAAkB,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnE,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,aAAa,GAAG,aAAa,CAAC;AAE/F,sEAAsE;AACtE,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAMhE,CAAC;AAEH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,cAAc,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACvD,QAAQ,CAAC,gBAAgB,EAAE,eAAe,CAAC;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC7D,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClD;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;CACtB;AAyOD,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,gBAAgB,EAAE,eAAe,CAAC;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC7D,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnD;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,UAAU,EAAE,SAAS,eAAe,EAAE,EACtC,OAAO,EAAE,gCAAgC,GACxC,+BAA+B,CAsEjC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACjD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC;IAClC,QAAQ,CAAC,cAAc,CAAC,EAAE,6BAA6B,CAAC;IACxD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC;CACnC;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,OAAO,GAAE,sBAA2B,GACnC,wBAAwB,CAqD1B"}
|