@super-protocol/sdk-js 2.2.0-beta.10 → 2.2.0-beta.101

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 (228) hide show
  1. package/dist/cjs/RIGenerator.d.ts +2 -0
  2. package/dist/cjs/RIGenerator.js +6 -4
  3. package/dist/cjs/TIIGenerator.d.ts +2 -1
  4. package/dist/cjs/TIIGenerator.js +13 -3
  5. package/dist/cjs/TeeInputGeneratorBase.d.ts +1 -1
  6. package/dist/cjs/TeeInputGeneratorBase.js +20 -32
  7. package/dist/cjs/analytics/eventProviders/BrowserEventProvider.d.ts +1 -0
  8. package/dist/cjs/analytics/eventProviders/BrowserEventProvider.js +3 -3
  9. package/dist/cjs/analytics/transports/AxiosTransport.js +1 -1
  10. package/dist/cjs/config.d.ts +0 -1
  11. package/dist/cjs/config.js +1 -2
  12. package/dist/cjs/constants.d.ts +5 -4
  13. package/dist/cjs/constants.js +31 -7
  14. package/dist/cjs/contracts/abi.d.ts +766 -104
  15. package/dist/cjs/contracts/abi.js +968 -119
  16. package/dist/cjs/crypto/index.d.ts +1 -0
  17. package/dist/cjs/crypto/index.js +16 -1
  18. package/dist/cjs/errors/base.error.d.ts +3 -0
  19. package/dist/cjs/errors/base.error.js +19 -0
  20. package/dist/cjs/errors/index.d.ts +2 -0
  21. package/dist/cjs/errors/index.js +8 -0
  22. package/dist/cjs/errors/not-found.error.d.ts +3 -0
  23. package/dist/cjs/errors/not-found.error.js +8 -0
  24. package/dist/cjs/errors/utils.d.ts +1 -0
  25. package/dist/cjs/errors/utils.js +25 -0
  26. package/dist/cjs/index.d.ts +9 -1
  27. package/dist/cjs/index.js +16 -2
  28. package/dist/cjs/models/Offer.d.ts +38 -6
  29. package/dist/cjs/models/Offer.js +119 -15
  30. package/dist/cjs/models/Order.d.ts +2 -90
  31. package/dist/cjs/models/Order.js +20 -91
  32. package/dist/cjs/models/Provider.js +1 -1
  33. package/dist/cjs/models/TCB.js +13 -5
  34. package/dist/cjs/models/TeeOffer.d.ts +35 -13
  35. package/dist/cjs/models/TeeOffer.js +117 -45
  36. package/dist/cjs/proto/Compression.d.ts +1 -1
  37. package/dist/cjs/proto/TRI.d.ts +41 -6
  38. package/dist/cjs/proto/TRI.js +18 -1
  39. package/dist/cjs/proto/TeeProperties.d.ts +5 -5
  40. package/dist/cjs/providers/storage/IStorageProvider.d.ts +1 -1
  41. package/dist/cjs/providers/storage/S3StorageProvider.d.ts +8 -7
  42. package/dist/cjs/providers/storage/S3StorageProvider.js +80 -38
  43. package/dist/cjs/providers/storage/StorageAdapter.d.ts +9 -7
  44. package/dist/cjs/providers/storage/StorageAdapter.js +27 -29
  45. package/dist/cjs/providers/storage/StorageContentWriter.d.ts +2 -2
  46. package/dist/cjs/providers/storage/StorageContentWriter.js +5 -5
  47. package/dist/cjs/providers/storage/StorageKeyValueAdapter.d.ts +8 -5
  48. package/dist/cjs/providers/storage/StorageKeyValueAdapter.js +30 -16
  49. package/dist/cjs/providers/storage/StorjAdapter.d.ts +5 -4
  50. package/dist/cjs/providers/storage/StorjAdapter.js +15 -9
  51. package/dist/cjs/providers/storage/StorjCredentialsManager.d.ts +24 -0
  52. package/dist/cjs/providers/storage/StorjCredentialsManager.js +86 -0
  53. package/dist/cjs/providers/storage/StorjStorageProvider.js +2 -2
  54. package/dist/cjs/providers/storage/fs-storage-provider.d.ts +19 -0
  55. package/dist/cjs/providers/storage/fs-storage-provider.js +143 -0
  56. package/dist/cjs/providers/storage/getStorageProvider.js +4 -1
  57. package/dist/cjs/providers/storage/parseStorageCredentials.d.ts +5 -0
  58. package/dist/cjs/providers/storage/parseStorageCredentials.js +21 -0
  59. package/dist/cjs/providers/storage/types.d.ts +22 -0
  60. package/dist/cjs/staticModels/LoaderSecretsPublicKeys.js +3 -3
  61. package/dist/cjs/staticModels/LoaderSessions.d.ts +2 -2
  62. package/dist/cjs/staticModels/LoaderSessions.js +5 -5
  63. package/dist/cjs/staticModels/OfferResources.d.ts +2 -1
  64. package/dist/cjs/staticModels/OfferResources.js +24 -8
  65. package/dist/cjs/staticModels/Offers.js +7 -2
  66. package/dist/cjs/staticModels/OffersStorageAllocated.d.ts +1 -2
  67. package/dist/cjs/staticModels/OffersStorageAllocated.js +10 -10
  68. package/dist/cjs/staticModels/OffersStorageRequests.js +4 -3
  69. package/dist/cjs/staticModels/Orders.d.ts +5 -4
  70. package/dist/cjs/staticModels/Orders.js +7 -6
  71. package/dist/cjs/staticModels/SecretRequests.d.ts +1 -1
  72. package/dist/cjs/staticModels/SecretRequests.js +14 -7
  73. package/dist/cjs/staticModels/TeeOffers.d.ts +0 -2
  74. package/dist/cjs/staticModels/TeeOffers.js +5 -38
  75. package/dist/cjs/tee/QuoteParser.d.ts +61 -6
  76. package/dist/cjs/tee/QuoteParser.js +248 -29
  77. package/dist/cjs/tee/QuoteValidator.d.ts +11 -0
  78. package/dist/cjs/tee/QuoteValidator.js +131 -34
  79. package/dist/cjs/tee/TeeBlockVerifier.d.ts +3 -4
  80. package/dist/cjs/tee/TeeBlockVerifier.js +2 -8
  81. package/dist/cjs/tee/errors.d.ts +6 -3
  82. package/dist/cjs/tee/errors.js +9 -5
  83. package/dist/cjs/tee/types.d.ts +50 -9
  84. package/dist/cjs/tee/types.js +32 -1
  85. package/dist/cjs/types/DistributedSecretStorage.d.ts +7 -0
  86. package/dist/cjs/types/Offer.d.ts +20 -5
  87. package/dist/cjs/types/Offer.js +10 -2
  88. package/dist/cjs/types/OfferVersion.d.ts +13 -0
  89. package/dist/cjs/types/OfferVersion.js +9 -0
  90. package/dist/cjs/types/Order.d.ts +8 -2
  91. package/dist/cjs/types/Order.js +3 -1
  92. package/dist/cjs/types/SlotInfo.d.ts +1 -0
  93. package/dist/cjs/types/Superpro.d.ts +2 -1
  94. package/dist/cjs/types/Superpro.js +2 -1
  95. package/dist/cjs/types/TeeOfferInfo.d.ts +2 -1
  96. package/dist/cjs/types/index.d.ts +1 -0
  97. package/dist/cjs/types/index.js +2 -1
  98. package/dist/cjs/types/storage/StorageAccess.d.ts +3 -3
  99. package/dist/cjs/utils/CryptoKeysTransformer.d.ts +7 -1
  100. package/dist/cjs/utils/CryptoKeysTransformer.js +66 -7
  101. package/dist/cjs/utils/NonceTracker.js +1 -1
  102. package/dist/cjs/utils/helper.d.ts +7 -1
  103. package/dist/cjs/utils/helper.js +87 -2
  104. package/dist/cjs/utils/helpers/OrderArgsHelper.d.ts +17 -0
  105. package/dist/cjs/utils/helpers/OrderArgsHelper.js +87 -0
  106. package/dist/cjs/utils/helpers/index.d.ts +2 -0
  107. package/dist/cjs/utils/helpers/index.js +3 -1
  108. package/dist/cjs/utils/helpers/uploadObjectToStorage.d.ts +13 -0
  109. package/dist/cjs/utils/helpers/uploadObjectToStorage.js +55 -0
  110. package/dist/cjs/utils/schema-validators/index.d.ts +1 -0
  111. package/dist/cjs/utils/schema-validators/index.js +6 -0
  112. package/dist/cjs/utils/schema-validators/validator.d.ts +7 -0
  113. package/dist/cjs/utils/schema-validators/validator.js +49 -0
  114. package/dist/mjs/RIGenerator.d.ts +2 -0
  115. package/dist/mjs/RIGenerator.js +6 -4
  116. package/dist/mjs/TIIGenerator.d.ts +2 -1
  117. package/dist/mjs/TIIGenerator.js +13 -3
  118. package/dist/mjs/TeeInputGeneratorBase.d.ts +1 -1
  119. package/dist/mjs/TeeInputGeneratorBase.js +20 -32
  120. package/dist/mjs/analytics/eventProviders/BrowserEventProvider.d.ts +1 -0
  121. package/dist/mjs/analytics/eventProviders/BrowserEventProvider.js +3 -3
  122. package/dist/mjs/analytics/transports/AxiosTransport.js +1 -1
  123. package/dist/mjs/config.d.ts +0 -1
  124. package/dist/mjs/config.js +1 -2
  125. package/dist/mjs/constants.d.ts +5 -4
  126. package/dist/mjs/constants.js +30 -6
  127. package/dist/mjs/contracts/abi.d.ts +766 -104
  128. package/dist/mjs/contracts/abi.js +968 -119
  129. package/dist/mjs/crypto/index.d.ts +1 -0
  130. package/dist/mjs/crypto/index.js +2 -1
  131. package/dist/mjs/errors/base.error.d.ts +3 -0
  132. package/dist/mjs/errors/base.error.js +15 -0
  133. package/dist/mjs/errors/index.d.ts +2 -0
  134. package/dist/mjs/errors/index.js +3 -0
  135. package/dist/mjs/errors/not-found.error.d.ts +3 -0
  136. package/dist/mjs/errors/not-found.error.js +4 -0
  137. package/dist/mjs/errors/utils.d.ts +1 -0
  138. package/dist/mjs/errors/utils.js +18 -0
  139. package/dist/mjs/index.d.ts +9 -1
  140. package/dist/mjs/index.js +9 -2
  141. package/dist/mjs/models/Offer.d.ts +38 -6
  142. package/dist/mjs/models/Offer.js +120 -16
  143. package/dist/mjs/models/Order.d.ts +2 -90
  144. package/dist/mjs/models/Order.js +20 -91
  145. package/dist/mjs/models/Provider.js +1 -1
  146. package/dist/mjs/models/TCB.js +13 -5
  147. package/dist/mjs/models/TeeOffer.d.ts +35 -13
  148. package/dist/mjs/models/TeeOffer.js +113 -41
  149. package/dist/mjs/proto/Compression.d.ts +1 -1
  150. package/dist/mjs/proto/TRI.d.ts +41 -6
  151. package/dist/mjs/proto/TRI.js +18 -1
  152. package/dist/mjs/proto/TeeProperties.d.ts +5 -5
  153. package/dist/mjs/providers/storage/IStorageProvider.d.ts +1 -1
  154. package/dist/mjs/providers/storage/S3StorageProvider.d.ts +8 -7
  155. package/dist/mjs/providers/storage/S3StorageProvider.js +77 -38
  156. package/dist/mjs/providers/storage/StorageAdapter.d.ts +9 -7
  157. package/dist/mjs/providers/storage/StorageAdapter.js +27 -29
  158. package/dist/mjs/providers/storage/StorageContentWriter.d.ts +2 -2
  159. package/dist/mjs/providers/storage/StorageContentWriter.js +5 -5
  160. package/dist/mjs/providers/storage/StorageKeyValueAdapter.d.ts +8 -5
  161. package/dist/mjs/providers/storage/StorageKeyValueAdapter.js +30 -16
  162. package/dist/mjs/providers/storage/StorjAdapter.d.ts +5 -4
  163. package/dist/mjs/providers/storage/StorjAdapter.js +15 -9
  164. package/dist/mjs/providers/storage/StorjCredentialsManager.d.ts +24 -0
  165. package/dist/mjs/providers/storage/StorjCredentialsManager.js +82 -0
  166. package/dist/mjs/providers/storage/StorjStorageProvider.js +2 -2
  167. package/dist/mjs/providers/storage/fs-storage-provider.d.ts +19 -0
  168. package/dist/mjs/providers/storage/fs-storage-provider.js +113 -0
  169. package/dist/mjs/providers/storage/getStorageProvider.js +4 -1
  170. package/dist/mjs/providers/storage/parseStorageCredentials.d.ts +5 -0
  171. package/dist/mjs/providers/storage/parseStorageCredentials.js +17 -0
  172. package/dist/mjs/providers/storage/types.d.ts +22 -0
  173. package/dist/mjs/staticModels/LoaderSecretsPublicKeys.js +4 -4
  174. package/dist/mjs/staticModels/LoaderSessions.d.ts +2 -2
  175. package/dist/mjs/staticModels/LoaderSessions.js +6 -6
  176. package/dist/mjs/staticModels/OfferResources.d.ts +2 -1
  177. package/dist/mjs/staticModels/OfferResources.js +25 -9
  178. package/dist/mjs/staticModels/Offers.js +7 -2
  179. package/dist/mjs/staticModels/OffersStorageAllocated.d.ts +1 -2
  180. package/dist/mjs/staticModels/OffersStorageAllocated.js +11 -11
  181. package/dist/mjs/staticModels/OffersStorageRequests.js +5 -4
  182. package/dist/mjs/staticModels/Orders.d.ts +5 -4
  183. package/dist/mjs/staticModels/Orders.js +7 -6
  184. package/dist/mjs/staticModels/SecretRequests.d.ts +1 -1
  185. package/dist/mjs/staticModels/SecretRequests.js +15 -8
  186. package/dist/mjs/staticModels/TeeOffers.d.ts +0 -2
  187. package/dist/mjs/staticModels/TeeOffers.js +5 -38
  188. package/dist/mjs/store.js +2 -2
  189. package/dist/mjs/tee/QuoteParser.d.ts +61 -6
  190. package/dist/mjs/tee/QuoteParser.js +245 -28
  191. package/dist/mjs/tee/QuoteValidator.d.ts +11 -0
  192. package/dist/mjs/tee/QuoteValidator.js +131 -34
  193. package/dist/mjs/tee/TeeBlockVerifier.d.ts +3 -4
  194. package/dist/mjs/tee/TeeBlockVerifier.js +2 -8
  195. package/dist/mjs/tee/errors.d.ts +6 -3
  196. package/dist/mjs/tee/errors.js +7 -4
  197. package/dist/mjs/tee/types.d.ts +50 -9
  198. package/dist/mjs/tee/types.js +28 -2
  199. package/dist/mjs/types/DistributedSecretStorage.d.ts +7 -0
  200. package/dist/mjs/types/Offer.d.ts +20 -5
  201. package/dist/mjs/types/Offer.js +9 -1
  202. package/dist/mjs/types/OfferVersion.d.ts +13 -0
  203. package/dist/mjs/types/OfferVersion.js +6 -0
  204. package/dist/mjs/types/Order.d.ts +8 -2
  205. package/dist/mjs/types/Order.js +3 -1
  206. package/dist/mjs/types/SlotInfo.d.ts +1 -0
  207. package/dist/mjs/types/Superpro.d.ts +2 -1
  208. package/dist/mjs/types/Superpro.js +2 -1
  209. package/dist/mjs/types/TeeOfferInfo.d.ts +2 -1
  210. package/dist/mjs/types/index.d.ts +1 -0
  211. package/dist/mjs/types/index.js +2 -1
  212. package/dist/mjs/types/storage/StorageAccess.d.ts +3 -3
  213. package/dist/mjs/utils/CryptoKeysTransformer.d.ts +7 -1
  214. package/dist/mjs/utils/CryptoKeysTransformer.js +66 -7
  215. package/dist/mjs/utils/NonceTracker.js +1 -1
  216. package/dist/mjs/utils/helper.d.ts +7 -1
  217. package/dist/mjs/utils/helper.js +80 -1
  218. package/dist/mjs/utils/helpers/OrderArgsHelper.d.ts +17 -0
  219. package/dist/mjs/utils/helpers/OrderArgsHelper.js +80 -0
  220. package/dist/mjs/utils/helpers/index.d.ts +2 -0
  221. package/dist/mjs/utils/helpers/index.js +3 -1
  222. package/dist/mjs/utils/helpers/uploadObjectToStorage.d.ts +13 -0
  223. package/dist/mjs/utils/helpers/uploadObjectToStorage.js +48 -0
  224. package/dist/mjs/utils/schema-validators/index.d.ts +1 -0
  225. package/dist/mjs/utils/schema-validators/index.js +2 -0
  226. package/dist/mjs/utils/schema-validators/validator.d.ts +7 -0
  227. package/dist/mjs/utils/schema-validators/validator.js +45 -0
  228. package/package.json +6 -5
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.QuoteValidator = void 0;
7
7
  const axios_1 = __importDefault(require("axios"));
8
+ const index_js_1 = require("../utils/helpers/index.js");
8
9
  const elliptic_1 = __importDefault(require("elliptic"));
9
10
  const node_forge_1 = __importDefault(require("node-forge"));
10
11
  const x509_1 = require("@fidm/x509");
@@ -13,11 +14,13 @@ const pkijs_1 = require("pkijs");
13
14
  const asn1js_1 = require("asn1js");
14
15
  const lodash_1 = __importDefault(require("lodash"));
15
16
  const QuoteParser_js_1 = require("./QuoteParser.js");
17
+ const types_js_1 = require("./types.js");
16
18
  const logger_js_1 = __importDefault(require("../logger.js"));
17
19
  const errors_js_1 = require("./errors.js");
18
20
  const statuses_js_1 = require("./statuses.js");
19
21
  const dto_js_1 = require("@super-protocol/dto-js");
20
- const index_js_1 = __importDefault(require("../crypto/index.js"));
22
+ const index_js_2 = __importDefault(require("../crypto/index.js"));
23
+ const constants_js_1 = require("../constants.js");
21
24
  const { ec } = elliptic_1.default;
22
25
  const { util, asn1 } = node_forge_1.default;
23
26
  const INTEL_BASE_SGX_URL = 'https://api.trustedservices.intel.com';
@@ -37,13 +40,87 @@ class QuoteValidator {
37
40
  isDefault;
38
41
  baseUrl;
39
42
  teeSgxParser;
43
+ teeTdxParser;
40
44
  logger;
41
45
  constructor(baseUrl) {
42
46
  this.isDefault = baseUrl === INTEL_BASE_SGX_URL;
43
47
  this.baseUrl = `${baseUrl}/sgx/certification/v4`;
44
48
  this.teeSgxParser = new QuoteParser_js_1.TeeSgxParser();
49
+ this.teeTdxParser = new QuoteParser_js_1.TeeTdxParser();
45
50
  this.logger = logger_js_1.default.child({ className: QuoteValidator.name });
46
51
  }
52
+ static async getSignature(mrEnclave, options) {
53
+ const baseURL = options?.baseURL ?? 'https://api.github.com/repos/Super-Protocol/sp-vm';
54
+ const retryMax = options?.retryMax ?? 3;
55
+ const retryInterval = options?.retryInterval ?? 1000;
56
+ const axiosInstance = axios_1.default.create({
57
+ baseURL,
58
+ headers: {
59
+ Accept: 'application/vnd.github.v3.raw',
60
+ },
61
+ });
62
+ const response = await (0, index_js_1.tryWithInterval)({
63
+ checkResult(response) {
64
+ return { isResultOk: response.status === 200 };
65
+ },
66
+ handler() {
67
+ const mrenclaveHex = mrEnclave.toString('hex');
68
+ return axiosInstance.get(`/contents/signatures/mrenclave-${mrenclaveHex}.sign`, {
69
+ responseType: 'arraybuffer',
70
+ });
71
+ },
72
+ checkError(err) {
73
+ if (axios_1.default.isAxiosError(err) && err.response) {
74
+ const status = err.response.status;
75
+ return { retryable: status < 400 || status >= 500 };
76
+ }
77
+ return { retryable: axios_1.default.isAxiosError(err) };
78
+ },
79
+ retryInterval,
80
+ retryMax,
81
+ });
82
+ return Buffer.from(response.data);
83
+ }
84
+ static async checkSignature(quote, options = { getMrEnclaveSignature: QuoteValidator.getSignature }) {
85
+ const { getMrEnclaveSignature } = options;
86
+ const { type: quoteType } = QuoteParser_js_1.TeeSgxParser.determineQuoteType(quote);
87
+ switch (quoteType) {
88
+ case types_js_1.QuoteType.SGX: {
89
+ const parser = new QuoteParser_js_1.TeeSgxParser();
90
+ const parsedQuote = parser.parseQuote(quote);
91
+ const report = parser.parseReport(parsedQuote.report);
92
+ if (report.mrSigner.toString('hex') !== constants_js_1.TEE_LOADER_TRUSTED_MRSIGNER.toString('hex')) {
93
+ throw new errors_js_1.InvalidSignatureError('Quote has an invalid MR signer');
94
+ }
95
+ break;
96
+ }
97
+ case types_js_1.QuoteType.TDX: {
98
+ const mrEnclave = QuoteParser_js_1.TeeParser.getMrEnclave(quote);
99
+ const cert = node_forge_1.default.pki.certificateFromPem(constants_js_1.TEE_LOADER_TRUSTED_CERTIFICATE);
100
+ const isCertValid = node_forge_1.default.pki.verifyCertificateChain(node_forge_1.default.pki.createCaStore([cert]), [
101
+ cert,
102
+ ]);
103
+ if (!isCertValid) {
104
+ throw new Error('Trusted cert is invalid');
105
+ }
106
+ const publicKey = cert.publicKey;
107
+ if (!Object.prototype.hasOwnProperty.call(publicKey, 'n') ||
108
+ !Object.prototype.hasOwnProperty.call(publicKey, 'e')) {
109
+ throw new errors_js_1.InvalidSignatureError('Expected RSA private key inside certificate');
110
+ }
111
+ const digest = node_forge_1.default.md.sha256
112
+ .create()
113
+ .update(String.fromCharCode(...mrEnclave))
114
+ .digest();
115
+ const signature = await getMrEnclaveSignature(Buffer.from(mrEnclave));
116
+ const isSignatureValid = publicKey.verify(digest.bytes(), String.fromCharCode(...signature));
117
+ if (!isSignatureValid) {
118
+ throw new errors_js_1.InvalidSignatureError('TDX signature is invalid');
119
+ }
120
+ break;
121
+ }
122
+ }
123
+ }
47
124
  splitChain(chain) {
48
125
  const begin = '-----BEGIN CERTIFICATE-----';
49
126
  const end = '-----END CERTIFICATE-----';
@@ -80,11 +157,10 @@ class QuoteValidator {
80
157
  }
81
158
  verifyDataBySignature(data, signature, key) {
82
159
  const ellipticEc = new ec('p256');
83
- const result = ellipticEc.verify(data, {
160
+ return ellipticEc.verify(data, {
84
161
  r: signature.subarray(0, 32),
85
162
  s: signature.subarray(32),
86
163
  }, ellipticEc.keyFromPublic(key, 'hex'));
87
- return result;
88
164
  }
89
165
  checkValidDate(from, to) {
90
166
  const now = Date.now();
@@ -133,8 +209,7 @@ class QuoteValidator {
133
209
  if (Buffer.compare(rootFetchedCert.publicKey.keyRaw, INTEL_ROOT_PUB_KEY) !== 0) {
134
210
  throw new errors_js_1.TeeQuoteValidatorError('Wrong Intel root certificate public key');
135
211
  }
136
- const certificatePems = this.splitChain(quote.qeCertificationData.toString()); // [pck, platform, root]
137
- const pckCert = x509_1.Certificate.fromPEM(Buffer.from(certificatePems[0]));
212
+ const pckCert = x509_1.Certificate.fromPEM(Buffer.from(quote.certificates.device.pem));
138
213
  const certType = quote.qeCertificationDataType;
139
214
  if (!this.checkValidDate(pckCert.validFrom.valueOf(), pckCert.validTo.valueOf())) {
140
215
  throw new errors_js_1.TeeQuoteValidatorError('PCK certificate validation date is not valid');
@@ -142,7 +217,7 @@ class QuoteValidator {
142
217
  if (certType !== 5) {
143
218
  throw new errors_js_1.TeeQuoteValidatorError(`Unsupported certification data type: ${certType}`);
144
219
  }
145
- if (rootFetchedPem !== certificatePems[2]) {
220
+ if (rootFetchedPem !== quote.certificates.root.pem) {
146
221
  throw new errors_js_1.TeeQuoteValidatorError("Invalid SGX root certificate in quote's certificate chain");
147
222
  }
148
223
  if (!this.checkChainForIssuers(pckCert, platformFetchedCert, rootFetchedCert)) {
@@ -153,18 +228,14 @@ class QuoteValidator {
153
228
  platformFetchedCert.serialNumber,
154
229
  pckCert.serialNumber,
155
230
  ];
156
- if (this.isDefault) {
157
- const intelCrlDer = await axios_1.default.get(INTEL_SGX_ROOT_CA_URL, {
158
- responseType: 'arraybuffer',
159
- });
160
- const intelCrlAsn = (0, asn1js_1.fromBER)(Buffer.from(intelCrlDer.data));
161
- this.checkCertificatesInCrl(new pkijs_1.CertificateRevocationList({ schema: intelCrlAsn.result }), certIds);
162
- }
163
- else {
164
- const intelCrlDer = await axios_1.default.get(`${this.baseUrl}/rootcacrl`);
165
- const intelCrl = this.getCrl(intelCrlDer.data);
166
- this.checkCertificatesInCrl(intelCrl, certIds);
167
- }
231
+ const caCrlUrl = this.isDefault
232
+ ? INTEL_SGX_ROOT_CA_URL
233
+ : `${this.baseUrl}/crl?uri=${INTEL_SGX_ROOT_CA_URL}`;
234
+ const intelCrlDer = await axios_1.default.get(caCrlUrl, {
235
+ responseType: 'arraybuffer',
236
+ });
237
+ const intelCrlAsn = (0, asn1js_1.fromBER)(Buffer.from(intelCrlDer.data));
238
+ this.checkCertificatesInCrl(new pkijs_1.CertificateRevocationList({ schema: intelCrlAsn.result }), certIds);
168
239
  const platformCrl = this.getCrl(platformCrlResult.data);
169
240
  this.checkCertificatesInCrl(platformCrl, certIds);
170
241
  return { pckCert, rootCertPem: rootFetchedPem };
@@ -185,15 +256,18 @@ class QuoteValidator {
185
256
  async verifyEnclaveReportSignature(quote) {
186
257
  const key = Buffer.from(quote.ecdsaAttestationKey);
187
258
  const headerBuffer = Buffer.from(quote.rawHeader);
188
- const reportBuffer = Buffer.from(quote.report);
189
- const expected = quote.isvEnclaveReportSignature;
259
+ const reportBuffer = quote.quoteType === types_js_1.QuoteType.SGX
260
+ ? Buffer.from(quote.report)
261
+ : Buffer.from(quote.tdQuoteBody);
262
+ const expected = quote.quoteType === types_js_1.QuoteType.SGX
263
+ ? Buffer.from(quote.isvEnclaveReportSignature)
264
+ : Buffer.from(quote.quoteSignature);
190
265
  const calculatedHash = await this.getSha256Hash(Buffer.concat([headerBuffer, reportBuffer]));
191
266
  const ellipticEc = new ec('p256');
192
- const result = ellipticEc.verify(calculatedHash, {
267
+ return ellipticEc.verify(calculatedHash, {
193
268
  r: expected.subarray(0, 32),
194
269
  s: expected.subarray(32),
195
270
  }, Buffer.concat([Buffer.from([4]), key]));
196
- return result;
197
271
  }
198
272
  async validateQuoteStructure(quote, report, pckPublicKey) {
199
273
  if (!(await this.verifyQeReportSignature(quote, pckPublicKey))) {
@@ -225,8 +299,12 @@ class QuoteValidator {
225
299
  const result = util.bytesToHex(data[0].value);
226
300
  return targetType === asn1.Type.OCTETSTRING ? result : parseInt(result, 16).toString();
227
301
  }
228
- async getTcbInfo(fmspc, rootCertPem) {
229
- const tcbData = await axios_1.default.get(`${this.baseUrl}/tcb?fmspc=${fmspc}`);
302
+ async getTcbInfo(fmspc, rootCertPem, quoteType) {
303
+ let tcbUrl = `${this.baseUrl}/tcb?fmspc=${fmspc}`;
304
+ if (quoteType === types_js_1.QuoteType.TDX) {
305
+ tcbUrl = tcbUrl.replace('sgx/certification', 'tdx/certification');
306
+ }
307
+ const tcbData = await axios_1.default.get(tcbUrl);
230
308
  const tcbInfoHeader = 'tcb-info-issuer-chain';
231
309
  const tcbInfoChain = this.splitChain(decodeURIComponent(tcbData.headers[tcbInfoHeader])); // [tcb, root]
232
310
  if (tcbInfoChain[1] !== rootCertPem) {
@@ -245,8 +323,12 @@ class QuoteValidator {
245
323
  }
246
324
  return tcbData.data;
247
325
  }
248
- async getQEIdentity(rootCertPem) {
249
- const qeIdentityData = await axios_1.default.get(`${this.baseUrl}/qe/identity`);
326
+ async getQEIdentity(rootCertPem, quoteType) {
327
+ let qeIdentityUrl = `${this.baseUrl}/qe/identity`;
328
+ if (quoteType === types_js_1.QuoteType.TDX) {
329
+ qeIdentityUrl = qeIdentityUrl.replace('sgx/certification', 'tdx/certification');
330
+ }
331
+ const qeIdentityData = await axios_1.default.get(qeIdentityUrl);
250
332
  const qeIdentityHeader = 'sgx-enclave-identity-issuer-chain';
251
333
  const qeIdentityChain = this.splitChain(decodeURIComponent(qeIdentityData.headers[qeIdentityHeader])); // [qeIdentity, root]
252
334
  if (qeIdentityChain[1] !== rootCertPem) {
@@ -342,7 +424,10 @@ class QuoteValidator {
342
424
  }
343
425
  async validate(quoteBuffer) {
344
426
  try {
345
- const quote = this.teeSgxParser.parseQuote(quoteBuffer);
427
+ const quoteType = QuoteParser_js_1.TeeParser.determineQuoteType(quoteBuffer);
428
+ const quote = quoteType.type === types_js_1.QuoteType.SGX
429
+ ? this.teeSgxParser.parseQuote(quoteBuffer)
430
+ : this.teeTdxParser.parseQuote(quoteBuffer);
346
431
  const report = this.teeSgxParser.parseReport(quote.qeReport);
347
432
  const { pckCert, rootCertPem } = await this.getCertificates(quote);
348
433
  await this.validateQuoteStructure(quote, report, pckCert.publicKey.keyRaw);
@@ -350,8 +435,8 @@ class QuoteValidator {
350
435
  const sgxExtensionData = this.getSgxExtensionData(pckCert);
351
436
  const fmspc = this.getDataFromExtension(sgxExtensionData, FMSPC_OID, asn1.Type.OCTETSTRING);
352
437
  const pceId = this.getDataFromExtension(sgxExtensionData, PCEID_OID, asn1.Type.OCTETSTRING);
353
- const tcbData = await this.getTcbInfo(fmspc, rootCertPem);
354
- const qeIdentity = await this.getQEIdentity(rootCertPem);
438
+ const tcbData = await this.getTcbInfo(fmspc, rootCertPem, quoteType.type);
439
+ const qeIdentity = await this.getQEIdentity(rootCertPem, quoteType.type);
355
440
  const qeIdentityStatus = this.getQEIdentityStatus(report, qeIdentity);
356
441
  const tcbStatus = this.getTcbStatus(fmspc, pceId, tcbData, sgxExtensionData);
357
442
  const quoteValidationStatus = this.getQuoteValidationStatus(qeIdentityStatus, tcbStatus);
@@ -371,10 +456,22 @@ class QuoteValidator {
371
456
  }
372
457
  }
373
458
  async isQuoteHasUserData(quoteBuffer, userDataBuffer) {
374
- const quote = this.teeSgxParser.parseQuote(quoteBuffer);
375
- const report = this.teeSgxParser.parseReport(quote.report);
459
+ const quoteType = QuoteParser_js_1.TeeParser.determineQuoteType(quoteBuffer);
460
+ const quote = quoteType.type === types_js_1.QuoteType.SGX
461
+ ? this.teeSgxParser.parseQuote(quoteBuffer)
462
+ : this.teeTdxParser.parseQuote(quoteBuffer);
463
+ let slicedQuoteData;
376
464
  const userDataHash = await this.getSha256Hash(userDataBuffer);
377
- const slicedQuoteData = report.userData.slice(0, userDataHash.length);
465
+ if (quoteType.type === types_js_1.QuoteType.SGX) {
466
+ slicedQuoteData = this.teeSgxParser
467
+ .parseReport(quote.report)
468
+ .userData.slice(0, userDataHash.length);
469
+ }
470
+ else {
471
+ slicedQuoteData = this.teeTdxParser
472
+ .parseBody(quote.tdQuoteBody)
473
+ .reportData.slice(0, userDataHash.length);
474
+ }
378
475
  const compareResult = Buffer.compare(slicedQuoteData, userDataHash);
379
476
  return compareResult === 0;
380
477
  }
@@ -383,9 +480,9 @@ class QuoteValidator {
383
480
  algo: dto_js_1.HashAlgorithm.SHA256,
384
481
  encoding: dto_js_1.Encoding.base64,
385
482
  };
386
- const hashData = await index_js_1.default.createHash(data, hashInfo);
483
+ const hashData = await index_js_2.default.createHash(data, hashInfo);
387
484
  return Buffer.from(hashData.hash, hashData.encoding);
388
485
  }
389
486
  }
390
487
  exports.QuoteValidator = QuoteValidator;
391
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVvdGVWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVlL1F1b3RlVmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGtEQUEwQjtBQUMxQix3REFBZ0M7QUFDaEMsNERBQStCO0FBQy9CLHFDQUFvRDtBQUNwRCx5REFBOEM7QUFDOUMsaUNBQWtEO0FBQ2xELG1DQUFpQztBQUNqQyxvREFBdUI7QUFDdkIscURBQWdEO0FBRWhELDZEQUFzQztBQUV0QywyQ0FBcUQ7QUFDckQsK0NBQXlGO0FBQ3pGLG1EQUFpRTtBQUNqRSxrRUFBd0M7QUFFeEMsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLGtCQUFRLENBQUM7QUFDeEIsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxvQkFBSyxDQUFDO0FBRTdCLE1BQU0sa0JBQWtCLEdBQUcsdUNBQXVDLENBQUM7QUFDbkUsTUFBTSxxQkFBcUIsR0FBRyxtRUFBbUUsQ0FBQztBQUNsRyxNQUFNLE9BQU8sR0FBRyx1QkFBdUIsQ0FBQztBQUN4QyxNQUFNLFNBQVMsR0FBRyxHQUFHLE9BQU8sSUFBSSxDQUFDO0FBQ2pDLE1BQU0sU0FBUyxHQUFHLEdBQUcsT0FBTyxJQUFJLENBQUM7QUFDakMsTUFBTSxPQUFPLEdBQUcsR0FBRyxPQUFPLElBQUksQ0FBQztBQUMvQixNQUFNLFVBQVUsR0FBRyxHQUFHLE9BQU8sS0FBSyxDQUFDO0FBQ25DLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxVQUFVLENBQUM7SUFDeEMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQ2hHLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRztJQUNoRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQ2hHLEdBQUc7Q0FDSixDQUFDLENBQUM7QUFRSCxNQUFhLGNBQWM7SUFDUixTQUFTLENBQVU7SUFDbkIsT0FBTyxDQUFTO0lBQ2hCLFlBQVksQ0FBZTtJQUNwQyxNQUFNLENBQW9CO0lBRWxDLFlBQVksT0FBZTtRQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sS0FBSyxrQkFBa0IsQ0FBQztRQUNoRCxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsT0FBTyx1QkFBdUIsQ0FBQztRQUNqRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksNkJBQVksRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLEdBQUcsbUJBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVPLFVBQVUsQ0FBQyxLQUFhO1FBQzlCLE1BQU0sS0FBSyxHQUFHLDZCQUE2QixDQUFDO1FBQzVDLE1BQU0sR0FBRyxHQUFHLDJCQUEyQixDQUFDO1FBRXhDLE9BQU8sS0FBSzthQUNULEtBQUssQ0FBQyxLQUFLLENBQUM7YUFDWixNQUFNLENBQUMsT0FBTyxDQUFDO2FBQ2YsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxRQUFnQixFQUFFLFNBQWlCO1FBQzNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV0QyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVPLGlCQUFpQixDQUFDLFFBQXlCLEVBQUUsU0FBaUI7UUFDcEUsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDekMsS0FBSyxNQUFNLEtBQUssSUFBSSxRQUFRLENBQUMsS0FBMEIsRUFBRSxDQUFDO2dCQUN4RCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDakMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBZSxDQUFDLENBQUM7b0JBQ2pELElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUN0QixPQUFPLFFBQVEsQ0FBQztvQkFDbEIsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbEMsS0FBSyxNQUFNLEtBQUssSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ3hELElBQUksTUFBTSxFQUFFLENBQUM7b0JBQ1gsT0FBTyxNQUFNLENBQUM7Z0JBQ2hCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLHFCQUFxQixDQUFDLElBQVksRUFBRSxTQUFpQixFQUFFLEdBQVc7UUFDeEUsTUFBTSxVQUFVLEdBQUcsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FDOUIsSUFBSSxFQUNKO1lBQ0UsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1QixDQUFDLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7U0FDMUIsRUFDRCxVQUFVLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FDckMsQ0FBQztRQUVGLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxjQUFjLENBQUMsSUFBWSxFQUFFLEVBQVU7UUFDN0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFTyxvQkFBb0IsQ0FDMUIsT0FBb0IsRUFDcEIsWUFBeUIsRUFDekIsUUFBcUI7UUFFckIsT0FBTyxDQUNMLGdCQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLE9BQU8sQ0FBQztZQUMvQyxnQkFBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FDakQsQ0FBQztJQUNKLENBQUM7SUFFTyxNQUFNLENBQUMsT0FBZTtRQUM1QixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztZQUN4QyxDQUFDLENBQUMsNkJBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQzdCLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFBLGdCQUFPLEVBQUMsTUFBb0IsQ0FBQyxDQUFDO1FBRTdDLE9BQU8sSUFBSSxpQ0FBeUIsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRU8sc0JBQXNCLENBQUMsR0FBOEIsRUFBRSxPQUFpQjtRQUM5RSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN2QyxNQUFNLElBQUksa0NBQXNCLENBQUMsc0RBQXNELENBQUMsQ0FBQztRQUMzRixDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3pGLE1BQU0sSUFBSSxrQ0FBc0IsQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1FBQzFGLENBQUM7UUFDRCxJQUFJLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzVCLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUM1RCxPQUFPLENBQUMsUUFBUSxDQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUM3RSxDQUNGLENBQUM7WUFDRixJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNqQixNQUFNLElBQUksa0NBQXNCLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztZQUNyRSxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsZUFBZSxDQUMzQixLQUEwQjtRQUUxQixNQUFNLGlCQUFpQixHQUFHLE1BQU0sZUFBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLGtDQUFrQyxDQUFDLENBQUM7UUFDN0YsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQztRQUNoRyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsY0FBYyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLG1CQUFtQjtRQUNoRyxNQUFNLG1CQUFtQixHQUFHLGtCQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1FBQ2pGLE1BQU0sZUFBZSxHQUFHLGtCQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUV6RSxJQUNFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FDbEIsbUJBQW1CLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxFQUN2QyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQ3RDLEVBQ0QsQ0FBQztZQUNELE1BQU0sSUFBSSxrQ0FBc0IsQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7UUFDRCxJQUNFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFFLGVBQWUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsRUFDNUYsQ0FBQztZQUNELE1BQU0sSUFBSSxrQ0FBc0IsQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7UUFDRCxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNoRSxNQUFNLElBQUksa0NBQXNCLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0UsTUFBTSxJQUFJLGtDQUFzQixDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDOUUsQ0FBQztRQUVELE1BQU0sZUFBZSxHQUFhLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyx3QkFBd0I7UUFDakgsTUFBTSxPQUFPLEdBQUcsa0JBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQztRQUUvQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2pGLE1BQU0sSUFBSSxrQ0FBc0IsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1FBQ25GLENBQUM7UUFDRCxJQUFJLFFBQVEsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNuQixNQUFNLElBQUksa0NBQXNCLENBQUMsd0NBQXdDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDdkYsQ0FBQztRQUNELElBQUksY0FBYyxLQUFLLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzFDLE1BQU0sSUFBSSxrQ0FBc0IsQ0FBQywyREFBMkQsQ0FBQyxDQUFDO1FBQ2hHLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxlQUFlLENBQUMsRUFBRSxDQUFDO1lBQzlFLE1BQU0sSUFBSSxrQ0FBc0IsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRztZQUNkLGVBQWUsQ0FBQyxZQUFZO1lBQzVCLG1CQUFtQixDQUFDLFlBQVk7WUFDaEMsT0FBTyxDQUFDLFlBQVk7U0FDckIsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLE1BQU0sV0FBVyxHQUFHLE1BQU0sZUFBSyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRTtnQkFDekQsWUFBWSxFQUFFLGFBQWE7YUFDNUIsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxXQUFXLEdBQUcsSUFBQSxnQkFBTyxFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLHNCQUFzQixDQUN6QixJQUFJLGlDQUF5QixDQUFDLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUM3RCxPQUFPLENBQ1IsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxXQUFXLEdBQUcsTUFBTSxlQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sWUFBWSxDQUFDLENBQUM7WUFDakUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRWxELE9BQU8sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFTyxLQUFLLENBQUMsdUJBQXVCLENBQ25DLEtBQTBCLEVBQzFCLFlBQW9CO1FBRXBCLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDdkQsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFFekUsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRU8sS0FBSyxDQUFDLGtCQUFrQixDQUM5QixLQUEwQixFQUMxQixNQUE0QjtRQUU1QixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsb0JBQW9CLENBQUM7UUFDOUMsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUFDO1FBQ2pELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUN6QyxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0YsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUVoRSxPQUFPLE1BQU0sS0FBSyxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVPLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxLQUEwQjtRQUNuRSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQztRQUVqRCxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFN0YsTUFBTSxVQUFVLEdBQUcsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FDOUIsY0FBYyxFQUNkO1lBQ0UsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMzQixDQUFDLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7U0FDekIsRUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FDdkMsQ0FBQztRQUVGLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxLQUFLLENBQUMsc0JBQXNCLENBQ2xDLEtBQTBCLEVBQzFCLE1BQTRCLEVBQzVCLFlBQW9CO1FBRXBCLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDL0QsTUFBTSxJQUFJLGtDQUFzQixDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUNELElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDcEQsTUFBTSxJQUFJLGtDQUFzQixDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDM0QsQ0FBQztRQUNELElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLDRCQUE0QixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN0RCxNQUFNLElBQUksa0NBQXNCLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUNyRSxDQUFDO0lBQ0gsQ0FBQztJQUVPLG1CQUFtQixDQUFDLE9BQW9CO1FBQzlDLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssT0FBTyxDQUFDLENBQUM7UUFDakYsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLGtDQUFzQixDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUVELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztJQUVPLG9CQUFvQixDQUMxQixnQkFBMkIsRUFDM0IsU0FBaUIsRUFDakIsVUFBMkI7UUFFM0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDMUYsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLGtDQUFzQixDQUFDLE9BQU8sU0FBUywwQ0FBMEMsQ0FBQyxDQUFDO1FBQy9GLENBQUM7UUFDRCxNQUFNLElBQUksR0FBSSxPQUFPLENBQUMsS0FBMkIsQ0FBQyxNQUFNLENBQ3RELENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FDL0MsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLGtDQUFzQixDQUFDLGVBQWUsU0FBUyxZQUFZLFVBQVUsWUFBWSxDQUFDLENBQUM7UUFDL0YsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQWUsQ0FBQyxDQUFDO1FBRXhELE9BQU8sVUFBVSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDekYsQ0FBQztJQUVPLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBYSxFQUFFLFdBQW1CO1FBQ3pELE1BQU0sT0FBTyxHQUFHLE1BQU0sZUFBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLGNBQWMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN0RSxNQUFNLGFBQWEsR0FBRyx1QkFBdUIsQ0FBQztRQUM5QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYztRQUN4RyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksa0NBQXNCLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUNoRixDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsa0JBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQ3JDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0QsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUM3QyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUNsRCxDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osTUFBTSxJQUFJLGtDQUFzQixDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQzNELE1BQU0sSUFBSSxrQ0FBc0IsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQyxJQUFnQixDQUFDO0lBQ2xDLENBQUM7SUFFTyxLQUFLLENBQUMsYUFBYSxDQUFDLFdBQW1CO1FBQzdDLE1BQU0sY0FBYyxHQUFHLE1BQU0sZUFBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLGNBQWMsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sZ0JBQWdCLEdBQUcsbUNBQW1DLENBQUM7UUFDN0QsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FDckMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQzdELENBQUMsQ0FBQyxxQkFBcUI7UUFDeEIsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDdkMsTUFBTSxJQUFJLGtDQUFzQixDQUFDLHdEQUF3RCxDQUFDLENBQUM7UUFDN0YsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLGtCQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RSxNQUFNLEdBQUcsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUM1QyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FDN0MsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FDakUsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxrQ0FBc0IsQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFFRCxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUMxRSxNQUFNLElBQUksa0NBQXNCLENBQUMsa0RBQWtELENBQUMsQ0FBQztRQUN2RixDQUFDO1FBRUQsT0FBTyxjQUFjLENBQUMsSUFBbUIsQ0FBQztJQUM1QyxDQUFDO0lBRU8sbUJBQW1CLENBQ3pCLE1BQTRCLEVBQzVCLFVBQXVCO1FBRXZCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELElBQUksUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLFVBQVUsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkUsTUFBTSxJQUFJLGtDQUFzQixDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxVQUFVLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzlELE1BQU0sSUFBSSxrQ0FBc0IsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQ3hELENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxDQUNuRCxDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsUUFBUSxFQUFFLFNBQStCLENBQUM7UUFDekQsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDhCQUE4QixRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUN0RSxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBQ0QsT0FBTyxnQ0FBa0IsQ0FBQyxTQUFTLENBQUM7SUFDdEMsQ0FBQztJQUVPLFlBQVksQ0FDbEIsS0FBYSxFQUNiLEtBQWEsRUFDYixPQUFpQixFQUNqQixnQkFBMkI7UUFFM0IsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUNoRSxNQUFNLElBQUksa0NBQXNCLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsSUFBSSxLQUFLLEtBQUssT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksa0NBQXNCLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFGLE1BQU0sYUFBYSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNwRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQ3RGLENBQUM7UUFDRixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQzdDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FDWCxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQ3JDLFFBQVEsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FDN0YsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFHLFFBQVEsRUFBRSxTQUF3QixDQUFDO1FBQ2xELElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDekQsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUNELE9BQU8seUJBQVcsQ0FBQyxTQUFTLENBQUM7SUFDL0IsQ0FBQztJQUVPLHdCQUF3QixDQUM5QixnQkFBb0MsRUFDcEMsU0FBc0I7UUFFdEIsSUFBSSxnQkFBZ0IsS0FBSyxnQ0FBa0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN0RCxJQUFJLFNBQVMsS0FBSyx5QkFBVyxDQUFDLFFBQVEsSUFBSSxTQUFTLEtBQUsseUJBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUN0RixPQUFPLHFDQUF1QixDQUFDLG1CQUFtQixDQUFDO1lBQ3JELENBQUM7WUFDRCxJQUNFLFNBQVMsS0FBSyx5QkFBVyxDQUFDLDRCQUE0QjtnQkFDdEQsU0FBUyxLQUFLLHlCQUFXLENBQUMsaUNBQWlDLEVBQzNELENBQUM7Z0JBQ0QsT0FBTyxxQ0FBdUIsQ0FBQyxvQkFBb0IsQ0FBQztZQUN0RCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksZ0JBQWdCLEtBQUssZ0NBQWtCLENBQUMsT0FBTyxJQUFJLFNBQVMsS0FBSyx5QkFBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pGLE1BQU0sSUFBSSxrQ0FBc0IsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxJQUFJLFNBQVMsS0FBSyx5QkFBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZDLE9BQU8scUNBQXVCLENBQUMsUUFBUSxDQUFDO1FBQzFDLENBQUM7UUFDRCxJQUFJLFNBQVMsS0FBSyx5QkFBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3hDLE9BQU8scUNBQXVCLENBQUMsbUJBQW1CLENBQUM7UUFDckQsQ0FBQztRQUNELElBQUksU0FBUyxLQUFLLHlCQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNsRCxPQUFPLHFDQUF1QixDQUFDLG1CQUFtQixDQUFDO1FBQ3JELENBQUM7UUFDRCxPQUFPLHFDQUF1QixDQUFDLG9CQUFvQixDQUFDO0lBQ3RELENBQUM7SUFFTyxtQ0FBbUMsQ0FBQyxNQUErQjtRQUN6RSxRQUFRLE1BQU0sRUFBRSxDQUFDO1lBQ2YsS0FBSyxxQ0FBdUIsQ0FBQyxRQUFRO2dCQUNuQyxPQUFPLCtEQUErRCxDQUFDO1lBQ3pFLEtBQUsscUNBQXVCLENBQUMsbUJBQW1CO2dCQUM5QyxPQUFPOzhHQUMrRixDQUFDO1lBQ3pHLEtBQUsscUNBQXVCLENBQUMsbUJBQW1CO2dCQUM5QyxPQUFPOzRGQUM2RSxDQUFDO1lBQ3ZGLEtBQUsscUNBQXVCLENBQUMsb0JBQW9CO2dCQUMvQyxPQUFPOzZIQUM4RyxDQUFDO1lBQ3hIO2dCQUNFLE9BQU8sNEJBQTRCLENBQUM7UUFDeEMsQ0FBQztJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQW1CO1FBQ3ZDLElBQUksQ0FBQztZQUNILE1BQU0sS0FBSyxHQUF3QixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM3RSxNQUFNLE1BQU0sR0FBeUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRW5GLE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRW5FLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1lBRTNELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM1RixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFNUYsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztZQUMxRCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFekQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3RFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUU3RSxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN6RixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyw4QkFBOEIscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1lBRXhFLE9BQU87Z0JBQ0wscUJBQXFCO2dCQUNyQixXQUFXLEVBQUUsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLHFCQUFxQixDQUFDO2FBQzdFLENBQUM7UUFDSixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHFCQUFxQixLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBRWhELE9BQU87Z0JBQ0wscUJBQXFCLEVBQUUscUNBQXVCLENBQUMsS0FBSztnQkFDcEQsV0FBVyxFQUFFLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxxQ0FBdUIsQ0FBQyxLQUFLLENBQUM7Z0JBQ3BGLEtBQUs7YUFDTixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsa0JBQWtCLENBQUMsV0FBbUIsRUFBRSxjQUFzQjtRQUN6RSxNQUFNLEtBQUssR0FBd0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDN0UsTUFBTSxNQUFNLEdBQXlCLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqRixNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDOUQsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0RSxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUVwRSxPQUFPLGFBQWEsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVPLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBWTtRQUN0QyxNQUFNLFFBQVEsR0FBRztZQUNmLElBQUksRUFBRSxzQkFBYSxDQUFDLE1BQU07WUFDMUIsUUFBUSxFQUFFLGlCQUFRLENBQUMsTUFBTTtTQUMxQixDQUFDO1FBQ0YsTUFBTSxRQUFRLEdBQUcsTUFBTSxrQkFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDekQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7Q0FDRjtBQXplRCx3Q0F5ZUMifQ==
488
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVvdGVWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVlL1F1b3RlVmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGtEQUE2QztBQUM3Qyx3REFBNEQ7QUFDNUQsd0RBQWdDO0FBQ2hDLDREQUErQjtBQUMvQixxQ0FBb0Q7QUFDcEQseURBQThDO0FBQzlDLGlDQUFrRDtBQUNsRCxtQ0FBaUM7QUFDakMsb0RBQXVCO0FBQ3ZCLHFEQUF5RTtBQUN6RSx5Q0FNb0I7QUFDcEIsNkRBQXNDO0FBRXRDLDJDQUE0RTtBQUM1RSwrQ0FBeUY7QUFDekYsbURBQWlFO0FBQ2pFLGtFQUF3QztBQUN4QyxrREFBOEY7QUFFOUYsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLGtCQUFRLENBQUM7QUFDeEIsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxvQkFBSyxDQUFDO0FBRTdCLE1BQU0sa0JBQWtCLEdBQUcsdUNBQXVDLENBQUM7QUFDbkUsTUFBTSxxQkFBcUIsR0FBRyxtRUFBbUUsQ0FBQztBQUNsRyxNQUFNLE9BQU8sR0FBRyx1QkFBdUIsQ0FBQztBQUN4QyxNQUFNLFNBQVMsR0FBRyxHQUFHLE9BQU8sSUFBSSxDQUFDO0FBQ2pDLE1BQU0sU0FBUyxHQUFHLEdBQUcsT0FBTyxJQUFJLENBQUM7QUFDakMsTUFBTSxPQUFPLEdBQUcsR0FBRyxPQUFPLElBQUksQ0FBQztBQUMvQixNQUFNLFVBQVUsR0FBRyxHQUFHLE9BQU8sS0FBSyxDQUFDO0FBQ25DLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxVQUFVLENBQUM7SUFDeEMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxF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
@@ -1,10 +1,9 @@
1
1
  import { TLBlockUnserializeResultType } from '@super-protocol/tee-lib';
2
2
  import { TCB } from '../models/index.js';
3
- import { BlockchainId } from '../types/index.js';
4
3
  export declare class TeeBlockVerifier {
5
- static verifiedTlbHashes: Map<string, string>;
6
- static verifiedTcbs: Set<BlockchainId>;
7
- private static checkQuote;
4
+ private static readonly verifiedTlbHashes;
5
+ private static readonly verifiedTcbs;
6
+ static checkQuote(quote: Uint8Array, dataBlob: Uint8Array, sgxApiUrl: string): Promise<void>;
8
7
  static verifyTcb(tcb: TCB, quoteString: string, pubKey: string, sgxApiUrl: string): Promise<void>;
9
8
  static verifyTlb(tlb: TLBlockUnserializeResultType, tlbString: string, offerId: string, sgxApiUrl: string): Promise<void>;
10
9
  }
@@ -8,7 +8,6 @@ const dto_js_1 = require("@super-protocol/dto-js");
8
8
  const tee_lib_1 = require("@super-protocol/tee-lib");
9
9
  const logger_js_1 = __importDefault(require("../logger.js"));
10
10
  const config_js_1 = require("../config.js");
11
- const QuoteParser_js_1 = require("./QuoteParser.js");
12
11
  const QuoteValidator_js_1 = require("./QuoteValidator.js");
13
12
  const statuses_js_1 = require("./statuses.js");
14
13
  const index_js_1 = __importDefault(require("../crypto/index.js"));
@@ -31,12 +30,7 @@ class TeeBlockVerifier {
31
30
  if (!userDataCheckResult) {
32
31
  throw new Error('Quote has invalid user data');
33
32
  }
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
- }
33
+ await QuoteValidator_js_1.QuoteValidator.checkSignature(quoteBuffer);
40
34
  }
41
35
  static async verifyTcb(tcb, quoteString, pubKey, sgxApiUrl) {
42
36
  // check cache
@@ -83,4 +77,4 @@ class TeeBlockVerifier {
83
77
  }
84
78
  }
85
79
  exports.TeeBlockVerifier = TeeBlockVerifier;
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVlQmxvY2tWZXJpZmllci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZWUvVGVlQmxvY2tWZXJpZmllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBaUU7QUFDakUscURBQTRGO0FBQzVGLDZEQUFrQztBQUNsQyw0Q0FBc0M7QUFFdEMscURBQWdEO0FBQ2hELDJEQUFxRDtBQUNyRCwrQ0FBd0Q7QUFFeEQsa0VBQXdDO0FBRXhDLE1BQWEsZ0JBQWdCO0lBQzNCLE1BQU0sQ0FBQyxpQkFBaUIsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUMxRCxNQUFNLENBQUMsWUFBWSxHQUFzQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRTNDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUM3QixLQUFpQixFQUNqQixRQUFvQixFQUNwQixTQUFpQjtRQUVqQixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sU0FBUyxHQUFHLElBQUksa0NBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoRCxNQUFNLFdBQVcsR0FBRyxNQUFNLFNBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUQsSUFBSSxXQUFXLENBQUMscUJBQXFCLEtBQUsscUNBQXVCLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDM0UsSUFBSSxXQUFXLENBQUMscUJBQXFCLEtBQUsscUNBQXVCLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3hFLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUN0QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sbUJBQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLHlDQUF5QyxDQUFDLENBQUM7WUFDdEUsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sU0FBUyxDQUFDLGtCQUFrQixDQUM1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
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVlQmxvY2tWZXJpZmllci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZWUvVGVlQmxvY2tWZXJpZmllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBaUU7QUFDakUscURBQTRGO0FBQzVGLDZEQUFrQztBQUNsQyw0Q0FBc0M7QUFFdEMsMkRBQXFEO0FBQ3JELCtDQUF3RDtBQUV4RCxrRUFBd0M7QUFFeEMsTUFBYSxnQkFBZ0I7SUFDbkIsTUFBTSxDQUFVLGlCQUFpQixHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ25FLE1BQU0sQ0FBVSxZQUFZLEdBQXNCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFcEUsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQ3JCLEtBQWlCLEVBQ2pCLFFBQW9CLEVBQ3BCLFNBQWlCO1FBRWpCLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsTUFBTSxTQUFTLEdBQUcsSUFBSSxrQ0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sV0FBVyxHQUFHLE1BQU0sU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxRCxJQUFJLFdBQVcsQ0FBQyxxQkFBcUIsS0FBSyxxQ0FBdUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMzRSxJQUFJLFdBQVcsQ0FBQyxxQkFBcUIsS0FBSyxxQ0FBdUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDeEUsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3RDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixtQkFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUseUNBQXlDLENBQUMsQ0FBQztZQUN0RSxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxTQUFTLENBQUMsa0JBQWtCLENBQzVELFdBQVcsRUFDWCxN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
@@ -1,6 +1,9 @@
1
- export declare class TLBlockSerializerError extends Error {
1
+ import { BaseError } from '../errors/index.js';
2
+ export declare class TLBlockSerializerError extends BaseError {
2
3
  }
3
- export declare class TeeQuoteParserError extends Error {
4
+ export declare class TeeQuoteParserError extends BaseError {
4
5
  }
5
- export declare class TeeQuoteValidatorError extends Error {
6
+ export declare class TeeQuoteValidatorError extends BaseError {
7
+ }
8
+ export declare class InvalidSignatureError extends BaseError {
6
9
  }
@@ -1,13 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TeeQuoteValidatorError = exports.TeeQuoteParserError = exports.TLBlockSerializerError = void 0;
4
- class TLBlockSerializerError extends Error {
3
+ exports.InvalidSignatureError = exports.TeeQuoteValidatorError = exports.TeeQuoteParserError = exports.TLBlockSerializerError = void 0;
4
+ const index_js_1 = require("../errors/index.js");
5
+ class TLBlockSerializerError extends index_js_1.BaseError {
5
6
  }
6
7
  exports.TLBlockSerializerError = TLBlockSerializerError;
7
- class TeeQuoteParserError extends Error {
8
+ class TeeQuoteParserError extends index_js_1.BaseError {
8
9
  }
9
10
  exports.TeeQuoteParserError = TeeQuoteParserError;
10
- class TeeQuoteValidatorError extends Error {
11
+ class TeeQuoteValidatorError extends index_js_1.BaseError {
11
12
  }
12
13
  exports.TeeQuoteValidatorError = TeeQuoteValidatorError;
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlZS9lcnJvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsTUFBYSxzQkFBdUIsU0FBUSxLQUFLO0NBQUc7QUFBcEQsd0RBQW9EO0FBRXBELE1BQWEsbUJBQW9CLFNBQVEsS0FBSztDQUFHO0FBQWpELGtEQUFpRDtBQUVqRCxNQUFhLHNCQUF1QixTQUFRLEtBQUs7Q0FBRztBQUFwRCx3REFBb0QifQ==
14
+ class InvalidSignatureError extends index_js_1.BaseError {
15
+ }
16
+ exports.InvalidSignatureError = InvalidSignatureError;
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlZS9lcnJvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBQStDO0FBRS9DLE1BQWEsc0JBQXVCLFNBQVEsb0JBQVM7Q0FBRztBQUF4RCx3REFBd0Q7QUFFeEQsTUFBYSxtQkFBb0IsU0FBUSxvQkFBUztDQUFHO0FBQXJELGtEQUFxRDtBQUVyRCxNQUFhLHNCQUF1QixTQUFRLG9CQUFTO0NBQUc7QUFBeEQsd0RBQXdEO0FBRXhELE1BQWEscUJBQXNCLFNBQVEsb0JBQVM7Q0FBRztBQUF2RCxzREFBdUQifQ==
@@ -37,16 +37,13 @@ export type TLBlockUnserializeResultType = {
37
37
  dataBlob: BinaryType;
38
38
  };
39
39
  export type TLBlockSerializeResultType = BinaryType;
40
- export type TeeSgxQuoteDataType = {
40
+ export declare enum QuoteType {
41
+ SGX = "Sgx",
42
+ TDX = "Tdx"
43
+ }
44
+ export declare class TeeQuoteBase {
45
+ quoteType: QuoteType;
41
46
  rawHeader: BinaryType;
42
- header: {
43
- version: number;
44
- attestationKeyType: number;
45
- pceSvn: number;
46
- userData: BinaryType;
47
- };
48
- report: BinaryType;
49
- isvEnclaveReportSignature: BinaryType;
50
47
  ecdsaAttestationKey: BinaryType;
51
48
  qeReport: BinaryType;
52
49
  qeReportSignature: BinaryType;
@@ -58,7 +55,33 @@ export type TeeSgxQuoteDataType = {
58
55
  platform: CertificateData;
59
56
  root: CertificateData;
60
57
  };
58
+ }
59
+ export type TeeSgxHeaderData = {
60
+ version: number;
61
+ attestationKeyType: number;
62
+ pceSvn: number;
63
+ userData: BinaryType;
64
+ };
65
+ export declare class TeeSgxQuoteDataType extends TeeQuoteBase {
66
+ header: TeeSgxHeaderData;
67
+ report: BinaryType;
68
+ isvEnclaveReportSignature: BinaryType;
69
+ }
70
+ export type TeeTdxHeaderData = {
71
+ version: number;
72
+ attestationKeyType: number;
73
+ teeType: number;
74
+ reserved1: BinaryType;
75
+ reserved2: BinaryType;
76
+ qeVendorId: BinaryType;
77
+ userData: BinaryType;
61
78
  };
79
+ export declare class TeeTdxQuoteDataType extends TeeQuoteBase {
80
+ header: TeeTdxHeaderData;
81
+ tdQuoteBody: BinaryType;
82
+ quoteSignature: BinaryType;
83
+ certDataType: number;
84
+ }
62
85
  export type TeeSgxReportDataType = {
63
86
  cpuSvn: string;
64
87
  mrEnclave: BinaryType;
@@ -78,3 +101,21 @@ export type CertificateData = {
78
101
  pem: string;
79
102
  x509Data: ChunkedX509Cert;
80
103
  };
104
+ export type TeeTdxBodyType = {
105
+ teeTcbSvn: BinaryType;
106
+ mrSeam: BinaryType;
107
+ mrSignerSeam: BinaryType;
108
+ seamAttributes: BinaryType;
109
+ tdAttributes: BinaryType;
110
+ xfam: BinaryType;
111
+ mrTd: BinaryType;
112
+ mrConfigId: BinaryType;
113
+ mrOwner: BinaryType;
114
+ mrOwnerConfig: BinaryType;
115
+ rtmr0: BinaryType;
116
+ rtmr1: BinaryType;
117
+ rtmr2: BinaryType;
118
+ rtmr3: BinaryType;
119
+ reportData: BinaryType;
120
+ dataHash: BinaryType;
121
+ };
@@ -1,3 +1,34 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
3
+ exports.TeeTdxQuoteDataType = exports.TeeSgxQuoteDataType = exports.TeeQuoteBase = exports.QuoteType = void 0;
4
+ var QuoteType;
5
+ (function (QuoteType) {
6
+ QuoteType["SGX"] = "Sgx";
7
+ QuoteType["TDX"] = "Tdx";
8
+ })(QuoteType || (exports.QuoteType = QuoteType = {}));
9
+ class TeeQuoteBase {
10
+ quoteType;
11
+ rawHeader;
12
+ ecdsaAttestationKey;
13
+ qeReport;
14
+ qeReportSignature;
15
+ qeAuthenticationData;
16
+ qeCertificationDataType;
17
+ qeCertificationData;
18
+ certificates;
19
+ }
20
+ exports.TeeQuoteBase = TeeQuoteBase;
21
+ class TeeSgxQuoteDataType extends TeeQuoteBase {
22
+ header;
23
+ report;
24
+ isvEnclaveReportSignature;
25
+ }
26
+ exports.TeeSgxQuoteDataType = TeeSgxQuoteDataType;
27
+ class TeeTdxQuoteDataType extends TeeQuoteBase {
28
+ header;
29
+ tdQuoteBody;
30
+ quoteSignature;
31
+ certDataType;
32
+ }
33
+ exports.TeeTdxQuoteDataType = TeeTdxQuoteDataType;
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWtEQSxJQUFZLFNBR1g7QUFIRCxXQUFZLFNBQVM7SUFDbkIsd0JBQVcsQ0FBQTtJQUNYLHdCQUFXLENBQUE7QUFDYixDQUFDLEVBSFcsU0FBUyx5QkFBVCxTQUFTLFFBR3BCO0FBQ0QsTUFBYSxZQUFZO0lBQ3ZCLFNBQVMsQ0FBYTtJQUN0QixTQUFTLENBQWM7SUFDdkIsbUJBQW1CLENBQWM7SUFDakMsUUFBUSxDQUFjO0lBQ3RCLGlCQUFpQixDQUFjO0lBQy9CLG9CQUFvQixDQUFjO0lBQ2xDLHVCQUF1QixDQUFVO0lBQ2pDLG1CQUFtQixDQUFjO0lBQ2pDLFlBQVksQ0FJVjtDQUNIO0FBZEQsb0NBY0M7QUFTRCxNQUFhLG1CQUFvQixTQUFRLFlBQVk7SUFDbkQsTUFBTSxDQUFvQjtJQUMxQixNQUFNLENBQWM7SUFDcEIseUJBQXlCLENBQWM7Q0FDeEM7QUFKRCxrREFJQztBQVdELE1BQWEsbUJBQW9CLFNBQVEsWUFBWTtJQUNuRCxNQUFNLENBQW9CO0lBQzFCLFdBQVcsQ0FBYztJQUN6QixjQUFjLENBQWM7SUFDNUIsWUFBWSxDQUFVO0NBQ3ZCO0FBTEQsa0RBS0MifQ==
@@ -1,3 +1,4 @@
1
+ import { OfferType } from './Offer.js';
1
2
  import { BlockchainId, TokenAmount } from './Web3.js';
2
3
  export type PublicKey = {
3
4
  kty: string;
@@ -40,12 +41,17 @@ export type OfferResource = {
40
41
  timestamp: number;
41
42
  signature: Signature;
42
43
  signedEncryptedData: string;
44
+ offerType: OfferType;
45
+ solutionHash?: string;
46
+ previousDataCopied: boolean;
43
47
  };
44
48
  export type OfferStorageAllocated = {
45
49
  teeOfferIssuerId: BlockchainId;
46
50
  storageOrderId: BlockchainId;
47
51
  distributionReplicationFactor: number;
48
52
  timestamp: number;
53
+ offerVersion: number;
54
+ offerId: BlockchainId;
49
55
  };
50
56
  export type OfferStorageRequest = {
51
57
  offerId: BlockchainId;
@@ -57,4 +63,5 @@ export type OfferStorageRequest = {
57
63
  offerVersion?: number;
58
64
  replicationFactor: number;
59
65
  timestamp: number;
66
+ copyPreviousData: boolean;
60
67
  };