agent-passport-system 4.1.0 → 4.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/README.md +37 -34
- package/dist/src/adapters/oauth-id-jag/import-v1.d.ts +74 -0
- package/dist/src/adapters/oauth-id-jag/import-v1.d.ts.map +1 -0
- package/dist/src/adapters/oauth-id-jag/import-v1.js +243 -0
- package/dist/src/adapters/oauth-id-jag/import-v1.js.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/profiles/a2a/identity-v1.d.ts +44 -0
- package/dist/src/profiles/a2a/identity-v1.d.ts.map +1 -0
- package/dist/src/profiles/a2a/identity-v1.js +208 -0
- package/dist/src/profiles/a2a/identity-v1.js.map +1 -0
- package/dist/src/profiles/a2a/index.d.ts +2 -0
- package/dist/src/profiles/a2a/index.d.ts.map +1 -0
- package/dist/src/profiles/a2a/index.js +2 -0
- package/dist/src/profiles/a2a/index.js.map +1 -0
- package/dist/src/profiles/mcp/authorization-v1.d.ts +88 -0
- package/dist/src/profiles/mcp/authorization-v1.d.ts.map +1 -0
- package/dist/src/profiles/mcp/authorization-v1.js +215 -0
- package/dist/src/profiles/mcp/authorization-v1.js.map +1 -0
- package/dist/src/profiles/mcp/index.d.ts +2 -0
- package/dist/src/profiles/mcp/index.d.ts.map +1 -0
- package/dist/src/profiles/mcp/index.js +2 -0
- package/dist/src/profiles/mcp/index.js.map +1 -0
- package/dist/src/v2/action-reference/index.d.ts +2 -0
- package/dist/src/v2/action-reference/index.d.ts.map +1 -0
- package/dist/src/v2/action-reference/index.js +2 -0
- package/dist/src/v2/action-reference/index.js.map +1 -0
- package/dist/src/v2/action-reference/v2.d.ts +23 -0
- package/dist/src/v2/action-reference/v2.d.ts.map +1 -0
- package/dist/src/v2/action-reference/v2.js +57 -0
- package/dist/src/v2/action-reference/v2.js.map +1 -0
- package/dist/src/v2/authority-delegation/budget.d.ts +20 -0
- package/dist/src/v2/authority-delegation/budget.d.ts.map +1 -0
- package/dist/src/v2/authority-delegation/budget.js +141 -0
- package/dist/src/v2/authority-delegation/budget.js.map +1 -0
- package/dist/src/v2/authority-delegation/canonical.d.ts +12 -0
- package/dist/src/v2/authority-delegation/canonical.d.ts.map +1 -0
- package/dist/src/v2/authority-delegation/canonical.js +33 -0
- package/dist/src/v2/authority-delegation/canonical.js.map +1 -0
- package/dist/src/v2/authority-delegation/compare.d.ts +4 -0
- package/dist/src/v2/authority-delegation/compare.d.ts.map +1 -0
- package/dist/src/v2/authority-delegation/compare.js +67 -0
- package/dist/src/v2/authority-delegation/compare.js.map +1 -0
- package/dist/src/v2/authority-delegation/index.d.ts +10 -0
- package/dist/src/v2/authority-delegation/index.d.ts.map +1 -0
- package/dist/src/v2/authority-delegation/index.js +12 -0
- package/dist/src/v2/authority-delegation/index.js.map +1 -0
- package/dist/src/v2/authority-delegation/issue.d.ts +10 -0
- package/dist/src/v2/authority-delegation/issue.d.ts.map +1 -0
- package/dist/src/v2/authority-delegation/issue.js +52 -0
- package/dist/src/v2/authority-delegation/issue.js.map +1 -0
- package/dist/src/v2/authority-delegation/parse.d.ts +4 -0
- package/dist/src/v2/authority-delegation/parse.d.ts.map +1 -0
- package/dist/src/v2/authority-delegation/parse.js +96 -0
- package/dist/src/v2/authority-delegation/parse.js.map +1 -0
- package/dist/src/v2/authority-delegation/schema.d.ts +7 -0
- package/dist/src/v2/authority-delegation/schema.d.ts.map +1 -0
- package/dist/src/v2/authority-delegation/schema.js +177 -0
- package/dist/src/v2/authority-delegation/schema.js.map +1 -0
- package/dist/src/v2/authority-delegation/scope.d.ts +6 -0
- package/dist/src/v2/authority-delegation/scope.d.ts.map +1 -0
- package/dist/src/v2/authority-delegation/scope.js +50 -0
- package/dist/src/v2/authority-delegation/scope.js.map +1 -0
- package/dist/src/v2/authority-delegation/types.d.ts +98 -0
- package/dist/src/v2/authority-delegation/types.d.ts.map +1 -0
- package/dist/src/v2/authority-delegation/types.js +10 -0
- package/dist/src/v2/authority-delegation/types.js.map +1 -0
- package/dist/src/v2/authority-delegation/verify.d.ts +5 -0
- package/dist/src/v2/authority-delegation/verify.d.ts.map +1 -0
- package/dist/src/v2/authority-delegation/verify.js +124 -0
- package/dist/src/v2/authority-delegation/verify.js.map +1 -0
- package/dist/src/v2/identity-binding/did-aps.d.ts +12 -0
- package/dist/src/v2/identity-binding/did-aps.d.ts.map +1 -0
- package/dist/src/v2/identity-binding/did-aps.js +53 -0
- package/dist/src/v2/identity-binding/did-aps.js.map +1 -0
- package/dist/src/v2/identity-binding/index.d.ts +6 -0
- package/dist/src/v2/identity-binding/index.d.ts.map +1 -0
- package/dist/src/v2/identity-binding/index.js +6 -0
- package/dist/src/v2/identity-binding/index.js.map +1 -0
- package/dist/src/v2/identity-binding/passport.d.ts +18 -0
- package/dist/src/v2/identity-binding/passport.d.ts.map +1 -0
- package/dist/src/v2/identity-binding/passport.js +144 -0
- package/dist/src/v2/identity-binding/passport.js.map +1 -0
- package/dist/src/v2/identity-binding/principal-binding.d.ts +20 -0
- package/dist/src/v2/identity-binding/principal-binding.d.ts.map +1 -0
- package/dist/src/v2/identity-binding/principal-binding.js +128 -0
- package/dist/src/v2/identity-binding/principal-binding.js.map +1 -0
- package/dist/src/v2/identity-binding/revocation.d.ts +12 -0
- package/dist/src/v2/identity-binding/revocation.d.ts.map +1 -0
- package/dist/src/v2/identity-binding/revocation.js +97 -0
- package/dist/src/v2/identity-binding/revocation.js.map +1 -0
- package/dist/src/v2/identity-binding/types.d.ts +72 -0
- package/dist/src/v2/identity-binding/types.d.ts.map +1 -0
- package/dist/src/v2/identity-binding/types.js +4 -0
- package/dist/src/v2/identity-binding/types.js.map +1 -0
- package/dist/src/v2/identity-binding/validation.d.ts +9 -0
- package/dist/src/v2/identity-binding/validation.d.ts.map +1 -0
- package/dist/src/v2/identity-binding/validation.js +104 -0
- package/dist/src/v2/identity-binding/validation.js.map +1 -0
- package/dist/src/v2/receipt-core/decision-ref.d.ts +23 -0
- package/dist/src/v2/receipt-core/decision-ref.d.ts.map +1 -0
- package/dist/src/v2/receipt-core/decision-ref.js +75 -0
- package/dist/src/v2/receipt-core/decision-ref.js.map +1 -0
- package/dist/src/v2/receipt-core/jcs.d.ts +15 -0
- package/dist/src/v2/receipt-core/jcs.d.ts.map +1 -0
- package/dist/src/v2/receipt-core/jcs.js +198 -0
- package/dist/src/v2/receipt-core/jcs.js.map +1 -0
- package/dist/src/v2/receipt-core/receipt.d.ts +21 -0
- package/dist/src/v2/receipt-core/receipt.d.ts.map +1 -0
- package/dist/src/v2/receipt-core/receipt.js +132 -0
- package/dist/src/v2/receipt-core/receipt.js.map +1 -0
- package/dist/src/v2/receipt-core/supporting-record.d.ts +55 -0
- package/dist/src/v2/receipt-core/supporting-record.d.ts.map +1 -0
- package/dist/src/v2/receipt-core/supporting-record.js +243 -0
- package/dist/src/v2/receipt-core/supporting-record.js.map +1 -0
- package/dist/src/v2/receipt-core/types.d.ts +94 -0
- package/dist/src/v2/receipt-core/types.d.ts.map +1 -0
- package/dist/src/v2/receipt-core/types.js +4 -0
- package/dist/src/v2/receipt-core/types.js.map +1 -0
- package/package.json +6 -6
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
// Copyright (c) 2026 Tymofii Pidlisnyi
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { canonicalizeJCS } from '../../core/canonical-jcs.js';
|
|
4
|
+
export class IJsonValidationError extends TypeError {
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'IJsonValidationError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function assertUnicodeScalarString(value, path) {
|
|
11
|
+
for (let i = 0; i < value.length; i++) {
|
|
12
|
+
const unit = value.charCodeAt(i);
|
|
13
|
+
if (unit >= 0xd800 && unit <= 0xdbff) {
|
|
14
|
+
const next = i + 1 < value.length ? value.charCodeAt(i + 1) : -1;
|
|
15
|
+
if (next >= 0xdc00 && next <= 0xdfff) {
|
|
16
|
+
i++;
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
throw new IJsonValidationError(`${path}: unpaired high surrogate`);
|
|
20
|
+
}
|
|
21
|
+
if (unit >= 0xdc00 && unit <= 0xdfff) {
|
|
22
|
+
throw new IJsonValidationError(`${path}: unpaired low surrogate`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/** Validate the in-memory new-write input before RFC 8785 processing.
|
|
27
|
+
* No coercion is performed. In particular, undefined is not converted to null
|
|
28
|
+
* and Date is not converted to a string. */
|
|
29
|
+
export function assertIJson(value, path = '$', ancestors = new WeakSet()) {
|
|
30
|
+
if (value === null || typeof value === 'boolean')
|
|
31
|
+
return;
|
|
32
|
+
if (typeof value === 'string') {
|
|
33
|
+
assertUnicodeScalarString(value, path);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (typeof value === 'number') {
|
|
37
|
+
if (!Number.isFinite(value))
|
|
38
|
+
throw new IJsonValidationError(`${path}: non-finite number`);
|
|
39
|
+
if (Number.isInteger(value) && !Number.isSafeInteger(value)) {
|
|
40
|
+
throw new IJsonValidationError(`${path}: integer exceeds the interoperable IEEE 754 range`);
|
|
41
|
+
}
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (typeof value !== 'object') {
|
|
45
|
+
throw new IJsonValidationError(`${path}: unsupported ${typeof value}`);
|
|
46
|
+
}
|
|
47
|
+
if (value instanceof Date)
|
|
48
|
+
throw new IJsonValidationError(`${path}: Date must be converted explicitly`);
|
|
49
|
+
if (ancestors.has(value))
|
|
50
|
+
throw new IJsonValidationError(`${path}: cyclic value`);
|
|
51
|
+
ancestors.add(value);
|
|
52
|
+
if (Array.isArray(value)) {
|
|
53
|
+
value.forEach((item, i) => assertIJson(item, `${path}[${i}]`, ancestors));
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
const proto = Object.getPrototypeOf(value);
|
|
57
|
+
if (proto !== Object.prototype && proto !== null) {
|
|
58
|
+
throw new IJsonValidationError(`${path}: non-plain object`);
|
|
59
|
+
}
|
|
60
|
+
for (const [key, item] of Object.entries(value)) {
|
|
61
|
+
assertUnicodeScalarString(key, `${path} key`);
|
|
62
|
+
assertIJson(item, `${path}.${key}`, ancestors);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
ancestors.delete(value);
|
|
66
|
+
}
|
|
67
|
+
export function strictJCS(value) {
|
|
68
|
+
assertIJson(value);
|
|
69
|
+
return canonicalizeJCS(value);
|
|
70
|
+
}
|
|
71
|
+
/** Parse bounded raw JSON without losing duplicate object names.
|
|
72
|
+
* Duplicate comparison is performed after JSON string decoding, so aliases
|
|
73
|
+
* such as "a" and "\u0061" are the same member name and are rejected. */
|
|
74
|
+
export function parseStrictIJson(raw, maxUtf8Bytes = 1_048_576, maxDepth = 128) {
|
|
75
|
+
if (typeof raw !== 'string')
|
|
76
|
+
throw new IJsonValidationError('$: raw JSON string required');
|
|
77
|
+
if (!Number.isSafeInteger(maxUtf8Bytes) || maxUtf8Bytes < 1 || Buffer.byteLength(raw, 'utf8') > maxUtf8Bytes) {
|
|
78
|
+
throw new IJsonValidationError('$: raw JSON size limit exceeded');
|
|
79
|
+
}
|
|
80
|
+
if (!Number.isSafeInteger(maxDepth) || maxDepth < 1)
|
|
81
|
+
throw new IJsonValidationError('$: invalid depth limit');
|
|
82
|
+
let offset = 0;
|
|
83
|
+
const skipWhitespace = () => { while (offset < raw.length && /[\x20\t\r\n]/.test(raw[offset]))
|
|
84
|
+
offset++; };
|
|
85
|
+
const parseString = () => {
|
|
86
|
+
const start = offset++;
|
|
87
|
+
let escaped = false;
|
|
88
|
+
while (offset < raw.length) {
|
|
89
|
+
const code = raw.charCodeAt(offset);
|
|
90
|
+
if (!escaped && code === 0x22) {
|
|
91
|
+
offset++;
|
|
92
|
+
let decoded;
|
|
93
|
+
try {
|
|
94
|
+
decoded = JSON.parse(raw.slice(start, offset));
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
throw new IJsonValidationError('$: invalid JSON string');
|
|
98
|
+
}
|
|
99
|
+
assertIJson(decoded);
|
|
100
|
+
return decoded;
|
|
101
|
+
}
|
|
102
|
+
if (!escaped && code < 0x20)
|
|
103
|
+
throw new IJsonValidationError('$: unescaped control character');
|
|
104
|
+
if (!escaped && code === 0x5c)
|
|
105
|
+
escaped = true;
|
|
106
|
+
else
|
|
107
|
+
escaped = false;
|
|
108
|
+
offset++;
|
|
109
|
+
}
|
|
110
|
+
throw new IJsonValidationError('$: unterminated JSON string');
|
|
111
|
+
};
|
|
112
|
+
const parseValue = (depth) => {
|
|
113
|
+
if (depth > maxDepth)
|
|
114
|
+
throw new IJsonValidationError('$: JSON nesting limit exceeded');
|
|
115
|
+
skipWhitespace();
|
|
116
|
+
const token = raw[offset];
|
|
117
|
+
if (token === '"')
|
|
118
|
+
return parseString();
|
|
119
|
+
if (token === '{') {
|
|
120
|
+
offset++;
|
|
121
|
+
const value = Object.create(null);
|
|
122
|
+
const names = new Set();
|
|
123
|
+
skipWhitespace();
|
|
124
|
+
if (raw[offset] === '}') {
|
|
125
|
+
offset++;
|
|
126
|
+
return value;
|
|
127
|
+
}
|
|
128
|
+
while (true) {
|
|
129
|
+
skipWhitespace();
|
|
130
|
+
if (raw[offset] !== '"')
|
|
131
|
+
throw new IJsonValidationError('$: object member name required');
|
|
132
|
+
const name = parseString();
|
|
133
|
+
if (names.has(name))
|
|
134
|
+
throw new IJsonValidationError('$: duplicate object member');
|
|
135
|
+
names.add(name);
|
|
136
|
+
skipWhitespace();
|
|
137
|
+
if (raw[offset++] !== ':')
|
|
138
|
+
throw new IJsonValidationError('$: colon required');
|
|
139
|
+
value[name] = parseValue(depth + 1);
|
|
140
|
+
skipWhitespace();
|
|
141
|
+
const separator = raw[offset++];
|
|
142
|
+
if (separator === '}')
|
|
143
|
+
return value;
|
|
144
|
+
if (separator !== ',')
|
|
145
|
+
throw new IJsonValidationError('$: comma or object end required');
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (token === '[') {
|
|
149
|
+
offset++;
|
|
150
|
+
const value = [];
|
|
151
|
+
skipWhitespace();
|
|
152
|
+
if (raw[offset] === ']') {
|
|
153
|
+
offset++;
|
|
154
|
+
return value;
|
|
155
|
+
}
|
|
156
|
+
while (true) {
|
|
157
|
+
value.push(parseValue(depth + 1));
|
|
158
|
+
skipWhitespace();
|
|
159
|
+
const separator = raw[offset++];
|
|
160
|
+
if (separator === ']')
|
|
161
|
+
return value;
|
|
162
|
+
if (separator !== ',')
|
|
163
|
+
throw new IJsonValidationError('$: comma or array end required');
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
for (const [literal, value] of [['true', true], ['false', false], ['null', null]]) {
|
|
167
|
+
if (raw.startsWith(literal, offset)) {
|
|
168
|
+
offset += literal.length;
|
|
169
|
+
return value;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
const number = raw.slice(offset).match(/^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/);
|
|
173
|
+
if (!number)
|
|
174
|
+
throw new IJsonValidationError('$: JSON value required');
|
|
175
|
+
offset += number[0].length;
|
|
176
|
+
const value = JSON.parse(number[0]);
|
|
177
|
+
assertIJson(value);
|
|
178
|
+
return value;
|
|
179
|
+
};
|
|
180
|
+
const value = parseValue(1);
|
|
181
|
+
skipWhitespace();
|
|
182
|
+
if (offset !== raw.length)
|
|
183
|
+
throw new IJsonValidationError('$: trailing JSON data');
|
|
184
|
+
assertIJson(value);
|
|
185
|
+
return value;
|
|
186
|
+
}
|
|
187
|
+
export function assertExactKeys(value, allowed, required, name) {
|
|
188
|
+
const allow = new Set(allowed);
|
|
189
|
+
for (const key of Object.keys(value)) {
|
|
190
|
+
if (!allow.has(key))
|
|
191
|
+
throw new IJsonValidationError(`${name}: unknown field ${key}`);
|
|
192
|
+
}
|
|
193
|
+
for (const key of required) {
|
|
194
|
+
if (!(key in value))
|
|
195
|
+
throw new IJsonValidationError(`${name}: missing field ${key}`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=jcs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jcs.js","sourceRoot":"","sources":["../../../../src/v2/receipt-core/jcs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ReceiptSignatureV1, ReceiptSignerV1, ReceiptV1 } from './types.js';
|
|
2
|
+
export declare const RECEIPT_ID_TAG: 'APS-RECEIPT-ID-V1';
|
|
3
|
+
export declare const RECEIPT_SIG_TAG: 'APS-RECEIPT-SIG-V1';
|
|
4
|
+
export declare function receiptIdPayloadV1(receipt: ReceiptV1): string;
|
|
5
|
+
export declare function computeReceiptIdV1(receipt: ReceiptV1): string;
|
|
6
|
+
export declare function receiptSignaturePayloadV1(receipt: ReceiptV1, descriptor: Omit<ReceiptSignatureV1, 'value'>): string;
|
|
7
|
+
export declare function validateReceiptV1(receipt: ReceiptV1, requireValues?: boolean): void;
|
|
8
|
+
export declare function createReceiptV1(fields: Omit<ReceiptV1, 'receipt_id' | 'signatures'>, signers: ReceiptSignerV1[]): ReceiptV1;
|
|
9
|
+
export interface ReceiptVerificationV1 {
|
|
10
|
+
valid: boolean;
|
|
11
|
+
receipt_id_valid: boolean;
|
|
12
|
+
signature_results: {
|
|
13
|
+
signer: string;
|
|
14
|
+
key_id: string;
|
|
15
|
+
valid: boolean;
|
|
16
|
+
reason?: string;
|
|
17
|
+
}[];
|
|
18
|
+
errors: string[];
|
|
19
|
+
}
|
|
20
|
+
export declare function verifyReceiptV1(receipt: ReceiptV1, resolveKey: (signer: string, keyId: string, issuedAt: string) => string | undefined): ReceiptVerificationV1;
|
|
21
|
+
//# sourceMappingURL=receipt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipt.d.ts","sourceRoot":"","sources":["../../../../src/v2/receipt-core/receipt.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAiB,kBAAkB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE/F,eAAO,MAAM,cAAc,EAAG,mBAA4B,CAAA;AAC1D,eAAO,MAAM,eAAe,EAAG,oBAA6B,CAAA;AA2B5D,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,CAE7D;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,CAE7D;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,kBAAkB,EAAE,OAAO,CAAC,GAAG,MAAM,CAGnH;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,EAAE,aAAa,UAAO,GAAG,IAAI,CAiChF;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,GAAG,YAAY,CAAC,EACpD,OAAO,EAAE,eAAe,EAAE,GACzB,SAAS,CAeX;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,CAAA;IACd,gBAAgB,EAAE,OAAO,CAAA;IACzB,iBAAiB,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACxF,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAAG,qBAAqB,CAmB9J"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
// Copyright (c) 2026 Tymofii Pidlisnyi
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
import { sign, verify } from '../../crypto/keys.js';
|
|
5
|
+
import { assertExactKeys, strictJCS } from './jcs.js';
|
|
6
|
+
export const RECEIPT_ID_TAG = 'APS-RECEIPT-ID-V1';
|
|
7
|
+
export const RECEIPT_SIG_TAG = 'APS-RECEIPT-SIG-V1';
|
|
8
|
+
const HEX64 = /^[0-9a-f]{64}$/;
|
|
9
|
+
const HEX128 = /^[0-9a-f]{128}$/;
|
|
10
|
+
const UTC_MS = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
|
|
11
|
+
const sha256Hex = (s) => createHash('sha256').update(s, 'utf8').digest('hex');
|
|
12
|
+
const compareUtf8 = (a, b) => Buffer.compare(Buffer.from(a, 'utf8'), Buffer.from(b, 'utf8'));
|
|
13
|
+
function compareEvidence(a, b) {
|
|
14
|
+
return compareUtf8(a.artifact_type, b.artifact_type) || compareUtf8(a.sha256, b.sha256);
|
|
15
|
+
}
|
|
16
|
+
function compareSignatures(a, b) {
|
|
17
|
+
return compareUtf8(a.signer, b.signer) || compareUtf8(a.key_id, b.key_id);
|
|
18
|
+
}
|
|
19
|
+
function isExactUtcMilliseconds(value) {
|
|
20
|
+
if (!UTC_MS.test(value))
|
|
21
|
+
return false;
|
|
22
|
+
const parsed = new Date(value);
|
|
23
|
+
return !Number.isNaN(parsed.valueOf()) && parsed.toISOString() === value;
|
|
24
|
+
}
|
|
25
|
+
function receiptWithout(receipt, ...keys) {
|
|
26
|
+
const copy = { ...receipt };
|
|
27
|
+
keys.forEach(k => delete copy[k]);
|
|
28
|
+
return copy;
|
|
29
|
+
}
|
|
30
|
+
export function receiptIdPayloadV1(receipt) {
|
|
31
|
+
return `${RECEIPT_ID_TAG}\0${strictJCS(receiptWithout(receipt, 'receipt_id', 'signatures'))}`;
|
|
32
|
+
}
|
|
33
|
+
export function computeReceiptIdV1(receipt) {
|
|
34
|
+
return sha256Hex(receiptIdPayloadV1(receipt));
|
|
35
|
+
}
|
|
36
|
+
export function receiptSignaturePayloadV1(receipt, descriptor) {
|
|
37
|
+
const form = { receipt: receiptWithout(receipt, 'signatures'), signer: descriptor };
|
|
38
|
+
return `${RECEIPT_SIG_TAG}\0${strictJCS(form)}`;
|
|
39
|
+
}
|
|
40
|
+
export function validateReceiptV1(receipt, requireValues = true) {
|
|
41
|
+
assertExactKeys(receipt, ['profile', 'receipt_id', 'receipt_type', 'issuer', 'subject_agent', 'action_ref', 'delegation_ref', 'decision_ref', 'issued_at', 'evidence_refs', 'result', 'prev', 'signatures'], ['profile', 'receipt_id', 'receipt_type', 'issuer', 'subject_agent', 'action_ref', 'delegation_ref', 'issued_at', 'evidence_refs', 'result', 'signatures'], 'ReceiptV1');
|
|
42
|
+
strictJCS(receipt);
|
|
43
|
+
if (receipt.profile !== 'aps-receipt-v1')
|
|
44
|
+
throw new TypeError('ReceiptV1: profile');
|
|
45
|
+
if (!receipt.receipt_type || !receipt.issuer || !receipt.subject_agent || !receipt.delegation_ref)
|
|
46
|
+
throw new TypeError('ReceiptV1: empty identifier');
|
|
47
|
+
if (requireValues && !HEX64.test(receipt.receipt_id))
|
|
48
|
+
throw new TypeError('ReceiptV1: receipt_id');
|
|
49
|
+
if (!HEX64.test(receipt.action_ref))
|
|
50
|
+
throw new TypeError('ReceiptV1: action_ref');
|
|
51
|
+
if (receipt.decision_ref !== undefined && !HEX64.test(receipt.decision_ref))
|
|
52
|
+
throw new TypeError('ReceiptV1: decision_ref');
|
|
53
|
+
if (receipt.prev !== undefined && !HEX64.test(receipt.prev))
|
|
54
|
+
throw new TypeError('ReceiptV1: prev');
|
|
55
|
+
if (!isExactUtcMilliseconds(receipt.issued_at))
|
|
56
|
+
throw new TypeError('ReceiptV1: issued_at');
|
|
57
|
+
if (typeof receipt.result !== 'object' || receipt.result === null || Array.isArray(receipt.result))
|
|
58
|
+
throw new TypeError('ReceiptV1: result');
|
|
59
|
+
if (!Array.isArray(receipt.evidence_refs) || !Array.isArray(receipt.signatures))
|
|
60
|
+
throw new TypeError('ReceiptV1: arrays');
|
|
61
|
+
const seenEvidence = new Set();
|
|
62
|
+
receipt.evidence_refs.forEach((ref, i) => {
|
|
63
|
+
assertExactKeys(ref, ['artifact_type', 'sha256'], ['artifact_type', 'sha256'], 'EvidenceRefV1');
|
|
64
|
+
if (!ref.artifact_type || !HEX64.test(ref.sha256))
|
|
65
|
+
throw new TypeError('EvidenceRefV1: value');
|
|
66
|
+
const key = `${ref.artifact_type}\0${ref.sha256}`;
|
|
67
|
+
if (seenEvidence.has(key))
|
|
68
|
+
throw new TypeError('ReceiptV1: duplicate evidence_ref');
|
|
69
|
+
seenEvidence.add(key);
|
|
70
|
+
if (i > 0 && compareEvidence(receipt.evidence_refs[i - 1], ref) >= 0)
|
|
71
|
+
throw new TypeError('ReceiptV1: evidence_refs not sorted');
|
|
72
|
+
});
|
|
73
|
+
const seenSigs = new Set();
|
|
74
|
+
receipt.signatures.forEach((proof, i) => {
|
|
75
|
+
assertExactKeys(proof, ['signer', 'key_id', 'alg', 'value'], ['signer', 'key_id', 'alg', 'value'], 'ReceiptSignatureV1');
|
|
76
|
+
if (!proof.signer || !proof.key_id || proof.alg !== 'Ed25519' || (requireValues && !HEX128.test(proof.value)))
|
|
77
|
+
throw new TypeError('ReceiptSignatureV1: value');
|
|
78
|
+
const key = `${proof.signer}\0${proof.key_id}`;
|
|
79
|
+
if (seenSigs.has(key))
|
|
80
|
+
throw new TypeError('ReceiptV1: duplicate signature');
|
|
81
|
+
seenSigs.add(key);
|
|
82
|
+
if (i > 0 && compareSignatures(receipt.signatures[i - 1], proof) >= 0)
|
|
83
|
+
throw new TypeError('ReceiptV1: signatures not sorted');
|
|
84
|
+
});
|
|
85
|
+
if (requireValues && !receipt.signatures.some(s => s.signer === receipt.issuer))
|
|
86
|
+
throw new TypeError('ReceiptV1: issuer signature missing');
|
|
87
|
+
}
|
|
88
|
+
export function createReceiptV1(fields, signers) {
|
|
89
|
+
if (signers.length === 0)
|
|
90
|
+
throw new TypeError('ReceiptV1: at least one signer');
|
|
91
|
+
const copiedFields = structuredClone(fields);
|
|
92
|
+
const evidence_refs = [...copiedFields.evidence_refs].sort(compareEvidence);
|
|
93
|
+
const descriptors = signers.map(s => ({ signer: s.signer, key_id: s.key_id, alg: 'Ed25519', private_key: s.private_key }))
|
|
94
|
+
.sort(compareSignatures);
|
|
95
|
+
const draft = { ...copiedFields, evidence_refs, receipt_id: '0'.repeat(64), signatures: [] };
|
|
96
|
+
validateReceiptV1(draft, false);
|
|
97
|
+
draft.receipt_id = computeReceiptIdV1(draft);
|
|
98
|
+
draft.signatures = descriptors.map(({ private_key, ...descriptor }) => ({
|
|
99
|
+
...descriptor,
|
|
100
|
+
value: sign(receiptSignaturePayloadV1(draft, descriptor), private_key),
|
|
101
|
+
}));
|
|
102
|
+
validateReceiptV1(draft);
|
|
103
|
+
return draft;
|
|
104
|
+
}
|
|
105
|
+
export function verifyReceiptV1(receipt, resolveKey) {
|
|
106
|
+
const errors = [];
|
|
107
|
+
try {
|
|
108
|
+
validateReceiptV1(receipt);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
return { valid: false, receipt_id_valid: false, signature_results: [], errors: [err instanceof Error ? err.message : String(err)] };
|
|
112
|
+
}
|
|
113
|
+
const receipt_id_valid = computeReceiptIdV1(receipt) === receipt.receipt_id;
|
|
114
|
+
if (!receipt_id_valid)
|
|
115
|
+
errors.push('receipt_id_mismatch');
|
|
116
|
+
const signature_results = receipt.signatures.map(proof => {
|
|
117
|
+
try {
|
|
118
|
+
const key = resolveKey(proof.signer, proof.key_id, receipt.issued_at);
|
|
119
|
+
if (!key)
|
|
120
|
+
return { signer: proof.signer, key_id: proof.key_id, valid: false, reason: 'key_unresolved' };
|
|
121
|
+
const { value, ...descriptor } = proof;
|
|
122
|
+
return { signer: proof.signer, key_id: proof.key_id, valid: verify(receiptSignaturePayloadV1(receipt, descriptor), value, key) };
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return { signer: proof.signer, key_id: proof.key_id, valid: false, reason: 'key_resolution_error' };
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
if (signature_results.some(r => !r.valid))
|
|
129
|
+
errors.push('signature_invalid');
|
|
130
|
+
return { valid: errors.length === 0, receipt_id_valid, signature_results, errors };
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=receipt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipt.js","sourceRoot":"","sources":["../../../../src/v2/receipt-core/receipt.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,sCAAsC;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAGrD,MAAM,CAAC,MAAM,cAAc,GAAG,mBAA4B,CAAA;AAC1D,MAAM,CAAC,MAAM,eAAe,GAAG,oBAA6B,CAAA;AAC5D,MAAM,KAAK,GAAG,gBAAgB,CAAA;AAC9B,MAAM,MAAM,GAAG,iBAAiB,CAAA;AAChC,MAAM,MAAM,GAAG,+CAA+C,CAAA;AAC9D,MAAM,SAAS,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAC7F,MAAM,WAAW,GAAG,CAAC,CAAS,EAAE,CAAS,EAAU,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;AAEpH,SAAS,eAAe,CAAC,CAAgB,EAAE,CAAgB;IACzD,OAAO,WAAW,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;AACzF,CAAC;AAED,SAAS,iBAAiB,CAAC,CAAgD,EAAE,CAAgD;IAC3H,OAAO,WAAW,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;AAC3E,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAa;IAC3C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IACrC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAA;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,KAAK,CAAA;AAC1E,CAAC;AAED,SAAS,cAAc,CAAwC,OAAkB,EAAE,GAAG,IAAS;IAC7F,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,EAA6B,CAAA;IACtD,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IACjC,OAAO,IAA0B,CAAA;AACnC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAkB;IACnD,OAAO,GAAG,cAAc,KAAK,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,EAAE,CAAA;AAC/F,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAkB;IACnD,OAAO,SAAS,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAA;AAC/C,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAAkB,EAAE,UAA6C;IACzG,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAA;IACnF,OAAO,GAAG,eAAe,KAAK,SAAS,CAAC,IAAI,CAAC,EAAE,CAAA;AACjD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAkB,EAAE,aAAa,GAAG,IAAI;IACxE,eAAe,CAAC,OAA6C,EAC3D,CAAC,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAClL,CAAC,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,WAAW,CAAC,CAAA;IAC1K,SAAS,CAAC,OAAO,CAAC,CAAA;IAClB,IAAI,OAAO,CAAC,OAAO,KAAK,gBAAgB;QAAE,MAAM,IAAI,SAAS,CAAC,oBAAoB,CAAC,CAAA;IACnF,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,cAAc;QAAE,MAAM,IAAI,SAAS,CAAC,6BAA6B,CAAC,CAAA;IACrJ,IAAI,aAAa,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,uBAAuB,CAAC,CAAA;IAClG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,uBAAuB,CAAC,CAAA;IACjF,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,yBAAyB,CAAC,CAAA;IAC3H,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAA;IACnG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,SAAS,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,sBAAsB,CAAC,CAAA;IAC3F,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,mBAAmB,CAAC,CAAA;IAC5I,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,mBAAmB,CAAC,CAAA;IACzH,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAA;IACtC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QACvC,eAAe,CAAC,GAAyC,EAAE,CAAC,eAAe,EAAE,QAAQ,CAAC,EAAE,CAAC,eAAe,EAAE,QAAQ,CAAC,EAAE,eAAe,CAAC,CAAA;QACrI,IAAI,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,sBAAsB,CAAC,CAAA;QAC9F,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,aAAa,KAAK,GAAG,CAAC,MAAM,EAAE,CAAA;QACjD,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAA;QACnF,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACrB,IAAI,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,qCAAqC,CAAC,CAAA;IAClI,CAAC,CAAC,CAAA;IACF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;IAClC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QACtC,eAAe,CAAC,KAA2C,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,oBAAoB,CAAC,CAAA;QAC9J,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,aAAa,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAA;QAC/J,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAA;QAC9C,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,gCAAgC,CAAC,CAAA;QAC5E,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACjB,IAAI,CAAC,GAAG,CAAC,IAAI,iBAAiB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,kCAAkC,CAAC,CAAA;IAChI,CAAC,CAAC,CAAA;IACF,IAAI,aAAa,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,qCAAqC,CAAC,CAAA;AAC7I,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,MAAoD,EACpD,OAA0B;IAE1B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,gCAAgC,CAAC,CAAA;IAC/E,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC,CAAA;IAC5C,MAAM,aAAa,GAAG,CAAC,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IAC3E,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,SAAkB,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;SAChI,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAC1B,MAAM,KAAK,GAAG,EAAE,GAAG,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAe,CAAA;IACzG,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IAC/B,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAA;IAC5C,KAAK,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QACtE,GAAG,UAAU;QACb,KAAK,EAAE,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC;KACvE,CAAC,CAAC,CAAA;IACH,iBAAiB,CAAC,KAAK,CAAC,CAAA;IACxB,OAAO,KAAK,CAAA;AACd,CAAC;AASD,MAAM,UAAU,eAAe,CAAC,OAAkB,EAAE,UAAmF;IACrI,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,CAAC;QAAC,iBAAiB,CAAC,OAAO,CAAC,CAAA;IAAC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QAC9C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAA;IACrI,CAAC;IACD,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,UAAU,CAAA;IAC3E,IAAI,CAAC,gBAAgB;QAAE,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;IACzD,MAAM,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QACvD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;YACrE,IAAI,CAAC,GAAG;gBAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAA;YACvG,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,EAAE,GAAG,KAAK,CAAA;YACtC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,yBAAyB,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,CAAA;QAClI,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAA;QACrG,CAAC;IACH,CAAC,CAAC,CAAA;IACF,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;IAC3E,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAA;AACpF,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { EvidenceBundleBodyV2, EvidenceBundleMemberInputV2, EvidenceBundleMemberV2, EvidenceBundleProofV2, JsonValue, SupportingRecordV1 } from './types.js';
|
|
2
|
+
export declare const SUPPORTING_RECORD_ID_TAG: 'APS-SUPPORTING-RECORD-ID-V1';
|
|
3
|
+
export declare const SUPPORTING_RECORD_SIG_TAG: 'APS-SUPPORTING-RECORD-SIG-V1';
|
|
4
|
+
export declare function supportingRecordIdPayloadV1(record: SupportingRecordV1): string;
|
|
5
|
+
export declare function computeSupportingRecordIdV1(record: SupportingRecordV1): string;
|
|
6
|
+
export declare function supportingRecordSignaturePayloadV1(record: SupportingRecordV1): string;
|
|
7
|
+
export declare function validateSupportingRecordV1(record: SupportingRecordV1, requireCrypto?: boolean): void;
|
|
8
|
+
export declare function createSupportingRecordV1(fields: Omit<SupportingRecordV1, 'record_id' | 'sig'>, privateKey: string): SupportingRecordV1;
|
|
9
|
+
export declare function verifySupportingRecordV1(record: SupportingRecordV1, publicKey: string): {
|
|
10
|
+
valid: boolean;
|
|
11
|
+
id_valid: boolean;
|
|
12
|
+
signature_valid: boolean;
|
|
13
|
+
};
|
|
14
|
+
export declare function evidenceBundleMerkleRootV2(entries: EvidenceBundleMemberV2[]): string;
|
|
15
|
+
export declare function buildEvidenceBundleBodyV2(members: EvidenceBundleMemberInputV2[]): EvidenceBundleBodyV2;
|
|
16
|
+
export declare function verifyEvidenceBundleBodyV2(body: EvidenceBundleBodyV2, payloads?: Record<string, JsonValue>): boolean;
|
|
17
|
+
/** Build an inclusion proof over the already-sorted manifest members.
|
|
18
|
+
* Odd nodes are promoted, never duplicated, and the promotion is explicit in
|
|
19
|
+
* the proof so a verifier can validate the tree shape from leaf_count. */
|
|
20
|
+
export declare function buildEvidenceBundleProofV2(entries: EvidenceBundleMemberV2[], memberId: string): EvidenceBundleProofV2;
|
|
21
|
+
export declare function verifyEvidenceBundleProofV2(proof: EvidenceBundleProofV2, trustedRoot: string, payload?: JsonValue): boolean;
|
|
22
|
+
export type SupportingRecordFormat = {
|
|
23
|
+
format: 'supporting-record-v1';
|
|
24
|
+
canonicalization: 'rfc8785';
|
|
25
|
+
legacy: false;
|
|
26
|
+
} | {
|
|
27
|
+
format: 'evidence-bundle-v1';
|
|
28
|
+
canonicalization: 'aps-legacy-null-dropping';
|
|
29
|
+
legacy: true;
|
|
30
|
+
} | {
|
|
31
|
+
format: 'composition-check-v0';
|
|
32
|
+
canonicalization: 'rfc8785-tagged-v0';
|
|
33
|
+
legacy: true;
|
|
34
|
+
} | {
|
|
35
|
+
format: 'accountability-record-0.1.0';
|
|
36
|
+
canonicalization: 'rfc8785-untagged';
|
|
37
|
+
legacy: true;
|
|
38
|
+
} | {
|
|
39
|
+
format: 'read-fidelity-unwrapped';
|
|
40
|
+
canonicalization: 'rfc8785-untagged';
|
|
41
|
+
legacy: true;
|
|
42
|
+
} | {
|
|
43
|
+
format: 'revocation-observation-unversioned';
|
|
44
|
+
canonicalization: 'aps-legacy-null-dropping';
|
|
45
|
+
legacy: true;
|
|
46
|
+
} | {
|
|
47
|
+
format: 'unknown';
|
|
48
|
+
canonicalization: 'unknown';
|
|
49
|
+
legacy: false;
|
|
50
|
+
};
|
|
51
|
+
/** Explicit discriminator dispatch. Verification code must never try both canonicalizers. */
|
|
52
|
+
export declare function classifySupportingRecordFormat(value: unknown): SupportingRecordFormat;
|
|
53
|
+
/** Legacy canonical bytes are exposed only after explicit legacy classification. */
|
|
54
|
+
export declare function legacyNullDroppingPayload(value: JsonValue): string;
|
|
55
|
+
//# sourceMappingURL=supporting-record.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supporting-record.d.ts","sourceRoot":"","sources":["../../../../src/v2/receipt-core/supporting-record.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,sBAAsB,EAA6B,qBAAqB,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAE5L,eAAO,MAAM,wBAAwB,EAAG,6BAAsC,CAAA;AAC9E,eAAO,MAAM,yBAAyB,EAAG,8BAAuC,CAAA;AAkBhF,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAE9E;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAE9E;AAED,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAErF;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,kBAAkB,EAAE,aAAa,UAAO,GAAG,IAAI,CAYjG;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW,GAAG,KAAK,CAAC,EACrD,UAAU,EAAE,MAAM,GACjB,kBAAkB,CAOpB;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,eAAe,EAAE,OAAO,CAAA;CAAE,CAKvJ;AAYD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,sBAAsB,EAAE,GAAG,MAAM,CAsBpF;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,2BAA2B,EAAE,GAAG,oBAAoB,CAWtG;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,oBAAoB,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,OAAO,CAepH;AAMD;;2EAE2E;AAC3E,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,sBAAsB,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,qBAAqB,CAoBrH;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,GAAG,OAAO,CA+B3H;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,MAAM,EAAE,sBAAsB,CAAC;IAAC,gBAAgB,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,KAAK,CAAA;CAAE,GAC9E;IAAE,MAAM,EAAE,oBAAoB,CAAC;IAAC,gBAAgB,EAAE,0BAA0B,CAAC;IAAC,MAAM,EAAE,IAAI,CAAA;CAAE,GAC5F;IAAE,MAAM,EAAE,sBAAsB,CAAC;IAAC,gBAAgB,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,IAAI,CAAA;CAAE,GACvF;IAAE,MAAM,EAAE,6BAA6B,CAAC;IAAC,gBAAgB,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,IAAI,CAAA;CAAE,GAC7F;IAAE,MAAM,EAAE,yBAAyB,CAAC;IAAC,gBAAgB,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,IAAI,CAAA;CAAE,GACzF;IAAE,MAAM,EAAE,oCAAoC,CAAC;IAAC,gBAAgB,EAAE,0BAA0B,CAAC;IAAC,MAAM,EAAE,IAAI,CAAA;CAAE,GAC5G;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,gBAAgB,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,KAAK,CAAA;CAAE,CAAA;AAErE,6FAA6F;AAC7F,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,GAAG,sBAAsB,CAUrF;AAED,oFAAoF;AACpF,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAElE"}
|