@super-protocol/pki-attestation-engine 5.0.6 → 5.1.0-beta1
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 +1 -1
- package/dist/attestationType.js +5 -1
- package/dist/azure/detectAzureTdx.d.ts +3 -0
- package/dist/azure/detectAzureTdx.js +73 -0
- package/dist/azure/tdxAzureEvidence.d.ts +14 -0
- package/dist/azure/tdxAzureEvidence.js +135 -0
- package/dist/certificateGenerator.js +38 -4
- package/dist/challengeProvider/challengeNvidiaCCHelper.d.ts +8 -9
- package/dist/challengeProvider/challengeNvidiaCCHelper.js +39 -25
- package/dist/challengeProvider/challengeProviderTdxAzure.d.ts +8 -0
- package/dist/challengeProvider/challengeProviderTdxAzure.js +54 -0
- package/dist/challengeProvider/index.d.ts +1 -0
- package/dist/challengeProvider/index.js +2 -1
- package/dist/challengeValidator/challengeValidatorNvidia.js +72 -6
- package/dist/challengeValidator/challengeValidatorTdxAzure.d.ts +7 -0
- package/dist/challengeValidator/challengeValidatorTdxAzure.js +37 -0
- package/dist/challengeValidator/index.d.ts +1 -0
- package/dist/challengeValidator/index.js +4 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -1
- package/package.json +3 -3
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { ChallengeType } from '@super-protocol/pki-common';
|
|
2
|
-
export type DetectAttestationType = ChallengeType.TDX | ChallengeType.TDXGOOGLE | ChallengeType.SEVSNP | ChallengeType.Untrusted;
|
|
2
|
+
export type DetectAttestationType = ChallengeType.TDX | ChallengeType.TDXGOOGLE | ChallengeType.TDXAZURE | ChallengeType.SEVSNP | ChallengeType.Untrusted;
|
|
3
3
|
export declare const isGoogleCloudVm: () => Promise<boolean>;
|
|
4
4
|
export declare const detectAttestationType: () => Promise<DetectAttestationType>;
|
package/dist/attestationType.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.detectAttestationType = exports.isGoogleCloudVm = void 0;
|
|
4
4
|
const pki_common_1 = require("@super-protocol/pki-common");
|
|
5
5
|
const fs_1 = require("fs");
|
|
6
|
+
const detectAzureTdx_1 = require("./azure/detectAzureTdx");
|
|
6
7
|
const GCP_METADATA_URL = 'http://169.254.169.254/computeMetadata/v1/instance/id';
|
|
7
8
|
const GCP_METADATA_TIMEOUT_MS = 500;
|
|
8
9
|
const isGoogleCloudVm = async () => {
|
|
@@ -26,6 +27,9 @@ const isGoogleCloudVm = async () => {
|
|
|
26
27
|
exports.isGoogleCloudVm = isGoogleCloudVm;
|
|
27
28
|
const detectAttestationType = async () => {
|
|
28
29
|
try {
|
|
30
|
+
if (await (0, detectAzureTdx_1.isAzureTdxVm)()) {
|
|
31
|
+
return pki_common_1.ChallengeType.TDXAZURE;
|
|
32
|
+
}
|
|
29
33
|
const tdxPath = '/dev/tdx_guest';
|
|
30
34
|
const sevPath = '/dev/sev-guest';
|
|
31
35
|
if ((0, fs_1.existsSync)(tdxPath)) {
|
|
@@ -51,4 +55,4 @@ const detectAttestationType = async () => {
|
|
|
51
55
|
return pki_common_1.ChallengeType.Untrusted;
|
|
52
56
|
};
|
|
53
57
|
exports.detectAttestationType = detectAttestationType;
|
|
54
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0YXRpb25UeXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2F0dGVzdGF0aW9uVHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyREFBMkQ7QUFDM0QsMkJBQTBDO0FBRTFDLDJEQUFzRDtBQVN0RCxNQUFNLGdCQUFnQixHQUNsQix1REFBdUQsQ0FBQztBQUM1RCxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQUU3QixNQUFNLGVBQWUsR0FBRyxLQUFLLElBQXNCLEVBQUU7SUFDeEQsSUFBSSxDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsZ0JBQWdCLEVBQUU7WUFDM0MsT0FBTyxFQUFFO2dCQUNMLGlCQUFpQixFQUFFLFFBQVE7YUFDOUI7WUFDRCxNQUFNLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQztTQUN2RCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2YsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pDLE9BQU8sVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNMLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7QUFDTCxDQUFDLENBQUM7QUFsQlcsUUFBQSxlQUFlLG1CQWtCMUI7QUFFSyxNQUFNLHFCQUFxQixHQUM5QixLQUFLLElBQW9DLEVBQUU7SUFDdkMsSUFBSSxDQUFDO1FBQ0QsSUFBSSxNQUFNLElBQUEsNkJBQVksR0FBRSxFQUFFLENBQUM7WUFDdkIsT0FBTywwQkFBYSxDQUFDLFFBQVEsQ0FBQztRQUNsQyxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsZ0JBQWdCLENBQUM7UUFDakMsTUFBTSxPQUFPLEdBQUcsZ0JBQWdCLENBQUM7UUFFakMsSUFBSSxJQUFBLGVBQVUsRUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sS0FBSyxHQUFHLElBQUEsYUFBUSxFQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hDLElBQUksS0FBSyxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQztnQkFDNUIsT0FBTyxDQUFDLE1BQU0sSUFBQSx1QkFBZSxHQUFFLENBQUM7b0JBQzVCLENBQUMsQ0FBQywwQkFBYSxDQUFDLFNBQVM7b0JBQ3pCLENBQUMsQ0FBQywwQkFBYSxDQUFDLEdBQUcsQ0FBQztZQUM1QixDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksSUFBQSxlQUFVLEVBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN0QixNQUFNLEtBQUssR0FBRyxJQUFBLGFBQVEsRUFBQyxPQUFPLENBQUMsQ0FBQztZQUNoQyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sQ0FBQyxNQUFNLElBQUEsdUJBQWUsR0FBRSxDQUFDO29CQUM1QixDQUFDLENBQUMsMEJBQWEsQ0FBQyxTQUFTO29CQUN6QixDQUFDLENBQUMsMEJBQWEsQ0FBQyxNQUFNLENBQUM7WUFDL0IsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ0wsb0RBQW9EO0lBQ3hELENBQUM7SUFFRCxPQUFPLDBCQUFhLENBQUMsU0FBUyxDQUFDO0FBQ25DLENBQUMsQ0FBQztBQWhDTyxRQUFBLHFCQUFxQix5QkFnQzVCIn0=
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isAzureTdxVm = exports.isAzureConfidentialVm = exports.isTdxGuest = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const AZURE_IMDS_COMPUTE_URL = 'http://169.254.169.254/metadata/instance/compute?api-version=2023-07-01';
|
|
6
|
+
const IMDS_TIMEOUT_MS = 500;
|
|
7
|
+
const SEV_DEVICE_PATH = '/dev/sev-guest';
|
|
8
|
+
const cpuinfoFlagTokens = () => {
|
|
9
|
+
try {
|
|
10
|
+
const text = (0, fs_1.readFileSync)('/proc/cpuinfo', 'utf8');
|
|
11
|
+
const tokens = new Set();
|
|
12
|
+
for (const line of text.split('\n')) {
|
|
13
|
+
const [key, value] = line.split(':');
|
|
14
|
+
if (key?.trim() === 'flags' || key?.trim() === 'Features') {
|
|
15
|
+
for (const token of (value ?? '').split(/\s+/)) {
|
|
16
|
+
if (token) {
|
|
17
|
+
tokens.add(token);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return tokens;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return new Set();
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
const isTdxGuest = () => {
|
|
29
|
+
try {
|
|
30
|
+
if ((0, fs_1.existsSync)(SEV_DEVICE_PATH) &&
|
|
31
|
+
(0, fs_1.statSync)(SEV_DEVICE_PATH).isCharacterDevice()) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// ignore
|
|
37
|
+
}
|
|
38
|
+
if (cpuinfoFlagTokens().has('tdx_guest')) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
if ((0, fs_1.existsSync)('/sys/module/tdx_guest')) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
return (0, fs_1.readFileSync)('/proc/cpuinfo', 'utf8').includes('Intel TDX');
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
exports.isTdxGuest = isTdxGuest;
|
|
52
|
+
const isAzureConfidentialVm = async () => {
|
|
53
|
+
try {
|
|
54
|
+
const response = await fetch(AZURE_IMDS_COMPUTE_URL, {
|
|
55
|
+
headers: { Metadata: 'true' },
|
|
56
|
+
signal: AbortSignal.timeout(IMDS_TIMEOUT_MS),
|
|
57
|
+
});
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
const compute = (await response.json());
|
|
62
|
+
return (String(compute?.securityProfile?.securityType ?? '')
|
|
63
|
+
.trim()
|
|
64
|
+
.toLowerCase() === 'confidentialvm');
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
exports.isAzureConfidentialVm = isAzureConfidentialVm;
|
|
71
|
+
const isAzureTdxVm = async () => (await (0, exports.isAzureConfidentialVm)()) && (0, exports.isTdxGuest)();
|
|
72
|
+
exports.isAzureTdxVm = isAzureTdxVm;
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0ZWN0QXp1cmVUZHguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXp1cmUvZGV0ZWN0QXp1cmVUZHgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkJBQXdEO0FBRXhELE1BQU0sc0JBQXNCLEdBQ3hCLHlFQUF5RSxDQUFDO0FBQzlFLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQztBQUM1QixNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQztBQUV6QyxNQUFNLGlCQUFpQixHQUFHLEdBQWdCLEVBQUU7SUFDeEMsSUFBSSxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBQSxpQkFBWSxFQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuRCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ2pDLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQyxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxPQUFPLElBQUksR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUN4RCxLQUFLLE1BQU0sS0FBSyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUM3QyxJQUFJLEtBQUssRUFBRSxDQUFDO3dCQUNSLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3RCLENBQUM7Z0JBQ0wsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNMLE9BQU8sSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUssTUFBTSxVQUFVLEdBQUcsR0FBWSxFQUFFO0lBQ3BDLElBQUksQ0FBQztRQUNELElBQ0ksSUFBQSxlQUFVLEVBQUMsZUFBZSxDQUFDO1lBQzNCLElBQUEsYUFBUSxFQUFDLGVBQWUsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLEVBQy9DLENBQUM7WUFDQyxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO0lBQ0wsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNMLFNBQVM7SUFDYixDQUFDO0lBRUQsSUFBSSxpQkFBaUIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFDRCxJQUFJLElBQUEsZUFBVSxFQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQztRQUN0QyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ0QsSUFBSSxDQUFDO1FBQ0QsT0FBTyxJQUFBLGlCQUFZLEVBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ0wsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztBQUNMLENBQUMsQ0FBQztBQXZCVyxRQUFBLFVBQVUsY0F1QnJCO0FBRUssTUFBTSxxQkFBcUIsR0FBRyxLQUFLLElBQXNCLEVBQUU7SUFDOUQsSUFBSSxDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsc0JBQXNCLEVBQUU7WUFDakQsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRTtZQUM3QixNQUFNLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUM7U0FDL0MsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNmLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxDQUFDLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUVyQyxDQUFDO1FBQ0YsT0FBTyxDQUNILE1BQU0sQ0FBQyxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksSUFBSSxFQUFFLENBQUM7YUFDL0MsSUFBSSxFQUFFO2FBQ04sV0FBVyxFQUFFLEtBQUssZ0JBQWdCLENBQzFDLENBQUM7SUFDTixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ0wsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztBQUNMLENBQUMsQ0FBQztBQXBCVyxRQUFBLHFCQUFxQix5QkFvQmhDO0FBRUssTUFBTSxZQUFZLEdBQUcsS0FBSyxJQUFzQixFQUFFLENBQ3JELENBQUMsTUFBTSxJQUFBLDZCQUFxQixHQUFFLENBQUMsSUFBSSxJQUFBLGtCQUFVLEdBQUUsQ0FBQztBQUR2QyxRQUFBLFlBQVksZ0JBQzJCIn0=
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
export declare const TDX_AZURE_EVIDENCE_FORMAT = "tdx-azure-maa-v1";
|
|
3
|
+
export interface TdxAzureEvidenceV1 {
|
|
4
|
+
format: typeof TDX_AZURE_EVIDENCE_FORMAT;
|
|
5
|
+
token: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const encodeTdxAzureEvidence: (token: string) => Buffer;
|
|
8
|
+
export declare const parseTdxAzureEvidence: (evidence: Buffer) => TdxAzureEvidenceV1;
|
|
9
|
+
export declare const computeAzureTdxMrEnclave: (tdAttributesHex: string, mrtdHex: string, pcrSha256Hex: string[]) => Buffer;
|
|
10
|
+
export declare const verifyMaaJwt: (token: string) => Promise<Record<string, unknown>>;
|
|
11
|
+
export declare const validateAzureTdxClaims: (claims: Record<string, unknown>) => {
|
|
12
|
+
userData: Buffer;
|
|
13
|
+
mrenclave: Buffer;
|
|
14
|
+
};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateAzureTdxClaims = exports.verifyMaaJwt = exports.computeAzureTdxMrEnclave = exports.parseTdxAzureEvidence = exports.encodeTdxAzureEvidence = exports.TDX_AZURE_EVIDENCE_FORMAT = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
exports.TDX_AZURE_EVIDENCE_FORMAT = 'tdx-azure-maa-v1';
|
|
6
|
+
const encodeTdxAzureEvidence = (token) => Buffer.from(JSON.stringify({
|
|
7
|
+
format: exports.TDX_AZURE_EVIDENCE_FORMAT,
|
|
8
|
+
token,
|
|
9
|
+
}), 'utf8');
|
|
10
|
+
exports.encodeTdxAzureEvidence = encodeTdxAzureEvidence;
|
|
11
|
+
const parseTdxAzureEvidence = (evidence) => {
|
|
12
|
+
const parsed = JSON.parse(evidence.toString('utf8'));
|
|
13
|
+
if (parsed.format !== exports.TDX_AZURE_EVIDENCE_FORMAT || typeof parsed.token !== 'string') {
|
|
14
|
+
throw new Error('Invalid tdx-azure evidence format');
|
|
15
|
+
}
|
|
16
|
+
return parsed;
|
|
17
|
+
};
|
|
18
|
+
exports.parseTdxAzureEvidence = parseTdxAzureEvidence;
|
|
19
|
+
const hexToBuffer = (hex, expectedBytes) => {
|
|
20
|
+
const normalized = hex.trim().toLowerCase().replace(/^0x/, '');
|
|
21
|
+
if (!/^[0-9a-f]*$/.test(normalized) || normalized.length % 2 !== 0) {
|
|
22
|
+
throw new Error(`Invalid hex value: ${hex}`);
|
|
23
|
+
}
|
|
24
|
+
const buffer = Buffer.from(normalized, 'hex');
|
|
25
|
+
if (expectedBytes !== undefined && buffer.length !== expectedBytes) {
|
|
26
|
+
throw new Error(`Expected ${expectedBytes} bytes, got ${buffer.length} from hex ${hex}`);
|
|
27
|
+
}
|
|
28
|
+
return buffer;
|
|
29
|
+
};
|
|
30
|
+
const decodeJwtPart = (part) => JSON.parse(Buffer.from(part, 'base64url').toString('utf8'));
|
|
31
|
+
const computeAzureTdxMrEnclave = (tdAttributesHex, mrtdHex, pcrSha256Hex) => {
|
|
32
|
+
if (pcrSha256Hex.length < 8) {
|
|
33
|
+
throw new Error('tdx-azure mrEnclave requires SHA-256 PCR[0]..PCR[7]');
|
|
34
|
+
}
|
|
35
|
+
const parts = [
|
|
36
|
+
hexToBuffer(tdAttributesHex, 8),
|
|
37
|
+
hexToBuffer(mrtdHex, 48),
|
|
38
|
+
...pcrSha256Hex.slice(0, 8).map((value) => hexToBuffer(value, 32)),
|
|
39
|
+
];
|
|
40
|
+
return (0, crypto_1.createHash)('sha256').update(Buffer.concat(parts)).digest();
|
|
41
|
+
};
|
|
42
|
+
exports.computeAzureTdxMrEnclave = computeAzureTdxMrEnclave;
|
|
43
|
+
const extractPcrSha256Hex = (claims) => {
|
|
44
|
+
const values = claims['x-ms-azurevm-attested-pcr-values'];
|
|
45
|
+
if (Array.isArray(values) && values.every((item) => typeof item === 'string')) {
|
|
46
|
+
return values;
|
|
47
|
+
}
|
|
48
|
+
if (values && typeof values === 'object') {
|
|
49
|
+
const sha256 = values.sha256;
|
|
50
|
+
if (Array.isArray(sha256) && sha256.every((item) => typeof item === 'string')) {
|
|
51
|
+
return sha256;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
throw new Error('MAA token is missing SHA-256 PCR values');
|
|
55
|
+
};
|
|
56
|
+
const isolationTee = (claims) => {
|
|
57
|
+
const nested = claims['x-ms-isolation-tee'];
|
|
58
|
+
if (nested && typeof nested === 'object') {
|
|
59
|
+
return nested;
|
|
60
|
+
}
|
|
61
|
+
return claims;
|
|
62
|
+
};
|
|
63
|
+
const fetchJwks = async (url) => {
|
|
64
|
+
const response = await fetch(url, { signal: AbortSignal.timeout(5000) });
|
|
65
|
+
if (!response.ok) {
|
|
66
|
+
throw new Error(`Failed to fetch MAA JWKS: ${response.status}`);
|
|
67
|
+
}
|
|
68
|
+
return (await response.json());
|
|
69
|
+
};
|
|
70
|
+
const verifyMaaJwt = async (token) => {
|
|
71
|
+
const parts = token.split('.');
|
|
72
|
+
if (parts.length !== 3) {
|
|
73
|
+
throw new Error('MAA token is not a JWT');
|
|
74
|
+
}
|
|
75
|
+
const header = decodeJwtPart(parts[0]);
|
|
76
|
+
const payload = decodeJwtPart(parts[1]);
|
|
77
|
+
if (header.alg !== 'RS256') {
|
|
78
|
+
throw new Error(`Unsupported MAA JWT alg: ${header.alg}`);
|
|
79
|
+
}
|
|
80
|
+
const iss = payload.iss;
|
|
81
|
+
if (typeof iss !== 'string' || !/^https:\/\/[^/]+\.attest\.azure\.net\/?$/.test(iss)) {
|
|
82
|
+
throw new Error(`Unexpected MAA issuer: ${String(iss)}`);
|
|
83
|
+
}
|
|
84
|
+
const jwksUrl = header.jku ?? `${iss.replace(/\/$/, '')}/certs`;
|
|
85
|
+
if (typeof jwksUrl !== 'string' || !jwksUrl.startsWith(iss.replace(/\/$/, ''))) {
|
|
86
|
+
throw new Error('MAA JWT jku is not on the issuer host');
|
|
87
|
+
}
|
|
88
|
+
const jwks = await fetchJwks(jwksUrl);
|
|
89
|
+
const jwk = jwks.keys?.find((key) => key.kid === header.kid) ?? jwks.keys?.[0];
|
|
90
|
+
if (!jwk) {
|
|
91
|
+
throw new Error('MAA JWKS does not contain a verification key');
|
|
92
|
+
}
|
|
93
|
+
const key = (0, crypto_1.createPublicKey)({
|
|
94
|
+
key: jwk,
|
|
95
|
+
format: 'jwk',
|
|
96
|
+
});
|
|
97
|
+
const ok = (0, crypto_1.verify)('RSA-SHA256', Buffer.from(`${parts[0]}.${parts[1]}`), key, Buffer.from(parts[2], 'base64url'));
|
|
98
|
+
if (!ok) {
|
|
99
|
+
throw new Error('MAA JWT signature verification failed');
|
|
100
|
+
}
|
|
101
|
+
return payload;
|
|
102
|
+
};
|
|
103
|
+
exports.verifyMaaJwt = verifyMaaJwt;
|
|
104
|
+
const validateAzureTdxClaims = (claims) => {
|
|
105
|
+
const tee = isolationTee(claims);
|
|
106
|
+
if (tee['tdx_td_attributes_debug'] === true) {
|
|
107
|
+
throw new Error('Azure TDX debug attribute is enabled');
|
|
108
|
+
}
|
|
109
|
+
if (tee['x-ms-compliance-status'] !== 'azure-compliant-cvm') {
|
|
110
|
+
throw new Error(`Azure TDX compliance status is ${String(tee['x-ms-compliance-status'])}`);
|
|
111
|
+
}
|
|
112
|
+
const tcbStatus = tee['attester_tcb_status'] ?? claims['attester_tcb_status'];
|
|
113
|
+
if (tcbStatus && tcbStatus !== 'UpToDate') {
|
|
114
|
+
throw new Error(`Azure TDX TCB is ${String(tcbStatus)}`);
|
|
115
|
+
}
|
|
116
|
+
const runtime = (tee['x-ms-runtime'] ?? claims['x-ms-runtime']);
|
|
117
|
+
const userDataHex = runtime?.['user-data'];
|
|
118
|
+
if (typeof userDataHex !== 'string') {
|
|
119
|
+
throw new Error('MAA token is missing runtime user-data');
|
|
120
|
+
}
|
|
121
|
+
const userData = hexToBuffer(userDataHex);
|
|
122
|
+
if (userData.length < 64) {
|
|
123
|
+
throw new Error('MAA user-data is shorter than 64 bytes');
|
|
124
|
+
}
|
|
125
|
+
const tdAttributes = String(tee['tdx_td_attributes'] ?? '');
|
|
126
|
+
const mrtd = String(tee['tdx_mrtd'] ?? '');
|
|
127
|
+
const pcrs = extractPcrSha256Hex(claims);
|
|
128
|
+
const mrenclave = (0, exports.computeAzureTdxMrEnclave)(tdAttributes, mrtd, pcrs);
|
|
129
|
+
return {
|
|
130
|
+
userData: userData.subarray(0, 64),
|
|
131
|
+
mrenclave,
|
|
132
|
+
};
|
|
133
|
+
};
|
|
134
|
+
exports.validateAzureTdxClaims = validateAzureTdxClaims;
|
|
135
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGR4QXp1cmVFdmlkZW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9henVyZS90ZHhBenVyZUV2aWRlbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFnRztBQUVuRixRQUFBLHlCQUF5QixHQUFHLGtCQUFrQixDQUFDO0FBT3JELE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxLQUFhLEVBQVUsRUFBRSxDQUM1RCxNQUFNLENBQUMsSUFBSSxDQUNQLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDWCxNQUFNLEVBQUUsaUNBQXlCO0lBQ2pDLEtBQUs7Q0FDcUIsQ0FBQyxFQUMvQixNQUFNLENBQ1QsQ0FBQztBQVBPLFFBQUEsc0JBQXNCLDBCQU83QjtBQUVDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxRQUFnQixFQUFzQixFQUFFO0lBQzFFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBZ0MsQ0FBQztJQUNwRixJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssaUNBQXlCLElBQUksT0FBTyxNQUFNLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2xGLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBQ0QsT0FBTyxNQUE0QixDQUFDO0FBQ3hDLENBQUMsQ0FBQztBQU5XLFFBQUEscUJBQXFCLHlCQU1oQztBQUVGLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBVyxFQUFFLGFBQXNCLEVBQVUsRUFBRTtJQUNoRSxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMvRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFH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
|
|
@@ -60,6 +60,7 @@ const getAttestationPayloadBase64FromChallenge = (challenge) => {
|
|
|
60
60
|
switch (challenge.type) {
|
|
61
61
|
case pki_common_1.ChallengeType.TDX:
|
|
62
62
|
case pki_common_1.ChallengeType.TDXGOOGLE:
|
|
63
|
+
case pki_common_1.ChallengeType.TDXAZURE:
|
|
63
64
|
case pki_common_1.ChallengeType.SEVSNP:
|
|
64
65
|
return challenge.evidenceBase64;
|
|
65
66
|
default:
|
|
@@ -108,23 +109,56 @@ const SYSTEM_MANAGED_EXTENSION_OIDS = [
|
|
|
108
109
|
pki_common_1.OID_CUSTOM_EXTENSION_CHALLENGE_COMMON_ID,
|
|
109
110
|
pki_common_1.OID_CUSTOM_EXTENSION_CHALLENGE_VALIDATED,
|
|
110
111
|
pki_common_1.OID_CUSTOM_EXTENSION_NVIDIA_INFO_GPU,
|
|
112
|
+
pki_common_1.OID_CUSTOM_EXTENSION_NVIDIA_INFO_GPU_INTERCONNECT,
|
|
111
113
|
pki_common_1.OID_CUSTOM_EXTENSION_CHALLENGE_SUBTYPE,
|
|
112
114
|
pki_common_1.OID_CUSTOM_EXTENSION_CHALLENGE_CERTIFICATE_ID,
|
|
113
115
|
];
|
|
114
116
|
const filterClientExtensions = (extensions = []) => extensions.filter((ext) => !SYSTEM_MANAGED_EXTENSION_OIDS.some((oid) => ext.oid.startsWith(oid)));
|
|
115
|
-
const
|
|
117
|
+
const buildNvidiaExtensions = (challenge) => {
|
|
116
118
|
if (!(0, pki_common_1.hasChallengeNvidiaToken)(challenge)) {
|
|
117
119
|
return [];
|
|
118
120
|
}
|
|
119
121
|
const gpusInfo = sp_nvtrust_wrapper_1.NvtrustWrapper.extractGPUInfoFromToken({
|
|
120
122
|
jwt: challenge.nvidiaTokens.gpuToken,
|
|
121
123
|
});
|
|
122
|
-
|
|
124
|
+
const extensions = [
|
|
123
125
|
{
|
|
124
126
|
oid: pki_common_1.OID_CUSTOM_EXTENSION_NVIDIA_INFO_GPU,
|
|
125
127
|
value: Buffer.from(sp_nvtrust_wrapper_1.NvtrustGPUList.encode(gpusInfo).finish()),
|
|
126
128
|
},
|
|
127
129
|
];
|
|
130
|
+
const { gpuInterconnectStatus, nvswitchToken } = challenge.nvidiaTokens;
|
|
131
|
+
if (gpusInfo.gpus.length === 1) {
|
|
132
|
+
if (gpuInterconnectStatus !== undefined ||
|
|
133
|
+
nvswitchToken !== undefined) {
|
|
134
|
+
throw new Error('NVIDIA GPU interconnect data must be omitted for a single GPU');
|
|
135
|
+
}
|
|
136
|
+
return extensions;
|
|
137
|
+
}
|
|
138
|
+
if (gpusInfo.gpus.length === 0) {
|
|
139
|
+
throw new Error('NVIDIA GPU token does not contain any GPU claims');
|
|
140
|
+
}
|
|
141
|
+
if (gpuInterconnectStatus === undefined) {
|
|
142
|
+
throw new Error('NVIDIA GPU interconnect status is required for multiple GPUs');
|
|
143
|
+
}
|
|
144
|
+
const isVerifiedNVSwitchInterconnect = gpuInterconnectStatus ===
|
|
145
|
+
sp_nvtrust_wrapper_1.NvidiaGpuInterconnectStatus.NVIDIA_GPU_INTERCONNECT_NVLINK_SWITCH_ATTESTATION_VERIFIED;
|
|
146
|
+
if (!isVerifiedNVSwitchInterconnect && nvswitchToken !== undefined) {
|
|
147
|
+
throw new Error('NVIDIA NVSwitch token is only allowed for a verified NVLink switch interconnect');
|
|
148
|
+
}
|
|
149
|
+
if (isVerifiedNVSwitchInterconnect && !nvswitchToken) {
|
|
150
|
+
throw new Error('Verified NVIDIA NVLink switch interconnect requires a non-empty NVSwitch token');
|
|
151
|
+
}
|
|
152
|
+
// ChallengeValidatorNvidia verifies this token before certificate issuance.
|
|
153
|
+
const switches = nvswitchToken
|
|
154
|
+
? sp_nvtrust_wrapper_1.NvtrustWrapper.extractNVSwitchInfoFromToken({ jwt: nvswitchToken })
|
|
155
|
+
: [];
|
|
156
|
+
const interconnectInfo = sp_nvtrust_wrapper_1.NvtrustWrapper.createNvidiaGpuInterconnectInfo(gpuInterconnectStatus, switches);
|
|
157
|
+
extensions.push({
|
|
158
|
+
oid: pki_common_1.OID_CUSTOM_EXTENSION_NVIDIA_INFO_GPU_INTERCONNECT,
|
|
159
|
+
value: Buffer.from(sp_nvtrust_wrapper_1.NvidiaGpuInterconnectInfo.encode(interconnectInfo).finish()),
|
|
160
|
+
});
|
|
161
|
+
return extensions;
|
|
128
162
|
};
|
|
129
163
|
const buildCertificateChallengeExtensions = (challenge) => {
|
|
130
164
|
if (challenge.type !== pki_common_1.ChallengeType.Certificate) {
|
|
@@ -215,7 +249,7 @@ const buildCommonExtensions = (params) => {
|
|
|
215
249
|
});
|
|
216
250
|
}
|
|
217
251
|
}
|
|
218
|
-
extensions.push(...
|
|
252
|
+
extensions.push(...buildNvidiaExtensions(challenge));
|
|
219
253
|
extensions.push(...buildCertificateChallengeExtensions(challenge));
|
|
220
254
|
}
|
|
221
255
|
}
|
|
@@ -298,4 +332,4 @@ const getParamsFromCSR = async (csrPem) => {
|
|
|
298
332
|
};
|
|
299
333
|
};
|
|
300
334
|
exports.getParamsFromCSR = getParamsFromCSR;
|
|
301
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydGlmaWNhdGVHZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2VydGlmaWNhdGVHZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBUWdDO0FBQ2hDLDJFQUc0QztBQUM1Qyw2QkFBMkI7QUFDM0IsMkRBbUJvQztBQUVwQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQztBQUNqQyxNQUFNLHNCQUFzQixHQUFHLEtBQUssQ0FBQztBQUNyQyxNQUFNLGVBQWUsR0FBRyx5Q0FBeUMsQ0FBQztBQUVsRSxNQUFNLGlCQUFpQixHQUFHLENBQUMsS0FBYSxFQUFXLEVBQUU7SUFDakQsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xDLElBQUksQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUM3QyxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqRCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztJQUVuRSxJQUFJLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxXQUFXLEVBQUUsQ0FBQztRQUN4RCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2pFLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FB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
|
|
335
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydGlmaWNhdGVHZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2VydGlmaWNhdGVHZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBUWdDO0FBQ2hDLDJFQUs0QztBQUM1Qyw2QkFBMkI7QUFDM0IsMkRBb0JvQztBQUVwQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQztBQUNqQyxNQUFNLHNCQUFzQixHQUFHLEtBQUssQ0FBQztBQUNyQyxNQUFNLGVBQWUsR0FBRyx5Q0FBeUMsQ0FBQztBQUVsRSxNQUFNLGlCQUFpQixHQUFHLENBQUMsS0FBYSxFQUFXLEVBQUU7SUFDakQsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xDLElBQUksQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUM3QyxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqRCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztJQUVuRSxJQUFJLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxXQUFXLEVBQUUsQ0FBQztRQUN4RCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2pFLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FB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
|
|
@@ -5,17 +5,16 @@ export declare class ChallengeNvidiaCCHelper {
|
|
|
5
5
|
/**
|
|
6
6
|
* Reports how the GPUs can reach each other's memory.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* NVLink
|
|
11
|
-
*
|
|
12
|
-
*
|
|
8
|
+
* PCIe and unidentified peer paths are reported as unverified metadata;
|
|
9
|
+
* the verifier only permits that state on an untrusted network. Whether
|
|
10
|
+
* NVLink requires a separate NVSwitch token is determined from the LS10
|
|
11
|
+
* count returned by getGPUTopology(): Hopper exposes attestable LS10
|
|
12
|
+
* switches, while Blackwell does not.
|
|
13
13
|
*
|
|
14
|
-
* @returns
|
|
15
|
-
* @throws if
|
|
16
|
-
* be queried
|
|
14
|
+
* @returns the metadata status to bind to the TEE challenge
|
|
15
|
+
* @throws if NVML cannot be queried
|
|
17
16
|
*/
|
|
18
|
-
private static
|
|
17
|
+
private static getGpuInterconnectStatus;
|
|
19
18
|
static getTokenHash(token: NvidiaCCToken): Buffer;
|
|
20
19
|
static getTokenAndCombinedChallengeData(baseUserData: Buffer, logger?: Log): Promise<{
|
|
21
20
|
nvidiaTokens: NvidiaCCToken | undefined;
|
|
@@ -18,17 +18,16 @@ class ChallengeNvidiaCCHelper {
|
|
|
18
18
|
gpuCount: topology.gpuCount,
|
|
19
19
|
nvswitchCount: topology.nvswitchCount,
|
|
20
20
|
});
|
|
21
|
-
if (topology.gpuCount > 1) {
|
|
22
|
-
const { hasNvlink } = await ChallengeNvidiaCCHelper.checkGpuInterconnect(wrapper, log);
|
|
23
|
-
if (hasNvlink && topology.nvswitchCount === 0) {
|
|
24
|
-
log?.warn('No attestable LS10 NVSwitch devices were found; continuing with GPU-only attestation (expected for Blackwell)');
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
21
|
if (!topology.gpuCount) {
|
|
28
22
|
log?.info('Challenge NVIDIA token present: false');
|
|
29
23
|
log?.info('NVIDIA token retrieval skipped: no GPUs detected in topology');
|
|
30
24
|
return;
|
|
31
25
|
}
|
|
26
|
+
let gpuInterconnectStatus;
|
|
27
|
+
if (topology.gpuCount > 1) {
|
|
28
|
+
gpuInterconnectStatus =
|
|
29
|
+
await ChallengeNvidiaCCHelper.getGpuInterconnectStatus(wrapper, topology.nvswitchCount, log);
|
|
30
|
+
}
|
|
32
31
|
const nonce = sp_nvtrust_wrapper_1.NvtrustWrapper.generateNonce();
|
|
33
32
|
log?.debug('Attempting NVIDIA token retrieval for detected GPUs', {
|
|
34
33
|
gpuCount: topology.gpuCount,
|
|
@@ -39,7 +38,8 @@ class ChallengeNvidiaCCHelper {
|
|
|
39
38
|
ppcieMode: false,
|
|
40
39
|
});
|
|
41
40
|
let nvswitchToken;
|
|
42
|
-
if (
|
|
41
|
+
if (gpuInterconnectStatus ===
|
|
42
|
+
sp_nvtrust_wrapper_1.NvidiaGpuInterconnectStatus.NVIDIA_GPU_INTERCONNECT_NVLINK_SWITCH_ATTESTATION_VERIFIED) {
|
|
43
43
|
log?.debug('Attempting NVIDIA NVSwitch token retrieval', {
|
|
44
44
|
nvswitchCount: topology.nvswitchCount,
|
|
45
45
|
});
|
|
@@ -60,7 +60,10 @@ class ChallengeNvidiaCCHelper {
|
|
|
60
60
|
});
|
|
61
61
|
return {
|
|
62
62
|
gpuToken: gpuTokenRaw.jwt,
|
|
63
|
-
...(
|
|
63
|
+
...(gpuInterconnectStatus !== undefined
|
|
64
|
+
? { gpuInterconnectStatus }
|
|
65
|
+
: {}),
|
|
66
|
+
...(nvswitchToken !== undefined ? { nvswitchToken } : {}),
|
|
64
67
|
};
|
|
65
68
|
}
|
|
66
69
|
catch (error) {
|
|
@@ -92,17 +95,16 @@ class ChallengeNvidiaCCHelper {
|
|
|
92
95
|
/**
|
|
93
96
|
* Reports how the GPUs can reach each other's memory.
|
|
94
97
|
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
* NVLink
|
|
98
|
-
*
|
|
99
|
-
*
|
|
98
|
+
* PCIe and unidentified peer paths are reported as unverified metadata;
|
|
99
|
+
* the verifier only permits that state on an untrusted network. Whether
|
|
100
|
+
* NVLink requires a separate NVSwitch token is determined from the LS10
|
|
101
|
+
* count returned by getGPUTopology(): Hopper exposes attestable LS10
|
|
102
|
+
* switches, while Blackwell does not.
|
|
100
103
|
*
|
|
101
|
-
* @returns
|
|
102
|
-
* @throws if
|
|
103
|
-
* be queried
|
|
104
|
+
* @returns the metadata status to bind to the TEE challenge
|
|
105
|
+
* @throws if NVML cannot be queried
|
|
104
106
|
*/
|
|
105
|
-
static async
|
|
107
|
+
static async getGpuInterconnectStatus(wrapper, nvswitchCount, log) {
|
|
106
108
|
const links = await wrapper.getGpuInterconnect();
|
|
107
109
|
const describe = (type) => sp_nvtrust_wrapper_1.GpuInterconnectLinkType[type] ?? String(type);
|
|
108
110
|
const format = (subset) => subset
|
|
@@ -119,23 +121,35 @@ class ChallengeNvidiaCCHelper {
|
|
|
119
121
|
sp_nvtrust_wrapper_1.GpuInterconnectLinkType.GPU_INTERCONNECT_LINK_TYPE_NONE);
|
|
120
122
|
if (connected.length === 0) {
|
|
121
123
|
log?.info('GPUs are isolated: no direct interconnect detected');
|
|
122
|
-
return
|
|
124
|
+
return sp_nvtrust_wrapper_1.NvidiaGpuInterconnectStatus.NVIDIA_GPU_INTERCONNECT_DISCONNECTED;
|
|
123
125
|
}
|
|
124
126
|
const bypassing = connected.filter((link) => link.type !==
|
|
125
127
|
sp_nvtrust_wrapper_1.GpuInterconnectLinkType.GPU_INTERCONNECT_LINK_TYPE_NVLINK);
|
|
126
128
|
if (bypassing.length > 0) {
|
|
127
129
|
const details = format(bypassing);
|
|
128
|
-
log?.
|
|
129
|
-
|
|
130
|
-
});
|
|
131
|
-
throw new Error(`Unsupported direct GPU interconnect detected: ${details}`);
|
|
130
|
+
log?.warn('Unverified direct GPU interconnect detected; it is allowed only on an untrusted network', { links: details });
|
|
131
|
+
return sp_nvtrust_wrapper_1.NvidiaGpuInterconnectStatus.NVIDIA_GPU_INTERCONNECT_DIRECT_UNVERIFIED;
|
|
132
132
|
}
|
|
133
133
|
log?.warn('NVLink interconnect detected', { links: format(connected) });
|
|
134
|
-
|
|
134
|
+
if (nvswitchCount === 0) {
|
|
135
|
+
log?.warn('No attestable LS10 NVSwitch devices were found; continuing with GPU-only attestation (expected for Blackwell)');
|
|
136
|
+
return sp_nvtrust_wrapper_1.NvidiaGpuInterconnectStatus.NVIDIA_GPU_INTERCONNECT_NVLINK_SWITCH_ATTESTATION_NOT_APPLICABLE;
|
|
137
|
+
}
|
|
138
|
+
return sp_nvtrust_wrapper_1.NvidiaGpuInterconnectStatus.NVIDIA_GPU_INTERCONNECT_NVLINK_SWITCH_ATTESTATION_VERIFIED;
|
|
135
139
|
}
|
|
136
140
|
static getTokenHash(token) {
|
|
137
141
|
const hash = (0, crypto_1.createHash)('sha256');
|
|
138
|
-
hash.update(JSON.stringify(
|
|
142
|
+
hash.update(JSON.stringify({
|
|
143
|
+
gpuToken: token.gpuToken,
|
|
144
|
+
...(token.gpuInterconnectStatus !== undefined
|
|
145
|
+
? {
|
|
146
|
+
gpuInterconnectStatus: token.gpuInterconnectStatus,
|
|
147
|
+
}
|
|
148
|
+
: {}),
|
|
149
|
+
...(token.nvswitchToken !== undefined
|
|
150
|
+
? { nvswitchToken: token.nvswitchToken }
|
|
151
|
+
: {}),
|
|
152
|
+
}));
|
|
139
153
|
return hash.digest();
|
|
140
154
|
}
|
|
141
155
|
static async getTokenAndCombinedChallengeData(baseUserData, logger) {
|
|
@@ -159,4 +173,4 @@ class ChallengeNvidiaCCHelper {
|
|
|
159
173
|
}
|
|
160
174
|
}
|
|
161
175
|
exports.ChallengeNvidiaCCHelper = ChallengeNvidiaCCHelper;
|
|
162
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
176
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbGxlbmdlTnZpZGlhQ0NIZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhbGxlbmdlUHJvdmlkZXIvY2hhbGxlbmdlTnZpZGlhQ0NIZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkVBTzRDO0FBRTVDLG1DQUFvQztBQUVwQyxNQUFhLHVCQUF1QjtJQUN4QixNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FDL0IsTUFBWTtRQUVaLE1BQU0sR0FBRyxHQUFHLE1BQU0sRUFBRSxLQUFLLENBQUM7WUFDdEIsTUFBTSxFQUFFLHlCQUF5QjtTQUNwQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUM7WUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLG1DQUFjLEVBQUUsQ0FBQztZQUNyQyxHQUFHLEVBQUUsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUM7WUFDekMsTUFBTSxPQUFPLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNsQyxHQUFHLEVBQUUsSUFBSSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7WUFFOUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDaEQsR0FBRyxFQUFFLEtBQUssQ0FBQyw4QkFBOEIsRUFBRTtnQkFDdkMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRO2dCQUMzQixhQUFhLEVBQUUsUUFBUSxDQUFDLGFBQWE7YUFDeEMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDckIsR0FBRyxFQUFFLElBQUksQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO2dCQUNuRCxHQUFHLEVBQUUsSUFBSSxDQUNMLDhEQUE4RCxDQUNqRSxDQUFDO2dCQUNGLE9BQU87WUFDWCxDQUFDO1lBRUQsSUFBSSxxQkFBOEQsQ0FBQztZQUNuRSxJQUFJLFFBQVEsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLHFC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
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { ChallengeProvider } from './challengeProvider';
|
|
3
|
+
import { Challenge, Log } from '@super-protocol/pki-common';
|
|
4
|
+
export declare class ChallengeProviderTdxAzure implements ChallengeProvider {
|
|
5
|
+
readonly logger?: Log | undefined;
|
|
6
|
+
constructor(logger?: Log | undefined);
|
|
7
|
+
generateChallenge(userData: Buffer, networkID?: string): Promise<Challenge>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ChallengeProviderTdxAzure = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const util_1 = require("util");
|
|
6
|
+
const challengeNvidiaCCHelper_1 = require("./challengeNvidiaCCHelper");
|
|
7
|
+
const pki_common_1 = require("@super-protocol/pki-common");
|
|
8
|
+
const tdxAzureEvidence_1 = require("../azure/tdxAzureEvidence");
|
|
9
|
+
const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
|
|
10
|
+
class ChallengeProviderTdxAzure {
|
|
11
|
+
logger;
|
|
12
|
+
constructor(logger) {
|
|
13
|
+
this.logger = logger;
|
|
14
|
+
}
|
|
15
|
+
async generateChallenge(userData, networkID) {
|
|
16
|
+
const { challengeData, nvidiaTokens } = await challengeNvidiaCCHelper_1.ChallengeNvidiaCCHelper.getTokenAndCombinedChallengeData(userData, this.logger);
|
|
17
|
+
const bin = process.env.AZURE_GUEST_ATTEST ?? 'azure-guest-attest';
|
|
18
|
+
const args = [
|
|
19
|
+
'guest-attest',
|
|
20
|
+
'--provider',
|
|
21
|
+
'maa',
|
|
22
|
+
'--json',
|
|
23
|
+
'--user-data',
|
|
24
|
+
`hex:${challengeData.toString('hex')}`,
|
|
25
|
+
];
|
|
26
|
+
let stdout;
|
|
27
|
+
try {
|
|
28
|
+
const result = await execFileAsync(bin, args, {
|
|
29
|
+
timeout: 30000,
|
|
30
|
+
maxBuffer: 4 * 1024 * 1024,
|
|
31
|
+
});
|
|
32
|
+
stdout = result.stdout;
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
throw new Error(`azure-guest-attest failed (${bin}): ${error.stderr || error.message}`);
|
|
36
|
+
}
|
|
37
|
+
const jsonStart = stdout.indexOf('{');
|
|
38
|
+
if (jsonStart < 0) {
|
|
39
|
+
throw new Error('azure-guest-attest returned no JSON');
|
|
40
|
+
}
|
|
41
|
+
const parsed = JSON.parse(stdout.slice(jsonStart));
|
|
42
|
+
if (!parsed.passed || typeof parsed.token !== 'string') {
|
|
43
|
+
throw new Error(`Azure MAA guest attestation failed: ${parsed.error || 'no token'}`);
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
type: pki_common_1.ChallengeType.TDXAZURE,
|
|
47
|
+
evidenceBase64: (0, tdxAzureEvidence_1.encodeTdxAzureEvidence)(parsed.token).toString('base64'),
|
|
48
|
+
nvidiaTokens,
|
|
49
|
+
networkID,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.ChallengeProviderTdxAzure = ChallengeProviderTdxAzure;
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbGxlbmdlUHJvdmlkZXJUZHhBenVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jaGFsbGVuZ2VQcm92aWRlci9jaGFsbGVuZ2VQcm92aWRlclRkeEF6dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlEQUF5QztBQUN6QywrQkFBaUM7QUFDakMsdUVBQW9FO0FBRXBFLDJEQUEyRTtBQUMzRSxnRUFBbUU7QUFFbkUsTUFBTSxhQUFhLEdBQUcsSUFBQSxnQkFBUyxFQUFDLHdCQUFRLENBQUMsQ0FBQztBQUUxQyxNQUFhLHlCQUF5QjtJQUNOO0lBQTVCLFlBQTRCLE1BQVk7UUFBWixXQUFNLEdBQU4sTUFBTSxDQUFNO0lBQUcsQ0FBQztJQUU1QyxLQUFLLENBQUMsaUJBQWlCLENBQ25CLFFBQWdCLEVBQ2hCLFNBQWtCO1FBRWxCLE1BQU0sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLEdBQ2pDLE1BQU0saURBQXVCLENBQUMsZ0NBQWdDLENBQzFELFFBQVEsRUFDUixJQUFJLENBQUMsTUFBTSxDQUNkLENBQUM7UUFFTixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixJQUFJLG9CQUFvQixDQUFDO1FBQ25FLE1BQU0sSUFBSSxHQUFHO1lBQ1QsY0FBYztZQUNkLFlBQVk7WUFDWixLQUFLO1lBQ0wsUUFBUTtZQUNSLGFBQWE7WUFDYixPQUFPLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7U0FDekMsQ0FBQztRQUVGLElBQUksTUFBYyxDQUFDO1FBQ25CLElBQUksQ0FBQztZQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUU7Z0JBQzFDLE9BQU8sRUFBRSxLQUFNO2dCQUNmLFNBQVMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUk7YUFDN0IsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDM0IsQ0FBQztRQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FDWCw4QkFBOEIsR0FBRyxNQUFNLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUN6RSxDQUFDO1FBQ04sQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBSWhELENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxPQUFPLE1BQU0sQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDckQsTUFBTSxJQUFJLEtBQUssQ0FDWCx1Q0FBdUMsTUFBTSxDQUFDLEtBQUssSUFBSSxVQUFVLEVBQUUsQ0FDdEUsQ0FBQztRQUNOLENBQUM7UUFFRCxPQUFPO1lBQ0gsSUFBSSxFQUFFLDBCQUFhLENBQUMsUUFBUTtZQUM1QixjQUFjLEVBQUUsSUFBQSx5Q0FBc0IsRUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUN6RCxRQUFRLENBQ1g7WUFDRCxZQUFZO1lBQ1osU0FBUztTQUNaLENBQUM7SUFDTixDQUFDO0NBQ0o7QUE1REQsOERBNERDIn0=
|
|
@@ -16,9 +16,10 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./challengeProvider"), exports);
|
|
18
18
|
__exportStar(require("./challengeProviderTdx"), exports);
|
|
19
|
+
__exportStar(require("./challengeProviderTdxAzure"), exports);
|
|
19
20
|
__exportStar(require("./challengeProviderUntrusted"), exports);
|
|
20
21
|
__exportStar(require("./challengeProviderSevSnp"), exports);
|
|
21
22
|
__exportStar(require("./challengeNvidiaCCHelper"), exports);
|
|
22
23
|
__exportStar(require("./challengeProviderCertificate"), exports);
|
|
23
24
|
__exportStar(require("./challengeProviderToken"), exports);
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhbGxlbmdlUHJvdmlkZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHNEQUFvQztBQUNwQyx5REFBdUM7QUFDdkMsOERBQTRDO0FBQzVDLCtEQUE2QztBQUM3Qyw0REFBMEM7QUFDMUMsNERBQTBDO0FBQzFDLGlFQUErQztBQUMvQywyREFBeUMifQ==
|
|
@@ -48,8 +48,58 @@ class ChallengeValidatorNvidia {
|
|
|
48
48
|
throw new Error('Failed to verify Nvidia GPU token: validateToken returned success=false');
|
|
49
49
|
}
|
|
50
50
|
log.info('NVIDIA validation passed: nvtrust token verification succeeded');
|
|
51
|
-
const
|
|
52
|
-
|
|
51
|
+
const gpusInfo = sp_nvtrust_wrapper_1.NvtrustWrapper.extractGPUInfoFromToken({
|
|
52
|
+
jwt: challenge.nvidiaTokens.gpuToken,
|
|
53
|
+
});
|
|
54
|
+
const gpuCount = gpusInfo.gpus.length;
|
|
55
|
+
if (gpuCount === 0) {
|
|
56
|
+
throw new Error('Validated NVIDIA GPU token does not contain any GPU claims');
|
|
57
|
+
}
|
|
58
|
+
const { gpuInterconnectStatus, nvswitchToken } = challenge.nvidiaTokens;
|
|
59
|
+
const hasGpuInterconnectStatus = gpuInterconnectStatus !== undefined;
|
|
60
|
+
const hasNVSwitchToken = nvswitchToken !== undefined;
|
|
61
|
+
if (gpuCount === 1) {
|
|
62
|
+
if (hasGpuInterconnectStatus || hasNVSwitchToken) {
|
|
63
|
+
throw new Error('NVIDIA GPU interconnect status and NVSwitch token must be omitted for a single GPU');
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else if (!hasGpuInterconnectStatus) {
|
|
67
|
+
throw new Error('NVIDIA GPU interconnect status is required when the validated GPU token contains multiple GPUs');
|
|
68
|
+
}
|
|
69
|
+
if (gpuInterconnectStatus !==
|
|
70
|
+
sp_nvtrust_wrapper_1.NvidiaGpuInterconnectStatus.NVIDIA_GPU_INTERCONNECT_NVLINK_SWITCH_ATTESTATION_VERIFIED &&
|
|
71
|
+
hasNVSwitchToken) {
|
|
72
|
+
throw new Error('NVIDIA NVSwitch token is only allowed for a verified NVLink switch interconnect');
|
|
73
|
+
}
|
|
74
|
+
switch (gpuInterconnectStatus) {
|
|
75
|
+
case undefined:
|
|
76
|
+
break;
|
|
77
|
+
case sp_nvtrust_wrapper_1.NvidiaGpuInterconnectStatus.NVIDIA_GPU_INTERCONNECT_DISCONNECTED:
|
|
78
|
+
log.info('Multiple disconnected NVIDIA GPUs were reported by TEE-bound interconnect metadata');
|
|
79
|
+
break;
|
|
80
|
+
case sp_nvtrust_wrapper_1.NvidiaGpuInterconnectStatus.NVIDIA_GPU_INTERCONNECT_DIRECT_UNVERIFIED:
|
|
81
|
+
if (networkType !== 'untrusted') {
|
|
82
|
+
throw new Error('Unverified direct NVIDIA GPU interconnect is only allowed on an untrusted network');
|
|
83
|
+
}
|
|
84
|
+
log.warn('Allowing unverified direct NVIDIA GPU interconnect on an untrusted network');
|
|
85
|
+
break;
|
|
86
|
+
case sp_nvtrust_wrapper_1.NvidiaGpuInterconnectStatus.NVIDIA_GPU_INTERCONNECT_NVLINK_SWITCH_ATTESTATION_NOT_APPLICABLE:
|
|
87
|
+
// TODO(NVIDIA NVLink attestation): Revisit this branch if NVIDIA
|
|
88
|
+
// introduces or requires separate NVLink/NVSwitch attestation for
|
|
89
|
+
// Blackwell. NOT_APPLICABLE currently has no switch token and relies
|
|
90
|
+
// on the validated GPU token plus TEE-bound interconnect metadata.
|
|
91
|
+
log.info('Separate NVIDIA NVSwitch attestation is not applicable to this NVLink topology');
|
|
92
|
+
break;
|
|
93
|
+
case sp_nvtrust_wrapper_1.NvidiaGpuInterconnectStatus.NVIDIA_GPU_INTERCONNECT_NVLINK_SWITCH_ATTESTATION_VERIFIED:
|
|
94
|
+
if (!nvswitchToken) {
|
|
95
|
+
throw new Error('Verified NVIDIA NVLink switch interconnect requires a non-empty NVSwitch token');
|
|
96
|
+
}
|
|
97
|
+
break;
|
|
98
|
+
default:
|
|
99
|
+
throw new Error(`Unknown NVIDIA GPU interconnect status: ${gpuInterconnectStatus}`);
|
|
100
|
+
}
|
|
101
|
+
if (gpuInterconnectStatus ===
|
|
102
|
+
sp_nvtrust_wrapper_1.NvidiaGpuInterconnectStatus.NVIDIA_GPU_INTERCONNECT_NVLINK_SWITCH_ATTESTATION_VERIFIED) {
|
|
53
103
|
nvidiaTokenValidationResult = await nvtrusWrapper.validateToken({
|
|
54
104
|
device: sp_nvtrust_wrapper_1.NvidiaDeviceType.SWITCH,
|
|
55
105
|
policy: sp_nvtrust_wrapper_1.defaultNVSwitchPolicy,
|
|
@@ -59,11 +109,27 @@ class ChallengeValidatorNvidia {
|
|
|
59
109
|
throw new Error('Failed to verify Nvidia NVSwitch token: validateToken returned success=false');
|
|
60
110
|
}
|
|
61
111
|
log.info('NVIDIA NVSwitch validation passed: nvtrust token verification succeeded');
|
|
112
|
+
const switchesInfo = sp_nvtrust_wrapper_1.NvtrustWrapper.extractNVSwitchInfoFromToken({
|
|
113
|
+
jwt: nvswitchToken,
|
|
114
|
+
});
|
|
115
|
+
if (switchesInfo.length === 0) {
|
|
116
|
+
throw new Error('Validated NVIDIA NVSwitch token does not contain any switch claims');
|
|
117
|
+
}
|
|
118
|
+
if (networkType === 'trusted') {
|
|
119
|
+
const insecureSwitchNumbers = switchesInfo
|
|
120
|
+
.map((nvSwitch, index) => ({
|
|
121
|
+
nvSwitch,
|
|
122
|
+
switchNumber: index + 1,
|
|
123
|
+
}))
|
|
124
|
+
.filter(({ nvSwitch }) => !nvSwitch.secureBoot || nvSwitch.debugEnabled)
|
|
125
|
+
.map(({ switchNumber }) => switchNumber);
|
|
126
|
+
if (insecureSwitchNumbers.length > 0) {
|
|
127
|
+
throw new Error(`Trusted network requires secure boot and disabled debug mode on every NVIDIA NVSwitch. Invalid switch(es): ${insecureSwitchNumbers.join(', ')}`);
|
|
128
|
+
}
|
|
129
|
+
log.info(`NVIDIA trusted policy check passed: secure boot is enabled and debug mode is disabled on all ${switchesInfo.length} NVSwitch(es)`);
|
|
130
|
+
}
|
|
62
131
|
}
|
|
63
132
|
if (networkType === 'trusted') {
|
|
64
|
-
const gpusInfo = sp_nvtrust_wrapper_1.NvtrustWrapper.extractGPUInfoFromToken({
|
|
65
|
-
jwt: challenge.nvidiaTokens.gpuToken,
|
|
66
|
-
});
|
|
67
133
|
const debugGpuNumbers = gpusInfo.gpus
|
|
68
134
|
.map((gpu, index) => ({ gpu, gpuNumber: index + 1 }))
|
|
69
135
|
.filter(({ gpu }) => gpu.dbgStat === true)
|
|
@@ -102,4 +168,4 @@ class ChallengeValidatorNvidia {
|
|
|
102
168
|
}
|
|
103
169
|
}
|
|
104
170
|
exports.ChallengeValidatorNvidia = ChallengeValidatorNvidia;
|
|
105
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbGxlbmdlVmFsaWRhdG9yTnZpZGlhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NoYWxsZW5nZVZhbGlkYXRvci9jaGFsbGVuZ2VWYWxpZGF0b3JOdmlkaWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkVBUTRDO0FBRTVDLDJEQUlvQztBQUNwQyw0REFBK0Q7QUFHL0QsTUFBYSx3QkFBd0I7SUFFWjtJQUNBO0lBRnJCLFlBQ3FCLEdBQVEsRUFDUixNQUE2QjtRQUQ3QixRQUFHLEdBQUgsR0FBRyxDQUFLO1FBQ1IsV0FBTSxHQUFOLE1BQU0sQ0FBdUI7SUFDL0MsQ0FBQztJQUVKLEtBQUssQ0FBQyxRQUFRLENBQ1YsU0FBb0IsRUFDcEIsUUFBZ0IsRUFDaEIsV0FBeUI7UUFFekIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDdkIsU0FBUyxFQUFFLDBCQUEwQjtTQUN4QyxDQUFDLENBQUM7UUFDSCxNQUFNLGNBQWMsR0FBRyxJQUFBLG9DQUF1QixFQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTFELEdBQUcsQ0FBQyxLQUFLLENBQUMsbUNBQW1DLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2xCLEdBQUcsQ0FBQyxLQUFLLENBQ0wsb0VBQW9FLENBQ3ZFLENBQUM7WUFDRixPQUFPO1FBQ1gsQ0FBQztRQUNELEdBQUcsQ0FBQyxLQUFLLENBQ0wsNkNBQTZDLFdBQVcsSUFBSSxXQUFXLEVBQUUsQ0FDNUUsQ0FBQztRQUVGLE1BQU0sU0FBUyxHQUFHLDJDQUF1QixDQUFDLFlBQVksQ0FDbEQsU0FBUyxDQUFDLFlBQVksQ0FDekIsQ0FBQztRQUVGLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUNE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
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Challenge, Log } from '@super-protocol/pki-common';
|
|
2
|
+
import { ChallengeResult, ChallengeValidator } from './challengeValidator';
|
|
3
|
+
export declare class ChallengeValidatorTdxAzure implements ChallengeValidator {
|
|
4
|
+
private readonly log;
|
|
5
|
+
constructor(log: Log);
|
|
6
|
+
validate(challenge: Challenge): Promise<ChallengeResult>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ChallengeValidatorTdxAzure = void 0;
|
|
4
|
+
const pki_common_1 = require("@super-protocol/pki-common");
|
|
5
|
+
const tdxAzureEvidence_1 = require("../azure/tdxAzureEvidence");
|
|
6
|
+
class ChallengeValidatorTdxAzure {
|
|
7
|
+
log;
|
|
8
|
+
constructor(log) {
|
|
9
|
+
this.log = log;
|
|
10
|
+
}
|
|
11
|
+
async validate(challenge) {
|
|
12
|
+
if (challenge.type !== pki_common_1.ChallengeType.TDXAZURE) {
|
|
13
|
+
throw new Error('Method not implemented.');
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const evidence = (0, tdxAzureEvidence_1.parseTdxAzureEvidence)(Buffer.from(challenge.evidenceBase64, 'base64'));
|
|
17
|
+
const claims = await (0, tdxAzureEvidence_1.verifyMaaJwt)(evidence.token);
|
|
18
|
+
const { userData, mrenclave } = (0, tdxAzureEvidence_1.validateAzureTdxClaims)(claims);
|
|
19
|
+
this.log.debug('Validated tdx-azure MAA claims', {
|
|
20
|
+
mrenclaveHex: mrenclave.toString('hex'),
|
|
21
|
+
});
|
|
22
|
+
return {
|
|
23
|
+
success: true,
|
|
24
|
+
validatedUserData: userData,
|
|
25
|
+
validatedId: mrenclave,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
return {
|
|
30
|
+
success: false,
|
|
31
|
+
error: e.message,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.ChallengeValidatorTdxAzure = ChallengeValidatorTdxAzure;
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbGxlbmdlVmFsaWRhdG9yVGR4QXp1cmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhbGxlbmdlVmFsaWRhdG9yL2NoYWxsZW5nZVZhbGlkYXRvclRkeEF6dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJEQUEyRTtBQUUzRSxnRUFJbUM7QUFFbkMsTUFBYSwwQkFBMEI7SUFDTjtJQUE3QixZQUE2QixHQUFRO1FBQVIsUUFBRyxHQUFILEdBQUcsQ0FBSztJQUFHLENBQUM7SUFFekMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFvQjtRQUMvQixJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssMEJBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM1QyxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELElBQUksQ0FBQztZQUNELE1BQU0sUUFBUSxHQUFHLElBQUEsd0NBQXFCLEVBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FDbEQsQ0FBQztZQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSwrQkFBWSxFQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsRCxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUEseUNBQXNCLEVBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLEVBQUU7Z0JBQzdDLFlBQVksRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQzthQUMxQyxDQUFDLENBQUM7WUFDSCxPQUFPO2dCQUNILE9BQU8sRUFBRSxJQUFJO2dCQUNiLGlCQUFpQixFQUFFLFFBQVE7Z0JBQzNCLFdBQVcsRUFBRSxTQUFTO2FBQ3pCLENBQUM7UUFDTixDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNkLE9BQU87Z0JBQ0gsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsS0FBSyxFQUFFLENBQUMsQ0FBQyxPQUFPO2FBQ25CLENBQUM7UUFDTixDQUFDO0lBQ0wsQ0FBQztDQUNKO0FBN0JELGdFQTZCQyJ9
|
|
@@ -3,5 +3,6 @@ export * from './validatorConfig';
|
|
|
3
3
|
export { ChallengeValidatorCertificate } from './challengeValidatorCertificate';
|
|
4
4
|
export { ChallengeValidatorNvidia } from './challengeValidatorNvidia';
|
|
5
5
|
export { ChallengeValidatorTdx } from './challengeValidatorTdx';
|
|
6
|
+
export { ChallengeValidatorTdxAzure } from './challengeValidatorTdxAzure';
|
|
6
7
|
export { ChallengeValidatorSevSnp } from './challengeValidatorSevSnp';
|
|
7
8
|
export { ChallengeValidatorToken } from './challengeValidatorToken';
|
|
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.ChallengeValidatorToken = exports.ChallengeValidatorSevSnp = exports.ChallengeValidatorTdx = exports.ChallengeValidatorNvidia = exports.ChallengeValidatorCertificate = void 0;
|
|
17
|
+
exports.ChallengeValidatorToken = exports.ChallengeValidatorSevSnp = exports.ChallengeValidatorTdxAzure = exports.ChallengeValidatorTdx = exports.ChallengeValidatorNvidia = exports.ChallengeValidatorCertificate = void 0;
|
|
18
18
|
__exportStar(require("./challengeValidator"), exports);
|
|
19
19
|
__exportStar(require("./validatorConfig"), exports);
|
|
20
20
|
var challengeValidatorCertificate_1 = require("./challengeValidatorCertificate");
|
|
@@ -23,8 +23,10 @@ var challengeValidatorNvidia_1 = require("./challengeValidatorNvidia");
|
|
|
23
23
|
Object.defineProperty(exports, "ChallengeValidatorNvidia", { enumerable: true, get: function () { return challengeValidatorNvidia_1.ChallengeValidatorNvidia; } });
|
|
24
24
|
var challengeValidatorTdx_1 = require("./challengeValidatorTdx");
|
|
25
25
|
Object.defineProperty(exports, "ChallengeValidatorTdx", { enumerable: true, get: function () { return challengeValidatorTdx_1.ChallengeValidatorTdx; } });
|
|
26
|
+
var challengeValidatorTdxAzure_1 = require("./challengeValidatorTdxAzure");
|
|
27
|
+
Object.defineProperty(exports, "ChallengeValidatorTdxAzure", { enumerable: true, get: function () { return challengeValidatorTdxAzure_1.ChallengeValidatorTdxAzure; } });
|
|
26
28
|
var challengeValidatorSevSnp_1 = require("./challengeValidatorSevSnp");
|
|
27
29
|
Object.defineProperty(exports, "ChallengeValidatorSevSnp", { enumerable: true, get: function () { return challengeValidatorSevSnp_1.ChallengeValidatorSevSnp; } });
|
|
28
30
|
var challengeValidatorToken_1 = require("./challengeValidatorToken");
|
|
29
31
|
Object.defineProperty(exports, "ChallengeValidatorToken", { enumerable: true, get: function () { return challengeValidatorToken_1.ChallengeValidatorToken; } });
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhbGxlbmdlVmFsaWRhdG9yL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdURBQXFDO0FBQ3JDLG9EQUFrQztBQUNsQyxpRkFBZ0Y7QUFBdkUsOElBQUEsNkJBQTZCLE9BQUE7QUFDdEMsdUVBQXNFO0FBQTdELG9JQUFBLHdCQUF3QixPQUFBO0FBQ2pDLGlFQUFnRTtBQUF2RCw4SEFBQSxxQkFBcUIsT0FBQTtBQUM5QiwyRUFBMEU7QUFBakUsd0lBQUEsMEJBQTBCLE9BQUE7QUFDbkMsdUVBQXNFO0FBQTdELG9JQUFBLHdCQUF3QixPQUFBO0FBQ2pDLHFFQUFvRTtBQUEzRCxrSUFBQSx1QkFBdUIsT0FBQSJ9
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -19,4 +19,6 @@ __exportStar(require("./challengeProvider"), exports);
|
|
|
19
19
|
__exportStar(require("./challengeValidator"), exports);
|
|
20
20
|
__exportStar(require("./swarmCertValidation"), exports);
|
|
21
21
|
__exportStar(require("./attestationType"), exports);
|
|
22
|
-
|
|
22
|
+
__exportStar(require("./azure/detectAzureTdx"), exports);
|
|
23
|
+
__exportStar(require("./azure/tdxAzureEvidence"), exports);
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHlEQUF1QztBQUN2QyxzREFBb0M7QUFDcEMsdURBQXFDO0FBQ3JDLHdEQUFzQztBQUN0QyxvREFBa0M7QUFDbEMseURBQXVDO0FBQ3ZDLDJEQUF5QyJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@super-protocol/pki-attestation-engine",
|
|
3
|
-
"version": "5.0
|
|
3
|
+
"version": "5.1.0-beta1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@sinclair/typebox": "0.33.22",
|
|
23
23
|
"@super-protocol/addons-tee": "^4.1.0",
|
|
24
|
-
"@super-protocol/pki-common": "
|
|
25
|
-
"@super-protocol/sp-nvtrust-wrapper": "^2.
|
|
24
|
+
"@super-protocol/pki-common": "5.1.0-beta1",
|
|
25
|
+
"@super-protocol/sp-nvtrust-wrapper": "^2.6.0"
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
28
|
"@super-protocol/sdk-js": "*"
|