@super-protocol/addons-tee 0.5.0

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 (58) hide show
  1. package/.editorconfig +15 -0
  2. package/.eslintrc.json +61 -0
  3. package/.prettierignore +3 -0
  4. package/.prettierrc +15 -0
  5. package/README.md +4 -0
  6. package/bindings/sgx-native/README.md +1 -0
  7. package/bindings/sgx-native/build/Release/libdcap_quoteprov.so.1 +0 -0
  8. package/bindings/sgx-native/build/Release/libmbedcrypto_gramine.so.6 +0 -0
  9. package/bindings/sgx-native/build/Release/libmbedx509_gramine.so.1 +0 -0
  10. package/bindings/sgx-native/build/Release/libsgx_dcap_quoteverify.so.1 +0 -0
  11. package/bindings/sgx-native/build/Release/libsgx_default_qcnl_wrapper.so.1 +0 -0
  12. package/bindings/sgx-native/build/Release/libsgx_urts.so.1 +0 -0
  13. package/bindings/sgx-native/build/Release/libsgx_util.so +0 -0
  14. package/bindings/sgx-native/build/Release/sgx_native.node +0 -0
  15. package/bindings/sgx-native/index.js +7 -0
  16. package/bindings/sgx-native/node.manifest.template +59 -0
  17. package/bindings/sgx-native/package-lock.json +23 -0
  18. package/bindings/sgx-native/package.json +19 -0
  19. package/bindings/sgx-native/run_tests.sh +10 -0
  20. package/bindings/sgx-native/test_certs/attestation/cert.der +0 -0
  21. package/bindings/sgx-native/test_certs/attestation/cert.pem +124 -0
  22. package/bindings/sgx-native/test_certs/attestation/cert_maliciously.der +0 -0
  23. package/bindings/sgx-native/test_certs/attestation/cert_maliciously.pem +124 -0
  24. package/bindings/sgx-native/test_certs/attestation/cert_without_quote.der +0 -0
  25. package/bindings/sgx-native/test_certs/attestation/cert_without_quote.pem +20 -0
  26. package/bindings/sgx-native/test_certs/attestation/cert_wrong_hash.der +0 -0
  27. package/bindings/sgx-native/test_certs/attestation/cert_wrong_hash.pem +124 -0
  28. package/bindings/sgx-native/test_certs/ssl/expired.pem +68 -0
  29. package/bindings/sgx-native/test_certs/ssl/hostnameTest.pem +22 -0
  30. package/bindings/sgx-native/test_certs/ssl/multipleHost.pem +62 -0
  31. package/bindings/sgx-native/test_certs/ssl/noHost.pem +61 -0
  32. package/bindings/sgx-native/test_certs/ssl/noIntermidiate.pem +62 -0
  33. package/bindings/sgx-native/test_certs/ssl/revoked.pem +68 -0
  34. package/bindings/sgx-native/test_certs/ssl/untrusted.pem +65 -0
  35. package/bindings/sgx-native/test_certs/ssl/valid.pem +94 -0
  36. package/dist/index.d.ts +2 -0
  37. package/dist/index.js +32 -0
  38. package/dist/quote-validator/constants.d.ts +3 -0
  39. package/dist/quote-validator/constants.js +7 -0
  40. package/dist/quote-validator/index.d.ts +1 -0
  41. package/dist/quote-validator/index.js +9 -0
  42. package/dist/quote-validator/sgx-untrasted-validator.d.ts +12 -0
  43. package/dist/quote-validator/sgx-untrasted-validator.js +150 -0
  44. package/dist/quote-validator/sgx-untrasted-validator.spec.d.ts +1 -0
  45. package/dist/sgx-native-module/consts.d.ts +105 -0
  46. package/dist/sgx-native-module/consts.js +124 -0
  47. package/dist/sgx-native-module/dcap-quote-verify.service.d.ts +54 -0
  48. package/dist/sgx-native-module/dcap-quote-verify.service.js +69 -0
  49. package/dist/sgx-native-module/dcap-quote-verify.service.spec.d.ts +1 -0
  50. package/dist/sgx-native-module/enclave.service.d.ts +82 -0
  51. package/dist/sgx-native-module/enclave.service.js +194 -0
  52. package/dist/sgx-native-module/errors.d.ts +9 -0
  53. package/dist/sgx-native-module/errors.js +25 -0
  54. package/dist/sgx-native-module/index.d.ts +5 -0
  55. package/dist/sgx-native-module/index.js +22 -0
  56. package/dist/sgx-native-module/pki.service.d.ts +11 -0
  57. package/dist/sgx-native-module/pki.service.js +31 -0
  58. package/package.json +76 -0
@@ -0,0 +1,82 @@
1
+ /// <reference types="node" />
2
+ import { Readable } from "stream";
3
+ import { KeyType, KeyPolicy } from "./consts";
4
+ export declare type TeeDeviceInfoType = {
5
+ cpus: Array<{
6
+ vendorId: string;
7
+ cpuFamily: number;
8
+ model: number;
9
+ modelName: string;
10
+ physicalCores: number;
11
+ logicalCores: number;
12
+ baseFreq: number;
13
+ maxFreq: number;
14
+ }>;
15
+ memSize: number;
16
+ totalPhysicalCores: number;
17
+ totalLogicalCores: number;
18
+ };
19
+ export declare type TeeRunCpuBenchmarkType = {
20
+ cpuScore: number;
21
+ cpuBenchmark: string;
22
+ cpuCoresCount: number;
23
+ };
24
+ export declare type TeeRunMemoryBenchmarkType = {
25
+ memBandwidth: number;
26
+ memСonfirmedSize: number;
27
+ };
28
+ export declare class EnclaveService {
29
+ private readonly tmpFolder;
30
+ private readonly sgx;
31
+ constructor(tmpFolder?: string);
32
+ /**
33
+ * Requests secret keys from cpu.
34
+ * @param param0
35
+ * @returns
36
+ */
37
+ getSecretKey({ type, policy }: {
38
+ type: KeyType;
39
+ policy: KeyPolicy;
40
+ }): Promise<Buffer>;
41
+ /**
42
+ * Returns TEE device information.
43
+ * @returns
44
+ */
45
+ getTeeDeviceInfo(): Promise<TeeDeviceInfoType>;
46
+ /**
47
+ * Returns TEE cpu benchmark.
48
+ * @param deviceInfoMemSize
49
+ * @returns
50
+ */
51
+ getTeeDeviceCpuBenchmark(deviceInfoMemSize: number): Promise<TeeRunCpuBenchmarkType>;
52
+ /**
53
+ * Returns TEE memory benchmark.
54
+ * @param deviceInfoTotalPhysicalCores
55
+ * @returns
56
+ */
57
+ getTeeDeviceMemoryBenchmark(deviceInfoTotalPhysicalCores: number): Promise<TeeRunMemoryBenchmarkType>;
58
+ /**
59
+ * Writes input stream to the protected file.
60
+ * @param inputStream
61
+ * @param outputStream
62
+ * @param filepath
63
+ * @param secretKey
64
+ */
65
+ writeGramineProtectedFile(filepath: string, inputStream: Readable, secretKey: Buffer): Promise<{
66
+ writtenSize: number;
67
+ filesize: number;
68
+ filepath: string;
69
+ }>;
70
+ /**
71
+ * Reads protected file and write to output stream.
72
+ * @param filepath
73
+ * @param inputStream
74
+ * @param outputStream
75
+ * @param secretKey
76
+ */
77
+ readGramineProtectedFile(filepath: string, inputStream: Readable, secretKey: Buffer): Promise<{
78
+ fileStream: Readable;
79
+ filesize: number;
80
+ filepath: string;
81
+ }>;
82
+ }
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EnclaveService = void 0;
4
+ const { SgxLowLevel, GramineProtectedFS } = require("../../bindings/sgx-native/build/Release/sgx_native.node");
5
+ const crypto_1 = require("crypto");
6
+ const fs_1 = require("fs");
7
+ const os_1 = require("os");
8
+ const path_1 = require("path");
9
+ const stream_1 = require("stream");
10
+ // @TODO: Read it from nodejs module
11
+ const PF_SIZE = 4096;
12
+ const chunkedTransformer = (chunkSize = PF_SIZE) => {
13
+ let nextBuffer = Buffer.alloc(0);
14
+ return new stream_1.Transform({
15
+ objectMode: true,
16
+ highWaterMark: PF_SIZE,
17
+ writableHighWaterMark: PF_SIZE,
18
+ readableHighWaterMark: PF_SIZE,
19
+ flush: (callback) => {
20
+ callback(null, [nextBuffer]);
21
+ nextBuffer = Buffer.alloc(0);
22
+ },
23
+ transform: function (chunk, encoding, callback) {
24
+ if (nextBuffer.length > 0) {
25
+ chunk = Buffer.concat([nextBuffer, chunk]);
26
+ }
27
+ const chunks = [];
28
+ while (chunk.length >= chunkSize) {
29
+ chunks.push(chunk.slice(0, chunkSize));
30
+ chunk = chunk.slice(chunkSize);
31
+ }
32
+ nextBuffer = chunk;
33
+ callback(null, chunks);
34
+ },
35
+ });
36
+ };
37
+ class EnclaveService {
38
+ constructor(tmpFolder = (0, os_1.tmpdir)()) {
39
+ this.tmpFolder = tmpFolder;
40
+ this.sgx = new SgxLowLevel();
41
+ }
42
+ /**
43
+ * Requests secret keys from cpu.
44
+ * @param param0
45
+ * @returns
46
+ */
47
+ async getSecretKey({ type, policy }) {
48
+ return this.sgx.getKey(type, policy);
49
+ }
50
+ /**
51
+ * Returns TEE device information.
52
+ * @returns
53
+ */
54
+ async getTeeDeviceInfo() {
55
+ return this.sgx.getDeviceInfo();
56
+ }
57
+ /**
58
+ * Returns TEE cpu benchmark.
59
+ * @param deviceInfoMemSize
60
+ * @returns
61
+ */
62
+ async getTeeDeviceCpuBenchmark(deviceInfoMemSize) {
63
+ return this.sgx.runCpuBenchmark(deviceInfoMemSize);
64
+ }
65
+ /**
66
+ * Returns TEE memory benchmark.
67
+ * @param deviceInfoTotalPhysicalCores
68
+ * @returns
69
+ */
70
+ async getTeeDeviceMemoryBenchmark(deviceInfoTotalPhysicalCores) {
71
+ return this.sgx.runMemoryBenchmark(deviceInfoTotalPhysicalCores);
72
+ }
73
+ /**
74
+ * Writes input stream to the protected file.
75
+ * @param inputStream
76
+ * @param outputStream
77
+ * @param filepath
78
+ * @param secretKey
79
+ */
80
+ async writeGramineProtectedFile(filepath, inputStream, secretKey) {
81
+ const tmpFileName = (0, path_1.join)(this.tmpFolder, "tee-pf-" + (0, crypto_1.randomBytes)(16).toString("hex") + ".tmp");
82
+ const protectedFsKey = secretKey.length !== 16
83
+ ? (0, crypto_1.createHash)("sha256", secretKey).update(secretKey).digest().slice(0, 16)
84
+ : secretKey;
85
+ const output = null;
86
+ try {
87
+ const output = new GramineProtectedFS(tmpFileName, filepath, protectedFsKey, true);
88
+ let totalSize = 0;
89
+ let batchChunkIndex = 0;
90
+ const everyTenFlush = 10;
91
+ for await (const chunks of inputStream.pipe(chunkedTransformer(PF_SIZE))) {
92
+ for (const chunk of chunks) {
93
+ if (!chunk.length) {
94
+ // @TODO: It's may be normal, research
95
+ continue;
96
+ }
97
+ const writtenSize = await output.write(totalSize, chunk);
98
+ if (writtenSize !== chunk.length) {
99
+ throw new Error(`Fail to write ${chunk.length} to protected file ${filepath}:${tmpFileName}, written only ${writtenSize} bytes`);
100
+ }
101
+ totalSize += writtenSize;
102
+ }
103
+ if (batchChunkIndex && batchChunkIndex++ % everyTenFlush) {
104
+ await output.flush();
105
+ }
106
+ }
107
+ await output.close();
108
+ return {
109
+ filepath: tmpFileName,
110
+ filesize: (await fs_1.promises.stat(tmpFileName)).size,
111
+ writtenSize: totalSize,
112
+ };
113
+ }
114
+ catch (error) {
115
+ if (output) {
116
+ await output.close();
117
+ await fs_1.promises.rm(tmpFileName, {
118
+ recursive: true,
119
+ force: true,
120
+ });
121
+ }
122
+ throw error;
123
+ }
124
+ }
125
+ /**
126
+ * Reads protected file and write to output stream.
127
+ * @param filepath
128
+ * @param inputStream
129
+ * @param outputStream
130
+ * @param secretKey
131
+ */
132
+ async readGramineProtectedFile(filepath, inputStream, secretKey) {
133
+ const tmpFileName = (0, path_1.join)(this.tmpFolder, "tee-pf-" + (0, crypto_1.randomBytes)(16).toString("hex") + ".tmp");
134
+ const protectedFsKey = secretKey.length !== 16
135
+ ? (0, crypto_1.createHash)("sha256", secretKey).update(secretKey).digest().slice(0, 16)
136
+ : secretKey;
137
+ let input = null;
138
+ try {
139
+ const tmpFileStream = (0, fs_1.createWriteStream)(tmpFileName);
140
+ await stream_1.promises.pipeline(inputStream, tmpFileStream);
141
+ input = new GramineProtectedFS(tmpFileName, filepath, protectedFsKey, false);
142
+ const originalFileSize = input.size();
143
+ const readChunkSize = PF_SIZE * 8;
144
+ let isFileEnd = false;
145
+ let cursor = 0;
146
+ let remainedBuffer = Buffer.alloc(0);
147
+ const decryptedStream = new stream_1.Readable({
148
+ read: async function (requestSize) {
149
+ if (isFileEnd && !remainedBuffer.length) {
150
+ if (input) {
151
+ await input.close();
152
+ }
153
+ return this.push(null);
154
+ }
155
+ let readBuffer = remainedBuffer;
156
+ let remainedReadSize = requestSize - readBuffer.length;
157
+ while (!isFileEnd && remainedReadSize > 0) {
158
+ const chunk = await input.read(cursor, readChunkSize);
159
+ if (!chunk?.length) {
160
+ isFileEnd = true;
161
+ break;
162
+ }
163
+ readBuffer = Buffer.concat([readBuffer, chunk]);
164
+ cursor += chunk.length;
165
+ remainedReadSize -= chunk.length;
166
+ if (chunk.length < readChunkSize) {
167
+ isFileEnd = true;
168
+ break;
169
+ }
170
+ }
171
+ remainedBuffer = readBuffer.slice(requestSize);
172
+ this.push(readBuffer.slice(0, requestSize));
173
+ },
174
+ });
175
+ return {
176
+ filepath: tmpFileName,
177
+ fileStream: decryptedStream,
178
+ filesize: originalFileSize,
179
+ };
180
+ }
181
+ catch (error) {
182
+ await fs_1.promises.rm(tmpFileName, {
183
+ recursive: true,
184
+ force: true,
185
+ });
186
+ if (input) {
187
+ await input.close();
188
+ }
189
+ throw error;
190
+ }
191
+ }
192
+ }
193
+ exports.EnclaveService = EnclaveService;
194
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jbGF2ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NneC1uYXRpdmUtbW9kdWxlL2VuY2xhdmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxNQUFNLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLEdBQUcsT0FBTyxDQUFDLHlEQUF5RCxDQUFDLENBQUM7QUFDL0csbUNBQWlEO0FBQ2pELDJCQUF1RTtBQUN2RSwyQkFBNEI7QUFDNUIsK0JBQTRCO0FBQzVCLG1DQUF1RDtBQUd2RCxvQ0FBb0M7QUFDcEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBNkNyQixNQUFNLGtCQUFrQixHQUFHLENBQUMsU0FBUyxHQUFHLE9BQU8sRUFBYSxFQUFFO0lBQzFELElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFakMsT0FBTyxJQUFJLGtCQUFTLENBQUM7UUFDakIsVUFBVSxFQUFFLElBQUk7UUFDaEIsYUFBYSxFQUFFLE9BQU87UUFDdEIscUJBQXFCLEVBQUUsT0FBTztRQUM5QixxQkFBcUIsRUFBRSxPQUFPO1FBQzlCLEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2hCLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQzdCLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFFRCxTQUFTLEVBQUUsVUFBVSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVE7WUFDMUMsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDdkIsS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQzthQUM5QztZQUVELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUVsQixPQUFP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
@@ -0,0 +1,9 @@
1
+ export declare class AttestationDcapQuoteVerifyServiceError extends Error {
2
+ constructor(msg?: string);
3
+ }
4
+ export declare class AttestationDcapQuoteVerifyEnclaveError extends Error {
5
+ constructor(msg?: string);
6
+ }
7
+ export declare class PkiServiceError extends Error {
8
+ constructor(msg?: string);
9
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PkiServiceError = exports.AttestationDcapQuoteVerifyEnclaveError = exports.AttestationDcapQuoteVerifyServiceError = void 0;
4
+ class AttestationDcapQuoteVerifyServiceError extends Error {
5
+ constructor(msg) {
6
+ super(msg);
7
+ this.name = AttestationDcapQuoteVerifyServiceError.name;
8
+ }
9
+ }
10
+ exports.AttestationDcapQuoteVerifyServiceError = AttestationDcapQuoteVerifyServiceError;
11
+ class AttestationDcapQuoteVerifyEnclaveError extends Error {
12
+ constructor(msg) {
13
+ super(msg);
14
+ this.name = AttestationDcapQuoteVerifyEnclaveError.name;
15
+ }
16
+ }
17
+ exports.AttestationDcapQuoteVerifyEnclaveError = AttestationDcapQuoteVerifyEnclaveError;
18
+ class PkiServiceError extends Error {
19
+ constructor(msg) {
20
+ super(msg);
21
+ this.name = PkiServiceError.name;
22
+ }
23
+ }
24
+ exports.PkiServiceError = PkiServiceError;
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NneC1uYXRpdmUtbW9kdWxlL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxNQUFhLHNDQUF1QyxTQUFRLEtBQUs7SUFDN0QsWUFBWSxHQUFZO1FBQ3BCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNYLElBQUksQ0FBQyxJQUFJLEdBQUcsc0NBQXNDLENBQUMsSUFBSSxDQUFDO0lBQzVELENBQUM7Q0FDSjtBQUxELHdGQUtDO0FBRUQsTUFBYSxzQ0FBdUMsU0FBUSxLQUFLO0lBQzdELFlBQVksR0FBWTtRQUNwQixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsSUFBSSxHQUFHLHNDQUFzQyxDQUFDLElBQUksQ0FBQztJQUM1RCxDQUFDO0NBQ0o7QUFMRCx3RkFLQztBQUVELE1BQWEsZUFBZ0IsU0FBUSxLQUFLO0lBQ3RDLFlBQVksR0FBWTtRQUNwQixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxJQUFJLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUM7SUFDckMsQ0FBQztDQUNKO0FBTEQsMENBS0MifQ==
@@ -0,0 +1,5 @@
1
+ export * from "./consts";
2
+ export * from "./errors";
3
+ export * from "./enclave.service";
4
+ export * from "./dcap-quote-verify.service";
5
+ export * from "./pki.service";
@@ -0,0 +1,22 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./consts"), exports);
18
+ __exportStar(require("./errors"), exports);
19
+ __exportStar(require("./enclave.service"), exports);
20
+ __exportStar(require("./dcap-quote-verify.service"), exports);
21
+ __exportStar(require("./pki.service"), exports);
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2d4LW5hdGl2ZS1tb2R1bGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUF5QjtBQUN6QiwyQ0FBeUI7QUFDekIsb0RBQWtDO0FBQ2xDLDhEQUE0QztBQUM1QyxnREFBOEIifQ==
@@ -0,0 +1,11 @@
1
+ /// <reference types="node" />
2
+ export declare enum CertificateFormat {
3
+ PEM = "PEM",
4
+ DER = "DER"
5
+ }
6
+ export declare class PkiService {
7
+ private readonly cryptoPrimitives;
8
+ constructor();
9
+ validateChain(certs: Buffer, format?: CertificateFormat): Promise<boolean>;
10
+ validateHostname(certs: Buffer, hostnameOrIp: string, format?: CertificateFormat): Promise<boolean>;
11
+ }
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PkiService = exports.CertificateFormat = void 0;
4
+ const { CryptoPrimitives } = require("../../bindings/sgx-native/build/Release/sgx_native.node");
5
+ var CertificateFormat;
6
+ (function (CertificateFormat) {
7
+ CertificateFormat["PEM"] = "PEM";
8
+ CertificateFormat["DER"] = "DER";
9
+ })(CertificateFormat = exports.CertificateFormat || (exports.CertificateFormat = {}));
10
+ class PkiService {
11
+ constructor() {
12
+ this.cryptoPrimitives = new CryptoPrimitives();
13
+ }
14
+ async validateChain(certs, format = CertificateFormat.PEM) {
15
+ if (format === CertificateFormat.PEM) {
16
+ this.cryptoPrimitives.VerifyCertificateChain(certs);
17
+ }
18
+ else {
19
+ this.cryptoPrimitives.VerifyCertificateChain(certs, format.toString());
20
+ }
21
+ return true;
22
+ }
23
+ async validateHostname(certs, hostnameOrIp, format = CertificateFormat.PEM) {
24
+ if (format === CertificateFormat.PEM) {
25
+ return this.cryptoPrimitives.CheckHostnameOrIP(hostnameOrIp, certs);
26
+ }
27
+ return this.cryptoPrimitives.CheckHostnameOrIP(hostnameOrIp, certs, format.toString());
28
+ }
29
+ }
30
+ exports.PkiService = PkiService;
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGtpLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2d4LW5hdGl2ZS1tb2R1bGUvcGtpLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsTUFBTSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsT0FBTyxDQUFDLHlEQUF5RCxDQUFDLENBQUM7QUFRaEcsSUFBWSxpQkFHWDtBQUhELFdBQVksaUJBQWlCO0lBQ3pCLGdDQUFXLENBQUE7SUFDWCxnQ0FBVyxDQUFBO0FBQ2YsQ0FBQyxFQUhXLGlCQUFpQixHQUFqQix5QkFBaUIsS0FBakIseUJBQWlCLFFBRzVCO0FBRUQsTUFBYSxVQUFVO0lBR25CO1FBQ0ksSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFhLEVBQUUsTUFBTSxHQUFHLGlCQUFpQixDQUFDLEdBQUc7UUFDN0QsSUFBSSxNQUFNLEtBQUssaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN2RDthQUFNO1lBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUMxRTtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBYSxFQUFFLFlBQW9CLEVBQUUsTUFBTSxHQUFHLGlCQUFpQixDQUFDLEdBQUc7UUFDdEYsSUFBSSxNQUFNLEtBQUssaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ2xDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztTQUN2RTtRQUVELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDM0YsQ0FBQztDQUNKO0FBeEJELGdDQXdCQyJ9
package/package.json ADDED
@@ -0,0 +1,76 @@
1
+ {
2
+ "name": "@super-protocol/addons-tee",
3
+ "version": "0.5.0",
4
+ "description": "The TEE trusted loader addons",
5
+ "tags": [
6
+ "tee"
7
+ ],
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/Super-Protocol/sp-nodejs-addons.git"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/Super-Protocol/sp-nodejs-addons/issues"
14
+ },
15
+ "author": "Super Protocol",
16
+ "license": "ISC",
17
+ "engines": {
18
+ "node": ">=14.0",
19
+ "npm": ">=6.0"
20
+ },
21
+ "main": "dist/index.js",
22
+ "module": "dist/index.js",
23
+ "types": "dist/index.d.ts",
24
+ "directories": {
25
+ "lib": "dist"
26
+ },
27
+ "scripts": {
28
+ "build": "tsc -p tsconfig.json",
29
+ "build:clean": "rm -rf ./dist && tsc -p tsconfig.json",
30
+ "lint": "eslint --ext .ts src",
31
+ "lint:fix": "eslint --ext .ts src --fix",
32
+ "start": "yarn build",
33
+ "start:watch": "nodemon",
34
+ "start:prod": "node --enable-source-maps ./dist/index.js",
35
+ "test": "jest",
36
+ "test:watch": "jest --watch",
37
+ "test:cov": "jest --coverage",
38
+ "test:debug": "node --inspect-brk node_modules/.bin/jest -i"
39
+ },
40
+ "dependencies": {
41
+ "@fidm/x509": "^1.2.1",
42
+ "asn1-tree": "^0.1.1",
43
+ "axios": "^0.24.0"
44
+ },
45
+ "devDependencies": {
46
+ "@types/jest": "^27.0.3",
47
+ "@types/node": "^17.0.0",
48
+ "@typescript-eslint/eslint-plugin": "^5.8.0",
49
+ "@typescript-eslint/parser": "^5.8.0",
50
+ "eslint": "^8.5.0",
51
+ "eslint-config-prettier": "^8.3.0",
52
+ "eslint-plugin-prettier": "^4.0.0",
53
+ "jest": "^27.4.5",
54
+ "nodemon": "^2.0.15",
55
+ "prettier": "^2.5.1",
56
+ "ts-jest": "^27.1.2",
57
+ "typescript": "^4.5.4"
58
+ },
59
+ "jest": {
60
+ "moduleFileExtensions": [
61
+ "js",
62
+ "json",
63
+ "ts"
64
+ ],
65
+ "rootDir": "src",
66
+ "testRegex": ".*\\.spec\\.ts$",
67
+ "transform": {
68
+ "^.+\\.(t|j)s$": "ts-jest"
69
+ },
70
+ "collectCoverageFrom": [
71
+ "**/*.(t|j)s"
72
+ ],
73
+ "coverageDirectory": "../coverage",
74
+ "testEnvironment": "node"
75
+ }
76
+ }