@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/report-data.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report-data.js","sourceRoot":"","sources":["../src/report-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"report-data.js","sourceRoot":"","sources":["../src/report-data.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The rules every approved TEE seller deployment follows, whatever runs it (dstack, Google
|
|
3
|
+
* Confidential Space): the seller config is readable by the buyer and only sends prompts to the
|
|
4
|
+
* upstreams it names, and the only hidden inputs are secrets that cannot redirect prompts.
|
|
5
|
+
*
|
|
6
|
+
* Seller config: only the settings listed in CONFIG_KEYS (anything that loads code, such as
|
|
7
|
+
* seller.agentDir, which imports tool modules from the data volume, is rejected); each provider
|
|
8
|
+
* uses a plugin listed in tee-provider-plugins.json, every upstream is https, and every path rewrite is a path on that upstream (the relay appends it to the base
|
|
9
|
+
* URL, so a value like "@other.example/v1" would move the request to another host). The approved
|
|
10
|
+
* images' relay refuses upstream redirects, so requests stay on these origins.
|
|
11
|
+
*/
|
|
12
|
+
/** One place a seller node forwards prompts to, read from its measured config. */
|
|
13
|
+
export interface SellerUpstream {
|
|
14
|
+
/** The provider's name in the seller config. */
|
|
15
|
+
provider: string;
|
|
16
|
+
plugin: string;
|
|
17
|
+
/** https origin, e.g. "https://api.openai.com". */
|
|
18
|
+
origin: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Settings an operator may set in the open (the buyer reads them): the peer id, provider
|
|
22
|
+
* attestation settings, the request-body fields the openai plugin adds (OPENAI_BODY_INJECT_JSON,
|
|
23
|
+
* which cannot change where a request goes) and the Base RPC URL (it never sees a request; one
|
|
24
|
+
* holding an API key belongs in a secret instead, since buyers read open settings).
|
|
25
|
+
*/
|
|
26
|
+
export declare const LITERAL_ENV: RegExp;
|
|
27
|
+
/** Names a hidden secret may have (checkHiddenSecrets narrows API keys to the ones the config names). */
|
|
28
|
+
export declare const SECRET_ENV: RegExp;
|
|
29
|
+
export type Obj = Record<string, unknown>;
|
|
30
|
+
export declare const isObj: (v: unknown) => v is Obj;
|
|
31
|
+
/** A deployment that breaks a rule; its message says which. */
|
|
32
|
+
export declare class RuleError extends Error {
|
|
33
|
+
}
|
|
34
|
+
export declare function check(ok: unknown, why: string): asserts ok;
|
|
35
|
+
export declare function parseJson(text: string, what: string): unknown;
|
|
36
|
+
/** Check a seller config; returns its upstreams and the API key variables it reads (apiKeyEnv). */
|
|
37
|
+
export declare function checkSellerConfig(config: unknown): {
|
|
38
|
+
upstreams: SellerUpstream[];
|
|
39
|
+
apiKeyEnvs: Set<string>;
|
|
40
|
+
};
|
|
41
|
+
/** Hidden secrets may only be the node's own secrets and the API keys the seller config names. */
|
|
42
|
+
export declare function checkHiddenSecrets(secrets: Iterable<string>, apiKeyEnvs: ReadonlySet<string>): void;
|
|
43
|
+
//# sourceMappingURL=seller-config-rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seller-config-rules.d.ts","sourceRoot":"","sources":["../src/seller-config-rules.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAEH,kFAAkF;AAClF,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAA;CACf;AAWD;;;;;GAKG;AACH,eAAO,MAAM,WAAW,QAAgH,CAAA;AACxI,yGAAyG;AACzG,eAAO,MAAM,UAAU,QAA4E,CAAA;AA2BnG,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AACzC,eAAO,MAAM,KAAK,GAAI,GAAG,OAAO,KAAG,CAAC,IAAI,GAAwD,CAAA;AAEhG,+DAA+D;AAC/D,qBAAa,SAAU,SAAQ,KAAK;CAAG;AACvC,wBAAgB,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,CAE1D;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAM7D;AA0BD,mGAAmG;AACnG,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG;IAAE,SAAS,EAAE,cAAc,EAAE,CAAC;IAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,CAsC3G;AAED,kGAAkG;AAClG,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAInG"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import teeProviderPlugins from './tee-provider-plugins.json' with { type: 'json' };
|
|
2
|
+
/**
|
|
3
|
+
* The provider plugins a TEE seller may use (tee-provider-plugins.json, which also decides the
|
|
4
|
+
* image's plugins): each one's default upstream, and whether the config's baseUrl (and
|
|
5
|
+
* fallbackUpstreams) changes it. Each sends buyer content only to that upstream. fal-video is
|
|
6
|
+
* left out: it uploads buyer media to a storage host the storage service names at runtime, which
|
|
7
|
+
* the config cannot show.
|
|
8
|
+
*/
|
|
9
|
+
const PLUGINS = teeProviderPlugins;
|
|
10
|
+
/**
|
|
11
|
+
* Settings an operator may set in the open (the buyer reads them): the peer id, provider
|
|
12
|
+
* attestation settings, the request-body fields the openai plugin adds (OPENAI_BODY_INJECT_JSON,
|
|
13
|
+
* which cannot change where a request goes) and the Base RPC URL (it never sees a request; one
|
|
14
|
+
* holding an API key belongs in a secret instead, since buyers read open settings).
|
|
15
|
+
*/
|
|
16
|
+
export const LITERAL_ENV = /^(?:ANTSEED_TEE_PEER_ID|ANTSEED_BASE_RPC_URL|OPENAI_BODY_INJECT_JSON|ANTSEED_VERIFIER_PROVIDER_[A-Z0-9_]+)$/;
|
|
17
|
+
/** Names a hidden secret may have (checkHiddenSecrets narrows API keys to the ones the config names). */
|
|
18
|
+
export const SECRET_ENV = /^(?:ANTSEED_IDENTITY_HEX|ANTSEED_BASE_RPC_URL|[A-Z][A-Z0-9_]*_API_KEY)$/;
|
|
19
|
+
/** Secrets the CLI reads itself; any other hidden variable must be a provider API key the config names. */
|
|
20
|
+
const NODE_SECRETS = new Set(['ANTSEED_IDENTITY_HEX', 'ANTSEED_BASE_RPC_URL']);
|
|
21
|
+
/** Prefixes of variables the CLI reads for its own settings (telemetry, payments, tunnels), never API keys. */
|
|
22
|
+
const RESERVED_ENV = /^(?:ANTSEED_|POSTHOG_|CDP_)/;
|
|
23
|
+
/**
|
|
24
|
+
* The seller config settings a TEE seller may use, by section. Each one only tunes the seller;
|
|
25
|
+
* none loads code (seller.agentDir imports agent tool modules from disk, which no measurement
|
|
26
|
+
* covers) or configures the buyer, verifier or relayer roles.
|
|
27
|
+
*/
|
|
28
|
+
const CONFIG_KEYS = {
|
|
29
|
+
config: new Set(['identity', 'seller', 'payments', 'network', 'telemetry']),
|
|
30
|
+
seller: new Set([
|
|
31
|
+
'reserveFloor', 'maxConcurrentBuyers', 'providers', 'publicAddress', 'verifications', 'maxUploadBodyBytes',
|
|
32
|
+
'maxInboundConnections', 'maxInboundConnectionsPerIp', 'inboundIdleTimeoutMs', 'verifiers', 'healthCheck', 'gasCheck', 'gasRefuel', 'freeTier',
|
|
33
|
+
'alerts', 'restrictedCountries', 'freeUsage', 'buyerLimits',
|
|
34
|
+
]),
|
|
35
|
+
provider: new Set(['plugin', 'baseUrl', 'apiKeyEnv', 'pathRewrite', 'fallbackUpstreams', 'defaults', 'services']),
|
|
36
|
+
fallback: new Set(['baseUrl', 'apiKeyEnv', 'pathRewrite', 'services']),
|
|
37
|
+
};
|
|
38
|
+
function checkKeys(value, section, where) {
|
|
39
|
+
const extra = Object.keys(value).filter((k) => !CONFIG_KEYS[section].has(k));
|
|
40
|
+
check(extra.length === 0, `${where}${extra[0]} is not allowed in a TEE seller config`);
|
|
41
|
+
}
|
|
42
|
+
export const isObj = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
|
|
43
|
+
/** A deployment that breaks a rule; its message says which. */
|
|
44
|
+
export class RuleError extends Error {
|
|
45
|
+
}
|
|
46
|
+
export function check(ok, why) {
|
|
47
|
+
if (!ok)
|
|
48
|
+
throw new RuleError(why);
|
|
49
|
+
}
|
|
50
|
+
export function parseJson(text, what) {
|
|
51
|
+
try {
|
|
52
|
+
return JSON.parse(text);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
throw new RuleError(`${what} is not JSON`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** A configured upstream URL, which must be https without credentials. */
|
|
59
|
+
function upstreamUrl(url, where) {
|
|
60
|
+
check(typeof url === 'string', `${where} must be a URL`);
|
|
61
|
+
let u;
|
|
62
|
+
try {
|
|
63
|
+
u = new URL(url);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
throw new RuleError(`${where} is not a URL`);
|
|
67
|
+
}
|
|
68
|
+
check(u.protocol === 'https:' && !u.username && !u.password, `${where} must be an https URL without credentials`);
|
|
69
|
+
return u;
|
|
70
|
+
}
|
|
71
|
+
/** A path rewrite must keep requests on the upstream it belongs to. */
|
|
72
|
+
function checkPathRewrite(rewrite, baseUrl, where) {
|
|
73
|
+
if (rewrite === undefined)
|
|
74
|
+
return;
|
|
75
|
+
check(isObj(rewrite), `${where} pathRewrite must be a map`);
|
|
76
|
+
const base = baseUrl.href.replace(/\/+$/, '');
|
|
77
|
+
for (const [from, to] of Object.entries(rewrite)) {
|
|
78
|
+
check(typeof to === 'string' && to.startsWith('/') && !to.startsWith('//'), `${where} pathRewrite for ${from} must be a path starting with one "/"`);
|
|
79
|
+
check(upstreamUrl(base + to, `${where} pathRewrite for ${from}`).origin === baseUrl.origin, `${where} pathRewrite for ${from} leaves the upstream`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/** Check a seller config; returns its upstreams and the API key variables it reads (apiKeyEnv). */
|
|
83
|
+
export function checkSellerConfig(config) {
|
|
84
|
+
check(isObj(config), 'seller config must be an object');
|
|
85
|
+
checkKeys(config, 'config', '');
|
|
86
|
+
check(isObj(config['seller']), 'seller config has no seller section');
|
|
87
|
+
checkKeys(config['seller'], 'seller', 'seller.');
|
|
88
|
+
const providers = config['seller']['providers'];
|
|
89
|
+
check(isObj(providers) && Object.keys(providers).length > 0, 'seller config has no providers');
|
|
90
|
+
const upstreams = [];
|
|
91
|
+
const apiKeyEnvs = new Set();
|
|
92
|
+
const keyEnv = (v) => {
|
|
93
|
+
if (typeof v === 'string')
|
|
94
|
+
apiKeyEnvs.add(v);
|
|
95
|
+
};
|
|
96
|
+
for (const [provider, cfg] of Object.entries(providers)) {
|
|
97
|
+
check(isObj(cfg) && typeof cfg['plugin'] === 'string', `provider ${provider} has no plugin`);
|
|
98
|
+
checkKeys(cfg, 'provider', `provider ${provider} `);
|
|
99
|
+
keyEnv(cfg['apiKeyEnv']);
|
|
100
|
+
const plugin = cfg['plugin'].replace(/^@antseed\/provider-/, '');
|
|
101
|
+
const spec = PLUGINS[plugin];
|
|
102
|
+
check(spec, `provider ${provider} uses plugin "${cfg['plugin']}", which a TEE seller cannot use`);
|
|
103
|
+
check(spec.baseUrl || cfg['baseUrl'] === undefined, `provider ${provider} sets a baseUrl its plugin ignores`);
|
|
104
|
+
const baseUrl = upstreamUrl(cfg['baseUrl'] ?? spec.defaultUrl, `provider ${provider} baseUrl`);
|
|
105
|
+
upstreams.push({ provider, plugin, origin: baseUrl.origin });
|
|
106
|
+
checkPathRewrite(cfg['pathRewrite'], baseUrl, `provider ${provider}`);
|
|
107
|
+
const fallbacks = cfg['fallbackUpstreams'];
|
|
108
|
+
if (fallbacks === undefined)
|
|
109
|
+
continue;
|
|
110
|
+
check(spec.fallbacks && Array.isArray(fallbacks), `provider ${provider} fallbackUpstreams are not supported`);
|
|
111
|
+
fallbacks.forEach((f, i) => {
|
|
112
|
+
check(isObj(f), `provider ${provider} fallbackUpstreams[${i}] must be an object`);
|
|
113
|
+
checkKeys(f, 'fallback', `provider ${provider} fallbackUpstreams[${i}] `);
|
|
114
|
+
keyEnv(f['apiKeyEnv']);
|
|
115
|
+
const where = `provider ${provider} fallbackUpstreams[${i}]`;
|
|
116
|
+
const fallbackUrl = upstreamUrl(f['baseUrl'], `${where}.baseUrl`);
|
|
117
|
+
upstreams.push({ provider, plugin, origin: fallbackUrl.origin });
|
|
118
|
+
// A fallback without its own rewrites uses the provider's, so check those against it too.
|
|
119
|
+
checkPathRewrite(f['pathRewrite'] ?? cfg['pathRewrite'], fallbackUrl, where);
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return { upstreams, apiKeyEnvs };
|
|
123
|
+
}
|
|
124
|
+
/** Hidden secrets may only be the node's own secrets and the API keys the seller config names. */
|
|
125
|
+
export function checkHiddenSecrets(secrets, apiKeyEnvs) {
|
|
126
|
+
for (const name of secrets) {
|
|
127
|
+
check(SECRET_ENV.test(name) && (NODE_SECRETS.has(name) || (apiKeyEnvs.has(name) && !RESERVED_ENV.test(name))), `environment ${name} is hidden but is not an API key the seller config names`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=seller-config-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seller-config-rules.js","sourceRoot":"","sources":["../src/seller-config-rules.ts"],"names":[],"mappings":"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"}
|
package/dist/shared.d.ts
CHANGED
|
@@ -32,7 +32,15 @@ export declare function normalizePeerId(peerId: string): string;
|
|
|
32
32
|
* `antseed-rd-v1` (see report-data.ts). The configfs collector mints exactly this, so the
|
|
33
33
|
* buyer's node cap recomputes and enforces the same bytes.
|
|
34
34
|
*/
|
|
35
|
-
export declare function computeReportData(nonce: Uint8Array, peerId: string): Buffer;
|
|
35
|
+
export declare function computeReportData(nonce: Uint8Array, peerId: string, channelBinding?: string): Buffer;
|
|
36
|
+
/** A connection's session hash: 64 lowercase hex chars (SHA-256). */
|
|
37
|
+
export declare function normalizeChannelBinding(binding: string): string;
|
|
38
|
+
/**
|
|
39
|
+
* Request header carrying the seller-side connection session hash (set by the seller node, never
|
|
40
|
+
* by the buyer). Must equal @antseed/node's ANTSEED_CHANNEL_BINDING_HEADER; like ATTEST_PATH it is
|
|
41
|
+
* mirrored rather than imported so this package stays free of an @antseed/node dependency.
|
|
42
|
+
*/
|
|
43
|
+
export declare const CHANNEL_BINDING_HEADER = "x-antseed-channel-binding";
|
|
36
44
|
/**
|
|
37
45
|
* Canonical digest over the whole attestation bundle — every cap's evidence entry
|
|
38
46
|
* except seller-bound's own signature (it cannot sign over itself). A sort by cap id
|
|
@@ -67,13 +75,18 @@ export interface AttestRequestBody {
|
|
|
67
75
|
nonce: string;
|
|
68
76
|
/** capability ids the buyer is asking the seller to attest. */
|
|
69
77
|
caps: string[];
|
|
78
|
+
/**
|
|
79
|
+
* Bind the node quote to the connection this request travels on. Older buyers omit it and
|
|
80
|
+
* get the {peerId}-only binding they verify.
|
|
81
|
+
*/
|
|
82
|
+
bindChannel?: boolean;
|
|
70
83
|
}
|
|
71
84
|
/** Body the seller's prover returns: per-capability evidence (a cap may have none). */
|
|
72
85
|
export interface AttestResponseBody {
|
|
73
86
|
/** capId -> base64 of that capability's opaque evidence bytes. */
|
|
74
87
|
evidence: Record<string, string>;
|
|
75
88
|
}
|
|
76
|
-
export declare function encodeAttestRequest(nonce: Uint8Array, caps: string[]): Uint8Array;
|
|
89
|
+
export declare function encodeAttestRequest(nonce: Uint8Array, caps: string[], bindChannel?: boolean): Uint8Array;
|
|
77
90
|
/**
|
|
78
91
|
* Upper bound on an attestation request or response body before JSON.parse. Both halves
|
|
79
92
|
* parse counterparty-controlled bytes (the prover reads buyer requests; the buyer reads
|
|
@@ -83,6 +96,7 @@ export declare const MAX_ATTEST_BODY_BYTES: number;
|
|
|
83
96
|
export declare function decodeAttestRequest(body: Uint8Array): {
|
|
84
97
|
nonce: Uint8Array;
|
|
85
98
|
caps: string[];
|
|
99
|
+
bindChannel: boolean;
|
|
86
100
|
};
|
|
87
101
|
export declare function encodeAttestResponse(evidence: Record<string, Uint8Array>): Uint8Array;
|
|
88
102
|
export declare function decodeAttestResponse(body: Uint8Array): Record<string, Uint8Array>;
|
package/dist/shared.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AAEH;;;GAGG;AACH,eAAO,MAAM,WAAW,qBAAqB,CAAA;AAE7C;;;GAGG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,sCAAoC,CAAA;AAE5D,wCAAwC;AACxC,eAAO,MAAM,WAAW,KAAK,CAAA;AAE7B;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMtD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AAEH;;;GAGG;AACH,eAAO,MAAM,WAAW,qBAAqB,CAAA;AAE7C;;;GAGG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,sCAAoC,CAAA;AAE5D,wCAAwC;AACxC,eAAO,MAAM,WAAW,KAAK,CAAA;AAE7B;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMtD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAKpG;AAED,qEAAqE;AACrE,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAI/D;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,8BAA8B,CAAA;AAKjE;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,UAAU,CAa7E;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAOrG;AAKD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,yGAAyG;AACzG,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEtE;AAED,uFAAuF;AACvF,MAAM,WAAW,iBAAiB;IAChC,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAA;IACb,+DAA+D;IAC/D,IAAI,EAAE,MAAM,EAAE,CAAA;IACd;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,uFAAuF;AACvF,MAAM,WAAW,kBAAkB;IACjC,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,UAAQ,GAAG,UAAU,CAGtG;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAAa,CAAA;AAQ/C,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,UAAU,GAAG;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAcjH;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,UAAU,CAOrF;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAcjF"}
|
package/dist/shared.js
CHANGED
|
@@ -43,9 +43,25 @@ export function normalizePeerId(peerId) {
|
|
|
43
43
|
* `antseed-rd-v1` (see report-data.ts). The configfs collector mints exactly this, so the
|
|
44
44
|
* buyer's node cap recomputes and enforces the same bytes.
|
|
45
45
|
*/
|
|
46
|
-
export function computeReportData(nonce, peerId) {
|
|
47
|
-
return Buffer.from(antseedRdV1.build(nonce, {
|
|
46
|
+
export function computeReportData(nonce, peerId, channelBinding) {
|
|
47
|
+
return Buffer.from(antseedRdV1.build(nonce, {
|
|
48
|
+
peerId: normalizePeerId(peerId),
|
|
49
|
+
...(channelBinding ? { channelBinding: normalizeChannelBinding(channelBinding) } : {}),
|
|
50
|
+
}));
|
|
48
51
|
}
|
|
52
|
+
/** A connection's session hash: 64 lowercase hex chars (SHA-256). */
|
|
53
|
+
export function normalizeChannelBinding(binding) {
|
|
54
|
+
const b = binding.trim().toLowerCase();
|
|
55
|
+
if (!/^[0-9a-f]{64}$/.test(b))
|
|
56
|
+
throw new Error('invalid channel binding: expected 64 hex chars');
|
|
57
|
+
return b;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Request header carrying the seller-side connection session hash (set by the seller node, never
|
|
61
|
+
* by the buyer). Must equal @antseed/node's ANTSEED_CHANNEL_BINDING_HEADER; like ATTEST_PATH it is
|
|
62
|
+
* mirrored rather than imported so this package stays free of an @antseed/node dependency.
|
|
63
|
+
*/
|
|
64
|
+
export const CHANNEL_BINDING_HEADER = 'x-antseed-channel-binding';
|
|
49
65
|
/** The dependent capability whose own evidence is excluded from the bundle it signs over. */
|
|
50
66
|
const SELLER_BOUND_CAP_ID = 'seller-bound';
|
|
51
67
|
/**
|
|
@@ -102,8 +118,8 @@ export function evidenceConfigKey(capId) {
|
|
|
102
118
|
export function parseEvidenceConfigKey(key) {
|
|
103
119
|
return key.startsWith(EVIDENCE_KEY_PREFIX) ? key.slice(EVIDENCE_KEY_PREFIX.length) : undefined;
|
|
104
120
|
}
|
|
105
|
-
export function encodeAttestRequest(nonce, caps) {
|
|
106
|
-
const body = { nonce: Buffer.from(nonce).toString('base64'), caps };
|
|
121
|
+
export function encodeAttestRequest(nonce, caps, bindChannel = false) {
|
|
122
|
+
const body = { nonce: Buffer.from(nonce).toString('base64'), caps, ...(bindChannel ? { bindChannel } : {}) };
|
|
107
123
|
return new TextEncoder().encode(JSON.stringify(body));
|
|
108
124
|
}
|
|
109
125
|
/**
|
|
@@ -130,7 +146,7 @@ export function decodeAttestRequest(body) {
|
|
|
130
146
|
if (!Array.isArray(parsed.caps) || !parsed.caps.every((c) => typeof c === 'string')) {
|
|
131
147
|
throw new Error('attestation request missing "caps" (string[])');
|
|
132
148
|
}
|
|
133
|
-
return { nonce, caps: parsed.caps };
|
|
149
|
+
return { nonce, caps: parsed.caps, bindChannel: parsed.bindChannel === true };
|
|
134
150
|
}
|
|
135
151
|
export function encodeAttestResponse(evidence) {
|
|
136
152
|
const enc = {};
|
package/dist/shared.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C;;;;GAIG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAA;AAE7C;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,GAAG,WAAW,IAAI,KAAK,EAAE,CAAA;AAClC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,oBAAoB,WAAW,EAAE,CAAA;AAE5D,wCAAwC;AACxC,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAA;AAE7B;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACrC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,oEAAoE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAA;IAChH,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAiB,EAAE,MAAc;
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C;;;;GAIG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAA;AAE7C;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,GAAG,WAAW,IAAI,KAAK,EAAE,CAAA;AAClC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,oBAAoB,WAAW,EAAE,CAAA;AAE5D,wCAAwC;AACxC,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAA;AAE7B;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACrC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,oEAAoE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAA;IAChH,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAiB,EAAE,MAAc,EAAE,cAAuB;IAC1F,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE;QAC1C,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC;QAC/B,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,uBAAuB,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvF,CAAC,CAAC,CAAA;AACL,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACtC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;IAChG,OAAO,CAAC,CAAA;AACV,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,2BAA2B,CAAA;AAEjE,6FAA6F;AAC7F,MAAM,mBAAmB,GAAG,cAAc,CAAA;AAE1C;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,QAAoC;IAC/D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,mBAAmB,CAAC,CAAC,IAAI,EAAE,CAAA;IACnF,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAA;IAC9B,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA,CAAC,CAAC,CAAA;IACjG,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAE,CAAA;QAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QACrC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;QAC3B,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACf,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;QAC3B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IAC9B,CAAC;IACD,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAA;AACnC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAiB,EAAE,MAAkB,EAAE,MAAc;IACvF,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAA;IAC7D,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAA;IAC1E,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IACtB,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;IAClC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;IAC/C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAA;AAC7B,CAAC;AAED,qGAAqG;AACrG,MAAM,mBAAmB,GAAG,WAAW,CAAA;AAEvC;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,GAAG,mBAAmB,GAAG,KAAK,EAAE,CAAA;AACzC,CAAC;AAED,yGAAyG;AACzG,MAAM,UAAU,sBAAsB,CAAC,GAAW;IAChD,OAAO,GAAG,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AAChG,CAAC;AAqBD,MAAM,UAAU,mBAAmB,CAAC,KAAiB,EAAE,IAAc,EAAE,WAAW,GAAG,KAAK;IACxF,MAAM,IAAI,GAAsB,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;IAC/H,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;AACvD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,GAAG,IAAI,CAAA;AAE/C,SAAS,cAAc,CAAC,IAAgB,EAAE,IAAY;IACpD,IAAI,IAAI,CAAC,MAAM,GAAG,qBAAqB,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,YAAY,qBAAqB,WAAW,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;IACpF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAgB;IAClD,cAAc,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAA;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAA+B,CAAA;IACvF,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;IACxD,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IACjD,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,6BAA6B,WAAW,eAAe,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;IACxF,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;QACpF,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;IAClE,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,KAAK,IAAI,EAAE,CAAA;AAC/E,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAoC;IACvE,MAAM,GAAG,GAA2B,EAAE,CAAA;IACtC,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtD,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACpD,CAAC;IACD,MAAM,IAAI,GAAuB,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAA;IAClD,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;AACvD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAgB;IACnD,cAAc,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAA;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAgC,CAAA;IACxF,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACpE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;IACnE,CAAC;IACD,MAAM,GAAG,GAA+B,EAAE,CAAA;IAC1C,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3D,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,iBAAiB,CAAC,CAAA;QACtE,CAAC;QACD,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAA;IACzD,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TCB acceptance. UpToDate is always genuine hardware. SWHardeningNeeded flags guest-side
|
|
3
|
+
* software mitigations only — not a hardware compromise — and is accepted by default (real
|
|
4
|
+
* GCP TDX quotes often report it). Set ANTSEED_VERIFIER_STRICT_TCB=true to require UpToDate
|
|
5
|
+
* exactly. Anything else (OutOfDate, Revoked, Unknown, ...) is rejected.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isTcbAcceptable(status: string): boolean;
|
|
8
|
+
//# sourceMappingURL=tcb-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tcb-policy.d.ts","sourceRoot":"","sources":["../src/tcb-policy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAIvD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TCB acceptance. UpToDate is always genuine hardware. SWHardeningNeeded flags guest-side
|
|
3
|
+
* software mitigations only — not a hardware compromise — and is accepted by default (real
|
|
4
|
+
* GCP TDX quotes often report it). Set ANTSEED_VERIFIER_STRICT_TCB=true to require UpToDate
|
|
5
|
+
* exactly. Anything else (OutOfDate, Revoked, Unknown, ...) is rejected.
|
|
6
|
+
*/
|
|
7
|
+
export function isTcbAcceptable(status) {
|
|
8
|
+
if (status === 'UpToDate')
|
|
9
|
+
return true;
|
|
10
|
+
if (status === 'SWHardeningNeeded')
|
|
11
|
+
return process.env['ANTSEED_VERIFIER_STRICT_TCB'] !== 'true';
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=tcb-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tcb-policy.js","sourceRoot":"","sources":["../src/tcb-policy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,IAAI,CAAA;IACtC,IAAI,MAAM,KAAK,mBAAmB;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,KAAK,MAAM,CAAA;IAChG,OAAO,KAAK,CAAA;AACd,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"openai": { "defaultUrl": "https://api.openai.com", "baseUrl": true, "fallbacks": true },
|
|
3
|
+
"anthropic": { "defaultUrl": "https://api.anthropic.com", "baseUrl": false },
|
|
4
|
+
"typesafe": { "defaultUrl": "https://api.typesafe.ai", "baseUrl": true },
|
|
5
|
+
"venice-video": { "defaultUrl": "https://api.venice.ai", "baseUrl": true },
|
|
6
|
+
"alibaba-video": { "defaultUrl": "https://dashscope-intl.aliyuncs.com", "baseUrl": true }
|
|
7
|
+
}
|
package/dist/verifier.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { AntseedVerifierPlugin, VerifyContext, VerifyResult } from './antseed-node-types.js';
|
|
2
2
|
import './caps/index.js';
|
|
3
|
+
import type { VerifyConfidentialSpaceTokenFn } from './confidential-space.js';
|
|
3
4
|
import { type VerifyQuoteFn } from './caps/tee-tdx.js';
|
|
4
5
|
import type { MeasuredImagePolicy } from './caps/measured-image.js';
|
|
5
6
|
/**
|
|
@@ -15,7 +16,7 @@ export declare function readRequiredCaps(): string[];
|
|
|
15
16
|
*/
|
|
16
17
|
export declare function readMeasuredImagePolicy(): MeasuredImagePolicy | undefined;
|
|
17
18
|
/** Core orchestration; the DCAP check is injectable for testing. */
|
|
18
|
-
export declare function runVerify(ctx: VerifyContext, verifyQuote?: VerifyQuoteFn): Promise<VerifyResult>;
|
|
19
|
+
export declare function runVerify(ctx: VerifyContext, verifyQuote?: VerifyQuoteFn, verifyConfidentialSpaceToken?: VerifyConfidentialSpaceTokenFn): Promise<VerifyResult>;
|
|
19
20
|
declare const verifierPlugin: AntseedVerifierPlugin;
|
|
20
21
|
export default verifierPlugin;
|
|
21
22
|
//# sourceMappingURL=verifier.d.ts.map
|
package/dist/verifier.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../src/verifier.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAe,aAAa,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC9G,OAAO,iBAAiB,CAAA;AAExB,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../src/verifier.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAe,aAAa,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC9G,OAAO,iBAAiB,CAAA;AAExB,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAA;AAC7E,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAiCnE;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAI3C;AAiBD;;;;;GAKG;AACH,wBAAgB,uBAAuB,IAAI,mBAAmB,GAAG,SAAS,CAUzE;AAOD,oEAAoE;AACpE,wBAAsB,SAAS,CAC7B,GAAG,EAAE,aAAa,EAClB,WAAW,GAAE,aAAkC,EAC/C,4BAA4B,CAAC,EAAE,8BAA8B,GAC5D,OAAO,CAAC,YAAY,CAAC,CAmEvB;AAED,QAAA,MAAM,cAAc,EAAE,qBAQrB,CAAA;AAED,eAAe,cAAc,CAAA"}
|
package/dist/verifier.js
CHANGED
|
@@ -4,6 +4,7 @@ import { capabilityIds, getCapability } from './capability.js';
|
|
|
4
4
|
import { NODE_TEE_CAP_ID, PROVIDER_TEE_CAP_ID, defaultVerifyQuote, verifyTdxEvidence, } from './caps/tee-tdx.js';
|
|
5
5
|
import { PROVIDER_CLAIMS_CAP_ID } from './caps/provider-claims.js';
|
|
6
6
|
import { readFileSync } from 'node:fs';
|
|
7
|
+
import { readApprovedNodeBuilds } from './approved-node-measurements.js';
|
|
7
8
|
import { NONCE_BYTES, VERIFIER_ID, claimId, decodeAttestResponse, encodeAttestRequest, normalizePeerId, } from './shared.js';
|
|
8
9
|
/**
|
|
9
10
|
* Buyer half. It fetches per-capability evidence from the seller in one attestation round,
|
|
@@ -71,7 +72,7 @@ function failAll(detail, requiredCaps) {
|
|
|
71
72
|
return { ok: false, claims: requiredCaps.map((id) => ({ claim: claimId(id), ok: false, detail })) };
|
|
72
73
|
}
|
|
73
74
|
/** Core orchestration; the DCAP check is injectable for testing. */
|
|
74
|
-
export async function runVerify(ctx, verifyQuote = defaultVerifyQuote) {
|
|
75
|
+
export async function runVerify(ctx, verifyQuote = defaultVerifyQuote, verifyConfidentialSpaceToken) {
|
|
75
76
|
const requiredCaps = readRequiredCaps();
|
|
76
77
|
let peerId;
|
|
77
78
|
try {
|
|
@@ -89,7 +90,7 @@ export async function runVerify(ctx, verifyQuote = defaultVerifyQuote) {
|
|
|
89
90
|
method: 'POST',
|
|
90
91
|
path: ctx.attestPath,
|
|
91
92
|
headers: { 'content-type': 'application/json' },
|
|
92
|
-
body: encodeAttestRequest(nonce, requested),
|
|
93
|
+
body: encodeAttestRequest(nonce, requested, true),
|
|
93
94
|
});
|
|
94
95
|
}
|
|
95
96
|
catch (err) {
|
|
@@ -111,11 +112,13 @@ export async function runVerify(ctx, verifyQuote = defaultVerifyQuote) {
|
|
|
111
112
|
for (const id of TDX_CAP_IDS) {
|
|
112
113
|
const ev = evidence[id];
|
|
113
114
|
if (ev)
|
|
114
|
-
parsedByCap.set(id, await verifyTdxEvidence(ev, verifyQuote, now));
|
|
115
|
+
parsedByCap.set(id, await verifyTdxEvidence(ev, verifyQuote, now, verifyConfidentialSpaceToken));
|
|
115
116
|
}
|
|
116
117
|
// Verify the required caps, any cap the seller returned evidence for, and derived caps.
|
|
117
118
|
const wanted = new Set([...requiredCaps, ...Object.keys(evidence), ...DERIVED_CAPS]);
|
|
118
119
|
const measuredImagePolicy = readMeasuredImagePolicy();
|
|
120
|
+
const approvedNodeBuilds = readApprovedNodeBuilds();
|
|
121
|
+
const channelBinding = resp.channelBinding;
|
|
119
122
|
const claims = [];
|
|
120
123
|
for (const capId of capabilityIds()) {
|
|
121
124
|
if (!wanted.has(capId))
|
|
@@ -125,9 +128,9 @@ export async function runVerify(ctx, verifyQuote = defaultVerifyQuote) {
|
|
|
125
128
|
continue;
|
|
126
129
|
const source = PARSE_SOURCE[capId];
|
|
127
130
|
const parsed = source ? parsedByCap.get(source) : undefined;
|
|
128
|
-
const policy = capId === MEASURED_IMAGE_ID ? measuredImagePolicy : undefined;
|
|
131
|
+
const policy = capId === MEASURED_IMAGE_ID ? measuredImagePolicy : capId === NODE_TEE_CAP_ID ? approvedNodeBuilds : undefined;
|
|
129
132
|
try {
|
|
130
|
-
const out = await cap.verify({ nonce, peerId, evidence: evidence[capId], parsedQuote: parsed, evidenceBundle: evidence, policy });
|
|
133
|
+
const out = await cap.verify({ nonce, peerId, evidence: evidence[capId], parsedQuote: parsed, evidenceBundle: evidence, policy, channelBinding });
|
|
131
134
|
claims.push(...(Array.isArray(out) ? out : [out]));
|
|
132
135
|
}
|
|
133
136
|
catch (err) {
|
|
@@ -141,8 +144,8 @@ const verifierPlugin = {
|
|
|
141
144
|
type: 'verifier',
|
|
142
145
|
name: VERIFIER_ID,
|
|
143
146
|
displayName: 'TEE attestation verifier (Intel TDX / DCAP)',
|
|
144
|
-
version: '0.1.
|
|
145
|
-
description: 'Capability-based seller attestation: one claim per capability. Requires the seller node\'s genuine Intel TDX hardware (seller-node-tee-genuine) and a seller-identity binding over the whole bundle (seller-bound); also reports the provider TEE (seller-provider-tee-genuine), measured-image and gpu-cc when available.',
|
|
147
|
+
version: '0.1.1',
|
|
148
|
+
description: 'Capability-based seller attestation: one claim per capability. Requires the seller node\'s genuine Intel TDX hardware running an approved seller build on the buyer\'s own connection (seller-node-tee-genuine) and a seller-identity binding over the whole bundle (seller-bound); also reports the provider TEE (seller-provider-tee-genuine), measured-image and gpu-cc when available.',
|
|
146
149
|
verify: (ctx) => runVerify(ctx),
|
|
147
150
|
};
|
|
148
151
|
export default verifierPlugin;
|
package/dist/verifier.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifier.js","sourceRoot":"","sources":["../src/verifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,iBAAiB,CAAA,CAAC,4CAA4C;AACrE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"verifier.js","sourceRoot":"","sources":["../src/verifier.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@antseed/antseed-verifier",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "AntSeed capability-based attestation SDK: buyer verifier + seller prover. A menu of independent seller capabilities (seller-node-tee-genuine, seller-provider-tee-genuine, seller-bound, seller-provider-measured-image, seller-provider-gpu-cc), one claim each.",
|
|
5
5
|
"license": "GPL-3.0-only",
|
|
6
6
|
"type": "module",
|