@super-protocol/addons-tee 0.8.16-beta.3 → 0.8.17-beta.1

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.
Files changed (32) hide show
  1. package/bindings/amd-sev-snp-napi-rs/amd-sev-snp-napi-rs.linux-x64-gnu.node +0 -0
  2. package/bindings/amd-sev-snp-napi-rs/index.d.ts +13 -1
  3. package/bindings/amd-sev-snp-napi-rs/index.js +9 -2
  4. package/bindings/amd-sev-snp-napi-rs/package-lock.json +2 -5
  5. package/bindings/amd-sev-snp-napi-rs/package.json +1 -1
  6. package/bindings/utils/virtee/libsev.so +0 -0
  7. package/bindings/utils/virtee/snpguest +0 -0
  8. package/dist/sgx-native-module/consts.d.ts +1 -1
  9. package/dist/sgx-native-module/consts.js +4 -4
  10. package/dist/sgx-native-module/dcap-quote-verify.service.js +1 -1
  11. package/dist/sgx-native-module/enclave.service.d.ts +5 -4
  12. package/dist/sgx-native-module/enclave.service.js +1 -1
  13. package/dist/sgx-native-module/errors.js +1 -1
  14. package/dist/sgx-native-module/index.d.ts +1 -0
  15. package/dist/sgx-native-module/index.js +2 -1
  16. package/dist/sgx-native-module/pki.service.d.ts +2 -2
  17. package/dist/sgx-native-module/pki.service.js +4 -4
  18. package/dist/sgx-native-module/sev-snp-mrenclave.d.ts +63 -0
  19. package/dist/sgx-native-module/sev-snp-mrenclave.js +290 -0
  20. package/dist/sgx-native-module/sev-snp.d.ts +104 -10
  21. package/dist/sgx-native-module/sev-snp.js +355 -33
  22. package/package.json +13 -12
  23. package/dist/sgx-native-module/helpers/tryWithInterval.d.ts +0 -13
  24. package/dist/sgx-native-module/helpers/tryWithInterval.js +0 -39
  25. package/dist/sgx-native-module/sgx-tests.d.ts +0 -1
  26. package/dist/sgx-native-module/sgx-tests.js +0 -114
  27. package/dist/sgx-native-module/snp-tests.d.ts +0 -1
  28. package/dist/sgx-native-module/snp-tests.js +0 -45
  29. package/dist/sgx-native-module/tdx-tests.d.ts +0 -1
  30. package/dist/sgx-native-module/tdx-tests.js +0 -64
  31. package/test_snp_env/Dockerfile +0 -25
  32. package/test_snp_env/build-and-run-tests.sh +0 -11
@@ -26,42 +26,242 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.SevSNP = exports.SevSNPCertType = exports.SupportedAmdSevSnpGenerations = void 0;
29
+ exports.SevSNP = exports.getDefaultArkHashes = exports.ARK_GENOA = exports.ARK_MILAN = exports.EMPTY_INITRD_SHA256_HASH = exports.AMD_EPYC_MILAN_CPUINFO = exports.SevSNPCertType = exports.SupportedAmdSevSnpGenerations = void 0;
30
30
  const amd_sev_snp_napi_rs_1 = require("../../bindings/amd-sev-snp-napi-rs/");
31
- const tryWithInterval_1 = require("./helpers/tryWithInterval");
31
+ const sdk_js_1 = require("@super-protocol/sdk-js");
32
32
  const axios_1 = __importDefault(require("axios"));
33
33
  const pki_service_1 = require("./pki.service");
34
- const x509_1 = require("@fidm/x509");
34
+ const forge = __importStar(require("node-forge"));
35
35
  const fs = __importStar(require("fs/promises"));
36
36
  const path = __importStar(require("path"));
37
37
  const os = __importStar(require("os"));
38
38
  const child_process_1 = require("child_process");
39
+ const crypto_1 = require("crypto");
40
+ const msgpack5_1 = __importDefault(require("msgpack5"));
39
41
  var SupportedAmdSevSnpGenerations;
40
42
  (function (SupportedAmdSevSnpGenerations) {
41
43
  SupportedAmdSevSnpGenerations["Milan"] = "Milan";
42
44
  SupportedAmdSevSnpGenerations["Genoa"] = "Genoa";
43
- })(SupportedAmdSevSnpGenerations = exports.SupportedAmdSevSnpGenerations || (exports.SupportedAmdSevSnpGenerations = {}));
45
+ })(SupportedAmdSevSnpGenerations || (exports.SupportedAmdSevSnpGenerations = SupportedAmdSevSnpGenerations = {}));
44
46
  var SevSNPCertType;
45
47
  (function (SevSNPCertType) {
46
48
  SevSNPCertType["ARK"] = "ARK";
47
49
  SevSNPCertType["ASK"] = "ASK";
48
50
  SevSNPCertType["VCEK"] = "VCEK";
49
- })(SevSNPCertType = exports.SevSNPCertType || (exports.SevSNPCertType = {}));
51
+ })(SevSNPCertType || (exports.SevSNPCertType = SevSNPCertType = {}));
52
+ exports.AMD_EPYC_MILAN_CPUINFO = {
53
+ family: 25,
54
+ model: 1,
55
+ stepping: 1,
56
+ };
57
+ exports.EMPTY_INITRD_SHA256_HASH = Buffer.from("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "hex");
58
+ exports.ARK_MILAN = `-----BEGIN CERTIFICATE-----
59
+ MIIGYzCCBBKgAwIBAgIDAQAAMEYGCSqGSIb3DQEBCjA5oA8wDQYJYIZIAWUDBAIC
60
+ BQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAICBQCiAwIBMKMDAgEBMHsxFDAS
61
+ BgNVBAsMC0VuZ2luZWVyaW5nMQswCQYDVQQGEwJVUzEUMBIGA1UEBwwLU2FudGEg
62
+ Q2xhcmExCzAJBgNVBAgMAkNBMR8wHQYDVQQKDBZBZHZhbmNlZCBNaWNybyBEZXZp
63
+ Y2VzMRIwEAYDVQQDDAlBUkstTWlsYW4wHhcNMjAxMDIyMTcyMzA1WhcNNDUxMDIy
64
+ MTcyMzA1WjB7MRQwEgYDVQQLDAtFbmdpbmVlcmluZzELMAkGA1UEBhMCVVMxFDAS
65
+ BgNVBAcMC1NhbnRhIENsYXJhMQswCQYDVQQIDAJDQTEfMB0GA1UECgwWQWR2YW5j
66
+ ZWQgTWljcm8gRGV2aWNlczESMBAGA1UEAwwJQVJLLU1pbGFuMIICIjANBgkqhkiG
67
+ 9w0BAQEFAAOCAg8AMIICCgKCAgEA0Ld52RJOdeiJlqK2JdsVmD7FktuotWwX1fNg
68
+ W41XY9Xz1HEhSUmhLz9Cu9DHRlvgJSNxbeYYsnJfvyjx1MfU0V5tkKiU1EesNFta
69
+ 1kTA0szNisdYc9isqk7mXT5+KfGRbfc4V/9zRIcE8jlHN61S1ju8X93+6dxDUrG2
70
+ SzxqJ4BhqyYmUDruPXJSX4vUc01P7j98MpqOS95rORdGHeI52Naz5m2B+O+vjsC0
71
+ 60d37jY9LFeuOP4Meri8qgfi2S5kKqg/aF6aPtuAZQVR7u3KFYXP59XmJgtcog05
72
+ gmI0T/OitLhuzVvpZcLph0odh/1IPXqx3+MnjD97A7fXpqGd/y8KxX7jksTEzAOg
73
+ bKAeam3lm+3yKIcTYMlsRMXPcjNbIvmsBykD//xSniusuHBkgnlENEWx1UcbQQrs
74
+ +gVDkuVPhsnzIRNgYvM48Y+7LGiJYnrmE8xcrexekBxrva2V9TJQqnN3Q53kt5vi
75
+ Qi3+gCfmkwC0F0tirIZbLkXPrPwzZ0M9eNxhIySb2npJfgnqz55I0u33wh4r0ZNQ
76
+ eTGfw03MBUtyuzGesGkcw+loqMaq1qR4tjGbPYxCvpCq7+OgpCCoMNit2uLo9M18
77
+ fHz10lOMT8nWAUvRZFzteXCm+7PHdYPlmQwUw3LvenJ/ILXoQPHfbkH0CyPfhl1j
78
+ WhJFZasCAwEAAaN+MHwwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSFrBrRQ/fI
79
+ rFXUxR1BSKvVeErUUzAPBgNVHRMBAf8EBTADAQH/MDoGA1UdHwQzMDEwL6AtoCuG
80
+ KWh0dHBzOi8va2RzaW50Zi5hbWQuY29tL3ZjZWsvdjEvTWlsYW4vY3JsMEYGCSqG
81
+ SIb3DQEBCjA5oA8wDQYJYIZIAWUDBAICBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZI
82
+ AWUDBAICBQCiAwIBMKMDAgEBA4ICAQC6m0kDp6zv4Ojfgy+zleehsx6ol0ocgVel
83
+ ETobpx+EuCsqVFRPK1jZ1sp/lyd9+0fQ0r66n7kagRk4Ca39g66WGTJMeJdqYriw
84
+ STjjDCKVPSesWXYPVAyDhmP5n2v+BYipZWhpvqpaiO+EGK5IBP+578QeW/sSokrK
85
+ dHaLAxG2LhZxj9aF73fqC7OAJZ5aPonw4RE299FVarh1Tx2eT3wSgkDgutCTB1Yq
86
+ zT5DuwvAe+co2CIVIzMDamYuSFjPN0BCgojl7V+bTou7dMsqIu/TW/rPCX9/EUcp
87
+ KGKqPQ3P+N9r1hjEFY1plBg93t53OOo49GNI+V1zvXPLI6xIFVsh+mto2RtgEX/e
88
+ pmMKTNN6psW88qg7c1hTWtN6MbRuQ0vm+O+/2tKBF2h8THb94OvvHHoFDpbCELlq
89
+ HnIYhxy0YKXGyaW1NjfULxrrmxVW4wcn5E8GddmvNa6yYm8scJagEi13mhGu4Jqh
90
+ 3QU3sf8iUSUr09xQDwHtOQUVIqx4maBZPBtSMf+qUDtjXSSq8lfWcd8bLr9mdsUn
91
+ JZJ0+tuPMKmBnSH860llKk+VpVQsgqbzDIvOLvD6W1Umq25boxCYJ+TuBoa4s+HH
92
+ CViAvgT9kf/rBq1d+ivj6skkHxuzcxbk1xv6ZGxrteJxVH7KlX7YRdZ6eARKwLe4
93
+ AFZEAwoKCQ==
94
+ -----END CERTIFICATE-----`;
95
+ exports.ARK_GENOA = `-----BEGIN CERTIFICATE-----
96
+ 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
130
+ /wMz1R1BHg==
131
+ -----END CERTIFICATE-----`;
132
+ function getDefaultArkHashes() {
133
+ const ark_hashes = {};
134
+ ark_hashes["ARK-Milan"] = SevSNP.getCertHash({
135
+ type: SevSNPCertType.ARK,
136
+ format: pki_service_1.CertificateFormat.PEM,
137
+ cert: exports.ARK_MILAN,
138
+ });
139
+ ark_hashes["ARK-Genoa"] = SevSNP.getCertHash({
140
+ type: SevSNPCertType.ARK,
141
+ format: pki_service_1.CertificateFormat.PEM,
142
+ cert: exports.ARK_GENOA,
143
+ });
144
+ return ark_hashes;
145
+ }
146
+ exports.getDefaultArkHashes = getDefaultArkHashes;
50
147
  class SevSNP {
148
+ static serializeSNPReport(report) {
149
+ const msgpack = (0, msgpack5_1.default)();
150
+ return msgpack.encode(report).slice();
151
+ }
152
+ static deserializeSNPReport(serialized) {
153
+ let parsedReport;
154
+ try {
155
+ const msgpack = (0, msgpack5_1.default)();
156
+ parsedReport = msgpack.decode(serialized);
157
+ }
158
+ catch (e) {
159
+ throw new Error("Failed to decode Buffer" + e.message);
160
+ }
161
+ const requiredFields = [
162
+ {
163
+ key: "report",
164
+ type: "Buffer",
165
+ },
166
+ {
167
+ key: "cmdLineHash",
168
+ type: "Buffer",
169
+ },
170
+ {
171
+ key: "build",
172
+ type: "string",
173
+ },
174
+ {
175
+ key: "cpuSig",
176
+ type: "number",
177
+ },
178
+ {
179
+ key: "cores",
180
+ type: "number",
181
+ },
182
+ ];
183
+ for (const { key, type } of requiredFields) {
184
+ if (type === "Buffer") {
185
+ if (!Buffer.isBuffer(parsedReport[key])) {
186
+ throw new Error(`Invalid or missing field: ${key}`);
187
+ }
188
+ }
189
+ else {
190
+ if (typeof parsedReport[key] !== type) {
191
+ throw new Error(`Invalid or missing field: ${key}`);
192
+ }
193
+ }
194
+ }
195
+ if (!parsedReport.certs || !Array.isArray(parsedReport.certs))
196
+ throw new Error("Invalid or missing field: certs");
197
+ for (const cert of parsedReport.certs) {
198
+ if (!cert.format || typeof cert.format !== "string")
199
+ throw new Error("Invalid or missing field: cert.format");
200
+ if (!cert.type || typeof cert.type !== "string")
201
+ throw new Error("Invalid or missing field: cert.type");
202
+ if (!cert.cert || (typeof cert.cert !== "string" && !Buffer.isBuffer(cert.cert)))
203
+ throw new Error("Invalid or missing field: cert.cert");
204
+ }
205
+ const deserializedReport = {
206
+ ...parsedReport,
207
+ };
208
+ return deserializedReport;
209
+ }
51
210
  static convertCertToPem(cert) {
52
211
  const pemHeader = "-----BEGIN CERTIFICATE-----\n";
53
212
  const pemFooter = "\n-----END CERTIFICATE-----";
54
213
  if (cert.slice(0, pemHeader.length).compare(Buffer.from(pemHeader)) === 0) {
55
- return cert;
214
+ return cert.toString();
56
215
  }
57
216
  const formattedBase64 = cert
58
217
  .toString("base64")
59
218
  .match(/.{1,64}/g)
60
219
  ?.join("\n");
61
- return Buffer.from(pemHeader + formattedBase64 + pemFooter);
220
+ return pemHeader + formattedBase64 + pemFooter;
221
+ }
222
+ static convertPemToDer(cert) {
223
+ return Buffer.from(forge.pki.pemToDer(cert).getBytes(), "binary");
224
+ }
225
+ static splitCerts(certsPem) {
226
+ const certRegex = /-----BEGIN CERTIFICATE-----(?:\s|.)*?-----END CERTIFICATE-----/g;
227
+ const matches = certsPem.match(certRegex);
228
+ return Array.from(matches || []);
62
229
  }
63
- async generateSNPReport(userData, options) {
64
- const report = (0, amd_sev_snp_napi_rs_1.getSnpReport)(userData, 0);
230
+ static async readCmdLine() {
231
+ const data = await fs.readFile("/proc/cmdline", "utf-8");
232
+ // Workaround: VM in direct boot mode sometimes adds to the end of the cmdline initrd=initrd, need to remove it
233
+ return data.replace(/initrd=initrd\s*/, "");
234
+ }
235
+ /**
236
+ * Method for generation AMD SEV-SNP Report
237
+ * @param userData - The data that will be included in the report and will be signed
238
+ */
239
+ static async generateSNPReport(userData) {
240
+ if (userData.length > amd_sev_snp_napi_rs_1.SNP_REPORT_DATA_SIZE) {
241
+ throw new Error(`userData cannot exceed ${amd_sev_snp_napi_rs_1.SNP_REPORT_DATA_SIZE} bytes.`);
242
+ }
243
+ const paddedUserData = Buffer.alloc(64);
244
+ userData.copy(paddedUserData);
245
+ const report = (0, amd_sev_snp_napi_rs_1.getSnpReport)(paddedUserData, 0);
246
+ const cpuInfo = (0, amd_sev_snp_napi_rs_1.getCpuInfo)();
247
+ const cpuSig = (0, amd_sev_snp_napi_rs_1.getCpuSig)(cpuInfo);
248
+ const cores = (0, amd_sev_snp_napi_rs_1.getLogicalCoresCount)();
249
+ const cmdLine = await SevSNP.readCmdLine();
250
+ return {
251
+ report,
252
+ cpuSig,
253
+ cores,
254
+ cmdLineHash: SevSNP.calculateCmdlineHash(cmdLine),
255
+ build: SevSNP.extractBuildFromCmdline(cmdLine),
256
+ };
257
+ }
258
+ /**
259
+ * Method for fetch certificates from AMD KDS
260
+ * @param report - report generated by the `generateSNPReport` method
261
+ * @param options - options for working with HTTP, allows you to configure repetitions and the interval between them,
262
+ * as well as the format of the returned certificates
263
+ */
264
+ static async getReportChain(report, options) {
65
265
  const retryMax = options?.retryMax ?? 2;
66
266
  const retryInterval = options?.retryInterval ?? 10000;
67
267
  const certFormat = options?.certFormat ?? pki_service_1.CertificateFormat.DER;
@@ -72,9 +272,9 @@ class SevSNP {
72
272
  const generations = Object.values(SupportedAmdSevSnpGenerations);
73
273
  for (const generation of generations) {
74
274
  cpuGeneration = generation;
75
- const vcekUrl = (0, amd_sev_snp_napi_rs_1.getVcekKdsUrl)(report, generation);
275
+ const vcekUrl = (0, amd_sev_snp_napi_rs_1.getVcekKdsUrl)(report.report, generation);
76
276
  try {
77
- const response = await (0, tryWithInterval_1.tryWithInterval)({
277
+ const response = await sdk_js_1.helpers.tryWithInterval({
78
278
  checkResult(response) {
79
279
  return { isResultOk: response.status === 200 };
80
280
  },
@@ -104,14 +304,13 @@ class SevSNP {
104
304
  }
105
305
  }
106
306
  const pemVcek = SevSNP.convertCertToPem(vcek);
107
- const vcekCert = x509_1.Certificate.fromPEM(Buffer.from(pemVcek));
108
307
  certs.push({
109
308
  type: SevSNPCertType.VCEK,
110
309
  format: certFormat,
111
- cert: certFormat === pki_service_1.CertificateFormat.PEM ? pemVcek : vcekCert.raw,
310
+ cert: certFormat === pki_service_1.CertificateFormat.PEM ? pemVcek : SevSNP.convertPemToDer(pemVcek),
112
311
  });
113
312
  const caUrl = `${amd_sev_snp_napi_rs_1.KDS_CERT_SITE}/${amd_sev_snp_napi_rs_1.KDS_VCEK}/${cpuGeneration}/cert_chain`;
114
- const response = await (0, tryWithInterval_1.tryWithInterval)({
313
+ const response = await sdk_js_1.helpers.tryWithInterval({
115
314
  checkResult(response) {
116
315
  return { isResultOk: response.status === 200 };
117
316
  },
@@ -130,24 +329,33 @@ class SevSNP {
130
329
  retryInterval,
131
330
  retryMax,
132
331
  });
133
- const CAChain = x509_1.Certificate.fromPEMs(response.data.toString());
332
+ const CAChain = SevSNP.splitCerts(response.data.toString());
134
333
  if (CAChain.length !== 2) {
135
334
  throw new Error("Cert chain must have 2 certificates");
136
335
  }
137
336
  certs.push({
138
337
  type: SevSNPCertType.ARK,
139
338
  format: certFormat,
140
- cert: certFormat === pki_service_1.CertificateFormat.PEM ? SevSNP.convertCertToPem(CAChain[1].raw) : CAChain[1].raw,
339
+ cert: certFormat === pki_service_1.CertificateFormat.PEM ? CAChain[1] : SevSNP.convertPemToDer(CAChain[1]),
141
340
  });
142
341
  certs.push({
143
342
  type: SevSNPCertType.ASK,
144
343
  format: certFormat,
145
- cert: certFormat === pki_service_1.CertificateFormat.PEM ? SevSNP.convertCertToPem(CAChain[0].raw) : CAChain[0].raw,
344
+ cert: certFormat === pki_service_1.CertificateFormat.PEM ? CAChain[0] : SevSNP.convertPemToDer(CAChain[0]),
146
345
  });
346
+ return certs;
347
+ }
348
+ /**
349
+ * Method for generation AMD SEV-SNP Report and fetching certificates
350
+ * @param userData - @see generateSNPReport
351
+ * @param options - @see getReportChain
352
+ */
353
+ static async generateSNPReportWithChain(userData, options) {
354
+ const report = await SevSNP.generateSNPReport(userData);
355
+ const certs = await SevSNP.getReportChain(report, options);
147
356
  return {
148
- report,
149
- cpuGeneration,
150
- certs,
357
+ ...report,
358
+ certs: certs,
151
359
  };
152
360
  }
153
361
  static async runSubProcess(binaryPath, args = [], options = {}) {
@@ -160,7 +368,16 @@ class SevSNP {
160
368
  let stderr = "";
161
369
  subprocess.stdout?.on("data", (chunk) => (stdout += chunk.toString()));
162
370
  subprocess.stderr?.on("data", (chunk) => (stderr += chunk.toString()));
371
+ let timeoutId;
372
+ if (options.timeoutMs && options.timeoutMs > 0) {
373
+ timeoutId = setTimeout(() => {
374
+ subprocess.kill();
375
+ reject(new Error(`Process timed out after ${options.timeoutMs}ms`));
376
+ }, options.timeoutMs);
377
+ }
163
378
  subprocess.on("close", (exitCode) => {
379
+ if (timeoutId)
380
+ clearTimeout(timeoutId);
164
381
  resolve({
165
382
  exitCode: exitCode || 0,
166
383
  stdout,
@@ -168,11 +385,53 @@ class SevSNP {
168
385
  });
169
386
  });
170
387
  subprocess.on("error", (error) => {
388
+ if (timeoutId)
389
+ clearTimeout(timeoutId);
171
390
  reject(new Error(`Failed to start process: ${error.message}`));
172
391
  });
173
392
  });
174
393
  }
175
- async veriryReport(report) {
394
+ static getCertHash(cert) {
395
+ const hash = (0, crypto_1.createHash)("sha256");
396
+ if (cert.format === pki_service_1.CertificateFormat.PEM) {
397
+ hash.update(SevSNP.convertPemToDer(cert.cert));
398
+ }
399
+ else {
400
+ hash.update(cert.cert);
401
+ }
402
+ return hash.digest();
403
+ }
404
+ static isValidArk(ARK, trustedHashes) {
405
+ const ArkCert = forge.pki.certificateFromPem(ARK.format === pki_service_1.CertificateFormat.PEM ? ARK.cert : SevSNP.convertCertToPem(ARK.cert));
406
+ const ArkCN = ArkCert.subject.attributes.find((attr) => attr.name === "commonName")?.value;
407
+ if (!ArkCN) {
408
+ throw new Error("Can't extract CN from ARK certificate");
409
+ }
410
+ const ArkHash = SevSNP.getCertHash(ARK);
411
+ const TrustedHash = (trustedHashes && trustedHashes[ArkCN]) || Buffer.alloc(0);
412
+ return ArkHash.equals(TrustedHash);
413
+ }
414
+ /**
415
+ * AMD SEV-SNP verification method
416
+ * @param report - report with full certificate chain
417
+ * @param options - trustedHashes - map of trusted AMD ARK Certificates (CommonName as Key, Sha256 Hash of Der Certificate as Value) - optional
418
+ * timeoutMs - timeout of the utility snpnost in ms
419
+ * snpGuestBinaryPath - path for snpguest util
420
+ */
421
+ static async verifyReport(report, options) {
422
+ const trustedHashes = options?.trustedHashes ?? getDefaultArkHashes();
423
+ const timeoutMs = options?.timeoutMs ?? 10000;
424
+ const snpGuestBinaryPath = options?.snpGuestBinaryPath ?? path.resolve(__dirname, "../../bindings/utils/virtee/snpguest");
425
+ if (!path.isAbsolute(snpGuestBinaryPath)) {
426
+ throw new Error("snpGuestBinaryPath must be an absolute path");
427
+ }
428
+ const ARK = report.certs.find((cert) => cert.type === SevSNPCertType.ARK);
429
+ if (!ARK) {
430
+ throw new Error("Can't find ARK certificate in certificate chain");
431
+ }
432
+ if (!SevSNP.isValidArk(ARK, trustedHashes)) {
433
+ throw new Error("The supplied certificate chain contains an untrusted root certificate");
434
+ }
176
435
  const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "temp-"));
177
436
  try {
178
437
  for (const certEntry of report.certs) {
@@ -182,12 +441,7 @@ class SevSNP {
182
441
  }
183
442
  const reportPath = `${tempDir}/report.bin`;
184
443
  await fs.writeFile(reportPath, report.report);
185
- const snpguestRes = await SevSNP.runSubProcess(`${__dirname}/../../bindings/utils/virtee/snpguest`, [
186
- "verify",
187
- "attestation",
188
- tempDir,
189
- reportPath,
190
- ]);
444
+ const snpguestRes = await SevSNP.runSubProcess(snpGuestBinaryPath, ["verify", "attestation", tempDir, reportPath], { timeoutMs });
191
445
  if (snpguestRes.exitCode != 0) {
192
446
  throw new Error(`Error validating report. Output: ${snpguestRes.stdout}\n${snpguestRes.stderr}`);
193
447
  }
@@ -198,14 +452,82 @@ class SevSNP {
198
452
  force: true,
199
453
  });
200
454
  }
201
- return true;
202
455
  }
203
- async getMrEnclave(report) {
204
- return (0, amd_sev_snp_napi_rs_1.getMrenclave)(report.report);
456
+ static calcMrEnclave(measure, vmpl, policy) {
457
+ const hash = (0, crypto_1.createHash)("sha256");
458
+ hash.update(measure);
459
+ const vmplBuf = Buffer.alloc(4);
460
+ vmplBuf.writeUInt32LE(vmpl, 0);
461
+ hash.update(vmplBuf);
462
+ const policyBuf = Buffer.alloc(8);
463
+ policyBuf.writeBigUint64LE(policy, 0);
464
+ hash.update(policyBuf);
465
+ return hash.digest();
466
+ }
467
+ /**
468
+ * Method for obtaining mrEnclave from report. MrEnclave includes report measure, report vmpl and report policy
469
+ * @param report - report without certificates
470
+ */
471
+ static getMrEnclave(report) {
472
+ const measure = (0, amd_sev_snp_napi_rs_1.getReportMeasure)(report);
473
+ const vmpl = (0, amd_sev_snp_napi_rs_1.getReportVmpl)(report);
474
+ const policy = (0, amd_sev_snp_napi_rs_1.getReportPolicy)(report);
475
+ return SevSNP.calcMrEnclave(measure, vmpl, policy);
476
+ }
477
+ /**
478
+ * Method for obtaining reportData. This data was passed when generating the report
479
+ * @param report - report without certificates
480
+ */
481
+ static async getReportData(report) {
482
+ return (0, amd_sev_snp_napi_rs_1.getReportData)(report);
483
+ }
484
+ /**
485
+ * Method for obtaining measure. Please do not confuse with mrenclave. Report measure is part of mrEnclave.
486
+ * @param report - report without certificates
487
+ */
488
+ static async getReportMeasure(report) {
489
+ return (0, amd_sev_snp_napi_rs_1.getReportMeasure)(report);
490
+ }
491
+ static async calculateFileSha256(filePath) {
492
+ const fileData = await fs.readFile(filePath);
493
+ const hash = (0, crypto_1.createHash)("sha256");
494
+ hash.update(fileData);
495
+ return hash.digest();
496
+ }
497
+ static calculateCmdlineHash(cmdLine) {
498
+ const cmdLineBytes = Buffer.concat([Buffer.from(cmdLine.trim(), "utf-8"), Buffer.from([0])]);
499
+ const hash = (0, crypto_1.createHash)("sha256");
500
+ hash.update(cmdLineBytes);
501
+ return hash.digest();
502
+ }
503
+ /**
504
+ * The method allows to get the expected mrEnclave without generating a report
505
+ * @param params - @see CalcSnpMrEnclaveParams
506
+ */
507
+ static async calcSnpMrEnclave(params) {
508
+ const measure = (0, amd_sev_snp_napi_rs_1.calcSnpMeasure)(params.ovmfPath, params.kernelHash, params.initrdHash ?? exports.EMPTY_INITRD_SHA256_HASH, params.cmdLineHash, params.vcpuSig, params.vcpuCount);
509
+ return SevSNP.calcMrEnclave(measure, params.vmpl ?? 0, params.policy ?? BigInt(0x30000));
510
+ }
511
+ static extractBuildFromCmdline(cmdLine, paramName = "build") {
512
+ const regex = new RegExp(`${paramName}=([^\\s]+)`);
513
+ const match = cmdLine.match(regex);
514
+ if (match) {
515
+ return match[1];
516
+ }
517
+ else {
518
+ throw new Error(`${paramName} parameter not found`);
519
+ }
205
520
  }
206
- async getReportData(report) {
207
- return (0, amd_sev_snp_napi_rs_1.getReportData)(report.report);
521
+ /**
522
+ * Compute the 32-bit CPUID signature from family, model, and stepping.
523
+ * This computation is described in AMD's CPUID Specification, publication #25481
524
+ * https://www.amd.com/system/files/TechDocs/25481.pdf
525
+ * See section: CPUID Fn0000_0001_EAX Family, Model, Stepping Identifiers
526
+ * @param cpuInfo - Structure containing family, model and stepping @see CpuInfo
527
+ */
528
+ static getCpuSig(cpuInfo) {
529
+ return (0, amd_sev_snp_napi_rs_1.getCpuSig)(cpuInfo);
208
530
  }
209
531
  }
210
532
  exports.SevSNP = SevSNP;
211
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V2LXNucC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZ3gtbmF0aXZlLW1vZHVsZS9zZXYtc25wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkVBTzZDO0FBQzdDLCtEQUE0RDtBQUM1RCxrREFBNkM7QUFDN0MsK0NBQWtEO0FBQ2xELHFDQUF5QztBQUV6QyxnREFBa0M7QUFDbEMsMkNBQTZCO0FBQzdCLHVDQUF5QjtBQUN6QixpREFBc0M7QUFFdEMsSUFBWSw2QkFHWDtBQUhELFdBQVksNkJBQTZCO0lBQ3JDLGdEQUFlLENBQUE7SUFDZixnREFBZSxDQUFBO0FBQ25CLENBQUMsRUFIVyw2QkFBNkIsR0FBN0IscUNBQTZCLEtBQTdCLHFDQUE2QixRQUd4QztBQUVELElBQVksY0FJWDtBQUpELFdBQVksY0FBYztJQUN0Qiw2QkFBVyxDQUFBO0lBQ1gsNkJBQVcsQ0FBQTtJQUNYLCtCQUFhLENBQUE7QUFDakIsQ0FBQyxFQUpXLGNBQWMsR0FBZCxzQkFBYyxLQUFkLHNCQUFjLFFBSXpCO0FBWUQsTUFBYSxNQUFNO0lBQ1AsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQVk7UUFDeEMsTUFBTSxTQUFTLEdBQUcsK0JBQStCLENBQUM7UUFDbEQsTUFBTSxTQUFTLEdBQUcsNkJBQTZCLENBQUM7UUFFaEQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDdkUsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELE1BQU0sZUFBZSxHQUFHLElBQUk7YUFDdkIsUUFBUSxDQUFDLFFBQVEsQ0FBQzthQUNsQixLQUFLLENBQUMsVUFBVSxDQUFDO1lBQ2xCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FB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
533
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V2LXNucC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZ3gtbmF0aXZlLW1vZHVsZS9zZXYtc25wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkVBZTZDO0FBQzdDLG1EQUErRDtBQUMvRCxrREFBNkM7QUFDN0MsK0NBQWtEO0FBQ2xELGtEQUFvQztBQUVwQyxnREFBa0M7QUFDbEMsMkNBQTZCO0FBQzdCLHVDQUF5QjtBQUN6QixpREFBc0M7QUFDdEMsbUNBQW9DO0FBQ3BDLHdEQUFnQztBQUVoQyxJQUFZLDZCQUdYO0FBSEQsV0FBWSw2QkFBNkI7SUFDckMsZ0RBQWUsQ0FBQTtJQUNmLGdEQUFlLENBQUE7QUFDbkIsQ0FBQyxFQUhXLDZCQUE2Qiw2Q0FBN0IsNkJBQTZCLFFBR3hDO0FBRUQsSUFBWSxjQUlYO0FBSkQsV0FBWSxjQUFjO0lBQ3RCLDZCQUFXLENBQUE7SUFDWCw2QkFBVyxDQUFBO0lBQ1gsK0JBQWEsQ0FBQTtBQUNqQixDQUFDLEVBSlcsY0FBYyw4QkFBZCxjQUFjLFFBSXpCO0FBOEJZLFFBQUEsc0JBQXNCLEdBQVk7SUFDM0MsTUFBTSxFQUFFLEVBQUU7SUFDVixLQUFLLEVBQUUsQ0FBQztJQUNSLFFBQVEsRUFBRSxDQUFDO0NBQ2QsQ0FBQztBQUVXLFFBQUEsd0JBQXdCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FDL0Msa0VBQWtFLEVBQ2xFLEtBQUssQ0FDUixDQUFDO0FBR1csUUFBQSxTQUFTLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzswQkFvQ0MsQ0FBQztBQUVkLFFBQUEsU0FBUyxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEJBb0NDLENBQUM7QUFFM0IsU0FBZ0IsbUJBQW1CO0lBQy9CLE1BQU0sVUFBVSxHQUE4QixFQUFFLENBQUM7SUFFakQsVUFBVSxDQUFDLFdBQVcsQ0FBQyxH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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@super-protocol/addons-tee",
3
- "version": "0.8.16-beta.3",
3
+ "version": "0.8.17-beta.1",
4
4
  "description": "The TEE trusted loader addons",
5
5
  "tags": [
6
6
  "tee"
@@ -38,25 +38,26 @@
38
38
  "test:debug": "node --inspect-brk node_modules/.bin/jest -i"
39
39
  },
40
40
  "dependencies": {
41
- "@fidm/x509": "^1.2.1",
41
+ "@super-protocol/eslint-config-typescript": "2.0.1",
42
42
  "asn1-tree": "^0.1.1",
43
- "axios": "^0.24.0"
43
+ "msgpack5": "^6.0.2",
44
+ "node-forge": "^1.3.1"
45
+ },
46
+ "peerDependencies": {
47
+ "@super-protocol/dto-js": ">=1.0.0-beta.0 <2.0",
48
+ "@super-protocol/sdk-js": ">=3.0.5 <4.0",
49
+ "axios": "^1.5.1"
44
50
  },
45
51
  "devDependencies": {
46
52
  "@peculiar/x509": "^1.9.3",
47
53
  "@types/jest": "^27.5.2",
48
54
  "@types/lodash": "^4.17.5",
55
+ "@types/msgpack5": "^3.4.6",
49
56
  "@types/node": "^17.0.0",
50
- "@typescript-eslint/eslint-plugin": "^5.8.0",
51
- "@typescript-eslint/parser": "^5.8.0",
52
- "eslint": "^8.5.0",
53
- "eslint-config-prettier": "^8.3.0",
54
- "eslint-plugin-prettier": "^4.0.0",
55
- "jest": "^27.5.1",
57
+ "@types/node-forge": "^1.3.1",
58
+ "jest": "^29.7.0",
56
59
  "nodemon": "^2.0.15",
57
- "prettier": "^2.5.1",
58
- "ts-jest": "^27.1.5",
59
- "typescript": "^4.5.4"
60
+ "ts-jest": "^29.1.2"
60
61
  },
61
62
  "jest": {
62
63
  "moduleFileExtensions": [
@@ -1,13 +0,0 @@
1
- export interface TryWithIntervalParams<T> {
2
- handler: () => Promise<T>;
3
- checkResult?: (result: T) => {
4
- isResultOk: boolean;
5
- };
6
- checkError?: (err: unknown) => {
7
- retryable: boolean;
8
- };
9
- startDelay?: number;
10
- retryInterval: number;
11
- retryMax: number;
12
- }
13
- export declare const tryWithInterval: <T>(params: TryWithIntervalParams<T>) => Promise<T>;
@@ -1,39 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.tryWithInterval = void 0;
4
- const tryWithInterval = async (params) => {
5
- let checkedTimes = 0;
6
- const { handler, checkResult, checkError, startDelay = 0, retryInterval, retryMax } = params;
7
- const reachedMaxRetries = () => checkedTimes >= retryMax;
8
- return await new Promise((resolve, reject) => {
9
- const scheduleNewIteration = (delay) => {
10
- checkedTimes += 1;
11
- setTimeout(timeoutFn, delay);
12
- };
13
- const timeoutFn = async () => {
14
- try {
15
- const result = await handler();
16
- const isResultOk = checkResult ? checkResult(result).isResultOk : true;
17
- if (isResultOk) {
18
- resolve(result);
19
- return;
20
- }
21
- if (reachedMaxRetries()) {
22
- reject(new Error(`${exports.tryWithInterval.name}: MaxCheck count reached!`));
23
- return;
24
- }
25
- }
26
- catch (err) {
27
- const isErrorRetryable = checkError ? checkError(err).retryable : true;
28
- if (!isErrorRetryable || reachedMaxRetries()) {
29
- reject(err);
30
- return;
31
- }
32
- }
33
- scheduleNewIteration(retryInterval);
34
- };
35
- scheduleNewIteration(startDelay);
36
- });
37
- };
38
- exports.tryWithInterval = tryWithInterval;
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ5V2l0aEludGVydmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NneC1uYXRpdmUtbW9kdWxlL2hlbHBlcnMvdHJ5V2l0aEludGVydmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVdPLE1BQU0sZUFBZSxHQUFHLEtBQUssRUFBSyxNQUFnQyxFQUFjLEVBQUU7SUFDckYsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxVQUFVLEdBQUcsQ0FBQyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFN0YsTUFBTSxpQkFBaUIsR0FBRyxHQUFZLEVBQUUsQ0FBQyxZQUFZLElBQUksUUFBUSxDQUFDO0lBRWxFLE9BQU8sTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUN6QyxNQUFNLG9CQUFvQixHQUFHLENBQUMsS0FBYSxFQUFRLEVBQUU7WUFDakQsWUFBWSxJQUFJLENBQUMsQ0FBQztZQUNsQixVQUFVLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQztRQUVGLE1BQU0sU0FBUyxHQUFHLEtBQUssSUFBbUIsRUFBRTtZQUN4QyxJQUFJO2dCQUNBLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxFQUFFLENBQUM7Z0JBQy9CLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUN2RSxJQUFJLFVBQVUsRUFBRTtvQkFDWixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBRWhCLE9BQU87aUJBQ1Y7Z0JBQ0QsSUFBSSxpQkFBaUIsRUFBRSxFQUFFO29CQUNyQixNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyx1QkFBZSxDQUFDLElBQUksMkJBQTJCLENBQUMsQ0FBQyxDQUFDO29CQUV0RSxPQUFPO2lCQUNWO2FBQ0o7WUFBQyxPQUFPLEdBQUcsRUFBRTtnQkFDVixNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUN2RSxJQUFJLENBQUMsZ0JBQWdCLElBQUksaUJBQWlCLEVBQUUsRUFBRTtvQkFDMUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUVaLE9BQU87aUJBQ1Y7YUFDSjtZQUVELG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQztRQUVGLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JDLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDO0FBeENXLFFBQUEsZUFBZSxtQkF3QzFCIn0=
@@ -1 +0,0 @@
1
- export {};