@super-protocol/sdk-js 2.1.9-beta.3 → 2.1.9-beta.4
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/dist/cjs/TIIGenerator.d.ts +15 -12
- package/dist/cjs/TIIGenerator.js +137 -14
- package/dist/cjs/connectors/BlockchainEventsListener.js +15 -10
- package/dist/cjs/constants.d.ts +0 -2
- package/dist/cjs/constants.js +2 -8
- package/dist/cjs/index.d.ts +0 -4
- package/dist/cjs/index.js +2 -8
- package/dist/cjs/types/Order.d.ts +6 -8
- package/dist/cjs/types/Order.js +1 -1
- package/dist/cjs/utils/helpers/index.d.ts +1 -0
- package/dist/cjs/utils/helpers/index.js +2 -1
- package/dist/cjs/utils/helpers/orderHelpers.d.ts +12 -0
- package/dist/cjs/utils/helpers/orderHelpers.js +42 -0
- package/dist/mjs/TIIGenerator.d.ts +15 -12
- package/dist/mjs/TIIGenerator.js +139 -16
- package/dist/mjs/connectors/BlockchainEventsListener.js +15 -10
- package/dist/mjs/constants.d.ts +0 -2
- package/dist/mjs/constants.js +1 -7
- package/dist/mjs/index.d.ts +0 -4
- package/dist/mjs/index.js +1 -5
- package/dist/mjs/types/Order.d.ts +6 -8
- package/dist/mjs/types/Order.js +1 -1
- package/dist/mjs/utils/helpers/index.d.ts +1 -0
- package/dist/mjs/utils/helpers/index.js +2 -1
- package/dist/mjs/utils/helpers/orderHelpers.d.ts +12 -0
- package/dist/mjs/utils/helpers/orderHelpers.js +34 -0
- package/package.json +2 -2
- package/dist/cjs/RIGenerator.d.ts +0 -17
- package/dist/cjs/RIGenerator.js +0 -50
- package/dist/cjs/TeeInputGeneratorBase.d.ts +0 -11
- package/dist/cjs/TeeInputGeneratorBase.js +0 -79
- package/dist/cjs/tee/TeeBlockVerifier.d.ts +0 -10
- package/dist/cjs/tee/TeeBlockVerifier.js +0 -86
- package/dist/mjs/RIGenerator.d.ts +0 -17
- package/dist/mjs/RIGenerator.js +0 -45
- package/dist/mjs/TeeInputGeneratorBase.d.ts +0 -11
- package/dist/mjs/TeeInputGeneratorBase.js +0 -73
- package/dist/mjs/tee/TeeBlockVerifier.d.ts +0 -10
- package/dist/mjs/tee/TeeBlockVerifier.js +0 -79
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const dto_js_1 = require("@super-protocol/dto-js");
|
|
7
|
-
const tee_lib_1 = require("@super-protocol/tee-lib");
|
|
8
|
-
const index_js_1 = require("./models/index.js");
|
|
9
|
-
const index_js_2 = require("./types/index.js");
|
|
10
|
-
const index_js_3 = __importDefault(require("./crypto/index.js"));
|
|
11
|
-
const TeeBlockVerifier_js_1 = require("./tee/TeeBlockVerifier.js");
|
|
12
|
-
const lodash_1 = __importDefault(require("lodash"));
|
|
13
|
-
const constants_js_1 = require("./constants.js");
|
|
14
|
-
class TeeInputGeneratorBase {
|
|
15
|
-
static async getOffersHashesAndLinkage(inputOffers) {
|
|
16
|
-
const solutionHashes = [];
|
|
17
|
-
const dataHashes = [];
|
|
18
|
-
let solutionLinkage;
|
|
19
|
-
let anyLinkage;
|
|
20
|
-
await Promise.all(inputOffers.map(async (offerId) => {
|
|
21
|
-
const offer = new index_js_1.Offer(offerId);
|
|
22
|
-
const offerInfo = await offer.getInfo();
|
|
23
|
-
if (offerInfo.offerType === index_js_2.OfferType.Solution) {
|
|
24
|
-
solutionHashes.push(offerInfo.hash ? JSON.parse(offerInfo.hash) : constants_js_1.ZERO_HASH);
|
|
25
|
-
const restrictions = lodash_1.default.intersection(offerInfo.restrictions.offers, inputOffers).filter((restrictedOfferId) => restrictedOfferId !== offer.id);
|
|
26
|
-
if (restrictions.length) {
|
|
27
|
-
solutionLinkage = offerInfo.linkage;
|
|
28
|
-
}
|
|
29
|
-
else {
|
|
30
|
-
anyLinkage = offerInfo.linkage;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
if (offerInfo.offerType === index_js_2.OfferType.Data) {
|
|
34
|
-
dataHashes.push(offerInfo.hash ? JSON.parse(offerInfo.hash) : constants_js_1.ZERO_HASH);
|
|
35
|
-
}
|
|
36
|
-
}));
|
|
37
|
-
return {
|
|
38
|
-
solutionHashes,
|
|
39
|
-
dataHashes,
|
|
40
|
-
linkage: solutionLinkage || anyLinkage,
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
static async encryptByTeeBlock(offerId, data, sgxApiUrl) {
|
|
44
|
-
const encryption = await this.getVerifiedBlockEncryption(offerId, sgxApiUrl);
|
|
45
|
-
const encryptedInfo = await index_js_3.default.encrypt(data, encryption);
|
|
46
|
-
return encryptedInfo;
|
|
47
|
-
}
|
|
48
|
-
static async getVerifiedBlockEncryption(offerId, sgxApiUrl) {
|
|
49
|
-
const teeOffer = new index_js_1.TeeOffer(offerId);
|
|
50
|
-
const teeOfferInfo = await teeOffer.getInfo();
|
|
51
|
-
const tcbId = await teeOffer.getActualTcbId();
|
|
52
|
-
const verifyByTcb = Number.parseInt(tcbId) != 0;
|
|
53
|
-
let encryption;
|
|
54
|
-
if (verifyByTcb) {
|
|
55
|
-
const tcb = new index_js_1.TCB(await teeOffer.getActualTcbId());
|
|
56
|
-
const { pubKey, quote } = await tcb.getUtilityData();
|
|
57
|
-
await TeeBlockVerifier_js_1.TeeBlockVerifier.verifyTcb(tcb, quote, pubKey, sgxApiUrl);
|
|
58
|
-
// TODO: must be 'blockEncryption = JSON.parse(pubKey);'
|
|
59
|
-
encryption = {
|
|
60
|
-
algo: dto_js_1.CryptoAlgorithm.ECIES,
|
|
61
|
-
key: pubKey,
|
|
62
|
-
encoding: dto_js_1.Encoding.base64,
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
const serializer = new tee_lib_1.TLBlockSerializerV1();
|
|
67
|
-
const tlb = serializer.unserializeTlb(Buffer.from(teeOfferInfo.tlb, 'base64'));
|
|
68
|
-
await TeeBlockVerifier_js_1.TeeBlockVerifier.verifyTlb(tlb, teeOfferInfo.tlb, offerId, sgxApiUrl);
|
|
69
|
-
encryption = {
|
|
70
|
-
algo: dto_js_1.CryptoAlgorithm.ECIES,
|
|
71
|
-
key: tlb.data.teePubKeyData.toString('base64'),
|
|
72
|
-
encoding: dto_js_1.Encoding.base64,
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
return encryption;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
exports.default = TeeInputGeneratorBase;
|
|
79
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVlSW5wdXRHZW5lcmF0b3JCYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL1RlZUlucHV0R2VuZXJhdG9yQmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1EQUFxRjtBQUNyRixxREFBNEY7QUFDNUYsZ0RBQXlEO0FBQ3pELCtDQUFvRjtBQUNwRixpRUFBdUM7QUFDdkMsbUVBQTZEO0FBQzdELG9EQUF1QjtBQUN2QixpREFBMkM7QUFFM0MsTUFBcUIscUJBQXFCO0lBQ2pDLE1BQU0sQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQzNDLFdBQTJCO1FBRTNCLE1BQU0sY0FBYyxHQUFXLEVBQUUsQ0FBQztRQUNsQyxNQUFNLFVBQVUsR0FBVyxFQUFFLENBQUM7UUFDOUIsSUFBSSxlQUFtQyxDQUFDO1FBQ3hDLElBQUksVUFBOEIsQ0FBQztRQUNuQyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFpQixFQUFFO1lBQy9DLE1BQU0sS0FBSyxHQUFVLElBQUksZ0JBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4QyxNQUFNLFNBQVMsR0FBYyxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUVuRCxJQUFJLFNBQVMsQ0FBQyxTQUFTLEtBQUssb0JBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDL0MsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsd0JBQVMsQ0FBQyxDQUFDO2dCQUU3RSxNQUFNLFlBQVksR0FBRyxnQkFBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQ3BGLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxD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
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { TLBlockUnserializeResultType } from '@super-protocol/tee-lib';
|
|
2
|
-
import { TCB } from '../models/index.js';
|
|
3
|
-
import { BlockchainId } from '../types/index.js';
|
|
4
|
-
export declare class TeeBlockVerifier {
|
|
5
|
-
static verifiedTlbHashes: Map<string, string>;
|
|
6
|
-
static verifiedTcbs: Set<BlockchainId>;
|
|
7
|
-
private static checkQuote;
|
|
8
|
-
static verifyTcb(tcb: TCB, quoteString: string, pubKey: string, sgxApiUrl: string): Promise<void>;
|
|
9
|
-
static verifyTlb(tlb: TLBlockUnserializeResultType, tlbString: string, offerId: string, sgxApiUrl: string): Promise<void>;
|
|
10
|
-
}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.TeeBlockVerifier = void 0;
|
|
7
|
-
const dto_js_1 = require("@super-protocol/dto-js");
|
|
8
|
-
const tee_lib_1 = require("@super-protocol/tee-lib");
|
|
9
|
-
const logger_js_1 = __importDefault(require("../logger.js"));
|
|
10
|
-
const config_js_1 = require("../config.js");
|
|
11
|
-
const QuoteParser_js_1 = require("./QuoteParser.js");
|
|
12
|
-
const QuoteValidator_js_1 = require("./QuoteValidator.js");
|
|
13
|
-
const statuses_js_1 = require("./statuses.js");
|
|
14
|
-
const index_js_1 = __importDefault(require("../crypto/index.js"));
|
|
15
|
-
class TeeBlockVerifier {
|
|
16
|
-
static verifiedTlbHashes = new Map();
|
|
17
|
-
static verifiedTcbs = new Set();
|
|
18
|
-
static async checkQuote(quote, dataBlob, sgxApiUrl) {
|
|
19
|
-
const quoteBuffer = Buffer.from(quote);
|
|
20
|
-
const validator = new QuoteValidator_js_1.QuoteValidator(sgxApiUrl);
|
|
21
|
-
const quoteStatus = await validator.validate(quoteBuffer);
|
|
22
|
-
if (quoteStatus.quoteValidationStatus !== statuses_js_1.QuoteValidationStatuses.UpToDate) {
|
|
23
|
-
if (quoteStatus.quoteValidationStatus === statuses_js_1.QuoteValidationStatuses.Error) {
|
|
24
|
-
throw new Error('Quote is invalid');
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
logger_js_1.default.warn(quoteStatus, 'Quote validation status is not UpToDate');
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
const userDataCheckResult = await validator.isQuoteHasUserData(quoteBuffer, Buffer.from(dataBlob));
|
|
31
|
-
if (!userDataCheckResult) {
|
|
32
|
-
throw new Error('Quote has invalid user data');
|
|
33
|
-
}
|
|
34
|
-
const parser = new QuoteParser_js_1.TeeSgxParser();
|
|
35
|
-
const parsedQuote = parser.parseQuote(quote);
|
|
36
|
-
const report = parser.parseReport(parsedQuote.report);
|
|
37
|
-
if (report.mrSigner.toString('hex') !== config_js_1.config.TEE_LOADER_TRUSTED_MRSIGNER) {
|
|
38
|
-
throw new Error('Quote has invalid MR signer');
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
static async verifyTcb(tcb, quoteString, pubKey, sgxApiUrl) {
|
|
42
|
-
// check cache
|
|
43
|
-
if (this.verifiedTcbs.has(tcb.tcbId)) {
|
|
44
|
-
logger_js_1.default.trace(`Tcb id = ${tcb.tcbId}, already validated`);
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
const quote = Buffer.from(quoteString, 'base64');
|
|
48
|
-
const signedTcbData = {
|
|
49
|
-
checkingTcbId: tcb.tcbId.toString(),
|
|
50
|
-
pubKey,
|
|
51
|
-
...(await tcb.getPublicData()),
|
|
52
|
-
};
|
|
53
|
-
const serializer = new tee_lib_1.TLBlockSerializerV1();
|
|
54
|
-
const dataBlob = await serializer.serializeAnyData(signedTcbData);
|
|
55
|
-
await this.checkQuote(quote, dataBlob, sgxApiUrl);
|
|
56
|
-
// update cache
|
|
57
|
-
this.verifiedTcbs.add(tcb.tcbId);
|
|
58
|
-
if (this.verifiedTcbs.size > config_js_1.config.TLB_CACHE_SIZE) {
|
|
59
|
-
const [value] = this.verifiedTcbs.entries().next().value;
|
|
60
|
-
this.verifiedTcbs.delete(value);
|
|
61
|
-
logger_js_1.default.trace(value, `TCB id = ${value} removed from the cache. Cache size: ${this.verifiedTcbs.size}, cache limit: ${config_js_1.config.TLB_CACHE_SIZE}`);
|
|
62
|
-
}
|
|
63
|
-
logger_js_1.default.trace(tcb.tcbId, `TCB id = ${tcb.tcbId} added to the cache. Cache size: ${this.verifiedTcbs.size}, cache limit: ${config_js_1.config.TLB_CACHE_SIZE}`);
|
|
64
|
-
}
|
|
65
|
-
static async verifyTlb(tlb, tlbString, offerId, sgxApiUrl) {
|
|
66
|
-
const tlbHash = await index_js_1.default.createHash(Buffer.from(tlbString), {
|
|
67
|
-
algo: dto_js_1.HashAlgorithm.SHA256,
|
|
68
|
-
encoding: dto_js_1.Encoding.base64,
|
|
69
|
-
});
|
|
70
|
-
if (this.verifiedTlbHashes.has(tlbHash.hash)) {
|
|
71
|
-
logger_js_1.default.trace(tlbHash, `TLB hash of offer ${this.verifiedTlbHashes.get(tlbHash.hash)} loaded from the cache. Cache size: ${this.verifiedTlbHashes.size}, cache limit: ${config_js_1.config.TLB_CACHE_SIZE}`);
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
const quoteBuffer = Buffer.from(tlb.quote);
|
|
75
|
-
await this.checkQuote(quoteBuffer, tlb.dataBlob, sgxApiUrl);
|
|
76
|
-
this.verifiedTlbHashes.set(tlbHash.hash, offerId);
|
|
77
|
-
if (this.verifiedTlbHashes.size > config_js_1.config.TLB_CACHE_SIZE) {
|
|
78
|
-
const [key, value] = this.verifiedTlbHashes.entries().next().value;
|
|
79
|
-
this.verifiedTlbHashes.delete(key);
|
|
80
|
-
logger_js_1.default.trace(key, `TLB hash of offer ${value} removed from the cache. Cache size: ${this.verifiedTlbHashes.size}, cache limit: ${config_js_1.config.TLB_CACHE_SIZE}`);
|
|
81
|
-
}
|
|
82
|
-
logger_js_1.default.trace(tlbHash.hash, `TLB hash of offer ${offerId} added to the cache. Cache size: ${this.verifiedTlbHashes.size}, cache limit: ${config_js_1.config.TLB_CACHE_SIZE}`);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
exports.TeeBlockVerifier = TeeBlockVerifier;
|
|
86
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVlQmxvY2tWZXJpZmllci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZWUvVGVlQmxvY2tWZXJpZmllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBaUU7QUFDakUscURBQTRGO0FBQzVGLDZEQUFrQztBQUNsQyw0Q0FBc0M7QUFFdEMscURBQWdEO0FBQ2hELDJEQUFxRDtBQUNyRCwrQ0FBd0Q7QUFFeEQsa0VBQXdDO0FBRXhDLE1BQWEsZ0JBQWdCO0lBQzNCLE1BQU0sQ0FBQyxpQkFBaUIsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUMxRCxNQUFNLENBQUMsWUFBWSxHQUFzQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRTNDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUM3QixLQUFpQixFQUNqQixRQUFvQixFQUNwQixTQUFpQjtRQUVqQixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sU0FBUyxHQUFHLElBQUksa0NBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoRCxNQUFNLFdBQVcsR0FBRyxNQUFNLFNBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUQsSUFBSSxXQUFXLENBQUMscUJBQXFCLEtBQUsscUNBQXVCLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDM0UsSUFBSSxXQUFXLENBQUMscUJBQXFCLEtBQUsscUNBQXVCLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3hFLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUN0QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sbUJBQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLHlDQUF5QyxDQUFDLENBQUM7WUFDdEUsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sU0FBUyxDQUFDLGtCQUFrQixDQUM1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
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import { EncryptionKey, Hash, Encryption } from '@super-protocol/dto-js';
|
|
3
|
-
import { OrderEncryptedInfo, OrderResultInfo } from './types/index.js';
|
|
4
|
-
import TeeInputGeneratorBase from './TeeInputGeneratorBase.js';
|
|
5
|
-
declare class RIGenerator extends TeeInputGeneratorBase {
|
|
6
|
-
static getDerivedPrivateKey(publicKeyEncryption: EncryptionKey): Promise<EncryptionKey>;
|
|
7
|
-
static generate(params: {
|
|
8
|
-
offerId: string;
|
|
9
|
-
encryptionPrivateKey: EncryptionKey;
|
|
10
|
-
pccsServiceApiUrl: string;
|
|
11
|
-
solutionHashes: Hash[];
|
|
12
|
-
dataHashes: Hash[];
|
|
13
|
-
linkage: string;
|
|
14
|
-
}): Promise<OrderResultInfo>;
|
|
15
|
-
static getResultInfo(encryptedResultInfo: Encryption, privateKey: Buffer): Promise<OrderEncryptedInfo>;
|
|
16
|
-
}
|
|
17
|
-
export default RIGenerator;
|
package/dist/mjs/RIGenerator.js
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { Encoding, CryptoAlgorithm, HashAlgorithm, } from '@super-protocol/dto-js';
|
|
2
|
-
import { createECDH } from 'crypto';
|
|
3
|
-
import Crypto from './crypto/index.js';
|
|
4
|
-
import TeeInputGeneratorBase from './TeeInputGeneratorBase.js';
|
|
5
|
-
class RIGenerator extends TeeInputGeneratorBase {
|
|
6
|
-
static async getDerivedPrivateKey(publicKeyEncryption) {
|
|
7
|
-
const derivedPrivateKey = await Crypto.createHash(Buffer.from(publicKeyEncryption.key, publicKeyEncryption.encoding), { encoding: Encoding.base64, algo: HashAlgorithm.SHA256 });
|
|
8
|
-
return {
|
|
9
|
-
key: derivedPrivateKey.hash,
|
|
10
|
-
encoding: derivedPrivateKey.encoding,
|
|
11
|
-
algo: CryptoAlgorithm.ECIES,
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
static async generate(params) {
|
|
15
|
-
const resultEncryption = Crypto.getPublicKey(params.encryptionPrivateKey);
|
|
16
|
-
const derivedPrivateKey = await this.getDerivedPrivateKey(resultEncryption);
|
|
17
|
-
const ecdh = createECDH('secp256k1');
|
|
18
|
-
ecdh.setPrivateKey(Buffer.from(derivedPrivateKey.key, derivedPrivateKey.encoding));
|
|
19
|
-
const publicKey = {
|
|
20
|
-
key: ecdh.getPublicKey(derivedPrivateKey.encoding),
|
|
21
|
-
encoding: Encoding.base64,
|
|
22
|
-
algo: CryptoAlgorithm.ECIES,
|
|
23
|
-
};
|
|
24
|
-
const orderInfoToEncrypt = {
|
|
25
|
-
publicKey: resultEncryption,
|
|
26
|
-
solutionHashes: params.solutionHashes || [],
|
|
27
|
-
dataHashes: params.dataHashes || [],
|
|
28
|
-
linkage: params.linkage || '',
|
|
29
|
-
};
|
|
30
|
-
const encryptedInfo = await this.encryptByTeeBlock(params.offerId, JSON.stringify(orderInfoToEncrypt), params.pccsServiceApiUrl);
|
|
31
|
-
return {
|
|
32
|
-
publicKey: JSON.stringify(publicKey),
|
|
33
|
-
encryptedInfo: JSON.stringify(encryptedInfo),
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
static async getResultInfo(encryptedResultInfo, privateKey) {
|
|
37
|
-
const resultInfo = await Crypto.decrypt({
|
|
38
|
-
...encryptedResultInfo,
|
|
39
|
-
key: privateKey.toString(encryptedResultInfo.encoding),
|
|
40
|
-
}).then((res) => JSON.parse(res));
|
|
41
|
-
return resultInfo;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
export default RIGenerator;
|
|
45
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUklHZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvUklHZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLFFBQVEsRUFDUixlQUFlLEVBRWYsYUFBYSxHQUNkLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVwQyxPQUFPLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQztBQUN2QyxPQUFPLHFCQUFxQixNQUFNLDRCQUE0QixDQUFDO0FBRS9ELE1BQU0sV0FBWSxTQUFRLHFCQUFxQjtJQUM3QyxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLG1CQUFrQztRQUNsRSxNQUFNLGlCQUFpQixHQUFHLE1BQU0sTUFBTSxDQUFDLFVBQVUsQ0FDL0MsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFJLEVBQUUsbUJBQW1CLENBQUMsUUFBUSxDQUFDLEVBQ25FLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FDMUQsQ0FBQztRQUVGLE9BQU87WUFDTCxHQUFHLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtZQUMzQixRQUFRLEVBQUUsaUJBQWlCLENBQUMsUUFBUTtZQUNwQyxJQUFJLEVBQUUsZUFBZSxDQUFDLEtBQUs7U0FDNUIsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQU9yQjtRQUNDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUUxRSxNQUFNLGlCQUFpQixHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFNUUsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFJLEVBQUUsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNwRixNQUFNLFNBQVMsR0FBRztZQUNoQixHQUFHLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUM7WUFDbEQsUUFBUSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1lBQ3pCLElBQUksRUFBRSxlQUFlLENBQUMsS0FBSztTQUNkLENBQUM7UUFFaEIsTUFBTSxrQkFBa0IsR0FBdUI7WUFDN0MsU0FBUyxFQUFFLGdCQUFnQjtZQUMzQixjQUFjLEVBQUUsTUFBTSxDQUFDLGNBQWMsSUFBSSxFQUFFO1lBQzNDLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUU7WUFDbkMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRTtTQUM5QixDQUFDO1FBRUYsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQ2hELE1BQU0sQ0FBQyxPQUFPLEVBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUNsQyxNQUFNLENBQUMsaUJBQWlCLENBQ3pCLENBQUM7UUFFRixPQUFPO1lBQ0wsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDO1lBQ3BDLGFBQWEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQztTQUM3QyxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUN4QixtQkFBK0IsRUFDL0IsVUFBa0I7UUFFbEIsTUFBTSxVQUFVLEdBQXVCLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUMxRCxHQUFHLG1CQUFtQjtZQUN0QixHQUFHLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUM7U0FDdkQsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRWxDLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQUVELGVBQWUsV0FBVyxDQUFDIn0=
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { Encryption, Hash } from '@super-protocol/dto-js';
|
|
2
|
-
import { BlockchainId } from './types/index.js';
|
|
3
|
-
export default class TeeInputGeneratorBase {
|
|
4
|
-
static getOffersHashesAndLinkage(inputOffers: BlockchainId[]): Promise<{
|
|
5
|
-
solutionHashes: Hash[];
|
|
6
|
-
dataHashes: Hash[];
|
|
7
|
-
linkage?: string;
|
|
8
|
-
}>;
|
|
9
|
-
static encryptByTeeBlock(offerId: string, data: string, sgxApiUrl: string): Promise<Encryption>;
|
|
10
|
-
protected static getVerifiedBlockEncryption(offerId: string, sgxApiUrl: string): Promise<Encryption>;
|
|
11
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { CryptoAlgorithm, Encoding } from '@super-protocol/dto-js';
|
|
2
|
-
import { TLBlockSerializerV1 } from '@super-protocol/tee-lib';
|
|
3
|
-
import { TeeOffer, TCB, Offer } from './models/index.js';
|
|
4
|
-
import { OfferType } from './types/index.js';
|
|
5
|
-
import Crypto from './crypto/index.js';
|
|
6
|
-
import { TeeBlockVerifier } from './tee/TeeBlockVerifier.js';
|
|
7
|
-
import _ from 'lodash';
|
|
8
|
-
import { ZERO_HASH } from './constants.js';
|
|
9
|
-
export default class TeeInputGeneratorBase {
|
|
10
|
-
static async getOffersHashesAndLinkage(inputOffers) {
|
|
11
|
-
const solutionHashes = [];
|
|
12
|
-
const dataHashes = [];
|
|
13
|
-
let solutionLinkage;
|
|
14
|
-
let anyLinkage;
|
|
15
|
-
await Promise.all(inputOffers.map(async (offerId) => {
|
|
16
|
-
const offer = new Offer(offerId);
|
|
17
|
-
const offerInfo = await offer.getInfo();
|
|
18
|
-
if (offerInfo.offerType === OfferType.Solution) {
|
|
19
|
-
solutionHashes.push(offerInfo.hash ? JSON.parse(offerInfo.hash) : ZERO_HASH);
|
|
20
|
-
const restrictions = _.intersection(offerInfo.restrictions.offers, inputOffers).filter((restrictedOfferId) => restrictedOfferId !== offer.id);
|
|
21
|
-
if (restrictions.length) {
|
|
22
|
-
solutionLinkage = offerInfo.linkage;
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
anyLinkage = offerInfo.linkage;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
if (offerInfo.offerType === OfferType.Data) {
|
|
29
|
-
dataHashes.push(offerInfo.hash ? JSON.parse(offerInfo.hash) : ZERO_HASH);
|
|
30
|
-
}
|
|
31
|
-
}));
|
|
32
|
-
return {
|
|
33
|
-
solutionHashes,
|
|
34
|
-
dataHashes,
|
|
35
|
-
linkage: solutionLinkage || anyLinkage,
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
static async encryptByTeeBlock(offerId, data, sgxApiUrl) {
|
|
39
|
-
const encryption = await this.getVerifiedBlockEncryption(offerId, sgxApiUrl);
|
|
40
|
-
const encryptedInfo = await Crypto.encrypt(data, encryption);
|
|
41
|
-
return encryptedInfo;
|
|
42
|
-
}
|
|
43
|
-
static async getVerifiedBlockEncryption(offerId, sgxApiUrl) {
|
|
44
|
-
const teeOffer = new TeeOffer(offerId);
|
|
45
|
-
const teeOfferInfo = await teeOffer.getInfo();
|
|
46
|
-
const tcbId = await teeOffer.getActualTcbId();
|
|
47
|
-
const verifyByTcb = Number.parseInt(tcbId) != 0;
|
|
48
|
-
let encryption;
|
|
49
|
-
if (verifyByTcb) {
|
|
50
|
-
const tcb = new TCB(await teeOffer.getActualTcbId());
|
|
51
|
-
const { pubKey, quote } = await tcb.getUtilityData();
|
|
52
|
-
await TeeBlockVerifier.verifyTcb(tcb, quote, pubKey, sgxApiUrl);
|
|
53
|
-
// TODO: must be 'blockEncryption = JSON.parse(pubKey);'
|
|
54
|
-
encryption = {
|
|
55
|
-
algo: CryptoAlgorithm.ECIES,
|
|
56
|
-
key: pubKey,
|
|
57
|
-
encoding: Encoding.base64,
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
const serializer = new TLBlockSerializerV1();
|
|
62
|
-
const tlb = serializer.unserializeTlb(Buffer.from(teeOfferInfo.tlb, 'base64'));
|
|
63
|
-
await TeeBlockVerifier.verifyTlb(tlb, teeOfferInfo.tlb, offerId, sgxApiUrl);
|
|
64
|
-
encryption = {
|
|
65
|
-
algo: CryptoAlgorithm.ECIES,
|
|
66
|
-
key: tlb.data.teePubKeyData.toString('base64'),
|
|
67
|
-
encoding: Encoding.base64,
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
return encryption;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVlSW5wdXRHZW5lcmF0b3JCYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL1RlZUlucHV0R2VuZXJhdG9yQmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsZUFBZSxFQUFFLFFBQVEsRUFBUSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxtQkFBbUIsRUFBZ0MsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RixPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN6RCxPQUFPLEVBQTJCLFNBQVMsRUFBZ0IsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRixPQUFPLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE1BQU0sQ0FBQyxPQUFPLE9BQU8scUJBQXFCO0lBQ2pDLE1BQU0sQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQzNDLFdBQTJCO1FBRTNCLE1BQU0sY0FBYyxHQUFXLEVBQUUsQ0FBQztRQUNsQyxNQUFNLFVBQVUsR0FBVyxFQUFFLENBQUM7UUFDOUIsSUFBSSxlQUFtQyxDQUFDO1FBQ3hDLElBQUksVUFBOEIsQ0FBQztRQUNuQyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFpQixFQUFFO1lBQy9DLE1BQU0sS0FBSyxHQUFVLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sU0FBUyxHQUFjLE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRW5ELElBQUksU0FBUyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsUUFB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
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { TLBlockUnserializeResultType } from '@super-protocol/tee-lib';
|
|
2
|
-
import { TCB } from '../models/index.js';
|
|
3
|
-
import { BlockchainId } from '../types/index.js';
|
|
4
|
-
export declare class TeeBlockVerifier {
|
|
5
|
-
static verifiedTlbHashes: Map<string, string>;
|
|
6
|
-
static verifiedTcbs: Set<BlockchainId>;
|
|
7
|
-
private static checkQuote;
|
|
8
|
-
static verifyTcb(tcb: TCB, quoteString: string, pubKey: string, sgxApiUrl: string): Promise<void>;
|
|
9
|
-
static verifyTlb(tlb: TLBlockUnserializeResultType, tlbString: string, offerId: string, sgxApiUrl: string): Promise<void>;
|
|
10
|
-
}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { HashAlgorithm, Encoding } from '@super-protocol/dto-js';
|
|
2
|
-
import { TLBlockSerializerV1 } from '@super-protocol/tee-lib';
|
|
3
|
-
import logger from '../logger.js';
|
|
4
|
-
import { config } from '../config.js';
|
|
5
|
-
import { TeeSgxParser } from './QuoteParser.js';
|
|
6
|
-
import { QuoteValidator } from './QuoteValidator.js';
|
|
7
|
-
import { QuoteValidationStatuses } from './statuses.js';
|
|
8
|
-
import Crypto from '../crypto/index.js';
|
|
9
|
-
export class TeeBlockVerifier {
|
|
10
|
-
static verifiedTlbHashes = new Map();
|
|
11
|
-
static verifiedTcbs = new Set();
|
|
12
|
-
static async checkQuote(quote, dataBlob, sgxApiUrl) {
|
|
13
|
-
const quoteBuffer = Buffer.from(quote);
|
|
14
|
-
const validator = new QuoteValidator(sgxApiUrl);
|
|
15
|
-
const quoteStatus = await validator.validate(quoteBuffer);
|
|
16
|
-
if (quoteStatus.quoteValidationStatus !== QuoteValidationStatuses.UpToDate) {
|
|
17
|
-
if (quoteStatus.quoteValidationStatus === QuoteValidationStatuses.Error) {
|
|
18
|
-
throw new Error('Quote is invalid');
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
logger.warn(quoteStatus, 'Quote validation status is not UpToDate');
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
const userDataCheckResult = await validator.isQuoteHasUserData(quoteBuffer, Buffer.from(dataBlob));
|
|
25
|
-
if (!userDataCheckResult) {
|
|
26
|
-
throw new Error('Quote has invalid user data');
|
|
27
|
-
}
|
|
28
|
-
const parser = new TeeSgxParser();
|
|
29
|
-
const parsedQuote = parser.parseQuote(quote);
|
|
30
|
-
const report = parser.parseReport(parsedQuote.report);
|
|
31
|
-
if (report.mrSigner.toString('hex') !== config.TEE_LOADER_TRUSTED_MRSIGNER) {
|
|
32
|
-
throw new Error('Quote has invalid MR signer');
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
static async verifyTcb(tcb, quoteString, pubKey, sgxApiUrl) {
|
|
36
|
-
// check cache
|
|
37
|
-
if (this.verifiedTcbs.has(tcb.tcbId)) {
|
|
38
|
-
logger.trace(`Tcb id = ${tcb.tcbId}, already validated`);
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
const quote = Buffer.from(quoteString, 'base64');
|
|
42
|
-
const signedTcbData = {
|
|
43
|
-
checkingTcbId: tcb.tcbId.toString(),
|
|
44
|
-
pubKey,
|
|
45
|
-
...(await tcb.getPublicData()),
|
|
46
|
-
};
|
|
47
|
-
const serializer = new TLBlockSerializerV1();
|
|
48
|
-
const dataBlob = await serializer.serializeAnyData(signedTcbData);
|
|
49
|
-
await this.checkQuote(quote, dataBlob, sgxApiUrl);
|
|
50
|
-
// update cache
|
|
51
|
-
this.verifiedTcbs.add(tcb.tcbId);
|
|
52
|
-
if (this.verifiedTcbs.size > config.TLB_CACHE_SIZE) {
|
|
53
|
-
const [value] = this.verifiedTcbs.entries().next().value;
|
|
54
|
-
this.verifiedTcbs.delete(value);
|
|
55
|
-
logger.trace(value, `TCB id = ${value} removed from the cache. Cache size: ${this.verifiedTcbs.size}, cache limit: ${config.TLB_CACHE_SIZE}`);
|
|
56
|
-
}
|
|
57
|
-
logger.trace(tcb.tcbId, `TCB id = ${tcb.tcbId} added to the cache. Cache size: ${this.verifiedTcbs.size}, cache limit: ${config.TLB_CACHE_SIZE}`);
|
|
58
|
-
}
|
|
59
|
-
static async verifyTlb(tlb, tlbString, offerId, sgxApiUrl) {
|
|
60
|
-
const tlbHash = await Crypto.createHash(Buffer.from(tlbString), {
|
|
61
|
-
algo: HashAlgorithm.SHA256,
|
|
62
|
-
encoding: Encoding.base64,
|
|
63
|
-
});
|
|
64
|
-
if (this.verifiedTlbHashes.has(tlbHash.hash)) {
|
|
65
|
-
logger.trace(tlbHash, `TLB hash of offer ${this.verifiedTlbHashes.get(tlbHash.hash)} loaded from the cache. Cache size: ${this.verifiedTlbHashes.size}, cache limit: ${config.TLB_CACHE_SIZE}`);
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
const quoteBuffer = Buffer.from(tlb.quote);
|
|
69
|
-
await this.checkQuote(quoteBuffer, tlb.dataBlob, sgxApiUrl);
|
|
70
|
-
this.verifiedTlbHashes.set(tlbHash.hash, offerId);
|
|
71
|
-
if (this.verifiedTlbHashes.size > config.TLB_CACHE_SIZE) {
|
|
72
|
-
const [key, value] = this.verifiedTlbHashes.entries().next().value;
|
|
73
|
-
this.verifiedTlbHashes.delete(key);
|
|
74
|
-
logger.trace(key, `TLB hash of offer ${value} removed from the cache. Cache size: ${this.verifiedTlbHashes.size}, cache limit: ${config.TLB_CACHE_SIZE}`);
|
|
75
|
-
}
|
|
76
|
-
logger.trace(tlbHash.hash, `TLB hash of offer ${offerId} added to the cache. Cache size: ${this.verifiedTlbHashes.size}, cache limit: ${config.TLB_CACHE_SIZE}`);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVlQmxvY2tWZXJpZmllci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZWUvVGVlQmxvY2tWZXJpZmllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBZ0MsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RixPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUM7QUFDbEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUV0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV4RCxPQUFPLE1BQU0sTUFBTSxvQkFBb0IsQ0FBQztBQUV4QyxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLE1BQU0sQ0FBQyxpQkFBaUIsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUMxRCxNQUFNLENBQUMsWUFBWSxHQUFzQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRTNDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUM3QixLQUFpQixFQUNqQixRQUFvQixFQUNwQixTQUFpQjtRQUVqQixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sU0FBUyxHQUFHLElBQUksY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sV0FBVyxHQUFHLE1BQU0sU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxRCxJQUFJLFdBQVcsQ0FBQyxxQkFBcUIsS0FBSyx1QkFBdUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMzRSxJQUFJLFdBQVcsQ0FBQyxx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
|