@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.
- package/.editorconfig +15 -0
- package/.eslintrc.json +61 -0
- package/.prettierignore +3 -0
- package/.prettierrc +15 -0
- package/README.md +4 -0
- package/bindings/sgx-native/README.md +1 -0
- package/bindings/sgx-native/build/Release/libdcap_quoteprov.so.1 +0 -0
- package/bindings/sgx-native/build/Release/libmbedcrypto_gramine.so.6 +0 -0
- package/bindings/sgx-native/build/Release/libmbedx509_gramine.so.1 +0 -0
- package/bindings/sgx-native/build/Release/libsgx_dcap_quoteverify.so.1 +0 -0
- package/bindings/sgx-native/build/Release/libsgx_default_qcnl_wrapper.so.1 +0 -0
- package/bindings/sgx-native/build/Release/libsgx_urts.so.1 +0 -0
- package/bindings/sgx-native/build/Release/libsgx_util.so +0 -0
- package/bindings/sgx-native/build/Release/sgx_native.node +0 -0
- package/bindings/sgx-native/index.js +7 -0
- package/bindings/sgx-native/node.manifest.template +59 -0
- package/bindings/sgx-native/package-lock.json +23 -0
- package/bindings/sgx-native/package.json +19 -0
- package/bindings/sgx-native/run_tests.sh +10 -0
- package/bindings/sgx-native/test_certs/attestation/cert.der +0 -0
- package/bindings/sgx-native/test_certs/attestation/cert.pem +124 -0
- package/bindings/sgx-native/test_certs/attestation/cert_maliciously.der +0 -0
- package/bindings/sgx-native/test_certs/attestation/cert_maliciously.pem +124 -0
- package/bindings/sgx-native/test_certs/attestation/cert_without_quote.der +0 -0
- package/bindings/sgx-native/test_certs/attestation/cert_without_quote.pem +20 -0
- package/bindings/sgx-native/test_certs/attestation/cert_wrong_hash.der +0 -0
- package/bindings/sgx-native/test_certs/attestation/cert_wrong_hash.pem +124 -0
- package/bindings/sgx-native/test_certs/ssl/expired.pem +68 -0
- package/bindings/sgx-native/test_certs/ssl/hostnameTest.pem +22 -0
- package/bindings/sgx-native/test_certs/ssl/multipleHost.pem +62 -0
- package/bindings/sgx-native/test_certs/ssl/noHost.pem +61 -0
- package/bindings/sgx-native/test_certs/ssl/noIntermidiate.pem +62 -0
- package/bindings/sgx-native/test_certs/ssl/revoked.pem +68 -0
- package/bindings/sgx-native/test_certs/ssl/untrusted.pem +65 -0
- package/bindings/sgx-native/test_certs/ssl/valid.pem +94 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +32 -0
- package/dist/quote-validator/constants.d.ts +3 -0
- package/dist/quote-validator/constants.js +7 -0
- package/dist/quote-validator/index.d.ts +1 -0
- package/dist/quote-validator/index.js +9 -0
- package/dist/quote-validator/sgx-untrasted-validator.d.ts +12 -0
- package/dist/quote-validator/sgx-untrasted-validator.js +150 -0
- package/dist/quote-validator/sgx-untrasted-validator.spec.d.ts +1 -0
- package/dist/sgx-native-module/consts.d.ts +105 -0
- package/dist/sgx-native-module/consts.js +124 -0
- package/dist/sgx-native-module/dcap-quote-verify.service.d.ts +54 -0
- package/dist/sgx-native-module/dcap-quote-verify.service.js +69 -0
- package/dist/sgx-native-module/dcap-quote-verify.service.spec.d.ts +1 -0
- package/dist/sgx-native-module/enclave.service.d.ts +82 -0
- package/dist/sgx-native-module/enclave.service.js +194 -0
- package/dist/sgx-native-module/errors.d.ts +9 -0
- package/dist/sgx-native-module/errors.js +25 -0
- package/dist/sgx-native-module/index.d.ts +5 -0
- package/dist/sgx-native-module/index.js +22 -0
- package/dist/sgx-native-module/pki.service.d.ts +11 -0
- package/dist/sgx-native-module/pki.service.js +31 -0
- 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jbGF2ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NneC1uYXRpdmUtbW9kdWxlL2VuY2xhdmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxNQUFNLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLEdBQUcsT0FBTyxDQUFDLHlEQUF5RCxDQUFDLENBQUM7QUFDL0csbUNBQWlEO0FBQ2pELDJCQUF1RTtBQUN2RSwyQkFBNEI7QUFDNUIsK0JBQTRCO0FBQzVCLG1DQUF1RDtBQUd2RCxvQ0FBb0M7QUFDcEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBNkNyQixNQUFNLGtCQUFrQixHQUFHLENBQUMsU0FBUyxHQUFHLE9BQU8sRUFBYSxFQUFFO0lBQzFELElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFakMsT0FBTyxJQUFJLGtCQUFTLENBQUM7UUFDakIsVUFBVSxFQUFFLElBQUk7UUFDaEIsYUFBYSxFQUFFLE9BQU87UUFDdEIscUJBQXFCLEVBQUUsT0FBTztRQUM5QixxQkFBcUIsRUFBRSxPQUFPO1FBQzlCLEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2hCLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQzdCLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFFRCxTQUFTLEVBQUUsVUFBVSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVE7WUFDMUMsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDdkIsS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQzthQUM5QztZQUVELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUVsQixPQUFPLEtBQUssQ0FBQyxNQUFNLElBQUksU0FBUyxFQUFFO2dCQUM5QixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBRXZDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ2xDO1lBRUQsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUVuQixRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLENBQUM7S0FDSixDQUFDLENBQUM7QUFDUCxDQUFDLENBQUM7QUFFRixNQUFhLGNBQWM7SUFHdkIsWUFBNkIsWUFBWSxJQUFBLFdBQU0sR0FBRTtRQUFwQixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQzdDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUF3QztRQUNyRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsd0JBQXdCLENBQUMsaUJBQXlCO1FBQ3BELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQywyQkFBMkIsQ0FBQyw0QkFBb0M7UUFDbEUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyx5QkFBeUIsQ0FDM0IsUUFBZ0IsRUFDaEIsV0FBcUIsRUFDckIsU0FBaUI7UUFFakIsTUFBTSxXQUFXLEdBQUcsSUFBQSxXQUFJLEVBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLEdBQUcsSUFBQSxvQkFBVyxFQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztRQUUvRixNQUFNLGNBQWMsR0FDaEIsU0FBUyxDQUFDLE1BQU0sS0FBSyxFQUFFO1lBQ25CLENBQUMsQ0FBQyxJQUFBLG1CQUFVLEVBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN6RSxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRXBCLE1BQU0sTUFBTSxHQUErQixJQUFJLENBQUM7UUFFaEQsSUFBSTtZQUNBLE1BQU0sTUFBTSxHQUF3QixJQUFJLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3hHLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztZQUNsQixJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUM7WUFDeEIsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDO1lBRXpCLElBQUksS0FBSyxFQUFFLE1BQU0sTUFBTSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRTtnQkFDdEUsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7b0JBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO3dCQUNmLHNDQUFzQzt3QkFDdEMsU0FBUztxQkFDWjtvQkFFRCxNQUFNLFdBQVcsR0FBRyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUV6RCxJQUFJLFdBQVcsS0FBSyxLQUFLLENBQUMsTUFBTSxFQUFFO3dCQUM5QixNQUFNLElBQUksS0FBSyxDQUNYLGlCQUFpQixLQUFLLENBQUMsTUFBTSxzQkFBc0IsUUFBUSxJQUFJLFdBQVcsa0JBQWtCLFdBQVcsUUFBUSxDQUNsSCxDQUFDO3FCQUNMO29CQUVELFNBQVMsSUFBSSxXQUFXLENBQUM7aUJBQzVCO2dCQUVELElBQUksZUFBZSxJQUFJLGVBQWUsRUFBRSxHQUFHLGFBQWEsRUFBRTtvQkFDdEQsTUFBTSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7aUJBQ3hCO2FBQ0o7WUFFRCxNQUFNLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUVyQixPQUFPO2dCQUNILFFBQVEsRUFBRSxXQUFXO2dCQUNyQixRQUFRLEVBQUUsQ0FBQyxNQUFNLGFBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJO2dCQUNuRCxXQUFXLEVBQUUsU0FBUzthQUN6QixDQUFDO1NBQ0w7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNaLElBQUksTUFBTSxFQUFFO2dCQUNSLE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUVyQixNQUFNLGFBQVUsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFO29CQUM3QixTQUFTLEVBQUUsSUFBSTtvQkFDZixLQUFLLEVBQUUsSUFBSTtpQkFDZCxDQUFDLENBQUM7YUFDTjtZQUVELE1BQU0sS0FBSyxDQUFDO1NBQ2Y7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLHdCQUF3QixDQUMxQixRQUFnQixFQUNoQixXQUFxQixFQUNyQixTQUFpQjtRQUVqQixNQUFNLFdBQVcsR0FBRyxJQUFBLFdBQUksRUFBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsR0FBRyxJQUFBLG9CQUFXLEVBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBRS9GLE1BQU0sY0FBYyxHQUNoQixTQUFTLENBQUMsTUFBTSxLQUFLLEVBQUU7WUFDbkIsQ0FBQyxDQUFDLElBQUEsbUJBQVUsRUFBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3pFLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFcEIsSUFBSSxLQUFLLEdBQStCLElBQUksQ0FBQztRQUU3QyxJQUFJO1lBQ0EsTUFBTSxhQUFhLEdBQUcsSUFBQSxzQkFBaUIsRUFBQyxXQUFXLENBQUMsQ0FBQztZQUVyRCxNQUFNLGlCQUFRLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUVwRCxLQUFLLEdBQXdCLElBQUksa0JBQWtCLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbEcsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdEMsTUFBTSxhQUFhLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNsQyxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdEIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ2YsSUFBSSxjQUFjLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVyQyxNQUFNLGVBQWUsR0FBRyxJQUFJLGlCQUFRLENBQUM7Z0JBQ2pDLElBQUksRUFBRSxLQUFLLFdBQVcsV0FBbUI7b0JBQ3JDLElBQUksU0FBUyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRTt3QkFDckMsSUFBSSxLQUFLLEVBQUU7NEJBQ1AsTUFBTSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7eUJBQ3ZCO3dCQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDMUI7b0JBRUQsSUFBSSxVQUFVLEdBQUcsY0FBYyxDQUFDO29CQUNoQyxJQUFJLGdCQUFnQixHQUFHLFdBQVcsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO29CQUV2RCxPQUFPLENBQUMsU0FBUyxJQUFJLGdCQUFnQixHQUFHLENBQUMsRUFBRTt3QkFDdkMsTUFBTSxLQUFLLEdBQUcsTUFBTSxLQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQzt3QkFFdkQsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUU7NEJBQ2hCLFNBQVMsR0FBRyxJQUFJLENBQUM7NEJBQ2pCLE1BQU07eUJBQ1Q7d0JBRUQsVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDaEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUM7d0JBQ3ZCLGdCQUFnQixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUM7d0JBRWpDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxhQUFhLEVBQUU7NEJBQzlCLFNBQVMsR0FBRyxJQUFJLENBQUM7NEJBQ2pCLE1BQU07eUJBQ1Q7cUJBQ0o7b0JBRUQsY0FBYyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBRS9DLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDaEQsQ0FBQzthQUNKLENBQUMsQ0FBQztZQUVILE9BQU87Z0JBQ0gsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLFVBQVUsRUFBRSxlQUFlO2dCQUMzQixRQUFRLEVBQUUsZ0JBQWdCO2FBQzdCLENBQUM7U0FDTDtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ1osTUFBTSxhQUFVLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRTtnQkFDN0IsU0FBUyxFQUFFLElBQUk7Z0JBQ2YsS0FBSyxFQUFFLElBQUk7YUFDZCxDQUFDLENBQUM7WUFFSCxJQUFJLEtBQUssRUFBRTtnQkFDUCxNQUFNLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUN2QjtZQUVELE1BQU0sS0FBSyxDQUFDO1NBQ2Y7SUFDTCxDQUFDO0NBQ0o7QUF6TUQsd0NBeU1DIn0=
|
|
@@ -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,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
|
+
}
|