@antseed/antseed-verifier 0.1.0 → 0.1.2
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 +5 -3
- package/dist/antseed-node-types.d.ts +6 -0
- package/dist/antseed-node-types.d.ts.map +1 -1
- package/dist/approved-node-measurements.d.ts +33 -0
- package/dist/approved-node-measurements.d.ts.map +1 -0
- package/dist/approved-node-measurements.js +67 -0
- package/dist/approved-node-measurements.js.map +1 -0
- package/dist/approved-seller-images.d.ts +14 -0
- package/dist/approved-seller-images.d.ts.map +1 -0
- package/dist/approved-seller-images.js +9 -0
- package/dist/approved-seller-images.js.map +1 -0
- package/dist/capability.d.ts +5 -0
- package/dist/capability.d.ts.map +1 -1
- package/dist/capability.js.map +1 -1
- package/dist/caps/tee-tdx.d.ts +43 -17
- package/dist/caps/tee-tdx.d.ts.map +1 -1
- package/dist/caps/tee-tdx.js +158 -35
- package/dist/caps/tee-tdx.js.map +1 -1
- package/dist/collect/confidential-space.d.ts +12 -0
- package/dist/collect/confidential-space.d.ts.map +1 -0
- package/dist/collect/confidential-space.js +22 -0
- package/dist/collect/confidential-space.js.map +1 -0
- package/dist/collect/dstack.d.ts +10 -0
- package/dist/collect/dstack.d.ts.map +1 -1
- package/dist/collect/dstack.js +31 -26
- package/dist/collect/dstack.js.map +1 -1
- package/dist/collect/unix-http.d.ts +9 -0
- package/dist/collect/unix-http.d.ts.map +1 -0
- package/dist/collect/unix-http.js +21 -0
- package/dist/collect/unix-http.js.map +1 -0
- package/dist/confidential-space.d.ts +49 -0
- package/dist/confidential-space.d.ts.map +1 -0
- package/dist/confidential-space.js +93 -0
- package/dist/confidential-space.js.map +1 -0
- package/dist/dstack-app-compose.d.ts +38 -0
- package/dist/dstack-app-compose.d.ts.map +1 -0
- package/dist/dstack-app-compose.js +113 -0
- package/dist/dstack-app-compose.js.map +1 -0
- package/dist/dstack-event-log.d.ts +42 -0
- package/dist/dstack-event-log.d.ts.map +1 -0
- package/dist/dstack-event-log.js +87 -0
- package/dist/dstack-event-log.js.map +1 -0
- package/dist/prover.d.ts.map +1 -1
- package/dist/prover.js +17 -4
- package/dist/prover.js.map +1 -1
- package/dist/report-data.d.ts +3 -1
- package/dist/report-data.d.ts.map +1 -1
- package/dist/report-data.js +1 -0
- package/dist/report-data.js.map +1 -1
- package/dist/seller-config-rules.d.ts +43 -0
- package/dist/seller-config-rules.d.ts.map +1 -0
- package/dist/seller-config-rules.js +130 -0
- package/dist/seller-config-rules.js.map +1 -0
- package/dist/shared.d.ts +16 -2
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +21 -5
- package/dist/shared.js.map +1 -1
- package/dist/tcb-policy.d.ts +8 -0
- package/dist/tcb-policy.d.ts.map +1 -0
- package/dist/tcb-policy.js +14 -0
- package/dist/tcb-policy.js.map +1 -0
- package/dist/tee-provider-plugins.json +7 -0
- package/dist/verifier.d.ts +2 -1
- package/dist/verifier.d.ts.map +1 -1
- package/dist/verifier.js +10 -7
- package/dist/verifier.js.map +1 -1
- package/package.json +1 -1
package/dist/caps/tee-tdx.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { claimId, computeReportData } from '../shared.js';
|
|
2
2
|
import { generateTdxQuote } from '../collect/configfs.js';
|
|
3
|
-
import {
|
|
3
|
+
import { generateDstackAttestation } from '../collect/dstack.js';
|
|
4
|
+
import { composeHashFromEventLog, parseDstackEventLog, rtmr3Events } from '../dstack-event-log.js';
|
|
4
5
|
import { collectViaHttp, collectTdxAndPubkey } from '../collect/http.js';
|
|
5
6
|
import { antseedRdV1, verifyReportData } from '../report-data.js';
|
|
7
|
+
import { checkAppCompose } from '../dstack-app-compose.js';
|
|
8
|
+
import { checkConfidentialSpaceClaims, confidentialSpaceNonce, defaultVerifyConfidentialSpaceToken, } from '../confidential-space.js';
|
|
9
|
+
import { isTcbAcceptable } from '../tcb-policy.js';
|
|
10
|
+
import { generateConfidentialSpaceToken } from '../collect/confidential-space.js';
|
|
6
11
|
/**
|
|
7
12
|
* A genuine-Intel-TDX capability: proves a party runs in a genuine Intel TDX enclave.
|
|
8
13
|
* It DCAP-verifies the quote (ECDSA sig + PCK chain to Intel's root + TCB), requires an
|
|
@@ -19,6 +24,11 @@ import { antseedRdV1, verifyReportData } from '../report-data.js';
|
|
|
19
24
|
export const NODE_TEE_CAP_ID = 'seller-node-tee-genuine';
|
|
20
25
|
/** The downstream inference provider's TEE (quote fetched from the provider's evidence route). */
|
|
21
26
|
export const PROVIDER_TEE_CAP_ID = 'seller-provider-tee-genuine';
|
|
27
|
+
/**
|
|
28
|
+
* Reported with a passing seller node claim: the https origins its measured config forwards
|
|
29
|
+
* prompts to, comma-separated. It describes the node claim and has no evidence of its own.
|
|
30
|
+
*/
|
|
31
|
+
export const NODE_UPSTREAMS_CLAIM = 'seller-node-upstreams';
|
|
22
32
|
/**
|
|
23
33
|
* Config-key convention: each TDX cap reads its own collector settings from `<capId>.<key>`
|
|
24
34
|
* in the shared config map, so the node cap and the provider cap never collide. It lives in
|
|
@@ -27,29 +37,29 @@ export const PROVIDER_TEE_CAP_ID = 'seller-provider-tee-genuine';
|
|
|
27
37
|
export function tdxConfigKey(id, key) {
|
|
28
38
|
return `${id}.${key}`;
|
|
29
39
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
* exactly. Anything else (OutOfDate, Revoked, Unknown, ...) is rejected.
|
|
35
|
-
*/
|
|
36
|
-
export function isTcbAcceptable(status) {
|
|
37
|
-
if (status === 'UpToDate')
|
|
38
|
-
return true;
|
|
39
|
-
if (status === 'SWHardeningNeeded')
|
|
40
|
-
return process.env['ANTSEED_VERIFIER_STRICT_TCB'] !== 'true';
|
|
41
|
-
return false;
|
|
40
|
+
export { isTcbAcceptable } from '../tcb-policy.js';
|
|
41
|
+
/** Node evidence from Google Confidential Space: Google's signed attestation token in place of a quote. */
|
|
42
|
+
export function encodeConfidentialSpaceEvidence(token) {
|
|
43
|
+
return new TextEncoder().encode(JSON.stringify({ confidentialSpaceToken: token }));
|
|
42
44
|
}
|
|
43
|
-
export function encodeTeeTdxEvidence(quote, collateral, binding) {
|
|
45
|
+
export function encodeTeeTdxEvidence(quote, collateral, binding, dstack) {
|
|
44
46
|
const blob = {
|
|
45
47
|
quote: Buffer.from(quote).toString('base64'),
|
|
46
48
|
...(collateral !== undefined ? { collateral } : {}),
|
|
47
49
|
...(binding !== undefined ? { binding } : {}),
|
|
50
|
+
...(dstack?.eventLog !== undefined ? { eventLog: dstack.eventLog } : {}),
|
|
51
|
+
...(dstack?.appCompose !== undefined ? { appCompose: dstack.appCompose } : {}),
|
|
48
52
|
};
|
|
49
53
|
return new TextEncoder().encode(JSON.stringify(blob));
|
|
50
54
|
}
|
|
51
55
|
export function decodeTeeTdxEvidence(bytes) {
|
|
52
|
-
|
|
56
|
+
return decodeTeeTdxEnvelope(JSON.parse(new TextDecoder().decode(bytes)));
|
|
57
|
+
}
|
|
58
|
+
/** Validate a parsed tee-tdx evidence envelope. */
|
|
59
|
+
function decodeTeeTdxEnvelope(envelope) {
|
|
60
|
+
if (!envelope || typeof envelope !== 'object')
|
|
61
|
+
throw new Error('tee-tdx evidence is not an object');
|
|
62
|
+
const parsed = envelope;
|
|
53
63
|
if (typeof parsed.quote !== 'string' || parsed.quote.length === 0) {
|
|
54
64
|
throw new Error('tee-tdx evidence missing "quote"');
|
|
55
65
|
}
|
|
@@ -57,10 +67,26 @@ export function decodeTeeTdxEvidence(bytes) {
|
|
|
57
67
|
if (quote.length === 0) {
|
|
58
68
|
throw new Error('tee-tdx evidence "quote" is not valid base64');
|
|
59
69
|
}
|
|
70
|
+
let eventLog;
|
|
71
|
+
if (parsed.eventLog !== undefined) {
|
|
72
|
+
try {
|
|
73
|
+
if (!Array.isArray(parsed.eventLog))
|
|
74
|
+
throw new Error('not an array');
|
|
75
|
+
eventLog = parseDstackEventLog(parsed.eventLog);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
throw new Error('tee-tdx evidence "eventLog" is not a dstack event log');
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (parsed.appCompose !== undefined && typeof parsed.appCompose !== 'string') {
|
|
82
|
+
throw new Error('tee-tdx evidence "appCompose" is not a string');
|
|
83
|
+
}
|
|
60
84
|
return {
|
|
61
85
|
quote,
|
|
62
86
|
...(parsed.collateral !== undefined ? { collateral: parsed.collateral } : {}),
|
|
63
87
|
...(parsed.binding !== undefined ? { binding: parsed.binding } : {}),
|
|
88
|
+
...(eventLog !== undefined ? { eventLog } : {}),
|
|
89
|
+
...(parsed.appCompose !== undefined ? { appCompose: parsed.appCompose } : {}),
|
|
64
90
|
};
|
|
65
91
|
}
|
|
66
92
|
/**
|
|
@@ -96,20 +122,41 @@ export const defaultVerifyQuote = async (quote, collateral, nowSecs) => {
|
|
|
96
122
|
* decode or verify errors are captured in `error`, so dependent caps still see the raw
|
|
97
123
|
* `quoteEvidence` bytes (seller-bound only needs those to bind identity to the quote).
|
|
98
124
|
*/
|
|
99
|
-
export async function verifyTdxEvidence(evidence, verifyQuote, nowSecs) {
|
|
125
|
+
export async function verifyTdxEvidence(evidence, verifyQuote, nowSecs, verifyConfidentialSpaceToken = defaultVerifyConfidentialSpaceToken) {
|
|
126
|
+
let envelope;
|
|
127
|
+
try {
|
|
128
|
+
envelope = JSON.parse(new TextDecoder().decode(evidence));
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
return { quoteEvidence: evidence, status: '', td: null, error: `malformed tee-tdx evidence: ${msg(err)}` };
|
|
132
|
+
}
|
|
133
|
+
const token = envelope && typeof envelope === 'object' ? envelope.confidentialSpaceToken : undefined;
|
|
134
|
+
if (typeof token === 'string') {
|
|
135
|
+
try {
|
|
136
|
+
return { quoteEvidence: evidence, status: '', td: null, confidentialSpace: await verifyConfidentialSpaceToken(token) };
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
return { quoteEvidence: evidence, status: '', td: null, error: `Confidential Space token verification failed: ${msg(err)}` };
|
|
140
|
+
}
|
|
141
|
+
}
|
|
100
142
|
let quote;
|
|
101
143
|
let collateral;
|
|
102
144
|
let binding;
|
|
145
|
+
let eventLog;
|
|
146
|
+
let appCompose;
|
|
103
147
|
try {
|
|
104
148
|
;
|
|
105
|
-
({ quote, collateral, binding } =
|
|
149
|
+
({ quote, collateral, binding, eventLog, appCompose } = decodeTeeTdxEnvelope(envelope));
|
|
106
150
|
}
|
|
107
151
|
catch (err) {
|
|
108
152
|
return { quoteEvidence: evidence, status: '', td: null, error: `malformed tee-tdx evidence: ${msg(err)}` };
|
|
109
153
|
}
|
|
110
154
|
try {
|
|
111
155
|
const raw = await verifyQuote(quote, collateral, nowSecs);
|
|
112
|
-
return {
|
|
156
|
+
return {
|
|
157
|
+
quoteEvidence: evidence, status: raw.status, td: raw.td,
|
|
158
|
+
...(binding ? { binding } : {}), ...(eventLog !== undefined ? { eventLog } : {}), ...(appCompose !== undefined ? { appCompose } : {}),
|
|
159
|
+
};
|
|
113
160
|
}
|
|
114
161
|
catch (err) {
|
|
115
162
|
return { quoteEvidence: evidence, status: '', td: null, ...(binding ? { binding } : {}), error: `quote verification failed: ${msg(err)}` };
|
|
@@ -121,12 +168,52 @@ function msg(err) {
|
|
|
121
168
|
function hex(b) {
|
|
122
169
|
return Buffer.from(b).toString('hex');
|
|
123
170
|
}
|
|
171
|
+
/**
|
|
172
|
+
* The approved build this quote runs: MRTD and RTMR0-2 must be an approved dstack OS, and the app
|
|
173
|
+
* compose measured into RTMR3 (replayed from the event log) must run an approved seller image under
|
|
174
|
+
* the compose rules. Returns the OS, image and upstreams, or why the build is not approved.
|
|
175
|
+
*/
|
|
176
|
+
function approvedBuild(approved, td, eventLog, appCompose) {
|
|
177
|
+
const base = [td.mrTd, td.rtMr0, td.rtMr1, td.rtMr2].map(hex);
|
|
178
|
+
const os = approved.os.find((m) => [m.mrtd, m.rtmr0, m.rtmr1, m.rtmr2].every((v, i) => v.toLowerCase() === base[i]));
|
|
179
|
+
if (!os)
|
|
180
|
+
return { error: `the CVM OS (MRTD ${base[0].slice(0, 16)}…) is not an approved dstack release` };
|
|
181
|
+
if (eventLog === undefined)
|
|
182
|
+
return { error: 'seller sent no dstack event log' };
|
|
183
|
+
const replay = composeHashFromEventLog(eventLog, td.rtMr3);
|
|
184
|
+
if ('error' in replay)
|
|
185
|
+
return replay;
|
|
186
|
+
if (appCompose === undefined)
|
|
187
|
+
return { error: 'seller sent no app compose' };
|
|
188
|
+
const app = checkAppCompose(appCompose, replay.composeHash, approved.images);
|
|
189
|
+
return 'error' in app ? app : { os, ...app };
|
|
190
|
+
}
|
|
191
|
+
/** The node claim (and its upstreams) for Google Confidential Space evidence: a verified token, checked for this round. */
|
|
192
|
+
function verifyConfidentialSpaceNode(claim, input, claims) {
|
|
193
|
+
const channelBinding = input.channelBinding;
|
|
194
|
+
if (!channelBinding) {
|
|
195
|
+
return { claim, ok: false, detail: 'no connection binding: TEE attestation needs an encrypted TCP connection to the seller' };
|
|
196
|
+
}
|
|
197
|
+
// The token's nonce commits to this round's antseed-rd-v1 report data, connection included.
|
|
198
|
+
const nonce = confidentialSpaceNonce(computeReportData(input.nonce, input.peerId, channelBinding));
|
|
199
|
+
const images = input.policy?.images ?? [];
|
|
200
|
+
const checked = checkConfidentialSpaceClaims(claims, nonce, images);
|
|
201
|
+
if ('error' in checked) {
|
|
202
|
+
return { claim, ok: false, detail: `Google Confidential Space attestation, but not an approved TEE seller build: ${checked.error}` };
|
|
203
|
+
}
|
|
204
|
+
const origins = [...new Set(checked.upstreams.map((u) => u.origin))].sort();
|
|
205
|
+
return [
|
|
206
|
+
{ claim, ok: true, detail: `Intel TDX on Google Confidential Space (attested by Google); Antseed TEE seller image ${checked.image.version}, bound to this connection; bound to this round (${antseedRdV1.id})` },
|
|
207
|
+
{ claim: claimId(NODE_UPSTREAMS_CLAIM), ok: true, detail: origins.join(', ') },
|
|
208
|
+
];
|
|
209
|
+
}
|
|
124
210
|
/**
|
|
125
211
|
* Mint one TDX capability. `id` names the target (node or provider); `defaultSource`
|
|
126
212
|
* is the collector used when config supplies no `<id>.source` override:
|
|
127
|
-
* 'configfs': self-hosted TDX minted locally via configfs-tsm; report_data = antseed-rd-v1
|
|
213
|
+
* 'configfs': self-hosted TDX minted locally via configfs-tsm; report_data = antseed-rd-v1
|
|
214
|
+
* {peerId, channelBinding} for seller-node attestations
|
|
128
215
|
* 'dstack' : self-hosted TDX minted via the dstack guest-agent socket (Phala CVMs, where
|
|
129
|
-
* configfs-tsm is absent); same
|
|
216
|
+
* configfs-tsm is absent); the same binding, plus the event log and app compose
|
|
130
217
|
* 'http' : a pre-made quote fetched from a config-supplied evidence route ({nonce} hex)
|
|
131
218
|
* verify reads this cap's own parsed quote (the orchestrator DCAP-verifies each cap's
|
|
132
219
|
* own evidence entry independently). collect throws when its source is unavailable
|
|
@@ -144,18 +231,38 @@ export function makeTdxCap(id, defaultSource, opts) {
|
|
|
144
231
|
return { claim, ok: false, detail: 'TDX quote was not verified' };
|
|
145
232
|
if (p.error)
|
|
146
233
|
return { claim, ok: false, detail: p.error };
|
|
234
|
+
if (p.confidentialSpace) {
|
|
235
|
+
if (!opts?.sellerNode)
|
|
236
|
+
return { claim, ok: false, detail: 'a Confidential Space token is only accepted for the seller node' };
|
|
237
|
+
return verifyConfidentialSpaceNode(claim, input, p.confidentialSpace);
|
|
238
|
+
}
|
|
147
239
|
if (!isTcbAcceptable(p.status))
|
|
148
240
|
return { claim, ok: false, detail: `TCB status not acceptable: ${p.status || 'unknown'}` };
|
|
149
241
|
if (!p.td)
|
|
150
242
|
return { claim, ok: false, detail: 'quote is not an Intel TDX quote' };
|
|
151
243
|
if (p.td.debug === true)
|
|
152
244
|
return { claim, ok: false, detail: 'TDX debug mode is enabled' };
|
|
153
|
-
//
|
|
154
|
-
// to
|
|
245
|
+
// The seller node must also run an approved build and answer on the buyer's own connection:
|
|
246
|
+
// the quote commits to that connection's session hash, so it was minted by the approved
|
|
247
|
+
// build terminating this connection, not relayed from another machine.
|
|
248
|
+
let build;
|
|
249
|
+
const channelBinding = input.channelBinding;
|
|
250
|
+
if (opts?.sellerNode) {
|
|
251
|
+
if (!channelBinding) {
|
|
252
|
+
return { claim, ok: false, detail: 'no connection binding: TEE attestation needs an encrypted TCP connection to the seller' };
|
|
253
|
+
}
|
|
254
|
+
const match = approvedBuild(input.policy ?? { os: [], images: [] }, p.td, p.eventLog, p.appCompose);
|
|
255
|
+
if ('error' in match) {
|
|
256
|
+
return { claim, ok: false, detail: `genuine Intel TDX hardware, but not an approved TEE seller build: ${match.error}` };
|
|
257
|
+
}
|
|
258
|
+
build = match;
|
|
259
|
+
}
|
|
260
|
+
// Bind report_data to this round: the node cap to its {peerId, channelBinding}, a provider
|
|
261
|
+
// cap to whatever frozen scheme its evidence declares. Fail-closed — a borrowed, relayed, or
|
|
155
262
|
// stale quote cannot match a fresh-nonce commitment. A provider quote with no declared
|
|
156
263
|
// scheme still passes on genuineness, but its detail must disclose that freshness was not proven.
|
|
157
|
-
const binding = opts?.
|
|
158
|
-
? { scheme: antseedRdV1.id, ingredients: { peerId: input.peerId } }
|
|
264
|
+
const binding = opts?.sellerNode
|
|
265
|
+
? { scheme: antseedRdV1.id, ingredients: { peerId: input.peerId, ...(channelBinding ? { channelBinding } : {}) } }
|
|
159
266
|
: p.binding;
|
|
160
267
|
if (binding) {
|
|
161
268
|
const bad = verifyReportData(binding.scheme, p.td.reportData, input.nonce, binding.ingredients);
|
|
@@ -165,22 +272,35 @@ export function makeTdxCap(id, defaultSource, opts) {
|
|
|
165
272
|
const freshness = binding
|
|
166
273
|
? `bound to this round (${binding.scheme})`
|
|
167
274
|
: 'freshness/instance binding NOT verified (no report_data scheme declared)';
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
275
|
+
const scope = build
|
|
276
|
+
? `Antseed TEE seller image ${build.image.version} on ${build.os.name}, bound to this connection`
|
|
277
|
+
: `MRTD ${hex(p.td.mrTd).slice(0, 16)}…`;
|
|
278
|
+
const result = { claim, ok: true, detail: `genuine Intel TDX quote (TCB ${p.status}); ${scope}; ${freshness}` };
|
|
279
|
+
if (!build)
|
|
280
|
+
return result;
|
|
281
|
+
const origins = [...new Set(build.upstreams.map((u) => u.origin))].sort();
|
|
282
|
+
return [result, { claim: claimId(NODE_UPSTREAMS_CLAIM), ok: true, detail: origins.join(', ') }];
|
|
173
283
|
},
|
|
174
284
|
async collect(input) {
|
|
175
285
|
const source = input.config[tdxConfigKey(id, 'source')] ?? defaultSource;
|
|
286
|
+
const channelBinding = input.config[tdxConfigKey(id, 'channelBinding')] || undefined;
|
|
176
287
|
if (source === 'configfs') {
|
|
177
|
-
const quote = generateTdxQuote(computeReportData(input.nonce, input.peerId));
|
|
288
|
+
const quote = generateTdxQuote(computeReportData(input.nonce, input.peerId, channelBinding));
|
|
178
289
|
return encodeTeeTdxEvidence(quote);
|
|
179
290
|
}
|
|
291
|
+
if (source === 'confidential-space') {
|
|
292
|
+
const socket = input.config[tdxConfigKey(id, 'confidentialSpace.socket')] || undefined;
|
|
293
|
+
const nonce = confidentialSpaceNonce(computeReportData(input.nonce, input.peerId, channelBinding));
|
|
294
|
+
return encodeConfidentialSpaceEvidence(await generateConfidentialSpaceToken(nonce, socket));
|
|
295
|
+
}
|
|
180
296
|
if (source === 'dstack') {
|
|
181
297
|
const socket = input.config[tdxConfigKey(id, 'dstack.socket')] || undefined;
|
|
182
|
-
const quote = await
|
|
183
|
-
|
|
298
|
+
const { quote, eventLog, appCompose } = await generateDstackAttestation(computeReportData(input.nonce, input.peerId, channelBinding), socket);
|
|
299
|
+
// Only the RTMR3 events: the buyer replays them to the app's compose hash, then checks the compose.
|
|
300
|
+
return encodeTeeTdxEvidence(quote, undefined, undefined, {
|
|
301
|
+
...(eventLog ? { eventLog: rtmr3Events(eventLog) } : {}),
|
|
302
|
+
...(appCompose ? { appCompose } : {}),
|
|
303
|
+
});
|
|
184
304
|
}
|
|
185
305
|
if (source === 'http') {
|
|
186
306
|
const url = input.config[tdxConfigKey(id, 'url')];
|
|
@@ -199,12 +319,15 @@ export function makeTdxCap(id, defaultSource, opts) {
|
|
|
199
319
|
const ingredients = pubkey ? { e2ePubkey: pubkey } : {};
|
|
200
320
|
return encodeTeeTdxEvidence(quote, undefined, { scheme, ingredients });
|
|
201
321
|
}
|
|
202
|
-
throw new Error(`unknown ${id} source "${source}" (expected "configfs", "dstack", or "http")`);
|
|
322
|
+
throw new Error(`unknown ${id} source "${source}" (expected "configfs", "dstack", "confidential-space", or "http")`);
|
|
203
323
|
},
|
|
204
324
|
};
|
|
205
325
|
}
|
|
206
|
-
/**
|
|
207
|
-
|
|
326
|
+
/**
|
|
327
|
+
* The AntSeed seller node's own TEE — mints its quote locally via configfs; report_data bound to
|
|
328
|
+
* nonce + peerId + the buyer's connection, and the TD measurement must be an approved build.
|
|
329
|
+
*/
|
|
330
|
+
export const nodeTeeCapability = makeTdxCap(NODE_TEE_CAP_ID, 'configfs', { sellerNode: true });
|
|
208
331
|
/** The downstream inference provider's TEE — quote fetched from the provider's evidence route. */
|
|
209
332
|
export const providerTeeCapability = makeTdxCap(PROVIDER_TEE_CAP_ID, 'http');
|
|
210
333
|
//# sourceMappingURL=tee-tdx.js.map
|
package/dist/caps/tee-tdx.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tee-tdx.js","sourceRoot":"","sources":["../../src/caps/tee-tdx.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tee-tdx.js","sourceRoot":"","sources":["../../src/caps/tee-tdx.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Confidential Space collector: asks the container launcher for a Google attestation token
|
|
3
|
+
* carrying `nonce` (the round's binding). The launcher mounts its socket into the workload
|
|
4
|
+
* container; it throws when the socket is absent, so the prover omits the capability elsewhere.
|
|
5
|
+
*
|
|
6
|
+
* Wire contract (POST http://localhost/v1/token over the socket):
|
|
7
|
+
* request { "audience": "antseed-verifier", "token_type": "OIDC", "nonces": ["<nonce>"] }
|
|
8
|
+
* response the signed token (JWT text)
|
|
9
|
+
*/
|
|
10
|
+
export declare const CS_LAUNCHER_SOCKET = "/run/container_launcher/teeserver.sock";
|
|
11
|
+
export declare function generateConfidentialSpaceToken(nonce: string, socketPath?: string): Promise<string>;
|
|
12
|
+
//# sourceMappingURL=confidential-space.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confidential-space.d.ts","sourceRoot":"","sources":["../../src/collect/confidential-space.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,2CAA2C,CAAA;AAE1E,wBAAsB,8BAA8B,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,SAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAMpH"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { CS_AUDIENCE } from '../confidential-space.js';
|
|
2
|
+
import { postUnix } from './unix-http.js';
|
|
3
|
+
/**
|
|
4
|
+
* Confidential Space collector: asks the container launcher for a Google attestation token
|
|
5
|
+
* carrying `nonce` (the round's binding). The launcher mounts its socket into the workload
|
|
6
|
+
* container; it throws when the socket is absent, so the prover omits the capability elsewhere.
|
|
7
|
+
*
|
|
8
|
+
* Wire contract (POST http://localhost/v1/token over the socket):
|
|
9
|
+
* request { "audience": "antseed-verifier", "token_type": "OIDC", "nonces": ["<nonce>"] }
|
|
10
|
+
* response the signed token (JWT text)
|
|
11
|
+
*/
|
|
12
|
+
export const CS_LAUNCHER_SOCKET = '/run/container_launcher/teeserver.sock';
|
|
13
|
+
export async function generateConfidentialSpaceToken(nonce, socketPath = CS_LAUNCHER_SOCKET) {
|
|
14
|
+
const body = JSON.stringify({ audience: CS_AUDIENCE, token_type: 'OIDC', nonces: [nonce] });
|
|
15
|
+
const { status, body: token } = await postUnix(socketPath, '/v1/token', body);
|
|
16
|
+
if (status !== 200)
|
|
17
|
+
throw new Error(`Confidential Space token request returned HTTP ${status}: ${token.slice(0, 200)}`);
|
|
18
|
+
if (!/^[\w-]+\.[\w-]+\.[\w-]+$/.test(token.trim()))
|
|
19
|
+
throw new Error('Confidential Space token response is not a JWT');
|
|
20
|
+
return token.trim();
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=confidential-space.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confidential-space.js","sourceRoot":"","sources":["../../src/collect/confidential-space.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,wCAAwC,CAAA;AAE1E,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAAC,KAAa,EAAE,UAAU,GAAG,kBAAkB;IACjG,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC3F,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,IAAI,CAAC,CAAA;IAC7E,IAAI,MAAM,KAAK,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,MAAM,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;IACvH,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;IACrH,OAAO,KAAK,CAAC,IAAI,EAAE,CAAA;AACrB,CAAC"}
|
package/dist/collect/dstack.d.ts
CHANGED
|
@@ -5,4 +5,14 @@
|
|
|
5
5
|
* this source" and omits the capability, like configfs off-TEE.
|
|
6
6
|
*/
|
|
7
7
|
export declare function generateDstackQuote(reportData: Uint8Array, socketPath?: string): Promise<Uint8Array>;
|
|
8
|
+
/**
|
|
9
|
+
* The quote plus what a buyer needs to check the app it measured: the agent's event log (a JSON
|
|
10
|
+
* string), which replays RTMR3 to the app's compose hash, and the app-compose.json that hash
|
|
11
|
+
* covers. Either is undefined when the agent does not return it.
|
|
12
|
+
*/
|
|
13
|
+
export declare function generateDstackAttestation(reportData: Uint8Array, socketPath?: string): Promise<{
|
|
14
|
+
quote: Uint8Array;
|
|
15
|
+
eventLog?: string;
|
|
16
|
+
appCompose?: string;
|
|
17
|
+
}>;
|
|
8
18
|
//# sourceMappingURL=dstack.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dstack.d.ts","sourceRoot":"","sources":["../../src/collect/dstack.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dstack.d.ts","sourceRoot":"","sources":["../../src/collect/dstack.ts"],"names":[],"mappings":"AA4BA;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAE1G;AAeD;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,UAAU,EACtB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA2BxE"}
|
package/dist/collect/dstack.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { postUnix } from './unix-http.js';
|
|
2
2
|
/**
|
|
3
3
|
* dstack collector: it mints a TDX quote via the dstack guest-agent unix socket. This is the
|
|
4
4
|
* canonical quoting path inside dstack CVMs (e.g. Phala), where the Linux configfs-tsm
|
|
@@ -6,13 +6,13 @@ import { request } from 'node:http';
|
|
|
6
6
|
* raw (no hashing, max 64 bytes). The quote's report_data is then byte-identical to the configfs
|
|
7
7
|
* path, and the buyer verifies it unchanged.
|
|
8
8
|
*
|
|
9
|
-
* Wire contract (POST
|
|
10
|
-
* request
|
|
11
|
-
* response { "
|
|
9
|
+
* Wire contract (POST over the socket):
|
|
10
|
+
* /GetQuote request { "report_data": "<hex, <=64 bytes>" } response { "quote": "<hex>", "event_log": "<json>", ... }
|
|
11
|
+
* /Info request {} response { "tcb_info": "<json with app_compose>", ... }
|
|
12
12
|
*/
|
|
13
13
|
/** Default guest-agent socket locations, tried in order (mirrors @phala/dstack-sdk). */
|
|
14
14
|
const DEFAULT_DSTACK_SOCKETS = ['/var/run/dstack.sock', '/run/dstack.sock'];
|
|
15
|
-
const
|
|
15
|
+
const DSTACK_REQUEST = { timeoutMs: 20_000, timeoutMessage: 'dstack request timed out' };
|
|
16
16
|
function msg(err) {
|
|
17
17
|
return err instanceof Error ? err.message : String(err);
|
|
18
18
|
}
|
|
@@ -21,25 +21,6 @@ function isConnError(err) {
|
|
|
21
21
|
const code = err?.code;
|
|
22
22
|
return code === 'ENOENT' || code === 'ECONNREFUSED' || code === 'EACCES';
|
|
23
23
|
}
|
|
24
|
-
/** POST JSON to a unix-socket HTTP server and read the whole response body. */
|
|
25
|
-
function postUnix(socketPath, path, body) {
|
|
26
|
-
return new Promise((resolve, reject) => {
|
|
27
|
-
const req = request({
|
|
28
|
-
socketPath,
|
|
29
|
-
path,
|
|
30
|
-
method: 'POST',
|
|
31
|
-
headers: { 'content-type': 'application/json', 'content-length': Buffer.byteLength(body) },
|
|
32
|
-
timeout: DSTACK_TIMEOUT_MS,
|
|
33
|
-
}, (res) => {
|
|
34
|
-
const chunks = [];
|
|
35
|
-
res.on('data', (c) => chunks.push(c));
|
|
36
|
-
res.on('end', () => resolve({ status: res.statusCode ?? 0, body: Buffer.concat(chunks).toString('utf8') }));
|
|
37
|
-
});
|
|
38
|
-
req.on('error', reject);
|
|
39
|
-
req.on('timeout', () => req.destroy(new Error('dstack request timed out')));
|
|
40
|
-
req.end(body);
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
24
|
/**
|
|
44
25
|
* Generate a raw Intel TDX quote bound to `reportData` (64 bytes) via the dstack guest agent.
|
|
45
26
|
* `socketPath` overrides the default locations (e.g. a custom mount or the dstack simulator).
|
|
@@ -47,6 +28,28 @@ function postUnix(socketPath, path, body) {
|
|
|
47
28
|
* this source" and omits the capability, like configfs off-TEE.
|
|
48
29
|
*/
|
|
49
30
|
export async function generateDstackQuote(reportData, socketPath) {
|
|
31
|
+
return (await generateDstackAttestation(reportData, socketPath)).quote;
|
|
32
|
+
}
|
|
33
|
+
/** The app-compose.json the CVM was measured with (tcb_info.app_compose of the agent's Info), if available. */
|
|
34
|
+
async function readAppCompose(socketPath) {
|
|
35
|
+
try {
|
|
36
|
+
const { status, body } = await postUnix(socketPath, '/Info', '{}', DSTACK_REQUEST);
|
|
37
|
+
if (status !== 200)
|
|
38
|
+
return undefined;
|
|
39
|
+
const info = JSON.parse(body);
|
|
40
|
+
const tcb = (typeof info.tcb_info === 'string' ? JSON.parse(info.tcb_info) : info.tcb_info);
|
|
41
|
+
return typeof tcb?.app_compose === 'string' && tcb.app_compose.length > 0 ? tcb.app_compose : undefined;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* The quote plus what a buyer needs to check the app it measured: the agent's event log (a JSON
|
|
49
|
+
* string), which replays RTMR3 to the app's compose hash, and the app-compose.json that hash
|
|
50
|
+
* covers. Either is undefined when the agent does not return it.
|
|
51
|
+
*/
|
|
52
|
+
export async function generateDstackAttestation(reportData, socketPath) {
|
|
50
53
|
if (reportData.length !== 64) {
|
|
51
54
|
throw new Error(`reportData must be 64 bytes, got ${reportData.length}`);
|
|
52
55
|
}
|
|
@@ -55,7 +58,7 @@ export async function generateDstackQuote(reportData, socketPath) {
|
|
|
55
58
|
let lastErr;
|
|
56
59
|
for (const sock of candidates) {
|
|
57
60
|
try {
|
|
58
|
-
const { status, body: resp } = await postUnix(sock, '/GetQuote', body);
|
|
61
|
+
const { status, body: resp } = await postUnix(sock, '/GetQuote', body, DSTACK_REQUEST);
|
|
59
62
|
if (status !== 200)
|
|
60
63
|
throw new Error(`dstack GetQuote returned HTTP ${status}`);
|
|
61
64
|
const parsed = JSON.parse(resp);
|
|
@@ -65,7 +68,9 @@ export async function generateDstackQuote(reportData, socketPath) {
|
|
|
65
68
|
const quote = Buffer.from(parsed.quote.replace(/^0x/, ''), 'hex');
|
|
66
69
|
if (quote.length === 0)
|
|
67
70
|
throw new Error('dstack GetQuote "quote" is not valid hex');
|
|
68
|
-
|
|
71
|
+
const eventLog = typeof parsed.event_log === 'string' && parsed.event_log.length > 0 ? parsed.event_log : undefined;
|
|
72
|
+
const appCompose = await readAppCompose(sock);
|
|
73
|
+
return { quote: new Uint8Array(quote), ...(eventLog ? { eventLog } : {}), ...(appCompose ? { appCompose } : {}) };
|
|
69
74
|
}
|
|
70
75
|
catch (err) {
|
|
71
76
|
lastErr = err;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dstack.js","sourceRoot":"","sources":["../../src/collect/dstack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"dstack.js","sourceRoot":"","sources":["../../src/collect/dstack.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** POST JSON to a unix-socket HTTP server and read the whole response body. */
|
|
2
|
+
export declare function postUnix(socketPath: string, path: string, body: string, { timeoutMs, timeoutMessage }?: {
|
|
3
|
+
timeoutMs?: number;
|
|
4
|
+
timeoutMessage?: string;
|
|
5
|
+
}): Promise<{
|
|
6
|
+
status: number;
|
|
7
|
+
body: string;
|
|
8
|
+
}>;
|
|
9
|
+
//# sourceMappingURL=unix-http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unix-http.d.ts","sourceRoot":"","sources":["../../src/collect/unix-http.ts"],"names":[],"mappings":"AAEA,+EAA+E;AAC/E,wBAAgB,QAAQ,CACtB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,EAAE,SAAkB,EAAE,cAAgD,EAAE,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7H,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAoB3C"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { request } from 'node:http';
|
|
2
|
+
/** POST JSON to a unix-socket HTTP server and read the whole response body. */
|
|
3
|
+
export function postUnix(socketPath, path, body, { timeoutMs = 20_000, timeoutMessage = 'unix socket request timed out' } = {}) {
|
|
4
|
+
return new Promise((resolve, reject) => {
|
|
5
|
+
const req = request({
|
|
6
|
+
socketPath,
|
|
7
|
+
path,
|
|
8
|
+
method: 'POST',
|
|
9
|
+
headers: { 'content-type': 'application/json', 'content-length': Buffer.byteLength(body) },
|
|
10
|
+
timeout: timeoutMs,
|
|
11
|
+
}, (res) => {
|
|
12
|
+
const chunks = [];
|
|
13
|
+
res.on('data', (c) => chunks.push(c));
|
|
14
|
+
res.on('end', () => resolve({ status: res.statusCode ?? 0, body: Buffer.concat(chunks).toString('utf8') }));
|
|
15
|
+
});
|
|
16
|
+
req.on('error', reject);
|
|
17
|
+
req.on('timeout', () => req.destroy(new Error(timeoutMessage)));
|
|
18
|
+
req.end(body);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=unix-http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unix-http.js","sourceRoot":"","sources":["../../src/collect/unix-http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,+EAA+E;AAC/E,MAAM,UAAU,QAAQ,CACtB,UAAkB,EAClB,IAAY,EACZ,IAAY,EACZ,EAAE,SAAS,GAAG,MAAM,EAAE,cAAc,GAAG,+BAA+B,KAAsD,EAAE;IAE9H,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,OAAO,CACjB;YACE,UAAU;YACV,IAAI;YACJ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;YAC1F,OAAO,EAAE,SAAS;SACnB,EACD,CAAC,GAAG,EAAE,EAAE;YACN,MAAM,MAAM,GAAa,EAAE,CAAA;YAC3B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAW,CAAC,CAAC,CAAA;YAC/C,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,UAAU,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;QAC7G,CAAC,CACF,CAAA;QACD,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACvB,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAA;QAC/D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACf,CAAC,CAAC,CAAA;AACJ,CAAC"}
|