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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/README.md +1 -1
  2. package/bindings/amd-sev-snp-napi-rs/amd-sev-snp-napi-rs.linux-x64-gnu.node +0 -0
  3. package/bindings/amd-sev-snp-napi-rs/index.d.ts +24 -0
  4. package/bindings/amd-sev-snp-napi-rs/index.js +328 -0
  5. package/bindings/amd-sev-snp-napi-rs/package-lock.json +40 -0
  6. package/bindings/amd-sev-snp-napi-rs/package.json +31 -0
  7. package/bindings/sgx-native/build/Release/sgx_native.node +0 -0
  8. package/bindings/utils/virtee/LICENSE +201 -0
  9. package/bindings/utils/virtee/libsev.so +0 -0
  10. package/bindings/utils/virtee/snpguest +0 -0
  11. package/dist/sgx-native-module/consts.d.ts +1 -1
  12. package/dist/sgx-native-module/consts.js +4 -4
  13. package/dist/sgx-native-module/dcap-quote-verify.service.js +1 -1
  14. package/dist/sgx-native-module/enclave.service.d.ts +5 -4
  15. package/dist/sgx-native-module/enclave.service.js +1 -1
  16. package/dist/sgx-native-module/errors.js +1 -1
  17. package/dist/sgx-native-module/index.d.ts +2 -0
  18. package/dist/sgx-native-module/index.js +3 -1
  19. package/dist/sgx-native-module/pki.service.d.ts +2 -2
  20. package/dist/sgx-native-module/pki.service.js +4 -4
  21. package/dist/sgx-native-module/sev-snp-mrenclave.d.ts +63 -0
  22. package/dist/sgx-native-module/sev-snp-mrenclave.js +290 -0
  23. package/dist/sgx-native-module/sev-snp.d.ts +133 -0
  24. package/dist/sgx-native-module/sev-snp.js +533 -0
  25. package/package.json +21 -14
  26. package/dist/sgx-native-module/sgx-tests.d.ts +0 -1
  27. package/dist/sgx-native-module/sgx-tests.js +0 -114
  28. package/dist/sgx-native-module/tdx-tests.d.ts +0 -1
  29. package/dist/sgx-native-module/tdx-tests.js +0 -64
@@ -1,114 +0,0 @@
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
- const SgxNative = __importStar(require("../sgx-native-module"));
30
- const assert_1 = __importDefault(require("assert"));
31
- const dcapVerifyService = new SgxNative.DcapQuoteVerifyService();
32
- const pkiService = new SgxNative.PkiService();
33
- const enclaveService = new SgxNative.EnclaveService();
34
- async function GenCertWithQouteTest() {
35
- const res = await pkiService.generateTlsCertificate({
36
- days: 14,
37
- dnsNames: ["superprotocol.com", "sp.com"],
38
- ips: ["1.2.3.4", "2001:0db8:85a3:0000:0000:8a2e:0370:7334"],
39
- format: SgxNative.CertificateFormat.DER,
40
- keyType: SgxNative.CertificateKeyType.ECP,
41
- ecpCurve: SgxNative.ECPCurve.SECP384R1,
42
- subject: {
43
- commonName: "localhost",
44
- },
45
- serialNumber: "12345",
46
- withQuote: true,
47
- });
48
- try {
49
- const quote = await dcapVerifyService.extractQuoteFromCert(res.cert);
50
- await dcapVerifyService.validateQuoteVerifierEnclave(quote);
51
- }
52
- catch (error) {
53
- if (error instanceof SgxNative.QuoteValidationError) {
54
- assert_1.default.equal(error.criticalError, false);
55
- }
56
- else {
57
- (0, assert_1.default)(false);
58
- }
59
- }
60
- console.log("GenCertWithQouteTest: Success");
61
- }
62
- async function GetKeyTest() {
63
- const key = await enclaveService.getSecretKey(SgxNative.KeyType.SGX_KEYSELECT_SEAL, SgxNative.KeyPolicy.SGX_KEYPOLICY_MRSIGNER);
64
- const key2 = await enclaveService.getSecretKey(SgxNative.KeyType.SGX_KEYSELECT_SEAL, SgxNative.KeyPolicy.SGX_KEYPOLICY_MRSIGNER, key.request);
65
- const key3 = await enclaveService.getSecretKey(SgxNative.KeyType.SGX_KEYSELECT_SEAL, SgxNative.KeyPolicy.SGX_KEYPOLICY_MRSIGNER);
66
- (0, assert_1.default)(Buffer.compare(key.key, key2.key) === 0);
67
- (0, assert_1.default)(Buffer.compare(key.key, key3.key) !== 0);
68
- await assert_1.default.rejects(async () => {
69
- await enclaveService.getSecretKey(SgxNative.KeyType.SGX_KEYSELECT_SEAL, SgxNative.KeyPolicy.SGX_KEYPOLICY_MRENCLAVE, key.request);
70
- }, {
71
- name: "TypeError",
72
- message: "The previous request parameters do not match the request name or policy",
73
- });
74
- const outDated = await enclaveService.isOutdatedRequest(key.request);
75
- (0, assert_1.default)(outDated === false);
76
- const baseCpuSvn = Buffer.alloc(16);
77
- key.request.copy(baseCpuSvn, 0, 8, 24);
78
- let downgradeIndex = -1;
79
- let upgradeIndex = -1;
80
- for (let i = 0; i < 16; i++) {
81
- if (downgradeIndex < 0 && baseCpuSvn[i] < 0xff)
82
- downgradeIndex = i;
83
- if (upgradeIndex < 0 && baseCpuSvn[i] > 0)
84
- upgradeIndex = i;
85
- if (upgradeIndex >= 0 && downgradeIndex >= 0)
86
- break;
87
- }
88
- const modifiedRequestDowngrade = Buffer.alloc(key.request.length);
89
- key.request.copy(modifiedRequestDowngrade);
90
- const modifiedRequestUpgrade = Buffer.alloc(key.request.length);
91
- key.request.copy(modifiedRequestUpgrade);
92
- modifiedRequestDowngrade[8 + downgradeIndex] = modifiedRequestDowngrade[8 + downgradeIndex] - 1;
93
- modifiedRequestUpgrade[8 + upgradeIndex] = modifiedRequestUpgrade[8 + upgradeIndex] + 1;
94
- const outDated2 = await enclaveService.isOutdatedRequest(modifiedRequestDowngrade);
95
- (0, assert_1.default)(outDated2 === true);
96
- await assert_1.default.rejects(async () => {
97
- await enclaveService.isOutdatedRequest(modifiedRequestUpgrade);
98
- }, {
99
- name: "TypeError",
100
- message: /Failed to obtain the key with the passed request*/,
101
- });
102
- await assert_1.default.rejects(async () => {
103
- await enclaveService.getSecretKey(SgxNative.KeyType.SGX_KEYSELECT_SEAL, SgxNative.KeyPolicy.SGX_KEYPOLICY_MRSIGNER, modifiedRequestUpgrade);
104
- }, {
105
- name: "TypeError",
106
- message: /Failed to obtain the key with the passed request*/,
107
- });
108
- console.log("GetKeyTest: Success");
109
- }
110
- (async () => {
111
- await GenCertWithQouteTest();
112
- await GetKeyTest();
113
- })();
114
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2d4LXRlc3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NneC1uYXRpdmUtbW9kdWxlL3NneC10ZXN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0VBQWtEO0FBQ2xELG9EQUE0QjtBQUU1QixNQUFNLGlCQUFpQixHQUFHLElBQUksU0FBUyxDQUFDLHNCQUFzQixFQUFFLENBQUM7QUFDakUsTUFBTSxVQUFVLEdBQUcsSUFBSSxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDOUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxTQUFTLENBQUMsY0FBYyxFQUFFLENBQUM7QUFFdEQsS0FBSyxVQUFVLG9CQUFvQjtJQUMvQixNQUFNLEdBQUcsR0FBRyxNQUFNLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQztRQUNoRCxJQUFJLEVBQUUsRUFBRTtRQUNSLFFBQVEsRUFBRSxDQUFDLG1CQUFtQixFQUFFLFFBQVEsQ0FBQztRQUN6QyxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUseUNBQXlDLENBQUM7UUFDM0QsTUFBTSxFQUFFLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHO1FBQ3ZDLE9BQU8sRUFBRSxTQUFTLENBQUMsa0JBQWtCLENBQUMsR0FBRztRQUN6QyxRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTO1FBQ3RDLE9BQU8sRUFBRTtZQUNMLFVBQVUsRUFBRSxXQUFXO1NBQzFCO1FBQ0QsWUFBWSxFQUFFLE9BQU87UUFDckIsU0FBUyxFQUFFLElBQUk7S0FDbEIsQ0FBQyxDQUFDO0lBQ0gsSUFBSTtRQUNBLE1BQU0sS0FBSyxHQUFHLE1BQU0saUJBQWlCLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JFLE1BQU0saUJBQWlCLENBQUMsNEJBQTRCLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDL0Q7SUFBQyxPQUFPLEtBQUssRUFB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
@@ -1 +0,0 @@
1
- export {};
@@ -1,64 +0,0 @@
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
- const SgxNative = __importStar(require("../sgx-native-module"));
30
- const assert_1 = __importDefault(require("assert"));
31
- const crypto_1 = __importDefault(require("crypto"));
32
- const dcapVerifyService = new SgxNative.DcapQuoteVerifyService();
33
- async function GenerateTdxQuoteTest() {
34
- const userData = crypto_1.default.randomBytes(64);
35
- const quote = await dcapVerifyService.generateTDXQuote(userData);
36
- try {
37
- await dcapVerifyService.validateQuoteVerifierEnclave(quote);
38
- }
39
- catch (error) {
40
- console.log(error);
41
- if (error instanceof SgxNative.QuoteValidationError) {
42
- assert_1.default.equal(error.criticalError, false);
43
- }
44
- else {
45
- (0, assert_1.default)(false);
46
- }
47
- }
48
- console.log("GenerateTdxQuoteTest: Success");
49
- }
50
- async function GenerateTdxQuoteNegativeTest() {
51
- await assert_1.default.rejects(async () => {
52
- const tooLonguserData = crypto_1.default.randomBytes(65);
53
- await dcapVerifyService.generateTDXQuote(tooLonguserData);
54
- }, {
55
- name: "TypeError",
56
- message: /Invalid user data size*/,
57
- });
58
- console.log("GenerateTdxQuoteNegativeTest: Success");
59
- }
60
- (async () => {
61
- await GenerateTdxQuoteTest();
62
- await GenerateTdxQuoteNegativeTest();
63
- })();
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGR4LXRlc3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NneC1uYXRpdmUtbW9kdWxlL3RkeC10ZXN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0VBQWtEO0FBQ2xELG9EQUE0QjtBQUM1QixvREFBNEI7QUFFNUIsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLFNBQVMsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0FBRWpFLEtBQUssVUFBVSxvQkFBb0I7SUFDL0IsTUFBTSxRQUFRLEdBQUcsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqRSxJQUFJO1FBQ0EsTUFBTSxpQkFBaUIsQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUMvRDtJQUFDLE9BQU8sS0FBSyxFQUFFO1FBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQixJQUFJLEtBQUssWUFBWSxTQUFTLENBQUMsb0JBQW9CLEVBQUU7WUFDakQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUM1QzthQUFNO1lBQ0gsSUFBQSxnQkFBTSxFQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2pCO0tBQ0o7SUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLCtCQUErQixDQUFDLENBQUM7QUFDakQsQ0FBQztBQUVELEtBQUssVUFBVSw0QkFBNEI7SUFDdkMsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FDaEIsS0FBSyxJQUFJLEVBQUU7UUFDUCxNQUFNLGVBQWUsR0FBRyxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvQyxNQUFNLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzlELENBQUMsRUFDRDtRQUNJLElBQUksRUFBRSxXQUFXO1FBQ2pCLE9BQU8sRUFBRSx5QkFBeUI7S0FDckMsQ0FDSixDQUFDO0lBRUYsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFFRCxDQUFDLEtBQUssSUFBSSxFQUFFO0lBQ1IsTUFBTSxvQkFBb0IsRUFBRSxDQUFDO0lBQzdCLE1BQU0sNEJBQTRCLEVBQUUsQ0FBQztBQUN6QyxDQUFDLENBQUMsRUFBRSxDQUFDIn0=