@onchaindiligence/agent-evidence 0.1.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 +21 -0
- package/README.md +98 -0
- package/conformance/README.md +31 -0
- package/conformance/duplicate-outer-key.json +1 -0
- package/conformance/manifest.json +74 -0
- package/conformance/missing-parent.json +31 -0
- package/conformance/noncanonical-payload.json +31 -0
- package/conformance/rfc8785-vectors.json +31 -0
- package/conformance/valid-full-graph.json +31 -0
- package/dist/canonical.d.ts +14 -0
- package/dist/canonical.d.ts.map +1 -0
- package/dist/canonical.js +249 -0
- package/dist/canonical.js.map +1 -0
- package/dist/constants.d.ts +9 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +9 -0
- package/dist/constants.js.map +1 -0
- package/dist/dsse.d.ts +10 -0
- package/dist/dsse.d.ts.map +1 -0
- package/dist/dsse.js +85 -0
- package/dist/dsse.js.map +1 -0
- package/dist/errors.d.ts +16 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +19 -0
- package/dist/errors.js.map +1 -0
- package/dist/graph.d.ts +3 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +227 -0
- package/dist/graph.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/records.d.ts +14 -0
- package/dist/records.d.ts.map +1 -0
- package/dist/records.js +55 -0
- package/dist/records.js.map +1 -0
- package/dist/schema.d.ts +4 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +45 -0
- package/dist/schema.js.map +1 -0
- package/dist/trust.d.ts +64 -0
- package/dist/trust.d.ts.map +1 -0
- package/dist/trust.js +254 -0
- package/dist/trust.js.map +1 -0
- package/dist/types.d.ts +83 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/verifier.d.ts +5 -0
- package/dist/verifier.d.ts.map +1 -0
- package/dist/verifier.js +489 -0
- package/dist/verifier.js.map +1 -0
- package/examples/withheld-payment.mjs +67 -0
- package/package.json +65 -0
- package/schemas/attestation-key.schema.json +88 -0
- package/schemas/bundle-payload.schema.json +32 -0
- package/schemas/catalog.json +20 -0
- package/schemas/common.schema.json +35 -0
- package/schemas/dsse-envelope.schema.json +34 -0
- package/schemas/portable-file.schema.json +62 -0
- package/schemas/proof.schema.json +98 -0
- package/schemas/record.schema.json +286 -0
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { CanonicalizationError, ParseError } from './errors.js';
|
|
3
|
+
const TIMESTAMP = /^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}Z$/;
|
|
4
|
+
function assertUnicodeScalarValue(value) {
|
|
5
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
6
|
+
const unit = value.charCodeAt(index);
|
|
7
|
+
if (unit >= 0xd800 && unit <= 0xdbff) {
|
|
8
|
+
const next = value.charCodeAt(index + 1);
|
|
9
|
+
if (!(next >= 0xdc00 && next <= 0xdfff)) {
|
|
10
|
+
throw new CanonicalizationError('canonical JSON cannot contain an unpaired surrogate');
|
|
11
|
+
}
|
|
12
|
+
index += 1;
|
|
13
|
+
}
|
|
14
|
+
else if (unit >= 0xdc00 && unit <= 0xdfff) {
|
|
15
|
+
throw new CanonicalizationError('canonical JSON cannot contain an unpaired surrogate');
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function canonical(value, seen) {
|
|
20
|
+
if (value === null || typeof value === 'boolean')
|
|
21
|
+
return JSON.stringify(value);
|
|
22
|
+
if (typeof value === 'string') {
|
|
23
|
+
assertUnicodeScalarValue(value);
|
|
24
|
+
return JSON.stringify(value);
|
|
25
|
+
}
|
|
26
|
+
if (typeof value === 'number') {
|
|
27
|
+
if (!Number.isFinite(value))
|
|
28
|
+
throw new CanonicalizationError('canonical JSON cannot contain non-finite numbers');
|
|
29
|
+
if (Number.isInteger(value) && !Number.isSafeInteger(value) && !JSON.stringify(value).includes('e')) {
|
|
30
|
+
throw new CanonicalizationError('canonical JSON integer exceeds the interoperable safe-integer range');
|
|
31
|
+
}
|
|
32
|
+
return JSON.stringify(value);
|
|
33
|
+
}
|
|
34
|
+
if (typeof value !== 'object') {
|
|
35
|
+
throw new CanonicalizationError(`value of type ${typeof value} is not valid JSON`);
|
|
36
|
+
}
|
|
37
|
+
if (seen.has(value))
|
|
38
|
+
throw new CanonicalizationError('canonical JSON cannot contain cycles');
|
|
39
|
+
seen.add(value);
|
|
40
|
+
try {
|
|
41
|
+
if (Array.isArray(value))
|
|
42
|
+
return `[${value.map((item) => canonical(item, seen)).join(',')}]`;
|
|
43
|
+
const prototype = Object.getPrototypeOf(value);
|
|
44
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
45
|
+
throw new CanonicalizationError('canonical JSON objects must have a plain object prototype');
|
|
46
|
+
}
|
|
47
|
+
const record = value;
|
|
48
|
+
const entries = Object.keys(record)
|
|
49
|
+
.sort()
|
|
50
|
+
.map((key) => {
|
|
51
|
+
assertUnicodeScalarValue(key);
|
|
52
|
+
return `${JSON.stringify(key)}:${canonical(record[key], seen)}`;
|
|
53
|
+
});
|
|
54
|
+
return `{${entries.join(',')}}`;
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
seen.delete(value);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export function canonicalize(value) {
|
|
61
|
+
return Buffer.from(canonical(value, new Set()), 'utf8');
|
|
62
|
+
}
|
|
63
|
+
export function canonicalizeText(value) {
|
|
64
|
+
return Buffer.from(canonicalize(value)).toString('utf8');
|
|
65
|
+
}
|
|
66
|
+
export function contentId(value) {
|
|
67
|
+
return `sha256:${createHash('sha256').update(canonicalize(value)).digest('base64url')}`;
|
|
68
|
+
}
|
|
69
|
+
export function formatTimestamp(value) {
|
|
70
|
+
if (!(value instanceof Date) || Number.isNaN(value.getTime()))
|
|
71
|
+
throw new TypeError('timestamp must be a valid Date');
|
|
72
|
+
return value.toISOString();
|
|
73
|
+
}
|
|
74
|
+
export function parseTimestamp(value) {
|
|
75
|
+
if (!TIMESTAMP.test(value))
|
|
76
|
+
throw new ParseError('timestamp must use exact YYYY-MM-DDTHH:mm:ss.sssZ syntax');
|
|
77
|
+
const parsed = new Date(value);
|
|
78
|
+
if (Number.isNaN(parsed.getTime()) || parsed.toISOString() !== value) {
|
|
79
|
+
throw new ParseError(`invalid UTC timestamp: ${value}`);
|
|
80
|
+
}
|
|
81
|
+
return parsed;
|
|
82
|
+
}
|
|
83
|
+
export function cloneJson(value) {
|
|
84
|
+
return parseJson(canonicalize(value));
|
|
85
|
+
}
|
|
86
|
+
export function enforceLimits(value, limits) {
|
|
87
|
+
const visit = (item, depth) => {
|
|
88
|
+
if (depth > limits.maxDepth)
|
|
89
|
+
throw new ParseError(`JSON exceeds maximum depth ${limits.maxDepth}`);
|
|
90
|
+
if (typeof item === 'string') {
|
|
91
|
+
if (item.length > limits.maxStringLength) {
|
|
92
|
+
throw new ParseError(`JSON string exceeds maximum length ${limits.maxStringLength}`);
|
|
93
|
+
}
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (Array.isArray(item)) {
|
|
97
|
+
if (item.length > limits.maxArrayLength) {
|
|
98
|
+
throw new ParseError(`JSON array exceeds maximum length ${limits.maxArrayLength}`);
|
|
99
|
+
}
|
|
100
|
+
for (const child of item)
|
|
101
|
+
visit(child, depth + 1);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (item !== null && typeof item === 'object') {
|
|
105
|
+
const entries = Object.entries(item);
|
|
106
|
+
if (entries.length > limits.maxArrayLength) {
|
|
107
|
+
throw new ParseError(`JSON object exceeds maximum members ${limits.maxArrayLength}`);
|
|
108
|
+
}
|
|
109
|
+
for (const [key, child] of entries) {
|
|
110
|
+
visit(key, depth + 1);
|
|
111
|
+
visit(child, depth + 1);
|
|
112
|
+
}
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if (typeof item === 'number') {
|
|
116
|
+
if (!Number.isFinite(item))
|
|
117
|
+
throw new ParseError('non-finite JSON number is forbidden');
|
|
118
|
+
if (Number.isInteger(item) && !Number.isSafeInteger(item) && !JSON.stringify(item).includes('e')) {
|
|
119
|
+
throw new ParseError('JSON integer exceeds the interoperable safe-integer range');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
visit(value, 0);
|
|
124
|
+
}
|
|
125
|
+
export function parseJson(data) {
|
|
126
|
+
const text = typeof data === 'string' ? data : new TextDecoder('utf-8', { fatal: true }).decode(data);
|
|
127
|
+
scanStrictJson(text);
|
|
128
|
+
try {
|
|
129
|
+
return JSON.parse(text);
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
throw new ParseError(`invalid JSON: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
function scanStrictJson(text) {
|
|
136
|
+
let index = 0;
|
|
137
|
+
const whitespace = () => {
|
|
138
|
+
while (text[index] === ' ' || text[index] === '\t' || text[index] === '\r' || text[index] === '\n')
|
|
139
|
+
index += 1;
|
|
140
|
+
};
|
|
141
|
+
const stringToken = () => {
|
|
142
|
+
const start = index;
|
|
143
|
+
index += 1;
|
|
144
|
+
while (index < text.length) {
|
|
145
|
+
const character = text[index];
|
|
146
|
+
if (character === '\\') {
|
|
147
|
+
index += 1;
|
|
148
|
+
const escaped = text[index];
|
|
149
|
+
if (escaped === 'u') {
|
|
150
|
+
if (!/^[0-9a-fA-F]{4}$/.test(text.slice(index + 1, index + 5)))
|
|
151
|
+
throw new ParseError('invalid JSON unicode escape');
|
|
152
|
+
index += 5;
|
|
153
|
+
}
|
|
154
|
+
else if ('"\\/bfnrt'.includes(escaped ?? ''))
|
|
155
|
+
index += 1;
|
|
156
|
+
else
|
|
157
|
+
throw new ParseError('invalid JSON escape');
|
|
158
|
+
}
|
|
159
|
+
else if (character === '"') {
|
|
160
|
+
index += 1;
|
|
161
|
+
const raw = text.slice(start, index);
|
|
162
|
+
const parsed = JSON.parse(raw);
|
|
163
|
+
assertUnicodeScalarValue(parsed);
|
|
164
|
+
return parsed;
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
if (character === undefined || character.charCodeAt(0) < 0x20)
|
|
168
|
+
throw new ParseError('invalid JSON string');
|
|
169
|
+
index += 1;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
throw new ParseError('unterminated JSON string');
|
|
173
|
+
};
|
|
174
|
+
const value = (depth) => {
|
|
175
|
+
if (depth > 64)
|
|
176
|
+
throw new ParseError('JSON exceeds maximum parser depth 64');
|
|
177
|
+
whitespace();
|
|
178
|
+
const character = text[index];
|
|
179
|
+
if (character === '{') {
|
|
180
|
+
index += 1;
|
|
181
|
+
whitespace();
|
|
182
|
+
const keys = new Set();
|
|
183
|
+
if (text[index] === '}') {
|
|
184
|
+
index += 1;
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
while (true) {
|
|
188
|
+
whitespace();
|
|
189
|
+
if (text[index] !== '"')
|
|
190
|
+
throw new ParseError('expected JSON object key');
|
|
191
|
+
const key = stringToken();
|
|
192
|
+
if (keys.has(key))
|
|
193
|
+
throw new ParseError(`duplicate JSON object key: ${key}`);
|
|
194
|
+
keys.add(key);
|
|
195
|
+
whitespace();
|
|
196
|
+
if (text[index] !== ':')
|
|
197
|
+
throw new ParseError('expected colon');
|
|
198
|
+
index += 1;
|
|
199
|
+
value(depth + 1);
|
|
200
|
+
whitespace();
|
|
201
|
+
if (text[index] === '}') {
|
|
202
|
+
index += 1;
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if (text[index] !== ',')
|
|
206
|
+
throw new ParseError('expected comma');
|
|
207
|
+
index += 1;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (character === '[') {
|
|
211
|
+
index += 1;
|
|
212
|
+
whitespace();
|
|
213
|
+
if (text[index] === ']') {
|
|
214
|
+
index += 1;
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
while (true) {
|
|
218
|
+
value(depth + 1);
|
|
219
|
+
whitespace();
|
|
220
|
+
if (text[index] === ']') {
|
|
221
|
+
index += 1;
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
if (text[index] !== ',')
|
|
225
|
+
throw new ParseError('expected comma');
|
|
226
|
+
index += 1;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
if (character === '"') {
|
|
230
|
+
stringToken();
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
const token = text.slice(index).match(/^(?:true|false|null|-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?)/)?.[0];
|
|
234
|
+
if (!token)
|
|
235
|
+
throw new ParseError('invalid JSON value');
|
|
236
|
+
if (/^-?(?:0|[1-9]\d*)$/.test(token) && !Number.isSafeInteger(Number(token))) {
|
|
237
|
+
throw new ParseError('JSON integer exceeds the interoperable safe-integer range');
|
|
238
|
+
}
|
|
239
|
+
if (/^-?(?:0|[1-9]\d*)(?:\.\d+|[eE])/.test(token) && !Number.isFinite(Number(token))) {
|
|
240
|
+
throw new ParseError('JSON number exceeds the finite IEEE-754 range');
|
|
241
|
+
}
|
|
242
|
+
index += token.length;
|
|
243
|
+
};
|
|
244
|
+
value(0);
|
|
245
|
+
whitespace();
|
|
246
|
+
if (index !== text.length)
|
|
247
|
+
throw new ParseError('unexpected trailing JSON data');
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=canonical.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const SPECIFICATION_ID: "onchaindiligence.agent-evidence.v0";
|
|
2
|
+
export declare const RECORD_VERSION: "onchaindiligence.agent-evidence.record.v0";
|
|
3
|
+
export declare const BUNDLE_VERSION: "onchaindiligence.agent-evidence.bundle.v0";
|
|
4
|
+
export declare const MEDIA_TYPE: "application/vnd.onchaindiligence.agent-evidence+json";
|
|
5
|
+
export declare const BUNDLE_PAYLOAD_TYPE: "application/vnd.onchaindiligence.agent-evidence.bundle.v0+json";
|
|
6
|
+
export declare const ATTESTATION_V2: "onchaindiligence.attestation.v2";
|
|
7
|
+
export declare const ATTESTATION_ISSUER: "https://api.onchaindiligence.com";
|
|
8
|
+
export declare const ATTESTATION_PURPOSE: "compliance-screening-result";
|
|
9
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,EAAG,oCAA6C,CAAA;AAC7E,eAAO,MAAM,cAAc,EAAG,2CAAoD,CAAA;AAClF,eAAO,MAAM,cAAc,EAAG,2CAAoD,CAAA;AAClF,eAAO,MAAM,UAAU,EAAG,sDAA+D,CAAA;AACzF,eAAO,MAAM,mBAAmB,EAC9B,gEAAyE,CAAA;AAC3E,eAAO,MAAM,cAAc,EAAG,iCAA0C,CAAA;AACxE,eAAO,MAAM,kBAAkB,EAAG,kCAA2C,CAAA;AAC7E,eAAO,MAAM,mBAAmB,EAAG,6BAAsC,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export const SPECIFICATION_ID = 'onchaindiligence.agent-evidence.v0';
|
|
2
|
+
export const RECORD_VERSION = 'onchaindiligence.agent-evidence.record.v0';
|
|
3
|
+
export const BUNDLE_VERSION = 'onchaindiligence.agent-evidence.bundle.v0';
|
|
4
|
+
export const MEDIA_TYPE = 'application/vnd.onchaindiligence.agent-evidence+json';
|
|
5
|
+
export const BUNDLE_PAYLOAD_TYPE = 'application/vnd.onchaindiligence.agent-evidence.bundle.v0+json';
|
|
6
|
+
export const ATTESTATION_V2 = 'onchaindiligence.attestation.v2';
|
|
7
|
+
export const ATTESTATION_ISSUER = 'https://api.onchaindiligence.com';
|
|
8
|
+
export const ATTESTATION_PURPOSE = 'compliance-screening-result';
|
|
9
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,oCAA6C,CAAA;AAC7E,MAAM,CAAC,MAAM,cAAc,GAAG,2CAAoD,CAAA;AAClF,MAAM,CAAC,MAAM,cAAc,GAAG,2CAAoD,CAAA;AAClF,MAAM,CAAC,MAAM,UAAU,GAAG,sDAA+D,CAAA;AACzF,MAAM,CAAC,MAAM,mBAAmB,GAC9B,gEAAyE,CAAA;AAC3E,MAAM,CAAC,MAAM,cAAc,GAAG,iCAA0C,CAAA;AACxE,MAAM,CAAC,MAAM,kBAAkB,GAAG,kCAA2C,CAAA;AAC7E,MAAM,CAAC,MAAM,mBAAmB,GAAG,6BAAsC,CAAA"}
|
package/dist/dsse.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AttestationKeyRecord, BundlePayload, Ed25519Signer, JsonObject, KeyInput, PortableBundle } from './types.js';
|
|
2
|
+
export declare function dssePae(payloadType: string, payload: Uint8Array): Uint8Array;
|
|
3
|
+
export declare function createEd25519Signer(privateKeyInput: KeyInput): Ed25519Signer;
|
|
4
|
+
export interface SealBundleOptions {
|
|
5
|
+
keys?: readonly AttestationKeyRecord[];
|
|
6
|
+
registrySnapshots?: readonly JsonObject[];
|
|
7
|
+
anchors?: readonly JsonObject[];
|
|
8
|
+
}
|
|
9
|
+
export declare function sealBundle(payload: BundlePayload, signer: Ed25519Signer, options?: SealBundleOptions): Promise<PortableBundle>;
|
|
10
|
+
//# sourceMappingURL=dsse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dsse.d.ts","sourceRoot":"","sources":["../src/dsse.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,UAAU,EAEV,QAAQ,EACR,cAAc,EACf,MAAM,YAAY,CAAA;AAEnB,wBAAgB,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,UAAU,CAY5E;AAiBD,wBAAgB,mBAAmB,CAAC,eAAe,EAAE,QAAQ,GAAG,aAAa,CAU5E;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAA;IACtC,iBAAiB,CAAC,EAAE,SAAS,UAAU,EAAE,CAAA;IACzC,OAAO,CAAC,EAAE,SAAS,UAAU,EAAE,CAAA;CAChC;AAED,wBAAsB,UAAU,CAC9B,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,cAAc,CAAC,CAkCzB"}
|
package/dist/dsse.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { createPrivateKey, createPublicKey, KeyObject, sign as ed25519Sign, verify as ed25519Verify, } from 'node:crypto';
|
|
2
|
+
import { canonicalize, cloneJson } from './canonical.js';
|
|
3
|
+
import { BUNDLE_PAYLOAD_TYPE, BUNDLE_VERSION, MEDIA_TYPE } from './constants.js';
|
|
4
|
+
import { SchemaValidationError, SigningError } from './errors.js';
|
|
5
|
+
import { validateBundlePayload } from './graph.js';
|
|
6
|
+
import { validateDocument } from './schema.js';
|
|
7
|
+
import { deriveKeyId, loadPublicKey } from './trust.js';
|
|
8
|
+
export function dssePae(payloadType, payload) {
|
|
9
|
+
const typeBytes = Buffer.from(payloadType, 'utf8');
|
|
10
|
+
return Buffer.concat([
|
|
11
|
+
Buffer.from('DSSEv1 ', 'ascii'),
|
|
12
|
+
Buffer.from(String(typeBytes.length), 'ascii'),
|
|
13
|
+
Buffer.from(' ', 'ascii'),
|
|
14
|
+
typeBytes,
|
|
15
|
+
Buffer.from(' ', 'ascii'),
|
|
16
|
+
Buffer.from(String(payload.byteLength), 'ascii'),
|
|
17
|
+
Buffer.from(' ', 'ascii'),
|
|
18
|
+
Buffer.from(payload),
|
|
19
|
+
]);
|
|
20
|
+
}
|
|
21
|
+
function loadPrivateKey(value) {
|
|
22
|
+
try {
|
|
23
|
+
const key = value instanceof KeyObject
|
|
24
|
+
? value
|
|
25
|
+
: createPrivateKey(value instanceof Uint8Array && !Buffer.isBuffer(value) ? Buffer.from(value) : value);
|
|
26
|
+
if (key.type !== 'private' || key.asymmetricKeyType !== 'ed25519') {
|
|
27
|
+
throw new SigningError('private key must be Ed25519');
|
|
28
|
+
}
|
|
29
|
+
return key;
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
if (error instanceof SigningError)
|
|
33
|
+
throw error;
|
|
34
|
+
throw new SigningError('private key is not a valid Ed25519 PKCS8 key', { cause: error });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function createEd25519Signer(privateKeyInput) {
|
|
38
|
+
const privateKey = loadPrivateKey(privateKeyInput);
|
|
39
|
+
const publicKey = createPublicKey(privateKey);
|
|
40
|
+
return Object.freeze({
|
|
41
|
+
keyId: deriveKeyId(publicKey),
|
|
42
|
+
publicKey,
|
|
43
|
+
sign(message) {
|
|
44
|
+
return ed25519Sign(null, Buffer.from(message), privateKey);
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
export async function sealBundle(payload, signer, options = {}) {
|
|
49
|
+
validateBundlePayload(payload);
|
|
50
|
+
const publicKey = loadPublicKey(signer.publicKey);
|
|
51
|
+
const expectedKeyId = deriveKeyId(publicKey);
|
|
52
|
+
if (signer.keyId !== expectedKeyId) {
|
|
53
|
+
throw new SigningError(`signer keyId does not match public key; expected ${expectedKeyId}`);
|
|
54
|
+
}
|
|
55
|
+
const payloadBytes = canonicalize(payload);
|
|
56
|
+
const message = dssePae(BUNDLE_PAYLOAD_TYPE, payloadBytes);
|
|
57
|
+
const signature = Buffer.from(await signer.sign(message));
|
|
58
|
+
if (signature.length !== 64 || !ed25519Verify(null, Buffer.from(message), publicKey, signature)) {
|
|
59
|
+
throw new SigningError('signer did not return a valid Ed25519 signature for the DSSE PAE bytes');
|
|
60
|
+
}
|
|
61
|
+
const portable = {
|
|
62
|
+
media_type: MEDIA_TYPE,
|
|
63
|
+
bundle_version: BUNDLE_VERSION,
|
|
64
|
+
envelope: {
|
|
65
|
+
payloadType: BUNDLE_PAYLOAD_TYPE,
|
|
66
|
+
payload: Buffer.from(payloadBytes).toString('base64'),
|
|
67
|
+
signatures: [{ keyid: signer.keyId, sig: signature.toString('base64') }],
|
|
68
|
+
},
|
|
69
|
+
verification_material: {
|
|
70
|
+
keys: cloneJson([...(options.keys ?? [])]),
|
|
71
|
+
registry_snapshots: cloneJson([...(options.registrySnapshots ?? [])]),
|
|
72
|
+
anchors: cloneJson([...(options.anchors ?? [])]),
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
try {
|
|
76
|
+
validateDocument('portable-file.schema.json', portable);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
if (error instanceof SchemaValidationError)
|
|
80
|
+
throw new SigningError(error.message, { cause: error });
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
return portable;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=dsse.js.map
|
package/dist/dsse.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dsse.js","sourceRoot":"","sources":["../src/dsse.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare class AgentEvidenceError extends Error {
|
|
2
|
+
constructor(message: string, options?: ErrorOptions);
|
|
3
|
+
}
|
|
4
|
+
export declare class CanonicalizationError extends AgentEvidenceError {
|
|
5
|
+
}
|
|
6
|
+
export declare class ParseError extends AgentEvidenceError {
|
|
7
|
+
}
|
|
8
|
+
export declare class SchemaValidationError extends AgentEvidenceError {
|
|
9
|
+
}
|
|
10
|
+
export declare class EvidenceValidationError extends AgentEvidenceError {
|
|
11
|
+
}
|
|
12
|
+
export declare class TrustPolicyError extends AgentEvidenceError {
|
|
13
|
+
}
|
|
14
|
+
export declare class SigningError extends AgentEvidenceError {
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAIpD;AAED,qBAAa,qBAAsB,SAAQ,kBAAkB;CAAG;AAChE,qBAAa,UAAW,SAAQ,kBAAkB;CAAG;AACrD,qBAAa,qBAAsB,SAAQ,kBAAkB;CAAG;AAChE,qBAAa,uBAAwB,SAAQ,kBAAkB;CAAG;AAClE,qBAAa,gBAAiB,SAAQ,kBAAkB;CAAG;AAC3D,qBAAa,YAAa,SAAQ,kBAAkB;CAAG"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export class AgentEvidenceError extends Error {
|
|
2
|
+
constructor(message, options) {
|
|
3
|
+
super(message, options);
|
|
4
|
+
this.name = new.target.name;
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export class CanonicalizationError extends AgentEvidenceError {
|
|
8
|
+
}
|
|
9
|
+
export class ParseError extends AgentEvidenceError {
|
|
10
|
+
}
|
|
11
|
+
export class SchemaValidationError extends AgentEvidenceError {
|
|
12
|
+
}
|
|
13
|
+
export class EvidenceValidationError extends AgentEvidenceError {
|
|
14
|
+
}
|
|
15
|
+
export class TrustPolicyError extends AgentEvidenceError {
|
|
16
|
+
}
|
|
17
|
+
export class SigningError extends AgentEvidenceError {
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACvB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAA;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,kBAAkB;CAAG;AAChE,MAAM,OAAO,UAAW,SAAQ,kBAAkB;CAAG;AACrD,MAAM,OAAO,qBAAsB,SAAQ,kBAAkB;CAAG;AAChE,MAAM,OAAO,uBAAwB,SAAQ,kBAAkB;CAAG;AAClE,MAAM,OAAO,gBAAiB,SAAQ,kBAAkB;CAAG;AAC3D,MAAM,OAAO,YAAa,SAAQ,kBAAkB;CAAG"}
|
package/dist/graph.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAuB,aAAa,EAAc,MAAM,YAAY,CAAA;AAqDhF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CA0J1F"}
|