@super-protocol/addons-tee 2.0.0 → 2.0.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.
- package/bindings/amd-sev-snp-napi-rs/amd-sev-snp-napi-rs.linux-x64-gnu.node +0 -0
- package/bindings/amd-sev-snp-napi-rs/index.d.ts +51 -0
- package/bindings/amd-sev-snp-napi-rs/index.js +339 -0
- package/bindings/nvidia-native/build/Release/libnvat.so.1.1.0 +0 -0
- package/bindings/nvidia-native/build/Release/nvidia_native.node +0 -0
- package/bindings/sgx-native/build/Release/libmbedcrypto_gramine.so.15 +0 -0
- package/bindings/sgx-native/build/Release/libmbedx509_gramine.so.6 +0 -0
- package/bindings/sgx-native/build/Release/libsgx_dcap_quoteverify.so.1 +0 -0
- package/bindings/sgx-native/build/Release/libtdx_attest.so.1 +0 -0
- package/bindings/sgx-native/build/Release/sgx_native.node +0 -0
- package/bindings/usr/lib/node_modules/node-addon-api/node_api.Makefile +6 -0
- package/bindings/usr/lib/node_modules/node-addon-api/nothing.target.mk +159 -0
- package/bindings/utils/virtee/LICENSE +201 -0
- package/bindings/utils/virtee/libsev.so +0 -0
- package/bindings/utils/virtee/snpguest +0 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +29 -1
- package/dist/nvidia-native-module/nvidia-attestation.d.ts +146 -0
- package/dist/nvidia-native-module/nvidia-attestation.js +374 -0
- package/dist/nvidia-native-module/nvidia-debug-state-policy.rego +45 -0
- package/dist/nvidia-native-module/nvidia-detailed-policy.rego +205 -0
- package/dist/proto/AmdSevSnp.d.ts +194 -0
- package/dist/proto/AmdSevSnp.js +363 -0
- package/dist/sgx-native-module/consts.d.ts +24 -0
- package/dist/sgx-native-module/consts.js +38 -0
- package/dist/sgx-native-module/dcap-quote-verify.service.d.ts +12 -0
- package/dist/sgx-native-module/dcap-quote-verify.service.js +84 -0
- package/dist/sgx-native-module/enclave.service.d.ts +93 -0
- package/dist/sgx-native-module/enclave.service.js +211 -0
- package/dist/sgx-native-module/errors.d.ts +19 -0
- package/dist/sgx-native-module/errors.js +69 -0
- package/dist/sgx-native-module/helpers.d.ts +1 -0
- package/dist/sgx-native-module/helpers.js +50 -0
- package/dist/sgx-native-module/index.d.ts +9 -0
- package/dist/sgx-native-module/index.js +26 -0
- package/dist/sgx-native-module/pki.service.d.ts +50 -0
- package/dist/sgx-native-module/pki.service.js +74 -0
- package/dist/sgx-native-module/sev-snp-mrenclave.d.ts +59 -0
- package/dist/sgx-native-module/sev-snp-mrenclave.js +322 -0
- package/dist/sgx-native-module/sev-snp-schema.d.ts +22 -0
- package/dist/sgx-native-module/sev-snp-schema.js +24 -0
- package/dist/sgx-native-module/sev-snp.d.ts +127 -0
- package/dist/sgx-native-module/sev-snp.js +513 -0
- package/package.json +1 -1
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PkiService = exports.ECPCurve = exports.CertificateFormat = exports.CertificateKeyType = void 0;
|
|
4
|
+
const { CryptoPrimitives } = require("../../bindings/sgx-native/build/Release/sgx_native.node");
|
|
5
|
+
var CertificateKeyType;
|
|
6
|
+
(function (CertificateKeyType) {
|
|
7
|
+
CertificateKeyType["RSA"] = "RSA";
|
|
8
|
+
CertificateKeyType["ECP"] = "ECP";
|
|
9
|
+
})(CertificateKeyType || (exports.CertificateKeyType = CertificateKeyType = {}));
|
|
10
|
+
var CertificateFormat;
|
|
11
|
+
(function (CertificateFormat) {
|
|
12
|
+
CertificateFormat["PEM"] = "PEM";
|
|
13
|
+
CertificateFormat["DER"] = "DER";
|
|
14
|
+
})(CertificateFormat || (exports.CertificateFormat = CertificateFormat = {}));
|
|
15
|
+
var ECPCurve;
|
|
16
|
+
(function (ECPCurve) {
|
|
17
|
+
ECPCurve["SECP192R1"] = "SECP192R1"; /*!< Domain parameters for the 192-bit curve defined by FIPS 186-4 and SEC1. */
|
|
18
|
+
ECPCurve["SECP224R1"] = "SECP224R1"; /*!< Domain parameters for the 224-bit curve defined by FIPS 186-4 and SEC1. */
|
|
19
|
+
ECPCurve["SECP256R1"] = "SECP256R1"; /*!< Domain parameters for the 256-bit curve defined by FIPS 186-4 and SEC1. */
|
|
20
|
+
ECPCurve["SECP384R1"] = "SECP384R1"; /*!< Domain parameters for the 384-bit curve defined by FIPS 186-4 and SEC1. */
|
|
21
|
+
ECPCurve["SECP521R1"] = "SECP521R1"; /*!< Domain parameters for the 521-bit curve defined by FIPS 186-4 and SEC1. */
|
|
22
|
+
ECPCurve["BP256R1"] = "BP256R1"; /*!< Domain parameters for 256-bit Brainpool curve. */
|
|
23
|
+
ECPCurve["BP384R1"] = "BP384R1"; /*!< Domain parameters for 384-bit Brainpool curve. */
|
|
24
|
+
ECPCurve["BP512R1"] = "BP512R1"; /*!< Domain parameters for 512-bit Brainpool curve. */
|
|
25
|
+
// @TODO: MBEDTLS NOT SUPPORT EXRPORT CURVE25519 = "CURVE25519", /*!< Domain parameters for Curve25519. */
|
|
26
|
+
ECPCurve["SECP192K1"] = "SECP192K1"; /*!< Domain parameters for 192-bit "Koblitz" curve. */
|
|
27
|
+
ECPCurve["SECP224K1"] = "SECP224K1"; /*!< Domain parameters for 224-bit "Koblitz" curve. */
|
|
28
|
+
ECPCurve["SECP256K1"] = "SECP256K1"; /*!< Domain parameters for 256-bit "Koblitz" curve. */
|
|
29
|
+
// @TODO: MBEDTLS NOT SUPPORT EXRPORT CURVE448 = "CURVE448", /*!< Domain parameters for Curve448. */
|
|
30
|
+
})(ECPCurve || (exports.ECPCurve = ECPCurve = {}));
|
|
31
|
+
class PkiService {
|
|
32
|
+
constructor() {
|
|
33
|
+
this.cryptoPrimitives = new CryptoPrimitives();
|
|
34
|
+
}
|
|
35
|
+
async generateTlsCertificate(params = {}) {
|
|
36
|
+
const subject = {
|
|
37
|
+
commonName: params.subject?.commonName ?? "localhost",
|
|
38
|
+
countryName: params.subject?.countryName ?? "US",
|
|
39
|
+
state: params.subject?.state ?? "New York",
|
|
40
|
+
localityName: params.subject?.localityName ?? "New York",
|
|
41
|
+
organizationName: params.subject?.organizationName ?? "SuperProtocol",
|
|
42
|
+
organizationUnit: params.subject?.organizationUnit ?? "TEE",
|
|
43
|
+
};
|
|
44
|
+
const format = params.format ?? CertificateFormat.PEM;
|
|
45
|
+
const keyType = params.keyType ?? CertificateKeyType.RSA;
|
|
46
|
+
let rsaKeyBits;
|
|
47
|
+
let ecpCurve;
|
|
48
|
+
if (keyType === CertificateKeyType.RSA) {
|
|
49
|
+
rsaKeyBits = params.rsaKeyBits ?? 3072;
|
|
50
|
+
}
|
|
51
|
+
else if (keyType === CertificateKeyType.ECP) {
|
|
52
|
+
ecpCurve = params.ecpCurve ?? ECPCurve.SECP384R1;
|
|
53
|
+
}
|
|
54
|
+
const withQuote = params.withQuote ?? false;
|
|
55
|
+
const serialNumber = params.serialNumber ?? "01";
|
|
56
|
+
const days = params.days ?? 365;
|
|
57
|
+
const dnsNames = params.dnsNames ?? [];
|
|
58
|
+
const ips = params.ips ?? [];
|
|
59
|
+
return this.cryptoPrimitives.GenerateTlsCertificate({
|
|
60
|
+
format,
|
|
61
|
+
subject,
|
|
62
|
+
keyType,
|
|
63
|
+
withQuote,
|
|
64
|
+
rsaKeyBits,
|
|
65
|
+
ecpCurve,
|
|
66
|
+
serialNumber,
|
|
67
|
+
days,
|
|
68
|
+
dnsNames,
|
|
69
|
+
ips,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
exports.PkiService = PkiService;
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGtpLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2d4LW5hdGl2ZS1tb2R1bGUvcGtpLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsTUFBTSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsT0FBTyxDQUFDLHlEQUF5RCxDQUFDLENBQUM7QUFPaEcsSUFBWSxrQkFHWDtBQUhELFdBQVksa0JBQWtCO0lBQzFCLGlDQUFXLENBQUE7SUFDWCxpQ0FBVyxDQUFBO0FBQ2YsQ0FBQyxFQUhXLGtCQUFrQixrQ0FBbEIsa0JBQWtCLFFBRzdCO0FBRUQsSUFBWSxpQkFHWDtBQUhELFdBQVksaUJBQWlCO0lBQ3pCLGdDQUFXLENBQUE7SUFDWCxnQ0FBVyxDQUFBO0FBQ2YsQ0FBQyxFQUhXLGlCQUFpQixpQ0FBakIsaUJBQWlCLFFBRzVCO0FBRUQsSUFBWSxRQWNYO0FBZEQsV0FBWSxRQUFRO0lBQ2hCLG1DQUF1QixDQUFBLENBQUMsK0VBQStFO0lBQ3ZHLG1DQUF1QixDQUFBLENBQUMsK0VBQStFO0lBQ3ZHLG1DQUF1QixDQUFBLENBQUMsK0VBQStFO0lBQ3ZHLG1DQUF1QixDQUFBLENBQUMsK0VBQStFO0lBQ3ZHLG1DQUF1QixDQUFBLENBQUMsK0VBQStFO0lBQ3ZHLCtCQUFtQixDQUFBLENBQUMsc0RBQXNEO0lBQzFFLCtCQUFtQixDQUFBLENBQUMsc0RBQXNEO0lBQzFFLCtCQUFtQixDQUFBLENBQUMsc0RBQXNEO0lBQzFFLDBHQUEwRztJQUMxRyxtQ0FBdUIsQ0FBQSxDQUFDLHNEQUFzRDtJQUM5RSxtQ0FBdUIsQ0FBQSxDQUFDLHNEQUFzRDtJQUM5RSxtQ0FBdUIsQ0FBQSxDQUFDLHNEQUFzRDtJQUM5RSwyR0FBMkc7QUFDL0csQ0FBQyxFQWRXLFFBQVEsd0JBQVIsUUFBUSxRQWNuQjtBQTBCRCxNQUFhLFVBQVU7SUFHbkI7UUFDSSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFRCxLQUFLLENBQUMsc0JBQXNCLENBQUMsU0FBd0IsRUFBRTtRQUNuRCxNQUFNLE9BQU8sR0FBRztZQUNaLFVBQVUsRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLFVBQVUsSUFBSSxXQUFXO1lBQ3JELFdBQVcsRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLFdBQVcsSUFBSSxJQUFJO1lBQ2hELEtBQUssRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxVQUFVO1lBQzFDLFlBQVksRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLFlBQVksSUFBSSxVQUFVO1lBQ3hELGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLElBQUksZUFBZTtZQUNyRSxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLGdCQUFnQixJQUFJLEtBQUs7U0FDOUQsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDO1FBQ3RELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksa0JBQWtCLENBQUMsR0FBRyxDQUFDO1FBRXpELElBQUksVUFBOEIsQ0FBQztRQUNuQyxJQUFJLFFBQThCLENBQUM7UUFFbkMsSUFBSSxPQUFPLEtBQUssa0JBQWtCLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDckMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDO1FBQzNDLENBQUM7YUFBTSxJQUFJLE9BQU8sS0FBSyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUM1QyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDO1FBQ3JELENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQztRQUM1QyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQztRQUNqRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQztRQUNoQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUN2QyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUU3QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQztZQUNoRCxNQUFNO1lBQ04sT0FBTztZQUNQLE9BQU87WUFDUCxTQUFTO1lBQ1QsVUFBVTtZQUNWLFFBQVE7WUFDUixZQUFZO1lBQ1osSUFBSTtZQUNKLFFBQVE7WUFDUixHQUFHO1NBQ04sQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKO0FBaERELGdDQWdEQyJ9
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import { StorageAccess } from "@super-protocol/sdk-js";
|
|
4
|
+
import { Transform } from "stream";
|
|
5
|
+
import { SNPReport } from "../proto/AmdSevSnp";
|
|
6
|
+
interface VMCommon {
|
|
7
|
+
kernelHash: Buffer;
|
|
8
|
+
initrdHash: Buffer | undefined;
|
|
9
|
+
ovmfHash: Buffer;
|
|
10
|
+
}
|
|
11
|
+
interface VMConfig extends VMCommon {
|
|
12
|
+
ovmfBucket: string;
|
|
13
|
+
ovmfPrefix: string;
|
|
14
|
+
ovmfFilename: string;
|
|
15
|
+
}
|
|
16
|
+
interface VMMeasure extends VMCommon {
|
|
17
|
+
ovmfFilePath: string;
|
|
18
|
+
}
|
|
19
|
+
export interface SNPMrEnclaveCalculatorArgs {
|
|
20
|
+
cacheFolder?: string;
|
|
21
|
+
rmPrevCache?: boolean;
|
|
22
|
+
vmRepoOwner?: string;
|
|
23
|
+
vmRepo?: string;
|
|
24
|
+
releaseAsset?: string;
|
|
25
|
+
downloadAssetRetryInterval?: number;
|
|
26
|
+
downloadAssetRetryMax?: number;
|
|
27
|
+
storageAccess?: StorageAccess;
|
|
28
|
+
cacheRecordsTTL?: number;
|
|
29
|
+
}
|
|
30
|
+
export declare class SNPMrEnclaveCalculator {
|
|
31
|
+
private readonly cacheFolder;
|
|
32
|
+
private readonly vmRepoOwner;
|
|
33
|
+
private readonly vmRepo;
|
|
34
|
+
private readonly releaseAsset;
|
|
35
|
+
private readonly axiosInstance;
|
|
36
|
+
private readonly retryInterval;
|
|
37
|
+
private readonly retryMax;
|
|
38
|
+
private readonly storageAccess;
|
|
39
|
+
private readonly vmInfoCache;
|
|
40
|
+
private readonly defaultCredentials;
|
|
41
|
+
constructor(config: SNPMrEnclaveCalculatorArgs);
|
|
42
|
+
/**
|
|
43
|
+
* The method allows to obtain expected mrenclave if the virtual machine for which the report is
|
|
44
|
+
* submitted was running on one core and a Milan processor
|
|
45
|
+
* @param report - @see CalcSnpMrEnclaveParams
|
|
46
|
+
*/
|
|
47
|
+
getSingleCoreMrEnclave(report: SNPReport): Promise<Buffer>;
|
|
48
|
+
protected downloadAsset(assetUrl: string): Promise<Buffer>;
|
|
49
|
+
protected extractVMData(data: Buffer): VMConfig;
|
|
50
|
+
protected static calcHashStream(alg?: string): {
|
|
51
|
+
process: Transform;
|
|
52
|
+
get: () => Buffer;
|
|
53
|
+
};
|
|
54
|
+
protected static fileExist(filePath: string): Promise<boolean>;
|
|
55
|
+
protected getAssetUrl(build: string): Promise<string>;
|
|
56
|
+
protected downloadVM(build: string): Promise<VMMeasure>;
|
|
57
|
+
protected downloadOvmf(vmFiles: VMConfig, ovmfPath: string): Promise<void>;
|
|
58
|
+
}
|
|
59
|
+
export {};
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.SNPMrEnclaveCalculator = void 0;
|
|
30
|
+
const typebox_1 = require("@sinclair/typebox");
|
|
31
|
+
const value_1 = require("@sinclair/typebox/value");
|
|
32
|
+
const fs = __importStar(require("fs"));
|
|
33
|
+
const fsAsync = __importStar(require("fs/promises"));
|
|
34
|
+
const path = __importStar(require("path"));
|
|
35
|
+
const os = __importStar(require("os"));
|
|
36
|
+
const sev_snp_1 = require("./sev-snp");
|
|
37
|
+
const axios_1 = __importDefault(require("axios"));
|
|
38
|
+
const sdk_js_1 = require("@super-protocol/sdk-js");
|
|
39
|
+
const dto_js_1 = require("@super-protocol/dto-js");
|
|
40
|
+
const crypto_1 = require("crypto");
|
|
41
|
+
const stream_1 = require("stream");
|
|
42
|
+
const helpers_1 = require("./helpers");
|
|
43
|
+
const amd_sev_snp_napi_rs_1 = require("../../bindings/amd-sev-snp-napi-rs/");
|
|
44
|
+
const VMJsonSchema = typebox_1.Type.Object({
|
|
45
|
+
kernel: typebox_1.Type.Object({ sha256: typebox_1.Type.String() }),
|
|
46
|
+
initrd: typebox_1.Type.Optional(typebox_1.Type.Object({ sha256: typebox_1.Type.String() })),
|
|
47
|
+
bios_amd: typebox_1.Type.Optional(typebox_1.Type.Object({
|
|
48
|
+
sha256: typebox_1.Type.String(),
|
|
49
|
+
bucket: typebox_1.Type.String(),
|
|
50
|
+
prefix: typebox_1.Type.String(),
|
|
51
|
+
filename: typebox_1.Type.String(),
|
|
52
|
+
})),
|
|
53
|
+
bios: typebox_1.Type.Optional(typebox_1.Type.Object({
|
|
54
|
+
sha256: typebox_1.Type.String(),
|
|
55
|
+
bucket: typebox_1.Type.String(),
|
|
56
|
+
prefix: typebox_1.Type.String(),
|
|
57
|
+
filename: typebox_1.Type.String(),
|
|
58
|
+
})),
|
|
59
|
+
});
|
|
60
|
+
class VMConfigCache {
|
|
61
|
+
constructor(ttl = 5 * 60 * 1000) {
|
|
62
|
+
this.cache = {};
|
|
63
|
+
this.ttl = ttl;
|
|
64
|
+
}
|
|
65
|
+
set(key, value) {
|
|
66
|
+
const timestamp = Date.now();
|
|
67
|
+
this.cache[key] = {
|
|
68
|
+
value,
|
|
69
|
+
timestamp,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
get(key, force = false) {
|
|
73
|
+
const record = this.cache[key];
|
|
74
|
+
if (record) {
|
|
75
|
+
if (force === false) {
|
|
76
|
+
const now = Date.now();
|
|
77
|
+
if (now - record.timestamp > this.ttl) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return record.value;
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
clear() {
|
|
86
|
+
this.cache = {};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
class SNPMrEnclaveCalculator {
|
|
90
|
+
constructor(config) {
|
|
91
|
+
this.axiosInstance = axios_1.default.create();
|
|
92
|
+
this.defaultCredentials = {
|
|
93
|
+
storageType: dto_js_1.StorageType.S3,
|
|
94
|
+
credentials: {
|
|
95
|
+
endpoint: "https://gateway.storjshare.io",
|
|
96
|
+
accessKeyId: "jxekrow2wxmjps6pr2jv22hamtha",
|
|
97
|
+
secretKey: "jztnpl532njcljtdolnpbszq66lgqmwmgkbh747342hwc72grkohi",
|
|
98
|
+
// prefix and bucket can be any, as it will be filled later
|
|
99
|
+
bucket: "",
|
|
100
|
+
prefix: "",
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
this.cacheFolder = config.cacheFolder || fs.mkdtempSync(path.join(os.tmpdir(), "snp-mrenclave-cache-"));
|
|
104
|
+
const rmPrevCache = config.rmPrevCache ?? false;
|
|
105
|
+
this.vmRepoOwner = config.vmRepoOwner || "Super-Protocol";
|
|
106
|
+
this.vmRepo = config.vmRepo || "sp-vm";
|
|
107
|
+
this.releaseAsset = config.releaseAsset || "vm.json";
|
|
108
|
+
this.retryInterval = config.downloadAssetRetryInterval ?? 1000;
|
|
109
|
+
this.retryMax = config.downloadAssetRetryMax ?? 3;
|
|
110
|
+
this.storageAccess = config.storageAccess ?? this.defaultCredentials;
|
|
111
|
+
const cacheRecordsTTL = config.cacheRecordsTTL ?? 5 * 60 * 1000;
|
|
112
|
+
if (rmPrevCache) {
|
|
113
|
+
(0, helpers_1.gramineCompatibleRmDir)(this.cacheFolder);
|
|
114
|
+
}
|
|
115
|
+
if (!fs.existsSync(this.cacheFolder)) {
|
|
116
|
+
fs.mkdirSync(this.cacheFolder, { recursive: true });
|
|
117
|
+
}
|
|
118
|
+
this.vmInfoCache = new VMConfigCache(cacheRecordsTTL);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* The method allows to obtain expected mrenclave if the virtual machine for which the report is
|
|
122
|
+
* submitted was running on one core and a Milan processor
|
|
123
|
+
* @param report - @see CalcSnpMrEnclaveParams
|
|
124
|
+
*/
|
|
125
|
+
async getSingleCoreMrEnclave(report) {
|
|
126
|
+
const mrEnclave = await sev_snp_1.SevSNP.getMrEnclave(Buffer.from(report.rawReport));
|
|
127
|
+
const vmMeasure = await this.downloadVM(report.build);
|
|
128
|
+
const expectedMrEnclave = await sev_snp_1.SevSNP.calcSnpMrEnclave({
|
|
129
|
+
ovmfPath: vmMeasure.ovmfFilePath,
|
|
130
|
+
kernelHash: vmMeasure.kernelHash,
|
|
131
|
+
initrdHash: vmMeasure.initrdHash,
|
|
132
|
+
cmdLineHash: Buffer.from(report.cmdLineHash),
|
|
133
|
+
vcpuSig: report.cpuSig,
|
|
134
|
+
vcpuCount: report.cores,
|
|
135
|
+
vmpl: await (0, amd_sev_snp_napi_rs_1.getReportVmpl)(Buffer.from(report.rawReport)),
|
|
136
|
+
policy: await (0, amd_sev_snp_napi_rs_1.getReportPolicy)(Buffer.from(report.rawReport)),
|
|
137
|
+
});
|
|
138
|
+
if (!mrEnclave.equals(expectedMrEnclave))
|
|
139
|
+
throw new Error(`Expected mrEnclave does not match the calculated one.\n` +
|
|
140
|
+
`mrEnclave: ${mrEnclave.toString("hex")}\n` +
|
|
141
|
+
`expectedMrEnclave: ${expectedMrEnclave.toString("hex")}\n` +
|
|
142
|
+
`report.build: ${report.build}\n` +
|
|
143
|
+
`vmMeasure: ${JSON.stringify(vmMeasure)}`);
|
|
144
|
+
const singleCoreMrEnclave = await sev_snp_1.SevSNP.calcSnpMrEnclave({
|
|
145
|
+
ovmfPath: vmMeasure.ovmfFilePath,
|
|
146
|
+
kernelHash: vmMeasure.kernelHash,
|
|
147
|
+
initrdHash: vmMeasure.initrdHash,
|
|
148
|
+
cmdLineHash: Buffer.from(report.cmdLineHash),
|
|
149
|
+
vcpuSig: sev_snp_1.SevSNP.getCpuSig(sev_snp_1.AMD_EPYC_MILAN_CPUINFO),
|
|
150
|
+
vcpuCount: 1,
|
|
151
|
+
});
|
|
152
|
+
return singleCoreMrEnclave;
|
|
153
|
+
}
|
|
154
|
+
async downloadAsset(assetUrl) {
|
|
155
|
+
const { retryInterval, retryMax } = this;
|
|
156
|
+
const response = await sdk_js_1.helpers.tryWithInterval({
|
|
157
|
+
checkResult(response) {
|
|
158
|
+
return { isResultOk: response.status === 200 };
|
|
159
|
+
},
|
|
160
|
+
handler: async () => {
|
|
161
|
+
return this.axiosInstance.get(assetUrl, {
|
|
162
|
+
responseType: "arraybuffer",
|
|
163
|
+
});
|
|
164
|
+
},
|
|
165
|
+
checkError(err) {
|
|
166
|
+
if (axios_1.default.isAxiosError(err) && err.response) {
|
|
167
|
+
const status = err.response.status;
|
|
168
|
+
return { retryable: status < 400 || status >= 500 || status === 429 };
|
|
169
|
+
}
|
|
170
|
+
return { retryable: axios_1.default.isAxiosError(err) };
|
|
171
|
+
},
|
|
172
|
+
retryInterval,
|
|
173
|
+
retryMax,
|
|
174
|
+
});
|
|
175
|
+
return response.data;
|
|
176
|
+
}
|
|
177
|
+
extractVMData(data) {
|
|
178
|
+
const vmRaw = data.toString("utf-8");
|
|
179
|
+
const parsed = JSON.parse(vmRaw);
|
|
180
|
+
const { isValid } = (0, sdk_js_1.validateBySchema)(parsed, VMJsonSchema);
|
|
181
|
+
if (!isValid) {
|
|
182
|
+
const validationErrors = Array.from(value_1.Value.Errors(VMJsonSchema, parsed));
|
|
183
|
+
const details = validationErrors.map((e) => e.message).join(", ");
|
|
184
|
+
throw new Error(`Failed to validate VM JSON:${details ? `: ${details}` : ""}`);
|
|
185
|
+
}
|
|
186
|
+
const vm = parsed;
|
|
187
|
+
const kernelHash = vm.kernel.sha256;
|
|
188
|
+
const initrdHash = vm.initrd?.sha256;
|
|
189
|
+
const OVMF = vm.bios_amd || vm.bios;
|
|
190
|
+
if (!OVMF) {
|
|
191
|
+
throw new Error("Neither bios_amd nor bios is available");
|
|
192
|
+
}
|
|
193
|
+
const { sha256, bucket, prefix, filename } = OVMF;
|
|
194
|
+
if (!sha256 || !bucket || !prefix || !filename) {
|
|
195
|
+
throw new Error("Missing one or more required fields in OVMF");
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
kernelHash: Buffer.from(kernelHash, "hex"),
|
|
199
|
+
initrdHash: initrdHash ? Buffer.from(initrdHash, "hex") : undefined,
|
|
200
|
+
ovmfHash: Buffer.from(sha256, "hex"),
|
|
201
|
+
ovmfBucket: bucket,
|
|
202
|
+
ovmfPrefix: prefix,
|
|
203
|
+
ovmfFilename: filename,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
static calcHashStream(alg = "sha256") {
|
|
207
|
+
const hash = (0, crypto_1.createHash)(alg);
|
|
208
|
+
return {
|
|
209
|
+
process: new stream_1.Transform({
|
|
210
|
+
transform: (data, encoding, done) => {
|
|
211
|
+
hash.update(data);
|
|
212
|
+
done(null, data);
|
|
213
|
+
},
|
|
214
|
+
}),
|
|
215
|
+
get: () => hash.digest(),
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
static async fileExist(filePath) {
|
|
219
|
+
try {
|
|
220
|
+
await fsAsync.access(filePath, fs.constants.F_OK);
|
|
221
|
+
return true;
|
|
222
|
+
}
|
|
223
|
+
catch (err) {
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
async getAssetUrl(build) {
|
|
228
|
+
const { retryInterval, retryMax } = this;
|
|
229
|
+
const response = await sdk_js_1.helpers.tryWithInterval({
|
|
230
|
+
checkResult(response) {
|
|
231
|
+
return { isResultOk: response.status === 200 };
|
|
232
|
+
},
|
|
233
|
+
handler: async () => {
|
|
234
|
+
return this.axiosInstance.get(`https://api.github.com/repos/${this.vmRepoOwner}/${this.vmRepo}/releases/tags/${build}`);
|
|
235
|
+
},
|
|
236
|
+
checkError(err) {
|
|
237
|
+
if (axios_1.default.isAxiosError(err) && err.response) {
|
|
238
|
+
const status = err.response.status;
|
|
239
|
+
return { retryable: status < 400 || status >= 500 || status === 429 };
|
|
240
|
+
}
|
|
241
|
+
return { retryable: axios_1.default.isAxiosError(err) };
|
|
242
|
+
},
|
|
243
|
+
retryInterval,
|
|
244
|
+
retryMax,
|
|
245
|
+
});
|
|
246
|
+
const { data } = response;
|
|
247
|
+
const asset = data.assets.find((asset) => asset.name === this.releaseAsset);
|
|
248
|
+
if (!asset) {
|
|
249
|
+
throw new Error(`Failed to find asset named ${this.releaseAsset} for build ${build}.`);
|
|
250
|
+
}
|
|
251
|
+
return asset.browser_download_url;
|
|
252
|
+
}
|
|
253
|
+
async downloadVM(build) {
|
|
254
|
+
let fromCache = false;
|
|
255
|
+
let vmFiles;
|
|
256
|
+
const vmInfo = this.vmInfoCache.get(build);
|
|
257
|
+
if (vmInfo) {
|
|
258
|
+
fromCache = true;
|
|
259
|
+
vmFiles = vmInfo;
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
try {
|
|
263
|
+
const assetUrl = await this.getAssetUrl(build);
|
|
264
|
+
const vm = await this.downloadAsset(assetUrl);
|
|
265
|
+
vmFiles = this.extractVMData(vm);
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
const vmInfo = this.vmInfoCache.get(build, true);
|
|
269
|
+
if (vmInfo) {
|
|
270
|
+
fromCache = true;
|
|
271
|
+
vmFiles = vmInfo;
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
throw error;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
const ovmfPath = path.join(this.cacheFolder, `${vmFiles.ovmfHash.toString("hex")}_OVMF.fd`);
|
|
279
|
+
let fileExistAndCorrect = false;
|
|
280
|
+
if (await SNPMrEnclaveCalculator.fileExist(ovmfPath)) {
|
|
281
|
+
const fileStream = fs.createReadStream(ovmfPath);
|
|
282
|
+
const hash = await sdk_js_1.Crypto.createHash(fileStream, {
|
|
283
|
+
algo: dto_js_1.HashAlgorithm.SHA256,
|
|
284
|
+
encoding: dto_js_1.Encoding.hex,
|
|
285
|
+
});
|
|
286
|
+
if (vmFiles.ovmfHash.toString("hex") === hash.hash) {
|
|
287
|
+
fileExistAndCorrect = true;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
if (fileExistAndCorrect !== true) {
|
|
291
|
+
await this.downloadOvmf(vmFiles, ovmfPath);
|
|
292
|
+
}
|
|
293
|
+
if (fromCache !== true) {
|
|
294
|
+
this.vmInfoCache.set(build, vmFiles);
|
|
295
|
+
}
|
|
296
|
+
return {
|
|
297
|
+
initrdHash: vmFiles.initrdHash,
|
|
298
|
+
kernelHash: vmFiles.kernelHash,
|
|
299
|
+
ovmfFilePath: ovmfPath,
|
|
300
|
+
ovmfHash: vmFiles.ovmfHash,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
async downloadOvmf(vmFiles, ovmfPath) {
|
|
304
|
+
const access = {
|
|
305
|
+
...this.storageAccess,
|
|
306
|
+
credentials: {
|
|
307
|
+
...this.storageAccess.credentials,
|
|
308
|
+
bucket: vmFiles.ovmfBucket,
|
|
309
|
+
prefix: vmFiles.ovmfPrefix.endsWith("/") ? vmFiles.ovmfPrefix : `${vmFiles.ovmfPrefix}/`,
|
|
310
|
+
},
|
|
311
|
+
};
|
|
312
|
+
const storageProvider = (0, sdk_js_1.getStorageProvider)(access);
|
|
313
|
+
const downloaderStream = await storageProvider.downloadFile(vmFiles.ovmfFilename, {});
|
|
314
|
+
const { process: hashStream, get: getStreamHash } = SNPMrEnclaveCalculator.calcHashStream("sha256");
|
|
315
|
+
await stream_1.promises.pipeline(downloaderStream, hashStream, fs.createWriteStream(ovmfPath));
|
|
316
|
+
if (!vmFiles.ovmfHash.equals(getStreamHash())) {
|
|
317
|
+
throw new Error("The downloaded OVMF-file does not match the expected checksum");
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
exports.SNPMrEnclaveCalculator = SNPMrEnclaveCalculator;
|
|
322
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V2LXNucC1tcmVuY2xhdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2d4LW5hdGl2ZS1tb2R1bGUvc2V2LXNucC1tcmVuY2xhdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUQ7QUFDakQsbURBQWdEO0FBQ2hELHVDQUF5QjtBQUN6QixxREFBdUM7QUFDdkMsMkNBQTZCO0FBQzdCLHVDQUF5QjtBQUN6Qix1Q0FBMkQ7QUFDM0Qsa0RBQTZDO0FBQzdDLG1EQU1nQztBQUNoQyxtREFBOEU7QUFDOUUsbUNBQW9DO0FBQ3BDLG1DQUE2QztBQUM3Qyx1Q0FBbUQ7QUFFbkQsNkVBQXFGO0FBa0JyRixNQUFNLFlBQVksR0FBRyxjQUFJLENBQUMsTUFBTSxDQUFDO0lBQzdCLE1BQU0sRUFBRSxjQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLGNBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO0lBQzlDLE1BQU0sRUFBRSxjQUFJLENBQUMsUUFBUSxDQUFDLGNBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsY0FBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM3RCxRQUFRLEVBQUUsY0FBSSxDQUFDLFFBQVEsQ0FDbkIsY0FBSSxDQUFDLE1BQU0sQ0FBQztRQUNSLE1BQU0sRUFBRSxjQUFJLENBQUMsTUFBTSxFQUFFO1FBQ3JCLE1BQU0sRUFBRSxjQUFJLENBQUMsTUFBTSxFQUFFO1FBQ3JCLE1BQU0sRUFBRSxjQUFJLENBQUMsTUFBTSxFQUFFO1FBQ3JCLFFBQVEsRUFBRSxjQUFJLENBQUMsTUFBTSxFQUFFO0tBQzFCLENBQUMsQ0FDTDtJQUNELElBQUksRUFBRSxjQUFJLENBQUMsUUFBUSxDQUNmLGNBQUksQ0FBQyxNQUFNLENBQUM7UUFDUixNQUFNLEVBQUUsY0FBSSxDQUFDLE1BQU0sRUFBRTtRQUNyQixNQUFN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
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Static, TLiteral } from "@sinclair/typebox";
|
|
2
|
+
import { ImportantSecurityFields } from "../../bindings/amd-sev-snp-napi-rs";
|
|
3
|
+
export declare const CommonPolicyKeyName = "Common";
|
|
4
|
+
export declare const importantFieldNames: (keyof ImportantSecurityFields)[];
|
|
5
|
+
export declare enum RuleOperator {
|
|
6
|
+
Le = "le",
|
|
7
|
+
Eq = "eq",
|
|
8
|
+
Ge = "ge"
|
|
9
|
+
}
|
|
10
|
+
declare const PolicyRuleSchema: import("@sinclair/typebox").TObject<{
|
|
11
|
+
name: import("@sinclair/typebox").TUnion<[TLiteral<string>, ...TLiteral<string>[]]>;
|
|
12
|
+
operator: import("@sinclair/typebox").TUnion<TLiteral<RuleOperator>[]>;
|
|
13
|
+
value: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TNumber, import("@sinclair/typebox").TBoolean]>;
|
|
14
|
+
}>;
|
|
15
|
+
export declare const PolicySetSchema: import("@sinclair/typebox").TObject<{
|
|
16
|
+
[x: string]: any;
|
|
17
|
+
}>;
|
|
18
|
+
export type PolicySet = Static<typeof PolicySetSchema>;
|
|
19
|
+
export type PolicyRule = Static<typeof PolicyRuleSchema> & {
|
|
20
|
+
name: keyof ImportantSecurityFields;
|
|
21
|
+
};
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PolicySetSchema = exports.RuleOperator = exports.importantFieldNames = exports.CommonPolicyKeyName = void 0;
|
|
4
|
+
const typebox_1 = require("@sinclair/typebox");
|
|
5
|
+
const amd_sev_snp_napi_rs_1 = require("../../bindings/amd-sev-snp-napi-rs");
|
|
6
|
+
exports.CommonPolicyKeyName = "Common";
|
|
7
|
+
exports.importantFieldNames = Object.keys(amd_sev_snp_napi_rs_1.IMPORTANT_SECURITY_FIELDS_DUMMY);
|
|
8
|
+
const importantFieldLiterals = exports.importantFieldNames.map((k) => typebox_1.Type.Literal(k));
|
|
9
|
+
var RuleOperator;
|
|
10
|
+
(function (RuleOperator) {
|
|
11
|
+
RuleOperator["Le"] = "le";
|
|
12
|
+
RuleOperator["Eq"] = "eq";
|
|
13
|
+
RuleOperator["Ge"] = "ge";
|
|
14
|
+
})(RuleOperator || (exports.RuleOperator = RuleOperator = {}));
|
|
15
|
+
const PolicyRuleSchema = typebox_1.Type.Object({
|
|
16
|
+
name: typebox_1.Type.Union(importantFieldLiterals),
|
|
17
|
+
operator: typebox_1.Type.Union(Object.values(RuleOperator).map((op) => typebox_1.Type.Literal(op))),
|
|
18
|
+
value: typebox_1.Type.Union([typebox_1.Type.Number(), typebox_1.Type.Boolean()]),
|
|
19
|
+
});
|
|
20
|
+
exports.PolicySetSchema = typebox_1.Type.Partial(typebox_1.Type.Object(Object.fromEntries([
|
|
21
|
+
...Object.values(amd_sev_snp_napi_rs_1.WellKnownSnpCodeNames).map((key) => [key, typebox_1.Type.Array(PolicyRuleSchema)]),
|
|
22
|
+
[exports.CommonPolicyKeyName, typebox_1.Type.Array(PolicyRuleSchema)],
|
|
23
|
+
])), { additionalProperties: false });
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V2LXNucC1zY2hlbWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2d4LW5hdGl2ZS1tb2R1bGUvc2V2LXNucC1zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0NBQTJEO0FBQzNELDRFQUk0QztBQUUvQixRQUFBLG1CQUFtQixHQUFHLFFBQVEsQ0FBQztBQUUvQixRQUFBLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMscURBQStCLENBQXNDLENBQUM7QUFFckgsTUFBTSxzQkFBc0IsR0FBRywyQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGNBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBRzVFLENBQUM7QUFFRixJQUFZLFlBSVg7QUFKRCxXQUFZLFlBQVk7SUFDcEIseUJBQVMsQ0FBQTtJQUNULHlCQUFTLENBQUE7SUFDVCx5QkFBUyxDQUFBO0FBQ2IsQ0FBQyxFQUpXLFlBQVksNEJBQVosWUFBWSxRQUl2QjtBQUVELE1BQU0sZ0JBQWdCLEdBQUcsY0FBSSxDQUFDLE1BQU0sQ0FBQztJQUNqQyxJQUFJLEVBQUUsY0FBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQztJQUN4QyxRQUFRLEVBQUUsY0FBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsY0FBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9FLEtBQUssRUFBRSxjQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsY0FBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLGNBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0NBQ3JELENBQUMsQ0FBQztBQUVVLFFBQUEsZUFBZSxHQUFHLGNBQUksQ0FBQyxPQUFPLENBQ3ZDLGNBQUksQ0FBQyxNQUFNLENBQ1AsTUFBTSxDQUFDLFdBQVcsQ0FBQztJQUNmLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQywyQ0FBcUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsY0FBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7SUFDekYsQ0FBQywyQkFBbUIsRUFBRSxjQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7Q0FDdEQsQ0FBQyxDQUNMLEVBQ0QsRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsQ0FDbEMsQ0FBQyJ9
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { CpuInfo, ImportantSecurityFields, WellKnownSnpCodeNames } from "../../bindings/amd-sev-snp-napi-rs/";
|
|
3
|
+
import { SnpCert, SevSnpCertificateFormat, SNPReport, SNPReportWithChain } from "../proto/AmdSevSnp";
|
|
4
|
+
import { PolicySet } from "./sev-snp-schema";
|
|
5
|
+
export interface CalcSnpMrEnclaveParams {
|
|
6
|
+
ovmfPath: string;
|
|
7
|
+
kernelHash: Buffer;
|
|
8
|
+
initrdHash?: Buffer;
|
|
9
|
+
cmdLineHash: Buffer;
|
|
10
|
+
vcpuSig: number;
|
|
11
|
+
vcpuCount: number;
|
|
12
|
+
vmpl?: number;
|
|
13
|
+
policy?: bigint;
|
|
14
|
+
}
|
|
15
|
+
export declare const AMD_EPYC_MILAN_CPUINFO: CpuInfo;
|
|
16
|
+
export declare const EMPTY_INITRD_SHA256_HASH: Buffer;
|
|
17
|
+
export type ArkHashes = {
|
|
18
|
+
[key: string]: Buffer;
|
|
19
|
+
};
|
|
20
|
+
export declare function getDefaultArkHashes(): ArkHashes;
|
|
21
|
+
export declare class SevSNP {
|
|
22
|
+
static serializeSNPReport(report: SNPReportWithChain): Buffer;
|
|
23
|
+
static deserializeSNPReport(serialized: Buffer): SNPReportWithChain;
|
|
24
|
+
protected static convertCertToPem(cert: Buffer): string;
|
|
25
|
+
protected static convertPemToDer(cert: string): Buffer;
|
|
26
|
+
protected static splitCerts(certsPem: string): string[];
|
|
27
|
+
protected static readCmdLine(): Promise<string>;
|
|
28
|
+
/**
|
|
29
|
+
* Method for generation AMD SEV-SNP Report
|
|
30
|
+
* @param userData - The data that will be included in the report and will be signed
|
|
31
|
+
* @param vmpl - Optional VMPL value to pass to the firmware when requesting a report (default: 0)
|
|
32
|
+
*/
|
|
33
|
+
static generateSNPReport(userData: Buffer, vmpl?: number): Promise<SNPReport>;
|
|
34
|
+
/**
|
|
35
|
+
* Method for fetch certificates from AMD KDS
|
|
36
|
+
* @param report - report generated by the `generateSNPReport` method
|
|
37
|
+
* @param options - options for working with HTTP, allows you to configure repetitions and the interval between them,
|
|
38
|
+
* as well as the format of the returned certificates
|
|
39
|
+
*/
|
|
40
|
+
static getReportChain(report: SNPReport, options?: {
|
|
41
|
+
retryMax?: number;
|
|
42
|
+
retryInterval?: number;
|
|
43
|
+
certFormat?: SevSnpCertificateFormat;
|
|
44
|
+
httpTimeoutMs?: number;
|
|
45
|
+
}): Promise<SnpCert[]>;
|
|
46
|
+
/**
|
|
47
|
+
* Method for generation AMD SEV-SNP Report and fetching certificates
|
|
48
|
+
* @param userData - @see generateSNPReport
|
|
49
|
+
* @param options - @see getReportChain
|
|
50
|
+
*/
|
|
51
|
+
static generateSNPReportWithChain(userData: Buffer, options?: {
|
|
52
|
+
retryMax?: number;
|
|
53
|
+
retryInterval?: number;
|
|
54
|
+
certFormat?: SevSnpCertificateFormat;
|
|
55
|
+
}): Promise<SNPReportWithChain>;
|
|
56
|
+
protected static runSubProcess(binaryPath: string, args?: string[], options?: {
|
|
57
|
+
cwd?: string;
|
|
58
|
+
timeoutMs?: number;
|
|
59
|
+
}): Promise<{
|
|
60
|
+
exitCode: number;
|
|
61
|
+
stdout: string;
|
|
62
|
+
stderr: string;
|
|
63
|
+
}>;
|
|
64
|
+
static getCertHash(cert: SnpCert): Buffer;
|
|
65
|
+
protected static isValidArk(ARK: SnpCert, trustedHashes: ArkHashes): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* AMD SEV-SNP verification method
|
|
68
|
+
* @param report - report with full certificate chain
|
|
69
|
+
* @param options - trustedHashes - map of trusted AMD ARK Certificates (CommonName as Key, Sha256 Hash of Der Certificate as Value) - optional
|
|
70
|
+
* timeoutMs - timeout of the utility snpnost in ms
|
|
71
|
+
* snpGuestBinaryPath - path for snpguest util
|
|
72
|
+
*/
|
|
73
|
+
static verifyReport(report: SNPReportWithChain, options?: {
|
|
74
|
+
trustedHashes?: ArkHashes;
|
|
75
|
+
timeoutMs?: number;
|
|
76
|
+
snpGuestBinaryPath?: string;
|
|
77
|
+
tmpDirTemplate?: string;
|
|
78
|
+
}): Promise<void>;
|
|
79
|
+
protected static calcMrEnclave(measure: Buffer, vmpl: number, policy: bigint): Buffer;
|
|
80
|
+
/**
|
|
81
|
+
* Method for obtaining mrEnclave from report. MrEnclave includes report measure, report vmpl and report policy
|
|
82
|
+
* @param report - report without certificates
|
|
83
|
+
*/
|
|
84
|
+
static getMrEnclave(report: Buffer): Buffer;
|
|
85
|
+
/**
|
|
86
|
+
* Method for obtaining reportData. This data was passed when generating the report
|
|
87
|
+
* @param report - report without certificates
|
|
88
|
+
*/
|
|
89
|
+
static getReportData(report: Buffer): Promise<Buffer>;
|
|
90
|
+
/**
|
|
91
|
+
* Method for obtaining measure. Please do not confuse with mrenclave. Report measure is part of mrEnclave.
|
|
92
|
+
* @param report - report without certificates
|
|
93
|
+
*/
|
|
94
|
+
static getReportMeasure(report: Buffer): Promise<Buffer>;
|
|
95
|
+
protected static calculateFileSha256(filePath: string): Promise<Buffer>;
|
|
96
|
+
protected static calculateCmdlineHash(cmdLine: string): Buffer;
|
|
97
|
+
/**
|
|
98
|
+
* The method allows to get the expected mrEnclave without generating a report
|
|
99
|
+
* @param params - @see CalcSnpMrEnclaveParams
|
|
100
|
+
*/
|
|
101
|
+
static calcSnpMrEnclave(params: CalcSnpMrEnclaveParams): Promise<Buffer>;
|
|
102
|
+
protected static extractBuildFromCmdline(cmdLine: string, paramName?: string): string;
|
|
103
|
+
/**
|
|
104
|
+
* Compute the 32-bit CPUID signature from family, model, and stepping.
|
|
105
|
+
* This computation is described in AMD's CPUID Specification, publication #25481
|
|
106
|
+
* https://www.amd.com/system/files/TechDocs/25481.pdf
|
|
107
|
+
* See section: CPUID Fn0000_0001_EAX Family, Model, Stepping Identifiers
|
|
108
|
+
* @param cpuInfo - Structure containing family, model and stepping @see CpuInfo
|
|
109
|
+
*/
|
|
110
|
+
static getCpuSig(cpuInfo: CpuInfo): number;
|
|
111
|
+
static getReportImportantSecurityFields(report: Buffer): Promise<ImportantSecurityFields>;
|
|
112
|
+
static getReportCpuInfo(report: Buffer): Promise<CpuInfo>;
|
|
113
|
+
static getCpuGeneration(cpuInfo: CpuInfo): Promise<WellKnownSnpCodeNames>;
|
|
114
|
+
/**
|
|
115
|
+
* Parse and validate policy
|
|
116
|
+
* @param input - Raw policy as json-text or object
|
|
117
|
+
*/
|
|
118
|
+
static parsePolicySet(input: string | Record<string, unknown>): PolicySet;
|
|
119
|
+
private static checkRule;
|
|
120
|
+
/**
|
|
121
|
+
* Verify SNP report against a PolicySet.
|
|
122
|
+
* Throws an error if any rule fails.
|
|
123
|
+
* @param report - SNPReport
|
|
124
|
+
* @param policySet - PolicySet containing rules
|
|
125
|
+
*/
|
|
126
|
+
static verifyPolicy(report: Buffer, policySet: PolicySet): Promise<void>;
|
|
127
|
+
}
|