@super-protocol/pki-attestation-engine 5.0.3 → 5.0.5
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.
|
@@ -2,6 +2,19 @@
|
|
|
2
2
|
import { NvidiaCCToken, Log } from '@super-protocol/pki-common';
|
|
3
3
|
export declare class ChallengeNvidiaCCHelper {
|
|
4
4
|
private static getNvidiaToken;
|
|
5
|
+
/**
|
|
6
|
+
* Reports how the GPUs can reach each other's memory.
|
|
7
|
+
*
|
|
8
|
+
* A PCIe or unidentified peer path carries traffic outside the encrypted
|
|
9
|
+
* CPU-GPU channel and nothing can vouch for it, so it is rejected here.
|
|
10
|
+
* NVLink is only reported: whether it is acceptable depends on attesting
|
|
11
|
+
* the NVSwitch fabric, which the caller decides.
|
|
12
|
+
*
|
|
13
|
+
* @returns whether any GPU pair is linked over NVLink
|
|
14
|
+
* @throws if a peer path bypasses the encrypted channel, or if NVML cannot
|
|
15
|
+
* be queried
|
|
16
|
+
*/
|
|
17
|
+
private static checkGpuInterconnect;
|
|
5
18
|
static getTokenHash(token: NvidiaCCToken): Buffer;
|
|
6
19
|
static getTokenAndCombinedChallengeData(baseUserData: Buffer, logger?: Log): Promise<{
|
|
7
20
|
nvidiaTokens: NvidiaCCToken | undefined;
|
|
@@ -19,6 +19,16 @@ class ChallengeNvidiaCCHelper {
|
|
|
19
19
|
gpuCount: topology.gpuCount,
|
|
20
20
|
nvswitchCount: topology.nvswitchCount,
|
|
21
21
|
});
|
|
22
|
+
if (topology.gpuCount > 1) {
|
|
23
|
+
const { hasNvlink } = await ChallengeNvidiaCCHelper.checkGpuInterconnect(wrapper, log);
|
|
24
|
+
if (hasNvlink) {
|
|
25
|
+
// TODO: attest the NVSwitch fabric here, then allow the run.
|
|
26
|
+
// The whole fabric must be attested rather than individual
|
|
27
|
+
// pairs: NVML cannot map a GPU pair onto the switch its
|
|
28
|
+
// traffic crosses, and a single unattested switch taints it.
|
|
29
|
+
throw new Error('NVLink interconnect detected but NVSwitch attestation is not supported');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
22
32
|
if (!topology.gpuCount) {
|
|
23
33
|
log?.info('Challenge NVIDIA token present: false');
|
|
24
34
|
log?.info('NVIDIA token retrieval skipped: no GPUs detected in topology');
|
|
@@ -66,6 +76,47 @@ class ChallengeNvidiaCCHelper {
|
|
|
66
76
|
throw error;
|
|
67
77
|
}
|
|
68
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* Reports how the GPUs can reach each other's memory.
|
|
81
|
+
*
|
|
82
|
+
* A PCIe or unidentified peer path carries traffic outside the encrypted
|
|
83
|
+
* CPU-GPU channel and nothing can vouch for it, so it is rejected here.
|
|
84
|
+
* NVLink is only reported: whether it is acceptable depends on attesting
|
|
85
|
+
* the NVSwitch fabric, which the caller decides.
|
|
86
|
+
*
|
|
87
|
+
* @returns whether any GPU pair is linked over NVLink
|
|
88
|
+
* @throws if a peer path bypasses the encrypted channel, or if NVML cannot
|
|
89
|
+
* be queried
|
|
90
|
+
*/
|
|
91
|
+
static async checkGpuInterconnect(wrapper, log) {
|
|
92
|
+
const links = await wrapper.getGpuInterconnect();
|
|
93
|
+
const describe = (type) => sp_nvtrust_wrapper_1.GpuInterconnectLinkType[type] ?? String(type);
|
|
94
|
+
const format = (subset) => subset
|
|
95
|
+
.map((link) => `${link.bdf1} <-> ${link.bdf2}: ${describe(link.type)}`)
|
|
96
|
+
.join('; ');
|
|
97
|
+
log?.debug('GPU interconnect checked', {
|
|
98
|
+
pairs: links.map((link) => ({
|
|
99
|
+
bdf1: link.bdf1,
|
|
100
|
+
bdf2: link.bdf2,
|
|
101
|
+
type: describe(link.type),
|
|
102
|
+
})),
|
|
103
|
+
});
|
|
104
|
+
const connected = links.filter((link) => link.type !== sp_nvtrust_wrapper_1.GpuInterconnectLinkType.GPU_INTERCONNECT_LINK_TYPE_NONE);
|
|
105
|
+
if (connected.length === 0) {
|
|
106
|
+
log?.info('GPUs are isolated: no direct interconnect detected');
|
|
107
|
+
return { hasNvlink: false };
|
|
108
|
+
}
|
|
109
|
+
const bypassing = connected.filter((link) => link.type !== sp_nvtrust_wrapper_1.GpuInterconnectLinkType.GPU_INTERCONNECT_LINK_TYPE_NVLINK);
|
|
110
|
+
if (bypassing.length > 0) {
|
|
111
|
+
const details = format(bypassing);
|
|
112
|
+
log?.error('GPU interconnect bypasses the encrypted channel', {
|
|
113
|
+
links: details,
|
|
114
|
+
});
|
|
115
|
+
throw new Error(`Unsupported direct GPU interconnect detected: ${details}`);
|
|
116
|
+
}
|
|
117
|
+
log?.warn('NVLink interconnect detected', { links: format(connected) });
|
|
118
|
+
return { hasNvlink: true };
|
|
119
|
+
}
|
|
69
120
|
static getTokenHash(token) {
|
|
70
121
|
const hash = (0, crypto_1.createHash)('sha256');
|
|
71
122
|
hash.update(JSON.stringify(token));
|
|
@@ -92,4 +143,4 @@ class ChallengeNvidiaCCHelper {
|
|
|
92
143
|
}
|
|
93
144
|
}
|
|
94
145
|
exports.ChallengeNvidiaCCHelper = ChallengeNvidiaCCHelper;
|
|
95
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbGxlbmdlTnZpZGlhQ0NIZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhbGxlbmdlUHJvdmlkZXIvY2hhbGxlbmdlTnZpZGlhQ0NIZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkVBTTRDO0FBRTVDLG1DQUFvQztBQUVwQyxNQUFhLHVCQUF1QjtJQUN4QixNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FDL0IsTUFBWTtRQUVaLE1BQU0sR0FBRyxHQUFHLE1BQU0sRUFBRSxLQUFLLENBQUM7WUFDdEIsTUFBTSxFQUFFLHlCQUF5QjtTQUNwQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUM7WUFDRCw4QkFBOEI7WUFDOUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxtQ0FBYyxFQUFFLENBQUM7WUFDckMsR0FBRyxFQUFFLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDbEMsR0FBRyxFQUFFLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1lBRTlDLE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2hELEdBQUcsRUFBRSxLQUFLLENBQUMsOEJBQThCLEVBQUU7Z0JBQ3ZDLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtnQkFDM0IsYUFBYSxFQUFFLFFBQVEsQ0FBQyxhQUFhO2FBQ3hDLENBQUMsQ0FBQztZQUVILElBQUksUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUNmLE1BQU0sdUJBQXVCLENBQUMsb0JBQW9CLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNyRSxJQUFJLFNBQVMsRUFBRSxDQUFDO29CQUNaLDZEQUE2RDtvQkFDN0QsMkRBQTJEO29CQUMzRCx3REFBd0Q7b0JBQ3hELDZEQUE2RDtv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
|
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.0.5",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"@sinclair/typebox": "0.33.22",
|
|
23
23
|
"@super-protocol/addons-tee": "^4.1.0",
|
|
24
24
|
"@super-protocol/pki-common": "^5.0.1",
|
|
25
|
-
"@super-protocol/sp-nvtrust-wrapper": "^2.
|
|
25
|
+
"@super-protocol/sp-nvtrust-wrapper": "^2.3.0"
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
28
|
"@super-protocol/sdk-js": "*"
|