@super-protocol/addons-tee 0.8.16 → 0.8.17-beta.2
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/README.md +1 -1
- 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 +24 -0
- package/bindings/amd-sev-snp-napi-rs/index.js +328 -0
- package/bindings/amd-sev-snp-napi-rs/package-lock.json +40 -0
- package/bindings/amd-sev-snp-napi-rs/package.json +31 -0
- package/bindings/sgx-native/build/Release/sgx_native.node +0 -0
- package/bindings/sp-sev/.github/auto_assign-issues.yml +5 -0
- package/bindings/sp-sev/.github/auto_assign.yml +21 -0
- package/bindings/sp-sev/.github/dependabot.yml +6 -0
- package/bindings/sp-sev/.github/workflows/dco.yml +10 -0
- package/bindings/sp-sev/.github/workflows/lint.yml +56 -0
- package/bindings/sp-sev/.github/workflows/test.yml +54 -0
- package/bindings/sp-sev/.rustfmt.toml +2 -0
- package/bindings/sp-sev/CODEOWNERS +1 -0
- package/bindings/sp-sev/Cargo.lock +2221 -0
- package/bindings/sp-sev/Cargo.toml +80 -0
- package/bindings/sp-sev/LICENSE +201 -0
- package/bindings/sp-sev/README.md +82 -0
- package/bindings/sp-sev/build.rs +17 -0
- package/bindings/sp-sev/docs/attestation/README.md +239 -0
- package/bindings/sp-sev/docs/attestation/certchain.dot +14 -0
- package/bindings/sp-sev/docs/attestation/certchain.dot.png +0 -0
- package/bindings/sp-sev/docs/attestation/prerequisites.md +6 -0
- package/bindings/sp-sev/docs/attestation/process.msc +60 -0
- package/bindings/sp-sev/docs/attestation/process.msc.png +0 -0
- package/bindings/sp-sev/docs/attestation/protections.md +53 -0
- package/bindings/sp-sev/package-version.py +11 -0
- package/bindings/sp-sev/tests/api.rs +191 -0
- package/bindings/sp-sev/tests/certs.rs +143 -0
- package/bindings/sp-sev/tests/certs_data/cert_chain_milan +74 -0
- package/bindings/sp-sev/tests/certs_data/cert_chain_turin +74 -0
- package/bindings/sp-sev/tests/certs_data/report_milan.hex +1 -0
- package/bindings/sp-sev/tests/certs_data/vcek_milan.der +0 -0
- package/bindings/sp-sev/tests/certs_data/vcek_turin.der +0 -0
- package/bindings/sp-sev/tests/guest.rs +56 -0
- package/bindings/sp-sev/tests/id-block.rs +168 -0
- package/bindings/sp-sev/tests/measurement/ovmf_AmdSev_suffix.bin +0 -0
- package/bindings/sp-sev/tests/measurement/ovmf_OvmfX64_suffix.bin +0 -0
- package/bindings/sp-sev/tests/measurement/test_auth_block.bin +0 -0
- package/bindings/sp-sev/tests/measurement/test_auth_key.pem +6 -0
- package/bindings/sp-sev/tests/measurement/test_auth_sig.bin +0 -0
- package/bindings/sp-sev/tests/measurement/test_id_key.pem +6 -0
- package/bindings/sp-sev/tests/measurement/test_id_sig.bin +0 -0
- package/bindings/sp-sev/tests/measurement.rs +510 -0
- package/bindings/sp-sev/tests/naples/ark.cert.bad +0 -0
- package/bindings/sp-sev/tests/naples/ark.cert.sig +0 -0
- package/bindings/sp-sev/tests/naples/ark.rs +38 -0
- package/bindings/sp-sev/tests/naples/ask.rs +29 -0
- package/bindings/sp-sev/tests/naples/cek.cert +0 -0
- package/bindings/sp-sev/tests/naples/cek.rs +30 -0
- package/bindings/sp-sev/tests/naples/mod.rs +20 -0
- package/bindings/sp-sev/tests/naples/oca.cert +0 -0
- package/bindings/sp-sev/tests/naples/oca.rs +45 -0
- package/bindings/sp-sev/tests/naples/pdh.cert +0 -0
- package/bindings/sp-sev/tests/naples/pdh.rs +28 -0
- package/bindings/sp-sev/tests/naples/pek.cert +0 -0
- package/bindings/sp-sev/tests/naples/pek.rs +32 -0
- package/bindings/sp-sev/tests/rome/ark.rs +33 -0
- package/bindings/sp-sev/tests/rome/ask.rs +29 -0
- package/bindings/sp-sev/tests/rome/cek.cert +0 -0
- package/bindings/sp-sev/tests/rome/cek.rs +29 -0
- package/bindings/sp-sev/tests/rome/mod.rs +16 -0
- package/bindings/sp-sev/tests/rome/oca.cert +0 -0
- package/bindings/sp-sev/tests/rome/oca.rs +45 -0
- package/bindings/sp-sev/tests/rome/pdh.cert +0 -0
- package/bindings/sp-sev/tests/rome/pdh.rs +28 -0
- package/bindings/sp-sev/tests/rome/pek.cert +0 -0
- package/bindings/sp-sev/tests/rome/pek.rs +32 -0
- package/bindings/sp-sev/tests/session.rs +39 -0
- package/bindings/sp-sev/tests/sev_launch.rs +120 -0
- package/bindings/sp-sev/tests/snp_launch.rs +108 -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/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 +2 -0
- package/dist/sgx-native-module/index.js +3 -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 +134 -0
- package/dist/sgx-native-module/sev-snp.js +534 -0
- package/package.json +21 -14
- 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/tdx-tests.d.ts +0 -1
- package/dist/sgx-native-module/tdx-tests.js +0 -64
|
@@ -0,0 +1,534 @@
|
|
|
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.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
|
+
const amd_sev_snp_napi_rs_1 = require("../../bindings/amd-sev-snp-napi-rs/");
|
|
31
|
+
const sdk_js_1 = require("@super-protocol/sdk-js");
|
|
32
|
+
const axios_1 = __importDefault(require("axios"));
|
|
33
|
+
const pki_service_1 = require("./pki.service");
|
|
34
|
+
const forge = __importStar(require("node-forge"));
|
|
35
|
+
const fs = __importStar(require("fs/promises"));
|
|
36
|
+
const path = __importStar(require("path"));
|
|
37
|
+
const os = __importStar(require("os"));
|
|
38
|
+
const child_process_1 = require("child_process");
|
|
39
|
+
const crypto_1 = require("crypto");
|
|
40
|
+
const msgpack5_1 = __importDefault(require("msgpack5"));
|
|
41
|
+
var SupportedAmdSevSnpGenerations;
|
|
42
|
+
(function (SupportedAmdSevSnpGenerations) {
|
|
43
|
+
SupportedAmdSevSnpGenerations["Milan"] = "Milan";
|
|
44
|
+
SupportedAmdSevSnpGenerations["Genoa"] = "Genoa";
|
|
45
|
+
})(SupportedAmdSevSnpGenerations || (exports.SupportedAmdSevSnpGenerations = SupportedAmdSevSnpGenerations = {}));
|
|
46
|
+
var SevSNPCertType;
|
|
47
|
+
(function (SevSNPCertType) {
|
|
48
|
+
SevSNPCertType["ARK"] = "ARK";
|
|
49
|
+
SevSNPCertType["ASK"] = "ASK";
|
|
50
|
+
SevSNPCertType["VCEK"] = "VCEK";
|
|
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;
|
|
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
|
+
}
|
|
210
|
+
static convertCertToPem(cert) {
|
|
211
|
+
const pemHeader = "-----BEGIN CERTIFICATE-----\n";
|
|
212
|
+
const pemFooter = "\n-----END CERTIFICATE-----";
|
|
213
|
+
if (cert.slice(0, pemHeader.length).compare(Buffer.from(pemHeader)) === 0) {
|
|
214
|
+
return cert.toString();
|
|
215
|
+
}
|
|
216
|
+
const formattedBase64 = cert
|
|
217
|
+
.toString("base64")
|
|
218
|
+
.match(/.{1,64}/g)
|
|
219
|
+
?.join("\n");
|
|
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 || []);
|
|
229
|
+
}
|
|
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) {
|
|
265
|
+
const retryMax = options?.retryMax ?? 2;
|
|
266
|
+
const retryInterval = options?.retryInterval ?? 10000;
|
|
267
|
+
const certFormat = options?.certFormat ?? pki_service_1.CertificateFormat.DER;
|
|
268
|
+
const certs = [];
|
|
269
|
+
const axiosInstance = axios_1.default.create();
|
|
270
|
+
let vcek = Buffer.alloc(0);
|
|
271
|
+
let cpuGeneration = SupportedAmdSevSnpGenerations.Milan;
|
|
272
|
+
const generations = Object.values(SupportedAmdSevSnpGenerations);
|
|
273
|
+
for (const generation of generations) {
|
|
274
|
+
cpuGeneration = generation;
|
|
275
|
+
const vcekUrl = (0, amd_sev_snp_napi_rs_1.getVcekKdsUrl)(report.report, generation);
|
|
276
|
+
try {
|
|
277
|
+
const response = await sdk_js_1.helpers.tryWithInterval({
|
|
278
|
+
checkResult(response) {
|
|
279
|
+
return { isResultOk: response.status === 200 };
|
|
280
|
+
},
|
|
281
|
+
handler() {
|
|
282
|
+
return axiosInstance.get(vcekUrl, {
|
|
283
|
+
responseType: "arraybuffer",
|
|
284
|
+
});
|
|
285
|
+
},
|
|
286
|
+
checkError(err) {
|
|
287
|
+
if (axios_1.default.isAxiosError(err) && err.response) {
|
|
288
|
+
const status = err.response.status;
|
|
289
|
+
return { retryable: status == 429 };
|
|
290
|
+
}
|
|
291
|
+
return { retryable: axios_1.default.isAxiosError(err) };
|
|
292
|
+
},
|
|
293
|
+
retryInterval,
|
|
294
|
+
retryMax,
|
|
295
|
+
});
|
|
296
|
+
vcek = response.data;
|
|
297
|
+
break;
|
|
298
|
+
}
|
|
299
|
+
catch (err) {
|
|
300
|
+
const isLast = generation === generations[generations.length - 1];
|
|
301
|
+
if (isLast) {
|
|
302
|
+
throw err;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
const pemVcek = SevSNP.convertCertToPem(vcek);
|
|
307
|
+
certs.push({
|
|
308
|
+
type: SevSNPCertType.VCEK,
|
|
309
|
+
format: certFormat,
|
|
310
|
+
cert: certFormat === pki_service_1.CertificateFormat.PEM ? pemVcek : SevSNP.convertPemToDer(pemVcek),
|
|
311
|
+
});
|
|
312
|
+
const caUrl = `${amd_sev_snp_napi_rs_1.KDS_CERT_SITE}/${amd_sev_snp_napi_rs_1.KDS_VCEK}/${cpuGeneration}/cert_chain`;
|
|
313
|
+
const response = await sdk_js_1.helpers.tryWithInterval({
|
|
314
|
+
checkResult(response) {
|
|
315
|
+
return { isResultOk: response.status === 200 };
|
|
316
|
+
},
|
|
317
|
+
handler() {
|
|
318
|
+
return axiosInstance.get(caUrl, {
|
|
319
|
+
responseType: "arraybuffer",
|
|
320
|
+
});
|
|
321
|
+
},
|
|
322
|
+
checkError(err) {
|
|
323
|
+
if (axios_1.default.isAxiosError(err) && err.response) {
|
|
324
|
+
const status = err.response.status;
|
|
325
|
+
return { retryable: status == 429 };
|
|
326
|
+
}
|
|
327
|
+
return { retryable: axios_1.default.isAxiosError(err) };
|
|
328
|
+
},
|
|
329
|
+
retryInterval,
|
|
330
|
+
retryMax,
|
|
331
|
+
});
|
|
332
|
+
const CAChain = SevSNP.splitCerts(response.data.toString());
|
|
333
|
+
if (CAChain.length !== 2) {
|
|
334
|
+
throw new Error("Cert chain must have 2 certificates");
|
|
335
|
+
}
|
|
336
|
+
certs.push({
|
|
337
|
+
type: SevSNPCertType.ARK,
|
|
338
|
+
format: certFormat,
|
|
339
|
+
cert: certFormat === pki_service_1.CertificateFormat.PEM ? CAChain[1] : SevSNP.convertPemToDer(CAChain[1]),
|
|
340
|
+
});
|
|
341
|
+
certs.push({
|
|
342
|
+
type: SevSNPCertType.ASK,
|
|
343
|
+
format: certFormat,
|
|
344
|
+
cert: certFormat === pki_service_1.CertificateFormat.PEM ? CAChain[0] : SevSNP.convertPemToDer(CAChain[0]),
|
|
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);
|
|
356
|
+
return {
|
|
357
|
+
...report,
|
|
358
|
+
certs: certs,
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
static async runSubProcess(binaryPath, args = [], options = {}) {
|
|
362
|
+
return new Promise((resolve, reject) => {
|
|
363
|
+
const subprocess = (0, child_process_1.spawn)(binaryPath, args, {
|
|
364
|
+
cwd: options.cwd,
|
|
365
|
+
stdio: "pipe",
|
|
366
|
+
});
|
|
367
|
+
let stdout = "";
|
|
368
|
+
let stderr = "";
|
|
369
|
+
subprocess.stdout?.on("data", (chunk) => (stdout += chunk.toString()));
|
|
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
|
+
}
|
|
378
|
+
subprocess.on("close", (exitCode) => {
|
|
379
|
+
if (timeoutId)
|
|
380
|
+
clearTimeout(timeoutId);
|
|
381
|
+
resolve({
|
|
382
|
+
exitCode: exitCode || 0,
|
|
383
|
+
stdout,
|
|
384
|
+
stderr,
|
|
385
|
+
});
|
|
386
|
+
});
|
|
387
|
+
subprocess.on("error", (error) => {
|
|
388
|
+
if (timeoutId)
|
|
389
|
+
clearTimeout(timeoutId);
|
|
390
|
+
reject(new Error(`Failed to start process: ${error.message}`));
|
|
391
|
+
});
|
|
392
|
+
});
|
|
393
|
+
}
|
|
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
|
+
const tmpDir = options?.tmpDir ?? path.join(os.tmpdir(), "temp-");
|
|
426
|
+
if (!path.isAbsolute(snpGuestBinaryPath)) {
|
|
427
|
+
throw new Error("snpGuestBinaryPath must be an absolute path");
|
|
428
|
+
}
|
|
429
|
+
const ARK = report.certs.find((cert) => cert.type === SevSNPCertType.ARK);
|
|
430
|
+
if (!ARK) {
|
|
431
|
+
throw new Error("Can't find ARK certificate in certificate chain");
|
|
432
|
+
}
|
|
433
|
+
if (!SevSNP.isValidArk(ARK, trustedHashes)) {
|
|
434
|
+
throw new Error("The supplied certificate chain contains an untrusted root certificate");
|
|
435
|
+
}
|
|
436
|
+
const tempDir = await fs.mkdtemp(tmpDir);
|
|
437
|
+
try {
|
|
438
|
+
for (const certEntry of report.certs) {
|
|
439
|
+
const fileName = certEntry.type.toLowerCase();
|
|
440
|
+
const extension = certEntry.format === pki_service_1.CertificateFormat.PEM ? "pem" : "der";
|
|
441
|
+
await fs.writeFile(`${tempDir}/${fileName}.${extension}`, certEntry.cert, certEntry.format === pki_service_1.CertificateFormat.PEM ? "utf8" : undefined);
|
|
442
|
+
}
|
|
443
|
+
const reportPath = `${tempDir}/report.bin`;
|
|
444
|
+
await fs.writeFile(reportPath, report.report);
|
|
445
|
+
const snpguestRes = await SevSNP.runSubProcess(snpGuestBinaryPath, ["verify", "attestation", tempDir, reportPath], { timeoutMs });
|
|
446
|
+
if (snpguestRes.exitCode != 0) {
|
|
447
|
+
throw new Error(`Error validating report. Output: ${snpguestRes.stdout}\n${snpguestRes.stderr}`);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
finally {
|
|
451
|
+
await fs.rm(tempDir, {
|
|
452
|
+
recursive: true,
|
|
453
|
+
force: true,
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
static calcMrEnclave(measure, vmpl, policy) {
|
|
458
|
+
const hash = (0, crypto_1.createHash)("sha256");
|
|
459
|
+
hash.update(measure);
|
|
460
|
+
const vmplBuf = Buffer.alloc(4);
|
|
461
|
+
vmplBuf.writeUInt32LE(vmpl, 0);
|
|
462
|
+
hash.update(vmplBuf);
|
|
463
|
+
const policyBuf = Buffer.alloc(8);
|
|
464
|
+
policyBuf.writeBigUint64LE(policy, 0);
|
|
465
|
+
hash.update(policyBuf);
|
|
466
|
+
return hash.digest();
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* Method for obtaining mrEnclave from report. MrEnclave includes report measure, report vmpl and report policy
|
|
470
|
+
* @param report - report without certificates
|
|
471
|
+
*/
|
|
472
|
+
static getMrEnclave(report) {
|
|
473
|
+
const measure = (0, amd_sev_snp_napi_rs_1.getReportMeasure)(report);
|
|
474
|
+
const vmpl = (0, amd_sev_snp_napi_rs_1.getReportVmpl)(report);
|
|
475
|
+
const policy = (0, amd_sev_snp_napi_rs_1.getReportPolicy)(report);
|
|
476
|
+
return SevSNP.calcMrEnclave(measure, vmpl, policy);
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Method for obtaining reportData. This data was passed when generating the report
|
|
480
|
+
* @param report - report without certificates
|
|
481
|
+
*/
|
|
482
|
+
static async getReportData(report) {
|
|
483
|
+
return (0, amd_sev_snp_napi_rs_1.getReportData)(report);
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Method for obtaining measure. Please do not confuse with mrenclave. Report measure is part of mrEnclave.
|
|
487
|
+
* @param report - report without certificates
|
|
488
|
+
*/
|
|
489
|
+
static async getReportMeasure(report) {
|
|
490
|
+
return (0, amd_sev_snp_napi_rs_1.getReportMeasure)(report);
|
|
491
|
+
}
|
|
492
|
+
static async calculateFileSha256(filePath) {
|
|
493
|
+
const fileData = await fs.readFile(filePath);
|
|
494
|
+
const hash = (0, crypto_1.createHash)("sha256");
|
|
495
|
+
hash.update(fileData);
|
|
496
|
+
return hash.digest();
|
|
497
|
+
}
|
|
498
|
+
static calculateCmdlineHash(cmdLine) {
|
|
499
|
+
const cmdLineBytes = Buffer.concat([Buffer.from(cmdLine.trim(), "utf-8"), Buffer.from([0])]);
|
|
500
|
+
const hash = (0, crypto_1.createHash)("sha256");
|
|
501
|
+
hash.update(cmdLineBytes);
|
|
502
|
+
return hash.digest();
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* The method allows to get the expected mrEnclave without generating a report
|
|
506
|
+
* @param params - @see CalcSnpMrEnclaveParams
|
|
507
|
+
*/
|
|
508
|
+
static async calcSnpMrEnclave(params) {
|
|
509
|
+
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);
|
|
510
|
+
return SevSNP.calcMrEnclave(measure, params.vmpl ?? 0, params.policy ?? BigInt(0x30000));
|
|
511
|
+
}
|
|
512
|
+
static extractBuildFromCmdline(cmdLine, paramName = "build") {
|
|
513
|
+
const regex = new RegExp(`${paramName}=([^\\s]+)`);
|
|
514
|
+
const match = cmdLine.match(regex);
|
|
515
|
+
if (match) {
|
|
516
|
+
return match[1];
|
|
517
|
+
}
|
|
518
|
+
else {
|
|
519
|
+
throw new Error(`${paramName} parameter not found`);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
/**
|
|
523
|
+
* Compute the 32-bit CPUID signature from family, model, and stepping.
|
|
524
|
+
* This computation is described in AMD's CPUID Specification, publication #25481
|
|
525
|
+
* https://www.amd.com/system/files/TechDocs/25481.pdf
|
|
526
|
+
* See section: CPUID Fn0000_0001_EAX Family, Model, Stepping Identifiers
|
|
527
|
+
* @param cpuInfo - Structure containing family, model and stepping @see CpuInfo
|
|
528
|
+
*/
|
|
529
|
+
static getCpuSig(cpuInfo) {
|
|
530
|
+
return (0, amd_sev_snp_napi_rs_1.getCpuSig)(cpuInfo);
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
exports.SevSNP = SevSNP;
|
|
534
|
+
//# 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.2",
|
|
4
4
|
"description": "The TEE trusted loader addons",
|
|
5
5
|
"tags": [
|
|
6
6
|
"tee"
|
|
@@ -32,30 +32,32 @@
|
|
|
32
32
|
"start": "yarn build",
|
|
33
33
|
"start:watch": "nodemon",
|
|
34
34
|
"start:prod": "node --enable-source-maps ./dist/index.js",
|
|
35
|
-
"test": "jest",
|
|
35
|
+
"test": "jest --verbose",
|
|
36
36
|
"test:watch": "jest --watch",
|
|
37
37
|
"test:cov": "jest --coverage",
|
|
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",
|
|
54
|
+
"@types/lodash": "^4.17.5",
|
|
55
|
+
"@types/msgpack5": "^3.4.6",
|
|
48
56
|
"@types/node": "^17.0.0",
|
|
49
|
-
"@
|
|
50
|
-
"
|
|
51
|
-
"eslint": "^8.5.0",
|
|
52
|
-
"eslint-config-prettier": "^8.3.0",
|
|
53
|
-
"eslint-plugin-prettier": "^4.0.0",
|
|
54
|
-
"jest": "^27.5.1",
|
|
57
|
+
"@types/node-forge": "^1.3.1",
|
|
58
|
+
"jest": "^29.7.0",
|
|
55
59
|
"nodemon": "^2.0.15",
|
|
56
|
-
"
|
|
57
|
-
"ts-jest": "^27.1.5",
|
|
58
|
-
"typescript": "^4.5.4"
|
|
60
|
+
"ts-jest": "^29.1.2"
|
|
59
61
|
},
|
|
60
62
|
"jest": {
|
|
61
63
|
"moduleFileExtensions": [
|
|
@@ -72,6 +74,11 @@
|
|
|
72
74
|
"**/*.(t|j)s"
|
|
73
75
|
],
|
|
74
76
|
"coverageDirectory": "../coverage",
|
|
75
|
-
"testEnvironment": "node"
|
|
77
|
+
"testEnvironment": "node",
|
|
78
|
+
"transformIgnorePatterns": [
|
|
79
|
+
"/bindings/",
|
|
80
|
+
"/node_modules/",
|
|
81
|
+
"/dist/"
|
|
82
|
+
]
|
|
76
83
|
}
|
|
77
84
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|