@super-protocol/pki-attestation-engine 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/dist/attestationType.d.ts +4 -0
- package/dist/attestationType.js +61 -0
- package/dist/azure.d.ts +40 -0
- package/dist/azure.js +128 -0
- package/dist/certificateGenerator.d.ts +34 -0
- package/dist/certificateGenerator.js +347 -0
- package/dist/challengeProvider/challengeNvidiaCCHelper.d.ts +33 -0
- package/dist/challengeProvider/challengeNvidiaCCHelper.js +254 -0
- package/dist/challengeProvider/challengeProvider.d.ts +6 -0
- package/dist/challengeProvider/challengeProvider.js +3 -0
- package/dist/challengeProvider/challengeProviderAzure.d.ts +11 -0
- package/dist/challengeProvider/challengeProviderAzure.js +60 -0
- package/dist/challengeProvider/challengeProviderCertificate.d.ts +15 -0
- package/dist/challengeProvider/challengeProviderCertificate.js +82 -0
- package/dist/challengeProvider/challengeProviderSevSnp.d.ts +10 -0
- package/dist/challengeProvider/challengeProviderSevSnp.js +55 -0
- package/dist/challengeProvider/challengeProviderTdx.d.ts +11 -0
- package/dist/challengeProvider/challengeProviderTdx.js +60 -0
- package/dist/challengeProvider/challengeProviderToken.d.ts +9 -0
- package/dist/challengeProvider/challengeProviderToken.js +22 -0
- package/dist/challengeProvider/challengeProviderUntrusted.d.ts +9 -0
- package/dist/challengeProvider/challengeProviderUntrusted.js +22 -0
- package/dist/challengeProvider/index.d.ts +8 -0
- package/dist/challengeProvider/index.js +25 -0
- package/dist/challengeValidator/challengeValidator.d.ts +18 -0
- package/dist/challengeValidator/challengeValidator.js +3 -0
- package/dist/challengeValidator/challengeValidatorAzure.d.ts +29 -0
- package/dist/challengeValidator/challengeValidatorAzure.js +67 -0
- package/dist/challengeValidator/challengeValidatorCertificate.d.ts +9 -0
- package/dist/challengeValidator/challengeValidatorCertificate.js +55 -0
- package/dist/challengeValidator/challengeValidatorNvidia.d.ts +10 -0
- package/dist/challengeValidator/challengeValidatorNvidia.js +246 -0
- package/dist/challengeValidator/challengeValidatorSevSnp.d.ts +13 -0
- package/dist/challengeValidator/challengeValidatorSevSnp.js +142 -0
- package/dist/challengeValidator/challengeValidatorTdx.d.ts +8 -0
- package/dist/challengeValidator/challengeValidatorTdx.js +58 -0
- package/dist/challengeValidator/challengeValidatorToken.d.ts +8 -0
- package/dist/challengeValidator/challengeValidatorToken.js +38 -0
- package/dist/challengeValidator/index.d.ts +9 -0
- package/dist/challengeValidator/index.js +37 -0
- package/dist/challengeValidator/schemas.d.ts +13 -0
- package/dist/challengeValidator/schemas.js +21 -0
- package/dist/challengeValidator/validatorConfig.d.ts +28 -0
- package/dist/challengeValidator/validatorConfig.js +3 -0
- package/dist/challengeValidator/wasmVerificationPolicy.d.ts +60 -0
- package/dist/challengeValidator/wasmVerificationPolicy.js +123 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +24 -0
- package/dist/mrEnclaveSignature.d.ts +9 -0
- package/dist/mrEnclaveSignature.js +32 -0
- package/dist/swarmCertValidation.d.ts +6 -0
- package/dist/swarmCertValidation.js +52 -0
- package/package.json +32 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ChallengeProviderToken = void 0;
|
|
4
|
+
const pki_common_1 = require("@super-protocol/pki-common");
|
|
5
|
+
class ChallengeProviderToken {
|
|
6
|
+
token;
|
|
7
|
+
logger;
|
|
8
|
+
constructor(token, logger) {
|
|
9
|
+
this.token = token;
|
|
10
|
+
this.logger = logger;
|
|
11
|
+
}
|
|
12
|
+
async generateChallenge(userData, networkID) {
|
|
13
|
+
return {
|
|
14
|
+
type: pki_common_1.ChallengeType.Token,
|
|
15
|
+
userDataBase64: userData.toString('base64'),
|
|
16
|
+
token: this.token,
|
|
17
|
+
networkID,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.ChallengeProviderToken = ChallengeProviderToken;
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbGxlbmdlUHJvdmlkZXJUb2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jaGFsbGVuZ2VQcm92aWRlci9jaGFsbGVuZ2VQcm92aWRlclRva2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDJEQUEyRTtBQUUzRSxNQUFhLHNCQUFzQjtJQUVWO0lBQ0Q7SUFGcEIsWUFDcUIsS0FBYSxFQUNkLE1BQVk7UUFEWCxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2QsV0FBTSxHQUFOLE1BQU0sQ0FBTTtJQUM3QixDQUFDO0lBQ0osS0FBSyxDQUFDLGlCQUFpQixDQUNuQixRQUFnQixFQUNoQixTQUFrQjtRQUVsQixPQUFPO1lBQ0gsSUFBSSxFQUFFLDBCQUFhLENBQUMsS0FBSztZQUN6QixjQUFjLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDM0MsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLFNBQVM7U0FDWixDQUFDO0lBQ04sQ0FBQztDQUNKO0FBaEJELHdEQWdCQyJ9
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { ChallengeProvider } from './challengeProvider';
|
|
3
|
+
import { Challenge, Log } from '@super-protocol/pki-common';
|
|
4
|
+
export declare class ChallengeProviderUntrusted implements ChallengeProvider {
|
|
5
|
+
private readonly deviceId;
|
|
6
|
+
readonly logger?: Log | undefined;
|
|
7
|
+
constructor(deviceId: Buffer, logger?: Log | undefined);
|
|
8
|
+
generateChallenge(userData: Buffer, networkID?: string): Promise<Challenge>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ChallengeProviderUntrusted = void 0;
|
|
4
|
+
const pki_common_1 = require("@super-protocol/pki-common");
|
|
5
|
+
class ChallengeProviderUntrusted {
|
|
6
|
+
deviceId;
|
|
7
|
+
logger;
|
|
8
|
+
constructor(deviceId, logger) {
|
|
9
|
+
this.deviceId = deviceId;
|
|
10
|
+
this.logger = logger;
|
|
11
|
+
}
|
|
12
|
+
async generateChallenge(userData, networkID) {
|
|
13
|
+
return {
|
|
14
|
+
type: pki_common_1.ChallengeType.Untrusted,
|
|
15
|
+
userDataBase64: userData.toString('base64'),
|
|
16
|
+
idBase64: this.deviceId.toString('base64'),
|
|
17
|
+
networkID,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.ChallengeProviderUntrusted = ChallengeProviderUntrusted;
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbGxlbmdlUHJvdmlkZXJVbnRydXN0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhbGxlbmdlUHJvdmlkZXIvY2hhbGxlbmdlUHJvdmlkZXJVbnRydXN0ZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsMkRBQTJFO0FBRTNFLE1BQWEsMEJBQTBCO0lBRWQ7SUFDRDtJQUZwQixZQUNxQixRQUFnQixFQUNqQixNQUFZO1FBRFgsYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQUNqQixXQUFNLEdBQU4sTUFBTSxDQUFNO0lBQzdCLENBQUM7SUFFSixLQUFLLENBQUMsaUJBQWlCLENBQ25CLFFBQWdCLEVBQ2hCLFNBQWtCO1FBRWxCLE9BQU87WUFDSCxJQUFJLEVBQUUsMEJBQWEsQ0FBQyxTQUFTO1lBQzdCLGNBQWMsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUMzQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1lBQzFDLFNBQVM7U0FDWixDQUFDO0lBQ04sQ0FBQztDQUNKO0FBakJELGdFQWlCQyJ9
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './challengeProvider';
|
|
2
|
+
export * from './challengeProviderTdx';
|
|
3
|
+
export * from './challengeProviderAzure';
|
|
4
|
+
export * from './challengeProviderUntrusted';
|
|
5
|
+
export * from './challengeProviderSevSnp';
|
|
6
|
+
export * from './challengeNvidiaCCHelper';
|
|
7
|
+
export * from './challengeProviderCertificate';
|
|
8
|
+
export * from './challengeProviderToken';
|
|
@@ -0,0 +1,25 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./challengeProvider"), exports);
|
|
18
|
+
__exportStar(require("./challengeProviderTdx"), exports);
|
|
19
|
+
__exportStar(require("./challengeProviderAzure"), exports);
|
|
20
|
+
__exportStar(require("./challengeProviderUntrusted"), exports);
|
|
21
|
+
__exportStar(require("./challengeProviderSevSnp"), exports);
|
|
22
|
+
__exportStar(require("./challengeNvidiaCCHelper"), exports);
|
|
23
|
+
__exportStar(require("./challengeProviderCertificate"), exports);
|
|
24
|
+
__exportStar(require("./challengeProviderToken"), exports);
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhbGxlbmdlUHJvdmlkZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHNEQUFvQztBQUNwQyx5REFBdUM7QUFDdkMsMkRBQXlDO0FBQ3pDLCtEQUE2QztBQUM3Qyw0REFBMEM7QUFDMUMsNERBQTBDO0FBQzFDLGlFQUErQztBQUMvQywyREFBeUMifQ==
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { Challenge } from '@super-protocol/pki-common';
|
|
3
|
+
export interface SuccessChallengeResult {
|
|
4
|
+
success: true;
|
|
5
|
+
validatedUserData: Buffer;
|
|
6
|
+
validatedId: Buffer;
|
|
7
|
+
validatedCommonId?: Buffer;
|
|
8
|
+
validatedSolutionHash?: Buffer;
|
|
9
|
+
}
|
|
10
|
+
export interface UnsuccessfulChallengeResult {
|
|
11
|
+
success: false;
|
|
12
|
+
error: string;
|
|
13
|
+
}
|
|
14
|
+
export type ChallengeResult = SuccessChallengeResult | UnsuccessfulChallengeResult;
|
|
15
|
+
export interface ChallengeValidator {
|
|
16
|
+
validate(challenge: Challenge, publicKeyPem?: string): Promise<ChallengeResult>;
|
|
17
|
+
initialize?: () => Promise<void>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbGxlbmdlVmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NoYWxsZW5nZVZhbGlkYXRvci9jaGFsbGVuZ2VWYWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Challenge, Log, NetworkType } from '@super-protocol/pki-common';
|
|
2
|
+
import { ChallengeResult, ChallengeValidator } from './challengeValidator';
|
|
3
|
+
import { AzureValidationConfig } from './validatorConfig';
|
|
4
|
+
import { AttestationWasmAzure } from './wasmVerificationPolicy';
|
|
5
|
+
export interface ChallengeValidatorAzureOptions {
|
|
6
|
+
/**
|
|
7
|
+
* A debug VM offers no confidentiality, so it is accepted only when the
|
|
8
|
+
* network is explicitly untrusted.
|
|
9
|
+
*/
|
|
10
|
+
networkType?: NetworkType;
|
|
11
|
+
config?: AzureValidationConfig;
|
|
12
|
+
loadAttestationModule?: () => Promise<AttestationWasmAzure>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Validates Azure confidential VM evidence (Intel TDX and AMD SEV-SNP) with
|
|
16
|
+
* @super-protocol/attestation-wasm: the Intel / AMD signature of the hardware
|
|
17
|
+
* report, the Microsoft vTPM attestation key, the TPM quote and the event log.
|
|
18
|
+
* Microsoft Azure Attestation is always asked whether the paravisor is a
|
|
19
|
+
* genuine Azure one; evidence is rejected when MAA is unreachable.
|
|
20
|
+
*
|
|
21
|
+
* NOT verified on a live SEV-SNP guest yet.
|
|
22
|
+
*/
|
|
23
|
+
export declare class ChallengeValidatorAzure implements ChallengeValidator {
|
|
24
|
+
private readonly log;
|
|
25
|
+
private readonly options;
|
|
26
|
+
constructor(log: Log, options?: ChallengeValidatorAzureOptions);
|
|
27
|
+
validate(challenge: Challenge): Promise<ChallengeResult>;
|
|
28
|
+
private validateEvidence;
|
|
29
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ChallengeValidatorAzure = void 0;
|
|
4
|
+
const attestation_common_1 = require("@super-protocol/attestation-common");
|
|
5
|
+
const pki_common_1 = require("@super-protocol/pki-common");
|
|
6
|
+
const wasmVerificationPolicy_1 = require("./wasmVerificationPolicy");
|
|
7
|
+
const preservedDynamicImport = new Function('specifier', 'return import(specifier)');
|
|
8
|
+
const defaultLoadAttestationModule = () => preservedDynamicImport('@super-protocol/attestation-wasm/node');
|
|
9
|
+
const EXPECTED_EVIDENCE_TYPE = {
|
|
10
|
+
[pki_common_1.ChallengeType.TDXAZURE]: attestation_common_1.TeeEvidenceType.TEE_EVIDENCE_TYPE_INTEL_TDX_AZURE,
|
|
11
|
+
[pki_common_1.ChallengeType.SEVSNPAZURE]: attestation_common_1.TeeEvidenceType.TEE_EVIDENCE_TYPE_AMD_SEV_SNP_AZURE,
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Validates Azure confidential VM evidence (Intel TDX and AMD SEV-SNP) with
|
|
15
|
+
* @super-protocol/attestation-wasm: the Intel / AMD signature of the hardware
|
|
16
|
+
* report, the Microsoft vTPM attestation key, the TPM quote and the event log.
|
|
17
|
+
* Microsoft Azure Attestation is always asked whether the paravisor is a
|
|
18
|
+
* genuine Azure one; evidence is rejected when MAA is unreachable.
|
|
19
|
+
*
|
|
20
|
+
* NOT verified on a live SEV-SNP guest yet.
|
|
21
|
+
*/
|
|
22
|
+
class ChallengeValidatorAzure {
|
|
23
|
+
log;
|
|
24
|
+
options;
|
|
25
|
+
constructor(log, options = {}) {
|
|
26
|
+
this.log = log;
|
|
27
|
+
this.options = options;
|
|
28
|
+
}
|
|
29
|
+
async validate(challenge) {
|
|
30
|
+
switch (challenge.type) {
|
|
31
|
+
case pki_common_1.ChallengeType.TDXAZURE:
|
|
32
|
+
case pki_common_1.ChallengeType.SEVSNPAZURE:
|
|
33
|
+
try {
|
|
34
|
+
return await this.validateEvidence(challenge.type, Buffer.from(challenge.evidenceBase64, 'base64'));
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
return {
|
|
38
|
+
success: false,
|
|
39
|
+
error: e.message,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
throw new Error('Method not implemented.');
|
|
44
|
+
}
|
|
45
|
+
async validateEvidence(challengeType, evidence) {
|
|
46
|
+
const log = this.log.child({
|
|
47
|
+
validator: 'ChallengeValidatorAzure',
|
|
48
|
+
challengeType,
|
|
49
|
+
});
|
|
50
|
+
const attestation = await (this.options.loadAttestationModule ?? defaultLoadAttestationModule)();
|
|
51
|
+
const verification = await attestation.verifyTeeEvidence(evidence, (0, wasmVerificationPolicy_1.buildAzureVerifyOptions)(this.options.config));
|
|
52
|
+
if (verification.evidenceType !== EXPECTED_EVIDENCE_TYPE[challengeType]) {
|
|
53
|
+
throw new Error(`Evidence type ${verification.evidenceType} does not match challenge type ${challengeType}`);
|
|
54
|
+
}
|
|
55
|
+
const { mrEnclave, reportData } = (0, wasmVerificationPolicy_1.checkAzureVerificationResult)(verification, attestation, { networkType: this.options.networkType, log });
|
|
56
|
+
log.debug('Azure evidence verified', {
|
|
57
|
+
mrEnclaveHex: mrEnclave.toString('hex'),
|
|
58
|
+
});
|
|
59
|
+
return {
|
|
60
|
+
success: true,
|
|
61
|
+
validatedUserData: reportData,
|
|
62
|
+
validatedId: mrEnclave,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.ChallengeValidatorAzure = ChallengeValidatorAzure;
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbGxlbmdlVmFsaWRhdG9yQXp1cmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhbGxlbmdlVmFsaWRhdG9yL2NoYWxsZW5nZVZhbGlkYXRvckF6dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJFQUFxRTtBQUNyRSwyREFLb0M7QUFHcEMscUVBSWtDO0FBRWxDLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxRQUFRLENBQ3ZDLFdBQVcsRUFDWCwwQkFBMEIsQ0FDVyxDQUFDO0FBRTFDLE1BQU0sNEJBQTRCLEdBQUcsR0FBa0MsRUFBRSxDQUNyRSxzQkFBc0IsQ0FDbEIsdUNBQXVDLENBQzFDLENBQUM7QUFFTixNQUFNLHNCQUFzQixHQUFHO0lBQzNCLENBQUMsMEJBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxvQ0FBZSxDQUFDLGlDQUFpQztJQUMzRSxDQUFDLDBCQUFhLENBQUMsV0FBVyxDQUFDLEVBQ3ZCLG9DQUFlLENBQUMsbUNBQW1DO0NBQ2pELENBQUM7QUFZWDs7Ozs7Ozs7R0FRRztBQUNILE1BQWEsdUJBQXVCO0lBRVg7SUFDQTtJQUZyQixZQUNxQixHQUFRLEVBQ1IsVUFBMEMsRUFBRTtRQUQ1QyxRQUFHLEdBQUgsR0FBRyxDQUFLO1FBQ1IsWUFBTyxHQUFQLE9BQU8sQ0FBcUM7SUFDOUQsQ0FBQztJQUVKLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBb0I7UUFDL0IsUUFBUSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDckIsS0FBSywwQkFBYSxDQUFDLFFBQVEsQ0FBQztZQUM1QixLQUFLLDBCQUFhLENBQUMsV0FBVztnQkFDMUIsSUFBSSxDQUFDO29CQUNELE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQzlCLFNBQVMsQ0FBQyxJQUFJLEVBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUNsRCxDQUFDO2dCQUNOLENBQUM7Z0JBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztvQkFDZCxPQUFPO3dCQUNILE9BQU8sRUFBRSxLQUFLO3dCQUNkLEtBQUssRUFBRSxDQUFDLENBQUMsT0FBTztxQkFDbkIsQ0FBQztnQkFDTixDQUFDO1FBQ1QsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRU8sS0FBSyxDQUFDLGdCQUFnQixDQUMxQixhQUFpRSxFQUNqRSxRQUFnQjtRQUVoQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUN2QixTQUFTLEVBQUUseUJBQXlCO1lBQ3BDLGFBQWE7U0FDaEIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixJQUFJLDRCQUE0QixDQUNyRSxFQUFFLENBQUM7UUFFSixNQUFNLFlBQVksR0FBRyxNQUFNLFdBQVcsQ0FBQyxpQkFBaUIsQ0FDcEQsUUFBUSxFQUNSLElBQUEsZ0RBQXVCLEVBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FDL0MsQ0FBQztRQUVGLElBQ0ksWUFBWSxDQUFDLFlBQVksS0FBSyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsRUFDckUsQ0FBQztZQUNDLE1BQU0sSUFBSSxLQUFLLENBQ1gsaUJBQWlCLFlBQVksQ0FBQyxZQUFZLGtDQUFrQyxhQUFhLEVBQUUsQ0FDOUYsQ0FBQztRQUNOLENBQUM7UUFFRCxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUEscURBQTRCLEVBQzFELFlBQVksRUFDWixXQUFXLEVBQ1gsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQ2pELENBQUM7UUFDRixHQUFHLENBQUMsS0FBSyxDQUFDLHlCQUF5QixFQUFFO1lBQ2pDLFlBQVksRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztTQUMxQyxDQUFDLENBQUM7UUFFSCxPQUFPO1lBQ0gsT0FBTyxFQUFFLElBQUk7WUFDYixpQkFBaUIsRUFBRSxVQUFVO1lBQzdCLFdBQVcsRUFBRSxTQUFTO1NBQ3pCLENBQUM7SUFDTixDQUFDO0NBQ0o7QUFqRUQsMERBaUVDIn0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Challenge } from '@super-protocol/pki-common';
|
|
2
|
+
import { ChallengeResult, ChallengeValidator } from './challengeValidator';
|
|
3
|
+
import { Log } from '@super-protocol/pki-common';
|
|
4
|
+
export declare class ChallengeValidatorCertificate implements ChallengeValidator {
|
|
5
|
+
private readonly log;
|
|
6
|
+
constructor(log: Log);
|
|
7
|
+
validate(challenge: Challenge, publicKeyPem: string): Promise<ChallengeResult>;
|
|
8
|
+
private verifyUserData;
|
|
9
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ChallengeValidatorCertificate = void 0;
|
|
7
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
8
|
+
const pki_common_1 = require("@super-protocol/pki-common");
|
|
9
|
+
const sdk_js_1 = require("@super-protocol/sdk-js");
|
|
10
|
+
class ChallengeValidatorCertificate {
|
|
11
|
+
log;
|
|
12
|
+
constructor(log) {
|
|
13
|
+
this.log = log;
|
|
14
|
+
}
|
|
15
|
+
async validate(challenge, publicKeyPem) {
|
|
16
|
+
switch (challenge.type) {
|
|
17
|
+
case pki_common_1.ChallengeType.Certificate:
|
|
18
|
+
try {
|
|
19
|
+
await sdk_js_1.TeeCertificateService.validateTeeCertChainOrFail(challenge.orderCertificate + challenge.orderCABundle);
|
|
20
|
+
this.verifyUserData(publicKeyPem, challenge.userDataSignatureBase64, challenge.orderCertificate);
|
|
21
|
+
return {
|
|
22
|
+
success: true,
|
|
23
|
+
validatedUserData: (0, pki_common_1.getPublicKeyPemHash)(publicKeyPem),
|
|
24
|
+
validatedId: sdk_js_1.CertificatesHelper.getExtensionValue(challenge.orderCertificate, pki_common_1.OID_CUSTOM_EXTENSION_CHALLENGE_ID) ?? Buffer.alloc(0),
|
|
25
|
+
validatedCommonId: sdk_js_1.CertificatesHelper.getExtensionValue(challenge.orderCertificate, pki_common_1.OID_CUSTOM_EXTENSION_CHALLENGE_COMMON_ID),
|
|
26
|
+
validatedSolutionHash: sdk_js_1.CertificatesHelper.getExtensionValue(challenge.orderCertificate, sdk_js_1.constants.OID_CUSTOM_EXTENSION_USER_DATA),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
catch (e) {
|
|
30
|
+
return {
|
|
31
|
+
success: false,
|
|
32
|
+
error: e.message,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
throw new Error('Method not implemented.');
|
|
37
|
+
}
|
|
38
|
+
async verifyUserData(publicKeyPem, signatureBase64, certificatePem) {
|
|
39
|
+
const cert = await sdk_js_1.CertificateGenerator.checkAndParseCert(certificatePem);
|
|
40
|
+
const certPublicKeyPem = await sdk_js_1.CryptoKeysTransformer.cryptoKeyToSpkiPem(cert.publicKey);
|
|
41
|
+
const certPublicKeyKeyObj = crypto_1.default.createPublicKey(certPublicKeyPem);
|
|
42
|
+
const publicKeyHash = (0, pki_common_1.getPublicKeyPemHash)(publicKeyPem);
|
|
43
|
+
const isValid = await sdk_js_1.Crypto.verify({
|
|
44
|
+
data: publicKeyHash,
|
|
45
|
+
signature: signatureBase64,
|
|
46
|
+
publicKey: certPublicKeyKeyObj,
|
|
47
|
+
signatureFormat: 'base64',
|
|
48
|
+
});
|
|
49
|
+
if (!isValid) {
|
|
50
|
+
throw Error('Signature verification failed');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.ChallengeValidatorCertificate = ChallengeValidatorCertificate;
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbGxlbmdlVmFsaWRhdG9yQ2VydGlmaWNhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhbGxlbmdlVmFsaWRhdG9yL2NoYWxsZW5nZVZhbGlkYXRvckNlcnRpZmljYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QiwyREFNb0M7QUFFcEMsbURBT2dDO0FBR2hDLE1BQWEsNkJBQTZCO0lBQ1Q7SUFBN0IsWUFBNkIsR0FBUTtRQUFSLFFBQUcsR0FBSCxHQUFHLENBQUs7SUFBRyxDQUFDO0lBRXpDLEtBQUssQ0FBQyxRQUFRLENBQ1YsU0FBb0IsRUFDcEIsWUFBb0I7UUFFcEIsUUFBUSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDckIsS0FBSywwQkFBYSxDQUFDLFdBQVc7Z0JBQzFCLElBQUksQ0FBQztvQkFDRCxNQUFNLDhCQUFxQixDQUFDLDBCQUEwQixDQUNsRCxTQUFTLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FDdkQsQ0FBQztvQkFDRixJQUFJLENBQUMsY0FBYyxDQUNmLFlBQVksRUFDWixTQUFTLENBQUMsdUJBQXVCLEVBQ2pDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FDN0IsQ0FBQztvQkFDRixPQUFPO3dCQUNILE9BQU8sRUFBRSxJQUFJO3dCQUNiLGlCQUFpQixFQUFFLElBQUEsZ0NBQW1CLEVBQUMsWUFBWSxDQUFDO3dCQUNwRCxXQUFXLEVBQ1AsMkJBQWtCLENBQUMsaUJBQWlCLENBQ2hDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFDMUIsOENBQWlDLENBQ3BDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3hCLGlCQUFpQixFQUFFLDJCQUFrQixDQUFDLGlCQUFpQixDQUNuRCxTQUFTLENBQUMsZ0JBQWdCLEVBQzFCLHFEQUF3QyxDQUMzQzt3QkFDRCxxQkFBcUIsRUFDakIsMkJBQWtCLENBQUMsaUJBQWlCLENBQ2hDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFDMUIsa0JBQVMsQ0FBQyw4QkFBOEIsQ0FDM0M7cUJBQ1IsQ0FBQztnQkFDTixDQUFDO2dCQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7b0JBQ2QsT0FBTzt3QkFDSCxPQUFPLEVBQUUsS0FBSzt3QkFDZCxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU87cUJBQ25CLENBQUM7Z0JBQ04sQ0FBQztRQUNULENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVPLEtBQUssQ0FBQyxjQUFjLENBQ3hCLFlBQW9CLEVBQ3BCLGVBQXVCLEVBQ3ZCLGNBQXNCO1FBRXRCLE1BQU0sSUFBSSxHQUNOLE1BQU0sNkJBQW9CLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDakUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLDhCQUFxQixDQUFDLGtCQUFrQixDQUNuRSxJQUFJLENBQUMsU0FBUyxDQUNqQixDQUFDO1FBQ0YsTUFBTSxtQkFBbUIsR0FBRyxnQkFBTSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRXJFLE1BQU0sYUFBYSxHQUFHLElBQUEsZ0NBQW1CLEVBQUMsWUFBWSxDQUFDLENBQUM7UUFFeEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxlQUFNLENBQUMsTUFBTSxDQUFDO1lBQ2hDLElBQUksRUFBRSxhQUFhO1lBQ25CLFNBQVMsRUFBRSxlQUFlO1lBQzFCLFNBQVMsRUFBRSxtQkFBbUI7WUFDOUIsZUFBZSxFQUFFLFFBQVE7U0FDNUIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ1gsTUFBTSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0wsQ0FBQztDQUNKO0FBdEVELHNFQXNFQyJ9
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { NvtrustWrapperConfig } from './validatorConfig';
|
|
3
|
+
import { Challenge, NetworkType, NvidiaVerification } from '@super-protocol/pki-common';
|
|
4
|
+
import { Log } from '@super-protocol/pki-common';
|
|
5
|
+
export declare class ChallengeValidatorNvidia {
|
|
6
|
+
private readonly log;
|
|
7
|
+
private readonly config?;
|
|
8
|
+
constructor(log: Log, config?: NvtrustWrapperConfig | undefined);
|
|
9
|
+
validate(challenge: Challenge, userData: Buffer, networkType?: NetworkType): Promise<NvidiaVerification | undefined>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ChallengeValidatorNvidia = void 0;
|
|
4
|
+
const sp_nvtrust_wrapper_1 = require("@super-protocol/sp-nvtrust-wrapper");
|
|
5
|
+
const pki_common_1 = require("@super-protocol/pki-common");
|
|
6
|
+
const challengeProvider_1 = require("../challengeProvider");
|
|
7
|
+
class ChallengeValidatorNvidia {
|
|
8
|
+
log;
|
|
9
|
+
config;
|
|
10
|
+
constructor(log, config) {
|
|
11
|
+
this.log = log;
|
|
12
|
+
this.config = config;
|
|
13
|
+
}
|
|
14
|
+
async validate(challenge, userData, networkType) {
|
|
15
|
+
const log = this.log.child({
|
|
16
|
+
validator: 'ChallengeValidatorNvidia',
|
|
17
|
+
});
|
|
18
|
+
const hasNvidiaToken = (0, pki_common_1.hasChallengeNvidiaToken)(challenge);
|
|
19
|
+
const hasNvidiaEvidence = (0, pki_common_1.hasChallengeNvidiaEvidence)(challenge);
|
|
20
|
+
const verifier = this.config?.verifier ?? 'remote';
|
|
21
|
+
if (hasNvidiaToken && hasNvidiaEvidence) {
|
|
22
|
+
throw new Error('NVIDIA challenge cannot contain both a token and evidence');
|
|
23
|
+
}
|
|
24
|
+
challengeProvider_1.ChallengeNvidiaCCHelper.assertLocalVerifierAllowsChallenge(verifier, challenge.type);
|
|
25
|
+
log.debug(`Challenge NVIDIA token present: ${hasNvidiaToken}, evidence present: ${hasNvidiaEvidence}, verifier: ${verifier}`);
|
|
26
|
+
if (!hasNvidiaToken && !hasNvidiaEvidence) {
|
|
27
|
+
log.debug('NVIDIA validation skipped: challenge does not contain NVIDIA token or evidence');
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (verifier === 'local' && !hasNvidiaEvidence) {
|
|
31
|
+
throw new Error('NVIDIA local verifier requires evidence and rejects an NRAS token');
|
|
32
|
+
}
|
|
33
|
+
if (verifier === 'remote' && !hasNvidiaToken) {
|
|
34
|
+
throw new Error('NVIDIA remote verifier requires an NRAS token and rejects evidence');
|
|
35
|
+
}
|
|
36
|
+
log.debug(`NVIDIA validation started for networkType=${networkType ?? 'undefined'}`);
|
|
37
|
+
const tokenHash = (0, pki_common_1.hasChallengeNvidiaEvidence)(challenge)
|
|
38
|
+
? challengeProvider_1.ChallengeNvidiaCCHelper.getEvidenceHash(challenge.nvidiaEvidence)
|
|
39
|
+
: (0, pki_common_1.hasChallengeNvidiaToken)(challenge)
|
|
40
|
+
? challengeProvider_1.ChallengeNvidiaCCHelper.getTokenHash(challenge.nvidiaTokens)
|
|
41
|
+
: undefined;
|
|
42
|
+
if (!tokenHash) {
|
|
43
|
+
throw new Error('NVIDIA challenge payload is missing');
|
|
44
|
+
}
|
|
45
|
+
if (userData.length < 64) {
|
|
46
|
+
throw new Error('userData must be at least 64 bytes');
|
|
47
|
+
}
|
|
48
|
+
const expectedHash = userData.slice(32, 64);
|
|
49
|
+
const tokenHashHex = tokenHash.toString('hex');
|
|
50
|
+
const expectedHashHex = expectedHash.toString('hex');
|
|
51
|
+
log.debug(`NVIDIA tokenHash: ${tokenHashHex}, expectedHash: ${expectedHashHex}`);
|
|
52
|
+
if (tokenHashHex !== expectedHashHex) {
|
|
53
|
+
throw new Error('Nvidia hash included in the challenge does not match the hash of the nvidia token specified in the request');
|
|
54
|
+
}
|
|
55
|
+
log.info('NVIDIA validation passed: token hash matches attested userData hash');
|
|
56
|
+
const nvtrusWrapper = new sp_nvtrust_wrapper_1.NvtrustWrapper(this.config?.tmp ?? '/tmp/nvtrust-tmp', this.config?.timeout ?? 60000);
|
|
57
|
+
const localVerifier = nvtrusWrapper;
|
|
58
|
+
let nvidiaTokenValidationResult = {
|
|
59
|
+
success: false,
|
|
60
|
+
};
|
|
61
|
+
try {
|
|
62
|
+
let gpuToken;
|
|
63
|
+
let nvswitchToken;
|
|
64
|
+
let gpuInterconnectStatus;
|
|
65
|
+
const attestationMode = verifier === 'local' ? 2 : 1;
|
|
66
|
+
if ((0, pki_common_1.hasChallengeNvidiaEvidence)(challenge)) {
|
|
67
|
+
const evidence = challenge.nvidiaEvidence;
|
|
68
|
+
gpuInterconnectStatus = evidence.gpuInterconnectStatus;
|
|
69
|
+
const attested = await localVerifier.attestEvidence({
|
|
70
|
+
device: sp_nvtrust_wrapper_1.NvidiaDeviceType.GPU,
|
|
71
|
+
nonce: evidence.nonce,
|
|
72
|
+
evidenceJson: evidence.gpuEvidence,
|
|
73
|
+
rimUrl: this.config?.rimUrl ?? '',
|
|
74
|
+
ocspUrl: this.config?.ocspUrl ?? '',
|
|
75
|
+
policy: sp_nvtrust_wrapper_1.defaultGPUpolicy,
|
|
76
|
+
ppcieMode: false,
|
|
77
|
+
});
|
|
78
|
+
gpuToken = attested.jwt;
|
|
79
|
+
if (gpuInterconnectStatus ===
|
|
80
|
+
sp_nvtrust_wrapper_1.NvidiaGpuInterconnectStatus.NVIDIA_GPU_INTERCONNECT_NVLINK_SWITCH_ATTESTATION_VERIFIED) {
|
|
81
|
+
if (!evidence.nvswitchEvidence) {
|
|
82
|
+
throw new Error('Verified NVIDIA NVLink switch interconnect requires switch evidence');
|
|
83
|
+
}
|
|
84
|
+
const switchAttested = await localVerifier.attestEvidence({
|
|
85
|
+
device: sp_nvtrust_wrapper_1.NvidiaDeviceType.SWITCH,
|
|
86
|
+
nonce: evidence.nonce,
|
|
87
|
+
evidenceJson: evidence.nvswitchEvidence,
|
|
88
|
+
rimUrl: this.config?.rimUrl ?? '',
|
|
89
|
+
ocspUrl: this.config?.ocspUrl ?? '',
|
|
90
|
+
policy: sp_nvtrust_wrapper_1.defaultNVSwitchPolicy,
|
|
91
|
+
ppcieMode: false,
|
|
92
|
+
});
|
|
93
|
+
nvswitchToken = switchAttested.jwt;
|
|
94
|
+
}
|
|
95
|
+
nvidiaTokenValidationResult = { success: true };
|
|
96
|
+
log.info('NVIDIA validation passed: local verifier accepted the evidence');
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
if (!(0, pki_common_1.hasChallengeNvidiaToken)(challenge)) {
|
|
100
|
+
throw new Error('NVIDIA remote verifier requires an NRAS token');
|
|
101
|
+
}
|
|
102
|
+
gpuToken = challenge.nvidiaTokens.gpuToken;
|
|
103
|
+
nvswitchToken = challenge.nvidiaTokens.nvswitchToken;
|
|
104
|
+
gpuInterconnectStatus =
|
|
105
|
+
challenge.nvidiaTokens.gpuInterconnectStatus;
|
|
106
|
+
nvidiaTokenValidationResult = await nvtrusWrapper.validateToken({
|
|
107
|
+
device: sp_nvtrust_wrapper_1.NvidiaDeviceType.GPU,
|
|
108
|
+
policy: sp_nvtrust_wrapper_1.defaultGPUpolicy,
|
|
109
|
+
token: { jwt: gpuToken },
|
|
110
|
+
});
|
|
111
|
+
if (nvidiaTokenValidationResult.success !== true) {
|
|
112
|
+
throw new Error('Failed to verify Nvidia GPU token: validateToken returned success=false');
|
|
113
|
+
}
|
|
114
|
+
log.info('NVIDIA validation passed: nvtrust token verification succeeded');
|
|
115
|
+
}
|
|
116
|
+
const gpusInfo = sp_nvtrust_wrapper_1.NvtrustWrapper.extractGPUInfoFromToken({
|
|
117
|
+
jwt: gpuToken,
|
|
118
|
+
});
|
|
119
|
+
const gpuCount = gpusInfo.gpus.length;
|
|
120
|
+
if (gpuCount === 0) {
|
|
121
|
+
throw new Error('Validated NVIDIA GPU token does not contain any GPU claims');
|
|
122
|
+
}
|
|
123
|
+
const hasGpuInterconnectStatus = gpuInterconnectStatus !== undefined;
|
|
124
|
+
const hasNVSwitchToken = nvswitchToken !== undefined;
|
|
125
|
+
if (gpuCount === 1) {
|
|
126
|
+
if (hasGpuInterconnectStatus || hasNVSwitchToken) {
|
|
127
|
+
throw new Error('NVIDIA GPU interconnect status and NVSwitch token must be omitted for a single GPU');
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
else if (!hasGpuInterconnectStatus) {
|
|
131
|
+
throw new Error('NVIDIA GPU interconnect status is required when the validated GPU token contains multiple GPUs');
|
|
132
|
+
}
|
|
133
|
+
if (gpuInterconnectStatus !==
|
|
134
|
+
sp_nvtrust_wrapper_1.NvidiaGpuInterconnectStatus.NVIDIA_GPU_INTERCONNECT_NVLINK_SWITCH_ATTESTATION_VERIFIED &&
|
|
135
|
+
hasNVSwitchToken) {
|
|
136
|
+
throw new Error('NVIDIA NVSwitch token is only allowed for a verified NVLink switch interconnect');
|
|
137
|
+
}
|
|
138
|
+
switch (gpuInterconnectStatus) {
|
|
139
|
+
case undefined:
|
|
140
|
+
break;
|
|
141
|
+
case sp_nvtrust_wrapper_1.NvidiaGpuInterconnectStatus.NVIDIA_GPU_INTERCONNECT_DISCONNECTED:
|
|
142
|
+
log.info('Multiple disconnected NVIDIA GPUs were reported by TEE-bound interconnect metadata');
|
|
143
|
+
break;
|
|
144
|
+
case sp_nvtrust_wrapper_1.NvidiaGpuInterconnectStatus.NVIDIA_GPU_INTERCONNECT_DIRECT_UNVERIFIED:
|
|
145
|
+
if (networkType !== 'untrusted') {
|
|
146
|
+
throw new Error('Unverified direct NVIDIA GPU interconnect is only allowed on an untrusted network');
|
|
147
|
+
}
|
|
148
|
+
log.warn('Allowing unverified direct NVIDIA GPU interconnect on an untrusted network');
|
|
149
|
+
break;
|
|
150
|
+
case sp_nvtrust_wrapper_1.NvidiaGpuInterconnectStatus.NVIDIA_GPU_INTERCONNECT_NVLINK_SWITCH_ATTESTATION_NOT_APPLICABLE:
|
|
151
|
+
// TODO(NVIDIA NVLink attestation): Revisit this branch if NVIDIA
|
|
152
|
+
// introduces or requires separate NVLink/NVSwitch attestation for
|
|
153
|
+
// Blackwell. NOT_APPLICABLE currently has no switch token and relies
|
|
154
|
+
// on the validated GPU token plus TEE-bound interconnect metadata.
|
|
155
|
+
log.info('Separate NVIDIA NVSwitch attestation is not applicable to this NVLink topology');
|
|
156
|
+
break;
|
|
157
|
+
case sp_nvtrust_wrapper_1.NvidiaGpuInterconnectStatus.NVIDIA_GPU_INTERCONNECT_NVLINK_SWITCH_ATTESTATION_VERIFIED:
|
|
158
|
+
if (!nvswitchToken) {
|
|
159
|
+
throw new Error('Verified NVIDIA NVLink switch interconnect requires a non-empty NVSwitch token');
|
|
160
|
+
}
|
|
161
|
+
break;
|
|
162
|
+
default:
|
|
163
|
+
throw new Error(`Unknown NVIDIA GPU interconnect status: ${gpuInterconnectStatus}`);
|
|
164
|
+
}
|
|
165
|
+
if (gpuInterconnectStatus ===
|
|
166
|
+
sp_nvtrust_wrapper_1.NvidiaGpuInterconnectStatus.NVIDIA_GPU_INTERCONNECT_NVLINK_SWITCH_ATTESTATION_VERIFIED) {
|
|
167
|
+
if (verifier !== 'local') {
|
|
168
|
+
nvidiaTokenValidationResult =
|
|
169
|
+
await nvtrusWrapper.validateToken({
|
|
170
|
+
device: sp_nvtrust_wrapper_1.NvidiaDeviceType.SWITCH,
|
|
171
|
+
policy: sp_nvtrust_wrapper_1.defaultNVSwitchPolicy,
|
|
172
|
+
token: { jwt: nvswitchToken },
|
|
173
|
+
});
|
|
174
|
+
if (nvidiaTokenValidationResult.success !== true) {
|
|
175
|
+
throw new Error('Failed to verify Nvidia NVSwitch token: validateToken returned success=false');
|
|
176
|
+
}
|
|
177
|
+
log.info('NVIDIA NVSwitch validation passed: nvtrust token verification succeeded');
|
|
178
|
+
}
|
|
179
|
+
const switchesInfo = sp_nvtrust_wrapper_1.NvtrustWrapper.extractNVSwitchInfoFromToken({
|
|
180
|
+
jwt: nvswitchToken,
|
|
181
|
+
});
|
|
182
|
+
if (switchesInfo.length === 0) {
|
|
183
|
+
throw new Error('Validated NVIDIA NVSwitch token does not contain any switch claims');
|
|
184
|
+
}
|
|
185
|
+
if (networkType === 'trusted') {
|
|
186
|
+
const insecureSwitchNumbers = switchesInfo
|
|
187
|
+
.map((nvSwitch, index) => ({
|
|
188
|
+
nvSwitch,
|
|
189
|
+
switchNumber: index + 1,
|
|
190
|
+
}))
|
|
191
|
+
.filter(({ nvSwitch }) => !nvSwitch.secureBoot || nvSwitch.debugEnabled)
|
|
192
|
+
.map(({ switchNumber }) => switchNumber);
|
|
193
|
+
if (insecureSwitchNumbers.length > 0) {
|
|
194
|
+
throw new Error(`Trusted network requires secure boot and disabled debug mode on every NVIDIA NVSwitch. Invalid switch(es): ${insecureSwitchNumbers.join(', ')}`);
|
|
195
|
+
}
|
|
196
|
+
log.info(`NVIDIA trusted policy check passed: secure boot is enabled and debug mode is disabled on all ${switchesInfo.length} NVSwitch(es)`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
if (networkType === 'trusted') {
|
|
200
|
+
const debugGpuNumbers = gpusInfo.gpus
|
|
201
|
+
.map((gpu, index) => ({ gpu, gpuNumber: index + 1 }))
|
|
202
|
+
.filter(({ gpu }) => gpu.dbgStat === true)
|
|
203
|
+
.map(({ gpuNumber }) => gpuNumber);
|
|
204
|
+
const hasDebugEnabledGpu = debugGpuNumbers.length > 0;
|
|
205
|
+
if (hasDebugEnabledGpu) {
|
|
206
|
+
const debugGpuNumbersText = debugGpuNumbers.join(', ');
|
|
207
|
+
throw new Error(`Trusted network does not allow NVIDIA GPUs with dbgStat=true. Debug enabled on GPU(s): ${debugGpuNumbersText}`);
|
|
208
|
+
}
|
|
209
|
+
log.info(`NVIDIA trusted policy check passed: dbgStat=false on all ${gpusInfo.gpus.length} GPU(s)`);
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
log.info(`NVIDIA trusted-only GPU debug policy check skipped for networkType=${networkType ?? 'undefined'}`);
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
gpuToken,
|
|
216
|
+
...(nvswitchToken !== undefined ? { nvswitchToken } : {}),
|
|
217
|
+
...(gpuInterconnectStatus !== undefined
|
|
218
|
+
? { gpuInterconnectStatus }
|
|
219
|
+
: {}),
|
|
220
|
+
attestationMode,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
if (error instanceof sp_nvtrust_wrapper_1.NvtrustWrapperCallError) {
|
|
225
|
+
log.error(`NvtrustWrapperCallError: ${error.message}`);
|
|
226
|
+
if (error.traceback?.trim()) {
|
|
227
|
+
log.debug(`Traceback:\n${error.traceback}`);
|
|
228
|
+
}
|
|
229
|
+
const logEntries = Object.entries(error.logs ?? {});
|
|
230
|
+
if (logEntries.length > 0) {
|
|
231
|
+
log.debug('Logs from nvtrust wrapper:');
|
|
232
|
+
for (const [fileName, logContent] of logEntries) {
|
|
233
|
+
log.debug(`--- ${fileName} ---`);
|
|
234
|
+
log.debug(String(logContent));
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
log.error(`Error during NVIDIA token validation: ${error}`);
|
|
240
|
+
}
|
|
241
|
+
throw error;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
exports.ChallengeValidatorNvidia = ChallengeValidatorNvidia;
|
|
246
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbGxlbmdlVmFsaWRhdG9yTnZpZGlhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NoYWxsZW5nZVZhbGlkYXRvci9jaGFsbGVuZ2VWYWxpZGF0b3JOdmlkaWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkVBUTRDO0FBRTVDLDJEQU1vQztBQUNwQyw0REFBK0Q7QUFHL0QsTUFBYSx3QkFBd0I7SUFFWjtJQUNBO0lBRnJCLFlBQ3FCLEdBQVEsRUFDUixNQUE2QjtRQUQ3QixRQUFHLEdBQUgsR0FBRyxDQUFLO1FBQ1IsV0FBTSxHQUFOLE1BQU0sQ0FBdUI7SUFDL0MsQ0FBQztJQUVKLEtBQUssQ0FBQyxRQUFRLENBQ1YsU0FBb0IsRUFDcEIsUUFBZ0IsRUFDaEIsV0FBeUI7UUFFekIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDdkIsU0FBUyxFQUFFLDBCQUEwQjtTQUN4QyxDQUFDLENBQUM7UUFDSCxNQUFNLGNBQWMsR0FBRyxJQUFBLG9DQUF1QixFQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFELE1BQU0saUJBQWlCLEdBQUcsSUFBQSx1Q0FBMEIsRUFBQyxTQUFTLENBQUMsQ0FBQztRQUNoRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsSUFBSSxRQUFRLENBQUM7UUFFbkQsSUFBSSxjQUFjLElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksS0FBSyxDQUNYLDJEQUEyRCxDQUM5RCxDQUFDO1FBQ04sQ0FBQztRQUNELDJDQUF1QixDQUFDLGtDQUFrQyxDQUN0RCxRQUFRLEVBQ1IsU0FBUyxDQUFDLElBQUksQ0FDakIsQ0FBQztRQUVGLEdBQUcsQ0FBQyxLQUFLLENBQ0wsbUNBQW1DLGNBQWMsdUJBQXVCLGlCQUFpQixlQUFlLFFBQVEsRUFBRSxDQUNySCxDQUFDO1FBQ0YsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLGlC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
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Challenge, Log } from '@super-protocol/pki-common';
|
|
2
|
+
import { ChallengeResult, ChallengeValidator } from './challengeValidator';
|
|
3
|
+
import { SevValidationConfig } from './validatorConfig';
|
|
4
|
+
export declare class ChallengeValidatorSevSnp implements ChallengeValidator {
|
|
5
|
+
private readonly log;
|
|
6
|
+
private measureInstance;
|
|
7
|
+
private readonly sevTmp;
|
|
8
|
+
private static instance;
|
|
9
|
+
private readonly securityPolicy;
|
|
10
|
+
static getInstance(log: Log, config?: SevValidationConfig): ChallengeValidatorSevSnp;
|
|
11
|
+
private constructor();
|
|
12
|
+
validate(challenge: Challenge): Promise<ChallengeResult>;
|
|
13
|
+
}
|