@super-protocol/pki-sync-client 0.0.0-nvidia-local-verifier
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 +372 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +105 -0
- package/dist/config.d.ts +29 -0
- package/dist/config.js +76 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +19 -0
- package/dist/root-certificate-verifier.d.ts +26 -0
- package/dist/root-certificate-verifier.js +259 -0
- package/dist/sync-client.d.ts +47 -0
- package/dist/sync-client.js +366 -0
- package/package.json +48 -0
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.verifyRootCertificateTrust = exports.verifyRootCertificatesMatch = exports.getRootCertificate = exports.resolveLocalNetworkType = void 0;
|
|
27
|
+
const pki_common_1 = require("@super-protocol/pki-common");
|
|
28
|
+
const attestation_common_1 = require("@super-protocol/attestation-common");
|
|
29
|
+
const pki_attestation_engine_1 = require("@super-protocol/pki-attestation-engine");
|
|
30
|
+
const sdk_js_1 = require("@super-protocol/sdk-js");
|
|
31
|
+
const crypto_1 = require("crypto");
|
|
32
|
+
const fs = __importStar(require("fs"));
|
|
33
|
+
const preservedDynamicImport = new Function('specifier', 'return import(specifier)');
|
|
34
|
+
const NETWORK_TYPES = ['trusted', 'untrusted'];
|
|
35
|
+
const isNetworkType = (value) => NETWORK_TYPES.includes(value);
|
|
36
|
+
const getEvidenceLogContext = (evidenceType) => ({
|
|
37
|
+
evidenceType,
|
|
38
|
+
evidenceTypeName: (0, attestation_common_1.teeEvidenceTypeToHumanReadable)(evidenceType),
|
|
39
|
+
});
|
|
40
|
+
async function resolveLocalNetworkType(networkTypeFile) {
|
|
41
|
+
if (!networkTypeFile) {
|
|
42
|
+
return 'untrusted';
|
|
43
|
+
}
|
|
44
|
+
const value = (await fs.promises.readFile(networkTypeFile, 'utf8')).trim();
|
|
45
|
+
if (!isNetworkType(value)) {
|
|
46
|
+
throw new Error(`Invalid network type file "${networkTypeFile}": expected trusted or untrusted`);
|
|
47
|
+
}
|
|
48
|
+
return value;
|
|
49
|
+
}
|
|
50
|
+
exports.resolveLocalNetworkType = resolveLocalNetworkType;
|
|
51
|
+
const getRootCertificate = (caBundle) => {
|
|
52
|
+
const { ca } = sdk_js_1.CertificatesHelper.extractCAFromChain(caBundle);
|
|
53
|
+
const rootCerts = sdk_js_1.CertificatesHelper.splitPemCerts(ca);
|
|
54
|
+
if (rootCerts.length !== 1) {
|
|
55
|
+
throw new Error(`Root certificate verification failed: expected exactly one root certificate, got ${rootCerts.length}`);
|
|
56
|
+
}
|
|
57
|
+
return `${rootCerts[0].trim()}\n`;
|
|
58
|
+
};
|
|
59
|
+
exports.getRootCertificate = getRootCertificate;
|
|
60
|
+
const verifyRootCertificatesMatch = (trustedCaBundle, receivedCaBundle, log) => {
|
|
61
|
+
const trustedRoot = new crypto_1.X509Certificate((0, exports.getRootCertificate)(trustedCaBundle));
|
|
62
|
+
const receivedRoot = new crypto_1.X509Certificate((0, exports.getRootCertificate)(receivedCaBundle));
|
|
63
|
+
const context = {
|
|
64
|
+
trustedRootFingerprint256: trustedRoot.fingerprint256,
|
|
65
|
+
trustedRootSubject: trustedRoot.subject,
|
|
66
|
+
receivedRootFingerprint256: receivedRoot.fingerprint256,
|
|
67
|
+
receivedRootSubject: receivedRoot.subject,
|
|
68
|
+
};
|
|
69
|
+
if (trustedRoot.fingerprint256 !== receivedRoot.fingerprint256) {
|
|
70
|
+
log?.error('Received certificate chain root does not match configured PKI authority CA bundle root', context);
|
|
71
|
+
throw new Error('Received certificate chain root does not match configured PKI authority CA bundle root');
|
|
72
|
+
}
|
|
73
|
+
log?.info('Received certificate chain root matches configured PKI authority CA bundle root', context);
|
|
74
|
+
};
|
|
75
|
+
exports.verifyRootCertificatesMatch = verifyRootCertificatesMatch;
|
|
76
|
+
const readNetworkTypeExtension = (rootCertPem, getExtensionValue) => {
|
|
77
|
+
const networkType = getExtensionValue(rootCertPem, pki_common_1.OID_CUSTOM_EXTENSION_NETWORK_TYPE)
|
|
78
|
+
?.toString('ascii')
|
|
79
|
+
.trim();
|
|
80
|
+
if (!networkType || !isNetworkType(networkType)) {
|
|
81
|
+
throw new Error(`Root certificate verification failed: missing or invalid ${pki_common_1.OID_CUSTOM_EXTENSION_NETWORK_TYPE} extension`);
|
|
82
|
+
}
|
|
83
|
+
return networkType;
|
|
84
|
+
};
|
|
85
|
+
const defaultLoadAttestationModule = () => preservedDynamicImport('@super-protocol/attestation-wasm/node');
|
|
86
|
+
const calculateMrEnclave = async (serializedEvidence, evidenceType, attestation) => {
|
|
87
|
+
switch (evidenceType) {
|
|
88
|
+
case attestation_common_1.TeeEvidenceType.TEE_EVIDENCE_TYPE_INTEL_TDX_QEMU:
|
|
89
|
+
case attestation_common_1.TeeEvidenceType.TEE_EVIDENCE_TYPE_INTEL_TDX_GCP:
|
|
90
|
+
case attestation_common_1.TeeEvidenceType.TEE_EVIDENCE_TYPE_INTEL_TDX_AZURE:
|
|
91
|
+
case attestation_common_1.TeeEvidenceType.TEE_EVIDENCE_TYPE_AMD_SEV_SNP_AZURE:
|
|
92
|
+
return (await attestation.calculateMrEnclave(serializedEvidence))
|
|
93
|
+
.mrEnclave;
|
|
94
|
+
case attestation_common_1.TeeEvidenceType.TEE_EVIDENCE_TYPE_AMD_SEV_SNP_QEMU: {
|
|
95
|
+
const evidence = attestation_common_1.TeeEvidence.decode(serializedEvidence);
|
|
96
|
+
const report = evidence.amdSevSnpQemu?.snpReport;
|
|
97
|
+
if (!report) {
|
|
98
|
+
throw new Error('Root certificate verification failed: SEV-SNP evidence is missing snpReport');
|
|
99
|
+
}
|
|
100
|
+
return attestation.calculateSnpSingleCoreMrEnclave(report);
|
|
101
|
+
}
|
|
102
|
+
default:
|
|
103
|
+
throw new Error(`Root certificate verification failed: unsupported TEE evidence type ${evidenceType}`);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
async function verifyRootCertificateTrust(options) {
|
|
107
|
+
const log = options.log;
|
|
108
|
+
const getExtensionValue = options.getExtensionValue ??
|
|
109
|
+
((certPem, oid) => sdk_js_1.CertificatesHelper.getExtensionValue(certPem, oid));
|
|
110
|
+
const verifySignature = options.verifySignature ?? attestation_common_1.verifyMrEnclaveSignature;
|
|
111
|
+
log?.info('Starting root certificate trust verification', {
|
|
112
|
+
networkTypeFile: options.networkTypeFile,
|
|
113
|
+
});
|
|
114
|
+
const localNetworkType = await resolveLocalNetworkType(options.networkTypeFile);
|
|
115
|
+
log?.info('Local network type resolved', {
|
|
116
|
+
localNetworkType,
|
|
117
|
+
networkTypeFile: options.networkTypeFile,
|
|
118
|
+
networkTypeSource: options.networkTypeFile ? 'file' : 'default',
|
|
119
|
+
});
|
|
120
|
+
log?.debug('Extracting root certificate from CA bundle');
|
|
121
|
+
let rootCertPem;
|
|
122
|
+
try {
|
|
123
|
+
rootCertPem = (0, exports.getRootCertificate)(options.caBundle);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
log?.error('Root certificate extraction failed', {
|
|
127
|
+
error: error instanceof Error ? error.message : String(error),
|
|
128
|
+
});
|
|
129
|
+
throw error;
|
|
130
|
+
}
|
|
131
|
+
const rootCertificate = new crypto_1.X509Certificate(rootCertPem);
|
|
132
|
+
log?.info('Root certificate extracted from CA bundle', {
|
|
133
|
+
rootFingerprint256: rootCertificate.fingerprint256,
|
|
134
|
+
rootSubject: rootCertificate.subject,
|
|
135
|
+
rootIssuer: rootCertificate.issuer,
|
|
136
|
+
});
|
|
137
|
+
log?.debug('Reading root certificate network type extension', {
|
|
138
|
+
oid: pki_common_1.OID_CUSTOM_EXTENSION_NETWORK_TYPE,
|
|
139
|
+
});
|
|
140
|
+
let rootNetworkType;
|
|
141
|
+
try {
|
|
142
|
+
rootNetworkType = readNetworkTypeExtension(rootCertPem, getExtensionValue);
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
log?.error('Root certificate network type extension check failed', {
|
|
146
|
+
oid: pki_common_1.OID_CUSTOM_EXTENSION_NETWORK_TYPE,
|
|
147
|
+
error: error instanceof Error ? error.message : String(error),
|
|
148
|
+
});
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
151
|
+
log?.info('Root certificate network type resolved', {
|
|
152
|
+
certificateNetworkType: rootNetworkType,
|
|
153
|
+
localNetworkType,
|
|
154
|
+
});
|
|
155
|
+
if (rootNetworkType !== localNetworkType) {
|
|
156
|
+
log?.error('Root certificate network type mismatch', {
|
|
157
|
+
certificateNetworkType: rootNetworkType,
|
|
158
|
+
localNetworkType,
|
|
159
|
+
});
|
|
160
|
+
throw new Error(`Root certificate verification failed: certificate network type "${rootNetworkType}" does not match local network type "${localNetworkType}"`);
|
|
161
|
+
}
|
|
162
|
+
log?.info('Root certificate network type matches local network type', {
|
|
163
|
+
certificateNetworkType: rootNetworkType,
|
|
164
|
+
localNetworkType,
|
|
165
|
+
});
|
|
166
|
+
if (rootNetworkType === 'untrusted') {
|
|
167
|
+
log?.info('Root certificate trust verification completed in untrusted mode', {
|
|
168
|
+
certificateNetworkType: rootNetworkType,
|
|
169
|
+
localNetworkType,
|
|
170
|
+
teeEvidenceRequired: false,
|
|
171
|
+
});
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
log?.info('Trusted root certificate requires TEE evidence verification', {
|
|
175
|
+
certificateNetworkType: rootNetworkType,
|
|
176
|
+
localNetworkType,
|
|
177
|
+
teeEvidenceRequired: true,
|
|
178
|
+
});
|
|
179
|
+
const serializedEvidence = getExtensionValue(rootCertPem, pki_common_1.OID_TEE_EVIDENCE);
|
|
180
|
+
if (!serializedEvidence) {
|
|
181
|
+
log?.error('Trusted root certificate is missing TEE evidence extension', {
|
|
182
|
+
oid: pki_common_1.OID_TEE_EVIDENCE,
|
|
183
|
+
});
|
|
184
|
+
throw new Error(`Root certificate verification failed: trusted root certificate is missing ${pki_common_1.OID_TEE_EVIDENCE} evidence extension`);
|
|
185
|
+
}
|
|
186
|
+
log?.info('Root certificate TEE evidence extension found', {
|
|
187
|
+
oid: pki_common_1.OID_TEE_EVIDENCE,
|
|
188
|
+
evidenceLength: serializedEvidence.length,
|
|
189
|
+
});
|
|
190
|
+
log?.debug('Loading attestation verification module');
|
|
191
|
+
const attestation = await (options.loadAttestationModule ?? defaultLoadAttestationModule)();
|
|
192
|
+
log?.debug('Attestation verification module loaded');
|
|
193
|
+
log?.info('Verifying root certificate TEE evidence');
|
|
194
|
+
let verificationResult;
|
|
195
|
+
try {
|
|
196
|
+
verificationResult = await attestation.verifyTeeEvidence(serializedEvidence, (0, pki_attestation_engine_1.buildAzureVerifyOptions)());
|
|
197
|
+
// Only a trusted root reaches this point, so a debug VM is rejected.
|
|
198
|
+
(0, pki_attestation_engine_1.checkTeeVerificationResult)(verificationResult, attestation, {
|
|
199
|
+
networkType: rootNetworkType,
|
|
200
|
+
log,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
log?.error('Root certificate TEE evidence verification failed', {
|
|
205
|
+
error: error instanceof Error ? error.message : String(error),
|
|
206
|
+
});
|
|
207
|
+
throw error;
|
|
208
|
+
}
|
|
209
|
+
log?.info('Root certificate TEE evidence verified', {
|
|
210
|
+
...getEvidenceLogContext(verificationResult.evidenceType),
|
|
211
|
+
});
|
|
212
|
+
log?.info('Calculating root certificate mrEnclave', {
|
|
213
|
+
...getEvidenceLogContext(verificationResult.evidenceType),
|
|
214
|
+
});
|
|
215
|
+
let mrEnclave;
|
|
216
|
+
try {
|
|
217
|
+
mrEnclave = await calculateMrEnclave(serializedEvidence, verificationResult.evidenceType, attestation);
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
log?.error('Root certificate mrEnclave calculation failed', {
|
|
221
|
+
...getEvidenceLogContext(verificationResult.evidenceType),
|
|
222
|
+
error: error instanceof Error ? error.message : String(error),
|
|
223
|
+
});
|
|
224
|
+
throw error;
|
|
225
|
+
}
|
|
226
|
+
const mrEnclaveHex = Buffer.from(mrEnclave).toString('hex');
|
|
227
|
+
log?.info('Root certificate mrEnclave calculated', {
|
|
228
|
+
...getEvidenceLogContext(verificationResult.evidenceType),
|
|
229
|
+
mrEnclaveHex,
|
|
230
|
+
});
|
|
231
|
+
log?.info('Checking root certificate mrEnclave in trusted registry', {
|
|
232
|
+
...getEvidenceLogContext(verificationResult.evidenceType),
|
|
233
|
+
mrEnclaveHex,
|
|
234
|
+
registryCheckStatus: 'started',
|
|
235
|
+
});
|
|
236
|
+
try {
|
|
237
|
+
await verifySignature(mrEnclave, verificationResult.evidenceType);
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
log?.error('Root certificate mrEnclave trusted registry check failed', {
|
|
241
|
+
...getEvidenceLogContext(verificationResult.evidenceType),
|
|
242
|
+
mrEnclaveHex,
|
|
243
|
+
isTrusted: false,
|
|
244
|
+
error: error instanceof Error ? error.message : String(error),
|
|
245
|
+
});
|
|
246
|
+
throw error;
|
|
247
|
+
}
|
|
248
|
+
log?.info('Root certificate mrEnclave trusted registry check passed', {
|
|
249
|
+
...getEvidenceLogContext(verificationResult.evidenceType),
|
|
250
|
+
mrEnclaveHex,
|
|
251
|
+
isTrusted: true,
|
|
252
|
+
});
|
|
253
|
+
log?.info('Trusted root certificate evidence verified', {
|
|
254
|
+
...getEvidenceLogContext(verificationResult.evidenceType),
|
|
255
|
+
mrEnclaveHex: Buffer.from(mrEnclave).toString('hex'),
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
exports.verifyRootCertificateTrust = verifyRootCertificateTrust;
|
|
259
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9vdC1jZXJ0aWZpY2F0ZS12ZXJpZmllci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yb290LWNlcnRpZmljYXRlLXZlcmlmaWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkRBS29DO0FBQ3BDLDJFQU00QztBQUM1QyxtRkFJZ0Q7QUFDaEQsbURBQTREO0FBQzVELG1DQUF5QztBQUN6Qyx1Q0FBeUI7QUFnQnpCLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxRQUFRLENBQ3ZDLFdBQVcsRUFDWCwwQkFBMEIsQ0FDWixDQUFDO0FBY25CLE1BQU0sYUFBYSxHQUFrQixDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUU5RCxNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQWEsRUFBd0IsRUFBRSxDQUN6RCxhQUEwQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUVoRCxNQUFNLHFCQUFxQixHQUFHLENBQUMsWUFBNkIsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM5RCxZQUFZO0lBQ1osZ0JBQWdCLEVBQUUsSUFBQSxtREFBOEIsRUFBQyxZQUFZLENBQUM7Q0FDakUsQ0FBQyxDQUFDO0FBRUksS0FBSyxVQUFVLHVCQUF1QixDQUN6QyxlQUF3QjtJQUV4QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDbkIsT0FBTyxXQUFXLENBQUM7SUFDdkIsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMzRSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FDWCw4QkFBOEIsZUFBZSxrQ0FBa0MsQ0FDbEYsQ0FBQztJQUNOLENBQUM7SUFFRCxPQUFPLEtBQUss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
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { SyncConfig } from './config';
|
|
2
|
+
import { LogLevel } from '@super-protocol/pki-common';
|
|
3
|
+
import { type DetectAttestationType } from '@super-protocol/pki-attestation-engine';
|
|
4
|
+
export interface SyncClientOptions {
|
|
5
|
+
servers: string[];
|
|
6
|
+
networkID: string;
|
|
7
|
+
caBundle: string;
|
|
8
|
+
ownChallenge: DetectAttestationType | 'auto';
|
|
9
|
+
retryAttempts?: number;
|
|
10
|
+
retryDelaySec?: number;
|
|
11
|
+
logLevel?: LogLevel;
|
|
12
|
+
disableServerIdentityCheck?: boolean;
|
|
13
|
+
saveCertsToDir?: string;
|
|
14
|
+
saveCertsPrefix?: string;
|
|
15
|
+
networkTypeFile?: string;
|
|
16
|
+
nvtrust?: {
|
|
17
|
+
verifier?: 'remote' | 'local';
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export declare class SyncClient {
|
|
21
|
+
static readonly DEFAULT_RETRY_ATTEMPTS = 1;
|
|
22
|
+
static readonly DEFAULT_RETRY_DELAY_SEC = 10;
|
|
23
|
+
private static readonly RETRYABLE_NETWORK_ERROR_CODES;
|
|
24
|
+
private static readonly RETRYABLE_HTTP_STATUS_CODES;
|
|
25
|
+
private options;
|
|
26
|
+
private challenge?;
|
|
27
|
+
private logger;
|
|
28
|
+
private retryAttempts;
|
|
29
|
+
private retryDelaySec;
|
|
30
|
+
private static getNvidiaTokenMode;
|
|
31
|
+
private static resolveLogger;
|
|
32
|
+
constructor(options: SyncClientOptions);
|
|
33
|
+
private static buildChallengeConfig;
|
|
34
|
+
private resolveChallenge;
|
|
35
|
+
private static normalizeRetryAttempts;
|
|
36
|
+
private static normalizeRetryDelaySec;
|
|
37
|
+
private static evaluateRetry;
|
|
38
|
+
private static buildChallengeProvider;
|
|
39
|
+
private createHttpsAgent;
|
|
40
|
+
private createAttestationServiceClient;
|
|
41
|
+
private preparePkiClient;
|
|
42
|
+
private fetchSecrets;
|
|
43
|
+
private saveSecrets;
|
|
44
|
+
private saveArtifacts;
|
|
45
|
+
private saveCertificates;
|
|
46
|
+
sync(config: SyncConfig): Promise<void>;
|
|
47
|
+
}
|