@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.
- 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 +13 -1
- package/bindings/amd-sev-snp-napi-rs/index.js +9 -2
- package/bindings/amd-sev-snp-napi-rs/package-lock.json +2 -5
- package/bindings/amd-sev-snp-napi-rs/package.json +1 -1
- package/bindings/utils/virtee/libsev.so +0 -0
- package/bindings/utils/virtee/snpguest +0 -0
- package/dist/sgx-native-module/consts.d.ts +1 -1
- package/dist/sgx-native-module/consts.js +4 -4
- package/dist/sgx-native-module/dcap-quote-verify.service.js +1 -1
- package/dist/sgx-native-module/enclave.service.d.ts +5 -4
- package/dist/sgx-native-module/enclave.service.js +1 -1
- package/dist/sgx-native-module/errors.js +1 -1
- package/dist/sgx-native-module/index.d.ts +1 -0
- package/dist/sgx-native-module/index.js +2 -1
- package/dist/sgx-native-module/pki.service.d.ts +2 -2
- package/dist/sgx-native-module/pki.service.js +4 -4
- package/dist/sgx-native-module/sev-snp-mrenclave.d.ts +63 -0
- package/dist/sgx-native-module/sev-snp-mrenclave.js +290 -0
- package/dist/sgx-native-module/sev-snp.d.ts +104 -10
- package/dist/sgx-native-module/sev-snp.js +355 -33
- package/package.json +13 -12
- package/dist/sgx-native-module/helpers/tryWithInterval.d.ts +0 -13
- package/dist/sgx-native-module/helpers/tryWithInterval.js +0 -39
- package/dist/sgx-native-module/sgx-tests.d.ts +0 -1
- package/dist/sgx-native-module/sgx-tests.js +0 -114
- package/dist/sgx-native-module/snp-tests.d.ts +0 -1
- package/dist/sgx-native-module/snp-tests.js +0 -45
- package/dist/sgx-native-module/tdx-tests.d.ts +0 -1
- package/dist/sgx-native-module/tdx-tests.js +0 -64
- package/test_snp_env/Dockerfile +0 -25
- 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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
64
|
-
const
|
|
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
|
|
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 :
|
|
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
|
|
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 =
|
|
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 ?
|
|
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 ?
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
204
|
-
|
|
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
|
-
|
|
207
|
-
|
|
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.
|
|
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
|
-
"@
|
|
41
|
+
"@super-protocol/eslint-config-typescript": "2.0.1",
|
|
42
42
|
"asn1-tree": "^0.1.1",
|
|
43
|
-
"
|
|
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
|
-
"@
|
|
51
|
-
"
|
|
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
|
-
"
|
|
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 {};
|