@super-protocol/sdk-js 2.2.0-beta.11 → 2.2.0-beta.110

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 (232) 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 +851 -105
  15. package/dist/cjs/contracts/abi.js +1135 -178
  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 +10 -1
  27. package/dist/cjs/index.js +17 -2
  28. package/dist/cjs/models/Offer.d.ts +48 -6
  29. package/dist/cjs/models/Offer.js +152 -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 +119 -44
  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 +77 -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 +109 -0
  53. package/dist/cjs/providers/storage/StorjStorageProvider.js +26 -3
  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/Consensus.d.ts +3 -2
  61. package/dist/cjs/staticModels/Consensus.js +22 -11
  62. package/dist/cjs/staticModels/LoaderSecretsPublicKeys.js +3 -3
  63. package/dist/cjs/staticModels/LoaderSessions.d.ts +2 -2
  64. package/dist/cjs/staticModels/LoaderSessions.js +5 -5
  65. package/dist/cjs/staticModels/OfferResources.d.ts +3 -1
  66. package/dist/cjs/staticModels/OfferResources.js +33 -8
  67. package/dist/cjs/staticModels/Offers.js +7 -2
  68. package/dist/cjs/staticModels/OffersStorageAllocated.d.ts +1 -2
  69. package/dist/cjs/staticModels/OffersStorageAllocated.js +10 -10
  70. package/dist/cjs/staticModels/OffersStorageRequests.js +4 -3
  71. package/dist/cjs/staticModels/Orders.d.ts +5 -4
  72. package/dist/cjs/staticModels/Orders.js +7 -6
  73. package/dist/cjs/staticModels/SecretRequests.d.ts +1 -1
  74. package/dist/cjs/staticModels/SecretRequests.js +14 -7
  75. package/dist/cjs/staticModels/TeeOffers.d.ts +0 -2
  76. package/dist/cjs/staticModels/TeeOffers.js +5 -38
  77. package/dist/cjs/tee/QuoteParser.d.ts +61 -6
  78. package/dist/cjs/tee/QuoteParser.js +250 -29
  79. package/dist/cjs/tee/QuoteValidator.d.ts +11 -0
  80. package/dist/cjs/tee/QuoteValidator.js +128 -34
  81. package/dist/cjs/tee/TeeBlockVerifier.d.ts +3 -4
  82. package/dist/cjs/tee/TeeBlockVerifier.js +2 -8
  83. package/dist/cjs/tee/errors.d.ts +6 -3
  84. package/dist/cjs/tee/errors.js +9 -5
  85. package/dist/cjs/tee/types.d.ts +50 -9
  86. package/dist/cjs/tee/types.js +32 -1
  87. package/dist/cjs/types/DistributedSecretStorage.d.ts +7 -0
  88. package/dist/cjs/types/Offer.d.ts +27 -5
  89. package/dist/cjs/types/Offer.js +17 -2
  90. package/dist/cjs/types/OfferVersion.d.ts +13 -0
  91. package/dist/cjs/types/OfferVersion.js +9 -0
  92. package/dist/cjs/types/Order.d.ts +8 -2
  93. package/dist/cjs/types/Order.js +3 -1
  94. package/dist/cjs/types/SlotInfo.d.ts +1 -0
  95. package/dist/cjs/types/Superpro.d.ts +2 -1
  96. package/dist/cjs/types/Superpro.js +2 -1
  97. package/dist/cjs/types/TeeOfferInfo.d.ts +2 -1
  98. package/dist/cjs/types/index.d.ts +1 -0
  99. package/dist/cjs/types/index.js +2 -1
  100. package/dist/cjs/types/storage/StorageAccess.d.ts +3 -3
  101. package/dist/cjs/utils/CryptoKeysTransformer.d.ts +6 -1
  102. package/dist/cjs/utils/CryptoKeysTransformer.js +55 -7
  103. package/dist/cjs/utils/NonceTracker.js +1 -1
  104. package/dist/cjs/utils/helper.d.ts +7 -1
  105. package/dist/cjs/utils/helper.js +87 -2
  106. package/dist/cjs/utils/helpers/OrderArgsHelper.d.ts +17 -0
  107. package/dist/cjs/utils/helpers/OrderArgsHelper.js +87 -0
  108. package/dist/cjs/utils/helpers/index.d.ts +2 -0
  109. package/dist/cjs/utils/helpers/index.js +3 -1
  110. package/dist/cjs/utils/helpers/uploadObjectToStorage.d.ts +13 -0
  111. package/dist/cjs/utils/helpers/uploadObjectToStorage.js +55 -0
  112. package/dist/cjs/utils/schema-validators/index.d.ts +1 -0
  113. package/dist/cjs/utils/schema-validators/index.js +6 -0
  114. package/dist/cjs/utils/schema-validators/validator.d.ts +7 -0
  115. package/dist/cjs/utils/schema-validators/validator.js +49 -0
  116. package/dist/mjs/RIGenerator.d.ts +2 -0
  117. package/dist/mjs/RIGenerator.js +6 -4
  118. package/dist/mjs/TIIGenerator.d.ts +2 -1
  119. package/dist/mjs/TIIGenerator.js +13 -3
  120. package/dist/mjs/TeeInputGeneratorBase.d.ts +1 -1
  121. package/dist/mjs/TeeInputGeneratorBase.js +20 -32
  122. package/dist/mjs/analytics/eventProviders/BrowserEventProvider.d.ts +1 -0
  123. package/dist/mjs/analytics/eventProviders/BrowserEventProvider.js +3 -3
  124. package/dist/mjs/analytics/transports/AxiosTransport.js +1 -1
  125. package/dist/mjs/config.d.ts +0 -1
  126. package/dist/mjs/config.js +1 -2
  127. package/dist/mjs/constants.d.ts +5 -4
  128. package/dist/mjs/constants.js +30 -6
  129. package/dist/mjs/contracts/abi.d.ts +851 -105
  130. package/dist/mjs/contracts/abi.js +1135 -178
  131. package/dist/mjs/crypto/index.d.ts +1 -0
  132. package/dist/mjs/crypto/index.js +2 -1
  133. package/dist/mjs/errors/base.error.d.ts +3 -0
  134. package/dist/mjs/errors/base.error.js +15 -0
  135. package/dist/mjs/errors/index.d.ts +2 -0
  136. package/dist/mjs/errors/index.js +3 -0
  137. package/dist/mjs/errors/not-found.error.d.ts +3 -0
  138. package/dist/mjs/errors/not-found.error.js +4 -0
  139. package/dist/mjs/errors/utils.d.ts +1 -0
  140. package/dist/mjs/errors/utils.js +18 -0
  141. package/dist/mjs/index.d.ts +10 -1
  142. package/dist/mjs/index.js +10 -2
  143. package/dist/mjs/models/Offer.d.ts +48 -6
  144. package/dist/mjs/models/Offer.js +154 -17
  145. package/dist/mjs/models/Order.d.ts +2 -90
  146. package/dist/mjs/models/Order.js +20 -91
  147. package/dist/mjs/models/Provider.js +1 -1
  148. package/dist/mjs/models/TCB.js +13 -5
  149. package/dist/mjs/models/TeeOffer.d.ts +35 -13
  150. package/dist/mjs/models/TeeOffer.js +115 -40
  151. package/dist/mjs/proto/Compression.d.ts +1 -1
  152. package/dist/mjs/proto/TRI.d.ts +41 -6
  153. package/dist/mjs/proto/TRI.js +18 -1
  154. package/dist/mjs/proto/TeeProperties.d.ts +5 -5
  155. package/dist/mjs/providers/storage/IStorageProvider.d.ts +1 -1
  156. package/dist/mjs/providers/storage/S3StorageProvider.d.ts +8 -7
  157. package/dist/mjs/providers/storage/S3StorageProvider.js +74 -38
  158. package/dist/mjs/providers/storage/StorageAdapter.d.ts +9 -7
  159. package/dist/mjs/providers/storage/StorageAdapter.js +27 -29
  160. package/dist/mjs/providers/storage/StorageContentWriter.d.ts +2 -2
  161. package/dist/mjs/providers/storage/StorageContentWriter.js +5 -5
  162. package/dist/mjs/providers/storage/StorageKeyValueAdapter.d.ts +8 -5
  163. package/dist/mjs/providers/storage/StorageKeyValueAdapter.js +30 -16
  164. package/dist/mjs/providers/storage/StorjAdapter.d.ts +5 -4
  165. package/dist/mjs/providers/storage/StorjAdapter.js +15 -9
  166. package/dist/mjs/providers/storage/StorjCredentialsManager.d.ts +24 -0
  167. package/dist/mjs/providers/storage/StorjCredentialsManager.js +82 -0
  168. package/dist/mjs/providers/storage/StorjStorageProvider.js +3 -3
  169. package/dist/mjs/providers/storage/fs-storage-provider.d.ts +19 -0
  170. package/dist/mjs/providers/storage/fs-storage-provider.js +113 -0
  171. package/dist/mjs/providers/storage/getStorageProvider.js +4 -1
  172. package/dist/mjs/providers/storage/parseStorageCredentials.d.ts +5 -0
  173. package/dist/mjs/providers/storage/parseStorageCredentials.js +17 -0
  174. package/dist/mjs/providers/storage/types.d.ts +22 -0
  175. package/dist/mjs/staticModels/Consensus.d.ts +3 -2
  176. package/dist/mjs/staticModels/Consensus.js +22 -11
  177. package/dist/mjs/staticModels/LoaderSecretsPublicKeys.js +4 -4
  178. package/dist/mjs/staticModels/LoaderSessions.d.ts +2 -2
  179. package/dist/mjs/staticModels/LoaderSessions.js +6 -6
  180. package/dist/mjs/staticModels/OfferResources.d.ts +3 -1
  181. package/dist/mjs/staticModels/OfferResources.js +34 -9
  182. package/dist/mjs/staticModels/Offers.js +7 -2
  183. package/dist/mjs/staticModels/OffersStorageAllocated.d.ts +1 -2
  184. package/dist/mjs/staticModels/OffersStorageAllocated.js +11 -11
  185. package/dist/mjs/staticModels/OffersStorageRequests.js +5 -4
  186. package/dist/mjs/staticModels/Orders.d.ts +5 -4
  187. package/dist/mjs/staticModels/Orders.js +7 -6
  188. package/dist/mjs/staticModels/SecretRequests.d.ts +1 -1
  189. package/dist/mjs/staticModels/SecretRequests.js +15 -8
  190. package/dist/mjs/staticModels/TeeOffers.d.ts +0 -2
  191. package/dist/mjs/staticModels/TeeOffers.js +5 -38
  192. package/dist/mjs/store.js +2 -2
  193. package/dist/mjs/tee/QuoteParser.d.ts +61 -6
  194. package/dist/mjs/tee/QuoteParser.js +247 -28
  195. package/dist/mjs/tee/QuoteValidator.d.ts +11 -0
  196. package/dist/mjs/tee/QuoteValidator.js +128 -34
  197. package/dist/mjs/tee/TeeBlockVerifier.d.ts +3 -4
  198. package/dist/mjs/tee/TeeBlockVerifier.js +2 -8
  199. package/dist/mjs/tee/errors.d.ts +6 -3
  200. package/dist/mjs/tee/errors.js +7 -4
  201. package/dist/mjs/tee/types.d.ts +50 -9
  202. package/dist/mjs/tee/types.js +28 -2
  203. package/dist/mjs/types/DistributedSecretStorage.d.ts +7 -0
  204. package/dist/mjs/types/Offer.d.ts +27 -5
  205. package/dist/mjs/types/Offer.js +16 -1
  206. package/dist/mjs/types/OfferVersion.d.ts +13 -0
  207. package/dist/mjs/types/OfferVersion.js +6 -0
  208. package/dist/mjs/types/Order.d.ts +8 -2
  209. package/dist/mjs/types/Order.js +3 -1
  210. package/dist/mjs/types/SlotInfo.d.ts +1 -0
  211. package/dist/mjs/types/Superpro.d.ts +2 -1
  212. package/dist/mjs/types/Superpro.js +2 -1
  213. package/dist/mjs/types/TeeOfferInfo.d.ts +2 -1
  214. package/dist/mjs/types/index.d.ts +1 -0
  215. package/dist/mjs/types/index.js +2 -1
  216. package/dist/mjs/types/storage/StorageAccess.d.ts +3 -3
  217. package/dist/mjs/utils/CryptoKeysTransformer.d.ts +6 -1
  218. package/dist/mjs/utils/CryptoKeysTransformer.js +55 -7
  219. package/dist/mjs/utils/NonceTracker.js +1 -1
  220. package/dist/mjs/utils/helper.d.ts +7 -1
  221. package/dist/mjs/utils/helper.js +80 -1
  222. package/dist/mjs/utils/helpers/OrderArgsHelper.d.ts +17 -0
  223. package/dist/mjs/utils/helpers/OrderArgsHelper.js +80 -0
  224. package/dist/mjs/utils/helpers/index.d.ts +2 -0
  225. package/dist/mjs/utils/helpers/index.js +3 -1
  226. package/dist/mjs/utils/helpers/uploadObjectToStorage.d.ts +13 -0
  227. package/dist/mjs/utils/helpers/uploadObjectToStorage.js +48 -0
  228. package/dist/mjs/utils/schema-validators/index.d.ts +1 -0
  229. package/dist/mjs/utils/schema-validators/index.js +2 -0
  230. package/dist/mjs/utils/schema-validators/validator.d.ts +7 -0
  231. package/dist/mjs/utils/schema-validators/validator.js +45 -0
  232. package/package.json +6 -5
@@ -1,4 +1,5 @@
1
1
  import axios from 'axios';
2
+ import { tryWithInterval } from '../utils/helpers/index.js';
2
3
  import elliptic from 'elliptic';
3
4
  import forge from 'node-forge';
4
5
  import { Certificate } from '@fidm/x509';
@@ -6,12 +7,14 @@ import { formatter } from 'js-encoding-utils';
6
7
  import { CertificateRevocationList } from 'pkijs';
7
8
  import { fromBER } from 'asn1js';
8
9
  import _ from 'lodash';
9
- import { TeeSgxParser } from './QuoteParser.js';
10
+ import { TeeSgxParser, TeeTdxParser, TeeParser } from './QuoteParser.js';
11
+ import { QuoteType, } from './types.js';
10
12
  import rootLogger from '../logger.js';
11
- import { TeeQuoteValidatorError } from './errors.js';
13
+ import { InvalidSignatureError, TeeQuoteValidatorError } from './errors.js';
12
14
  import { QEIdentityStatuses, TCBStatuses, QuoteValidationStatuses } from './statuses.js';
13
15
  import { Encoding, HashAlgorithm } from '@super-protocol/dto-js';
14
16
  import Crypto from '../crypto/index.js';
17
+ import { TEE_LOADER_TRUSTED_MRSIGNER, TEE_LOADER_TRUSTED_CERTIFICATE } from '../constants.js';
15
18
  const { ec } = elliptic;
16
19
  const { util, asn1 } = forge;
17
20
  const INTEL_BASE_SGX_URL = 'https://api.trustedservices.intel.com';
@@ -31,13 +34,84 @@ export class QuoteValidator {
31
34
  isDefault;
32
35
  baseUrl;
33
36
  teeSgxParser;
37
+ teeTdxParser;
34
38
  logger;
35
39
  constructor(baseUrl) {
36
40
  this.isDefault = baseUrl === INTEL_BASE_SGX_URL;
37
41
  this.baseUrl = `${baseUrl}/sgx/certification/v4`;
38
42
  this.teeSgxParser = new TeeSgxParser();
43
+ this.teeTdxParser = new TeeTdxParser();
39
44
  this.logger = rootLogger.child({ className: QuoteValidator.name });
40
45
  }
46
+ static async getSignature(mrEnclave, options) {
47
+ const baseURL = options?.baseURL ?? 'https://raw.githubusercontent.com/Super-Protocol/sp-vm';
48
+ const retryMax = options?.retryMax ?? 3;
49
+ const retryInterval = options?.retryInterval ?? 1000;
50
+ const axiosInstance = axios.create({
51
+ baseURL,
52
+ });
53
+ const response = await tryWithInterval({
54
+ checkResult(response) {
55
+ return { isResultOk: response.status === 200 };
56
+ },
57
+ handler() {
58
+ const mrenclaveHex = mrEnclave.toString('hex');
59
+ return axiosInstance.get(`/main/signatures/mrenclave-${mrenclaveHex}.sign`, {
60
+ responseType: 'arraybuffer',
61
+ });
62
+ },
63
+ checkError(err) {
64
+ if (axios.isAxiosError(err) && err.response) {
65
+ const status = err.response.status;
66
+ return { retryable: status < 400 || status >= 500 };
67
+ }
68
+ return { retryable: axios.isAxiosError(err) };
69
+ },
70
+ retryInterval,
71
+ retryMax,
72
+ });
73
+ return Buffer.from(response.data);
74
+ }
75
+ static async checkSignature(quote, options = { getMrEnclaveSignature: QuoteValidator.getSignature }) {
76
+ const { getMrEnclaveSignature } = options;
77
+ const { type: quoteType } = TeeSgxParser.determineQuoteType(quote);
78
+ switch (quoteType) {
79
+ case QuoteType.SGX: {
80
+ const parser = new TeeSgxParser();
81
+ const parsedQuote = parser.parseQuote(quote);
82
+ const report = parser.parseReport(parsedQuote.report);
83
+ if (report.mrSigner.toString('hex') !== TEE_LOADER_TRUSTED_MRSIGNER.toString('hex')) {
84
+ throw new InvalidSignatureError('Quote has an invalid MR signer');
85
+ }
86
+ break;
87
+ }
88
+ case QuoteType.TDX: {
89
+ const mrEnclave = TeeParser.getMrEnclave(quote);
90
+ const cert = forge.pki.certificateFromPem(TEE_LOADER_TRUSTED_CERTIFICATE);
91
+ const isCertValid = forge.pki.verifyCertificateChain(forge.pki.createCaStore([cert]), [
92
+ cert,
93
+ ]);
94
+ if (!isCertValid) {
95
+ throw new Error('Trusted cert is invalid');
96
+ }
97
+ const publicKey = cert.publicKey;
98
+ if (!Object.prototype.hasOwnProperty.call(publicKey, 'n') ||
99
+ !Object.prototype.hasOwnProperty.call(publicKey, 'e')) {
100
+ throw new InvalidSignatureError('Expected RSA private key inside certificate');
101
+ }
102
+ const digest = forge.md.sha256
103
+ .create()
104
+ .update(String.fromCharCode(...mrEnclave))
105
+ .digest();
106
+ const signature = await getMrEnclaveSignature(Buffer.from(mrEnclave));
107
+ const isSignatureValid = publicKey.verify(digest.bytes(), String.fromCharCode(...signature));
108
+ if (!isSignatureValid) {
109
+ throw new InvalidSignatureError('TDX signature is invalid');
110
+ }
111
+ break;
112
+ }
113
+ }
114
+ }
41
115
  splitChain(chain) {
42
116
  const begin = '-----BEGIN CERTIFICATE-----';
43
117
  const end = '-----END CERTIFICATE-----';
@@ -74,11 +148,10 @@ export class QuoteValidator {
74
148
  }
75
149
  verifyDataBySignature(data, signature, key) {
76
150
  const ellipticEc = new ec('p256');
77
- const result = ellipticEc.verify(data, {
151
+ return ellipticEc.verify(data, {
78
152
  r: signature.subarray(0, 32),
79
153
  s: signature.subarray(32),
80
154
  }, ellipticEc.keyFromPublic(key, 'hex'));
81
- return result;
82
155
  }
83
156
  checkValidDate(from, to) {
84
157
  const now = Date.now();
@@ -127,8 +200,7 @@ export class QuoteValidator {
127
200
  if (Buffer.compare(rootFetchedCert.publicKey.keyRaw, INTEL_ROOT_PUB_KEY) !== 0) {
128
201
  throw new TeeQuoteValidatorError('Wrong Intel root certificate public key');
129
202
  }
130
- const certificatePems = this.splitChain(quote.qeCertificationData.toString()); // [pck, platform, root]
131
- const pckCert = Certificate.fromPEM(Buffer.from(certificatePems[0]));
203
+ const pckCert = Certificate.fromPEM(Buffer.from(quote.certificates.device.pem));
132
204
  const certType = quote.qeCertificationDataType;
133
205
  if (!this.checkValidDate(pckCert.validFrom.valueOf(), pckCert.validTo.valueOf())) {
134
206
  throw new TeeQuoteValidatorError('PCK certificate validation date is not valid');
@@ -136,7 +208,7 @@ export class QuoteValidator {
136
208
  if (certType !== 5) {
137
209
  throw new TeeQuoteValidatorError(`Unsupported certification data type: ${certType}`);
138
210
  }
139
- if (rootFetchedPem !== certificatePems[2]) {
211
+ if (rootFetchedPem !== quote.certificates.root.pem) {
140
212
  throw new TeeQuoteValidatorError("Invalid SGX root certificate in quote's certificate chain");
141
213
  }
142
214
  if (!this.checkChainForIssuers(pckCert, platformFetchedCert, rootFetchedCert)) {
@@ -147,18 +219,14 @@ export class QuoteValidator {
147
219
  platformFetchedCert.serialNumber,
148
220
  pckCert.serialNumber,
149
221
  ];
150
- if (this.isDefault) {
151
- const intelCrlDer = await axios.get(INTEL_SGX_ROOT_CA_URL, {
152
- responseType: 'arraybuffer',
153
- });
154
- const intelCrlAsn = fromBER(Buffer.from(intelCrlDer.data));
155
- this.checkCertificatesInCrl(new CertificateRevocationList({ schema: intelCrlAsn.result }), certIds);
156
- }
157
- else {
158
- const intelCrlDer = await axios.get(`${this.baseUrl}/rootcacrl`);
159
- const intelCrl = this.getCrl(intelCrlDer.data);
160
- this.checkCertificatesInCrl(intelCrl, certIds);
161
- }
222
+ const caCrlUrl = this.isDefault
223
+ ? INTEL_SGX_ROOT_CA_URL
224
+ : `${this.baseUrl}/crl?uri=${INTEL_SGX_ROOT_CA_URL}`;
225
+ const intelCrlDer = await axios.get(caCrlUrl, {
226
+ responseType: 'arraybuffer',
227
+ });
228
+ const intelCrlAsn = fromBER(Buffer.from(intelCrlDer.data));
229
+ this.checkCertificatesInCrl(new CertificateRevocationList({ schema: intelCrlAsn.result }), certIds);
162
230
  const platformCrl = this.getCrl(platformCrlResult.data);
163
231
  this.checkCertificatesInCrl(platformCrl, certIds);
164
232
  return { pckCert, rootCertPem: rootFetchedPem };
@@ -179,15 +247,18 @@ export class QuoteValidator {
179
247
  async verifyEnclaveReportSignature(quote) {
180
248
  const key = Buffer.from(quote.ecdsaAttestationKey);
181
249
  const headerBuffer = Buffer.from(quote.rawHeader);
182
- const reportBuffer = Buffer.from(quote.report);
183
- const expected = quote.isvEnclaveReportSignature;
250
+ const reportBuffer = quote.quoteType === QuoteType.SGX
251
+ ? Buffer.from(quote.report)
252
+ : Buffer.from(quote.tdQuoteBody);
253
+ const expected = quote.quoteType === QuoteType.SGX
254
+ ? Buffer.from(quote.isvEnclaveReportSignature)
255
+ : Buffer.from(quote.quoteSignature);
184
256
  const calculatedHash = await this.getSha256Hash(Buffer.concat([headerBuffer, reportBuffer]));
185
257
  const ellipticEc = new ec('p256');
186
- const result = ellipticEc.verify(calculatedHash, {
258
+ return ellipticEc.verify(calculatedHash, {
187
259
  r: expected.subarray(0, 32),
188
260
  s: expected.subarray(32),
189
261
  }, Buffer.concat([Buffer.from([4]), key]));
190
- return result;
191
262
  }
192
263
  async validateQuoteStructure(quote, report, pckPublicKey) {
193
264
  if (!(await this.verifyQeReportSignature(quote, pckPublicKey))) {
@@ -219,8 +290,12 @@ export class QuoteValidator {
219
290
  const result = util.bytesToHex(data[0].value);
220
291
  return targetType === asn1.Type.OCTETSTRING ? result : parseInt(result, 16).toString();
221
292
  }
222
- async getTcbInfo(fmspc, rootCertPem) {
223
- const tcbData = await axios.get(`${this.baseUrl}/tcb?fmspc=${fmspc}`);
293
+ async getTcbInfo(fmspc, rootCertPem, quoteType) {
294
+ let tcbUrl = `${this.baseUrl}/tcb?fmspc=${fmspc}`;
295
+ if (quoteType === QuoteType.TDX) {
296
+ tcbUrl = tcbUrl.replace('sgx/certification', 'tdx/certification');
297
+ }
298
+ const tcbData = await axios.get(tcbUrl);
224
299
  const tcbInfoHeader = 'tcb-info-issuer-chain';
225
300
  const tcbInfoChain = this.splitChain(decodeURIComponent(tcbData.headers[tcbInfoHeader])); // [tcb, root]
226
301
  if (tcbInfoChain[1] !== rootCertPem) {
@@ -239,8 +314,12 @@ export class QuoteValidator {
239
314
  }
240
315
  return tcbData.data;
241
316
  }
242
- async getQEIdentity(rootCertPem) {
243
- const qeIdentityData = await axios.get(`${this.baseUrl}/qe/identity`);
317
+ async getQEIdentity(rootCertPem, quoteType) {
318
+ let qeIdentityUrl = `${this.baseUrl}/qe/identity`;
319
+ if (quoteType === QuoteType.TDX) {
320
+ qeIdentityUrl = qeIdentityUrl.replace('sgx/certification', 'tdx/certification');
321
+ }
322
+ const qeIdentityData = await axios.get(qeIdentityUrl);
244
323
  const qeIdentityHeader = 'sgx-enclave-identity-issuer-chain';
245
324
  const qeIdentityChain = this.splitChain(decodeURIComponent(qeIdentityData.headers[qeIdentityHeader])); // [qeIdentity, root]
246
325
  if (qeIdentityChain[1] !== rootCertPem) {
@@ -336,7 +415,10 @@ export class QuoteValidator {
336
415
  }
337
416
  async validate(quoteBuffer) {
338
417
  try {
339
- const quote = this.teeSgxParser.parseQuote(quoteBuffer);
418
+ const quoteType = TeeParser.determineQuoteType(quoteBuffer);
419
+ const quote = quoteType.type === QuoteType.SGX
420
+ ? this.teeSgxParser.parseQuote(quoteBuffer)
421
+ : this.teeTdxParser.parseQuote(quoteBuffer);
340
422
  const report = this.teeSgxParser.parseReport(quote.qeReport);
341
423
  const { pckCert, rootCertPem } = await this.getCertificates(quote);
342
424
  await this.validateQuoteStructure(quote, report, pckCert.publicKey.keyRaw);
@@ -344,8 +426,8 @@ export class QuoteValidator {
344
426
  const sgxExtensionData = this.getSgxExtensionData(pckCert);
345
427
  const fmspc = this.getDataFromExtension(sgxExtensionData, FMSPC_OID, asn1.Type.OCTETSTRING);
346
428
  const pceId = this.getDataFromExtension(sgxExtensionData, PCEID_OID, asn1.Type.OCTETSTRING);
347
- const tcbData = await this.getTcbInfo(fmspc, rootCertPem);
348
- const qeIdentity = await this.getQEIdentity(rootCertPem);
429
+ const tcbData = await this.getTcbInfo(fmspc, rootCertPem, quoteType.type);
430
+ const qeIdentity = await this.getQEIdentity(rootCertPem, quoteType.type);
349
431
  const qeIdentityStatus = this.getQEIdentityStatus(report, qeIdentity);
350
432
  const tcbStatus = this.getTcbStatus(fmspc, pceId, tcbData, sgxExtensionData);
351
433
  const quoteValidationStatus = this.getQuoteValidationStatus(qeIdentityStatus, tcbStatus);
@@ -365,10 +447,22 @@ export class QuoteValidator {
365
447
  }
366
448
  }
367
449
  async isQuoteHasUserData(quoteBuffer, userDataBuffer) {
368
- const quote = this.teeSgxParser.parseQuote(quoteBuffer);
369
- const report = this.teeSgxParser.parseReport(quote.report);
450
+ const quoteType = TeeParser.determineQuoteType(quoteBuffer);
451
+ const quote = quoteType.type === QuoteType.SGX
452
+ ? this.teeSgxParser.parseQuote(quoteBuffer)
453
+ : this.teeTdxParser.parseQuote(quoteBuffer);
454
+ let slicedQuoteData;
370
455
  const userDataHash = await this.getSha256Hash(userDataBuffer);
371
- const slicedQuoteData = report.userData.slice(0, userDataHash.length);
456
+ if (quoteType.type === QuoteType.SGX) {
457
+ slicedQuoteData = this.teeSgxParser
458
+ .parseReport(quote.report)
459
+ .userData.slice(0, userDataHash.length);
460
+ }
461
+ else {
462
+ slicedQuoteData = this.teeTdxParser
463
+ .parseBody(quote.tdQuoteBody)
464
+ .reportData.slice(0, userDataHash.length);
465
+ }
372
466
  const compareResult = Buffer.compare(slicedQuoteData, userDataHash);
373
467
  return compareResult === 0;
374
468
  }
@@ -381,4 +475,4 @@ export class QuoteValidator {
381
475
  return Buffer.from(hashData.hash, hashData.encoding);
382
476
  }
383
477
  }
384
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVvdGVWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVlL1F1b3RlVmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxXQUFXLEVBQWEsTUFBTSxZQUFZLENBQUM7QUFDcEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFaEQsT0FBTyxVQUFVLE1BQU0sY0FBYyxDQUFDO0FBRXRDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakUsT0FBTyxNQUFNLE1BQU0sb0JBQW9CLENBQUM7QUFFeEMsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLFFBQVEsQ0FBQztBQUN4QixNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQztBQUU3QixNQUFNLGtCQUFrQixHQUFHLHVDQUF1QyxDQUFDO0FBQ25FLE1BQU0scUJBQXFCLEdBQUcsbUVBQW1FLENBQUM7QUFDbEcsTUFBTSxPQUFPLEdBQUcsdUJBQXVCLENBQUM7QUFDeEMsTUFBTSxTQUFTLEdB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
478
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVvdGVWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVlL1F1b3RlVmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBd0IsTUFBTSxPQUFPLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sUUFBUSxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEtBQUssTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFFLFdBQVcsRUFBYSxNQUFNLFlBQVksQ0FBQztBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ2xELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pFLE9BQU8sRUFHTCxTQUFTLEdBR1YsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxVQUFVLE1BQU0sY0FBYyxDQUFDO0FBRXRDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakUsT0FBTyxNQUFNLE1BQU0sb0JBQW9CLENBQUM7QUFDeEMsT0FBTyxFQUFFLDJCQUEyQixFQUFFLDhCQUE4QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFOUYsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLFFBQVEsQ0FB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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
  }
@@ -2,7 +2,6 @@ import { HashAlgorithm, Encoding } from '@super-protocol/dto-js';
2
2
  import { TLBlockSerializerV1 } from '@super-protocol/tee-lib';
3
3
  import logger from '../logger.js';
4
4
  import { config } from '../config.js';
5
- import { TeeSgxParser } from './QuoteParser.js';
6
5
  import { QuoteValidator } from './QuoteValidator.js';
7
6
  import { QuoteValidationStatuses } from './statuses.js';
8
7
  import Crypto from '../crypto/index.js';
@@ -25,12 +24,7 @@ export class TeeBlockVerifier {
25
24
  if (!userDataCheckResult) {
26
25
  throw new Error('Quote has invalid user data');
27
26
  }
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
- }
27
+ await QuoteValidator.checkSignature(quoteBuffer);
34
28
  }
35
29
  static async verifyTcb(tcb, quoteString, pubKey, sgxApiUrl) {
36
30
  // check cache
@@ -76,4 +70,4 @@ export class TeeBlockVerifier {
76
70
  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
71
  }
78
72
  }
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVlQmxvY2tWZXJpZmllci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZWUvVGVlQmxvY2tWZXJpZmllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBZ0MsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RixPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUM7QUFDbEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUV0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV4RCxPQUFPLE1BQU0sTUFBTSxvQkFBb0IsQ0FBQztBQUV4QyxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLE1BQU0sQ0FBQyxpQkFBaUIsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUMxRCxNQUFNLENBQUMsWUFBWSxHQUFzQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRTNDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUM3QixLQUFpQixFQUNqQixRQUFvQixFQUNwQixTQUFpQjtRQUVqQixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sU0FBUyxHQUFHLElBQUksY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sV0FBVyxHQUFHLE1BQU0sU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxRCxJQUFJLFdBQVcsQ0FBQyxxQkFBcUIsS0FBSyx1QkFBdUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMzRSxJQUFJLFdBQVcsQ0FBQyxx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
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVlQmxvY2tWZXJpZmllci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZWUvVGVlQmxvY2tWZXJpZmllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBZ0MsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RixPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUM7QUFDbEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUV0QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXhELE9BQU8sTUFBTSxNQUFNLG9CQUFvQixDQUFDO0FBRXhDLE1BQU0sT0FBTyxnQkFBZ0I7SUFDbkIsTUFBTSxDQUFVLGlCQUFpQixHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ25FLE1BQU0sQ0FBVSxZQUFZLEdBQXNCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFcEUsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQ3JCLEtBQWlCLEVBQ2pCLFFBQW9CLEVBQ3BCLFNBQWlCO1FBRWpCLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsTUFBTSxTQUFTLEdBQUcsSUFBSSxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEQsTUFBTSxXQUFXLEdBQUcsTUFBTSxTQUFTLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzFELElBQUksV0FBVyxDQUFDLHFCQUFxQixLQUFLLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzNFLElBQUksV0FBVyxDQUFDLHFCQUFxQixLQUFLLHVCQUF1QixDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN4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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,7 +1,10 @@
1
- export class TLBlockSerializerError extends Error {
1
+ import { BaseError } from '../errors/index.js';
2
+ export class TLBlockSerializerError extends BaseError {
2
3
  }
3
- export class TeeQuoteParserError extends Error {
4
+ export class TeeQuoteParserError extends BaseError {
4
5
  }
5
- export class TeeQuoteValidatorError extends Error {
6
+ export class TeeQuoteValidatorError extends BaseError {
6
7
  }
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlZS9lcnJvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLHNCQUF1QixTQUFRLEtBQUs7Q0FBRztBQUVwRCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsS0FBSztDQUFHO0FBRWpELE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxLQUFLO0NBQUcifQ==
8
+ export class InvalidSignatureError extends BaseError {
9
+ }
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlZS9lcnJvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRS9DLE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxTQUFTO0NBQUc7QUFFeEQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLFNBQVM7Q0FBRztBQUVyRCxNQUFNLE9BQU8sc0JBQXVCLFNBQVEsU0FBUztDQUFHO0FBRXhELE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxTQUFTO0NBQUcifQ==
@@ -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,2 +1,28 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
1
+ export var QuoteType;
2
+ (function (QuoteType) {
3
+ QuoteType["SGX"] = "Sgx";
4
+ QuoteType["TDX"] = "Tdx";
5
+ })(QuoteType || (QuoteType = {}));
6
+ export class TeeQuoteBase {
7
+ quoteType;
8
+ rawHeader;
9
+ ecdsaAttestationKey;
10
+ qeReport;
11
+ qeReportSignature;
12
+ qeAuthenticationData;
13
+ qeCertificationDataType;
14
+ qeCertificationData;
15
+ certificates;
16
+ }
17
+ export class TeeSgxQuoteDataType extends TeeQuoteBase {
18
+ header;
19
+ report;
20
+ isvEnclaveReportSignature;
21
+ }
22
+ export class TeeTdxQuoteDataType extends TeeQuoteBase {
23
+ header;
24
+ tdQuoteBody;
25
+ quoteSignature;
26
+ certDataType;
27
+ }
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWtEQSxNQUFNLENBQU4sSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ25CLHdCQUFXLENBQUE7SUFDWCx3QkFBVyxDQUFBO0FBQ2IsQ0FBQyxFQUhXLFNBQVMsS0FBVCxTQUFTLFFBR3BCO0FBQ0QsTUFBTSxPQUFPLFlBQVk7SUFDdkIsU0FBUyxDQUFhO0lBQ3RCLFNBQVMsQ0FBYztJQUN2QixtQkFBbUIsQ0FBYztJQUNqQyxRQUFRLENBQWM7SUFDdEIsaUJBQWlCLENBQWM7SUFDL0Isb0JBQW9CLENBQWM7SUFDbEMsdUJBQXVCLENBQVU7SUFDakMsbUJBQW1CLENBQWM7SUFDakMsWUFBWSxDQUlWO0NBQ0g7QUFTRCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsWUFBWTtJQUNuRCxNQUFNLENBQW9CO0lBQzFCLE1BQU0sQ0FBYztJQUNwQix5QkFBeUIsQ0FBYztDQUN4QztBQVdELE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxZQUFZO0lBQ25ELE1BQU0sQ0FBb0I7SUFDMUIsV0FBVyxDQUFjO0lBQ3pCLGNBQWMsQ0FBYztJQUM1QixZQUFZLENBQVU7Q0FDdkIifQ==
@@ -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
  };