@super-protocol/sdk-js 2.2.0-beta.12 → 2.2.0-beta.120

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 (244) 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 +929 -122
  15. package/dist/cjs/contracts/abi.js +1168 -134
  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 +11 -1
  27. package/dist/cjs/index.js +19 -2
  28. package/dist/cjs/models/Offer.d.ts +48 -6
  29. package/dist/cjs/models/Offer.js +159 -16
  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 +10 -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 +251 -30
  79. package/dist/cjs/tee/QuoteValidator.d.ts +13 -0
  80. package/dist/cjs/tee/QuoteValidator.js +149 -35
  81. package/dist/cjs/tee/TcbSerializer.d.ts +20 -0
  82. package/dist/cjs/tee/TcbSerializer.js +27 -0
  83. package/dist/cjs/tee/TeeBlockVerifier.d.ts +1 -6
  84. package/dist/cjs/tee/TeeBlockVerifier.js +5 -52
  85. package/dist/cjs/tee/TeeCertificateService.d.ts +13 -0
  86. package/dist/cjs/tee/TeeCertificateService.js +42 -0
  87. package/dist/cjs/tee/errors.d.ts +6 -3
  88. package/dist/cjs/tee/errors.js +9 -5
  89. package/dist/cjs/tee/helpers.d.ts +1 -1
  90. package/dist/cjs/tee/helpers.js +2 -7
  91. package/dist/cjs/tee/types.d.ts +50 -9
  92. package/dist/cjs/tee/types.js +32 -1
  93. package/dist/cjs/types/DistributedSecretStorage.d.ts +7 -0
  94. package/dist/cjs/types/Offer.d.ts +33 -7
  95. package/dist/cjs/types/Offer.js +17 -2
  96. package/dist/cjs/types/OfferVersion.d.ts +13 -0
  97. package/dist/cjs/types/OfferVersion.js +9 -0
  98. package/dist/cjs/types/Order.d.ts +8 -2
  99. package/dist/cjs/types/Order.js +3 -1
  100. package/dist/cjs/types/SlotInfo.d.ts +1 -0
  101. package/dist/cjs/types/Superpro.d.ts +2 -1
  102. package/dist/cjs/types/Superpro.js +2 -1
  103. package/dist/cjs/types/TeeOfferInfo.d.ts +2 -1
  104. package/dist/cjs/types/index.d.ts +1 -0
  105. package/dist/cjs/types/index.js +2 -1
  106. package/dist/cjs/types/storage/StorageAccess.d.ts +3 -3
  107. package/dist/cjs/utils/CryptoKeysTransformer.d.ts +6 -1
  108. package/dist/cjs/utils/CryptoKeysTransformer.js +48 -3
  109. package/dist/cjs/utils/NonceTracker.js +1 -1
  110. package/dist/cjs/utils/helper.d.ts +7 -1
  111. package/dist/cjs/utils/helper.js +87 -2
  112. package/dist/cjs/utils/helpers/OrderArgsHelper.d.ts +17 -0
  113. package/dist/cjs/utils/helpers/OrderArgsHelper.js +87 -0
  114. package/dist/cjs/utils/helpers/index.d.ts +2 -0
  115. package/dist/cjs/utils/helpers/index.js +3 -1
  116. package/dist/cjs/utils/helpers/uploadObjectToStorage.d.ts +13 -0
  117. package/dist/cjs/utils/helpers/uploadObjectToStorage.js +55 -0
  118. package/dist/cjs/utils/schema-validators/index.d.ts +1 -0
  119. package/dist/cjs/utils/schema-validators/index.js +6 -0
  120. package/dist/cjs/utils/schema-validators/validator.d.ts +7 -0
  121. package/dist/cjs/utils/schema-validators/validator.js +49 -0
  122. package/dist/mjs/RIGenerator.d.ts +2 -0
  123. package/dist/mjs/RIGenerator.js +6 -4
  124. package/dist/mjs/TIIGenerator.d.ts +2 -1
  125. package/dist/mjs/TIIGenerator.js +13 -3
  126. package/dist/mjs/TeeInputGeneratorBase.d.ts +1 -1
  127. package/dist/mjs/TeeInputGeneratorBase.js +20 -32
  128. package/dist/mjs/analytics/eventProviders/BrowserEventProvider.d.ts +1 -0
  129. package/dist/mjs/analytics/eventProviders/BrowserEventProvider.js +3 -3
  130. package/dist/mjs/analytics/transports/AxiosTransport.js +1 -1
  131. package/dist/mjs/config.d.ts +0 -1
  132. package/dist/mjs/config.js +1 -2
  133. package/dist/mjs/constants.d.ts +5 -4
  134. package/dist/mjs/constants.js +30 -6
  135. package/dist/mjs/contracts/abi.d.ts +929 -122
  136. package/dist/mjs/contracts/abi.js +1166 -132
  137. package/dist/mjs/crypto/index.d.ts +1 -0
  138. package/dist/mjs/crypto/index.js +2 -1
  139. package/dist/mjs/errors/base.error.d.ts +3 -0
  140. package/dist/mjs/errors/base.error.js +15 -0
  141. package/dist/mjs/errors/index.d.ts +2 -0
  142. package/dist/mjs/errors/index.js +3 -0
  143. package/dist/mjs/errors/not-found.error.d.ts +3 -0
  144. package/dist/mjs/errors/not-found.error.js +4 -0
  145. package/dist/mjs/errors/utils.d.ts +1 -0
  146. package/dist/mjs/errors/utils.js +18 -0
  147. package/dist/mjs/index.d.ts +11 -1
  148. package/dist/mjs/index.js +11 -2
  149. package/dist/mjs/models/Offer.d.ts +48 -6
  150. package/dist/mjs/models/Offer.js +161 -18
  151. package/dist/mjs/models/Order.d.ts +2 -90
  152. package/dist/mjs/models/Order.js +20 -91
  153. package/dist/mjs/models/Provider.js +1 -1
  154. package/dist/mjs/models/TCB.js +13 -5
  155. package/dist/mjs/models/TeeOffer.d.ts +35 -13
  156. package/dist/mjs/models/TeeOffer.js +115 -40
  157. package/dist/mjs/proto/Compression.d.ts +1 -1
  158. package/dist/mjs/proto/TRI.d.ts +41 -6
  159. package/dist/mjs/proto/TRI.js +18 -1
  160. package/dist/mjs/proto/TeeProperties.d.ts +5 -5
  161. package/dist/mjs/providers/storage/IStorageProvider.d.ts +1 -1
  162. package/dist/mjs/providers/storage/S3StorageProvider.d.ts +8 -7
  163. package/dist/mjs/providers/storage/S3StorageProvider.js +74 -38
  164. package/dist/mjs/providers/storage/StorageAdapter.d.ts +9 -7
  165. package/dist/mjs/providers/storage/StorageAdapter.js +27 -29
  166. package/dist/mjs/providers/storage/StorageContentWriter.d.ts +2 -2
  167. package/dist/mjs/providers/storage/StorageContentWriter.js +5 -5
  168. package/dist/mjs/providers/storage/StorageKeyValueAdapter.d.ts +8 -5
  169. package/dist/mjs/providers/storage/StorageKeyValueAdapter.js +30 -16
  170. package/dist/mjs/providers/storage/StorjAdapter.d.ts +5 -4
  171. package/dist/mjs/providers/storage/StorjAdapter.js +15 -9
  172. package/dist/mjs/providers/storage/StorjCredentialsManager.d.ts +24 -0
  173. package/dist/mjs/providers/storage/StorjCredentialsManager.js +82 -0
  174. package/dist/mjs/providers/storage/StorjStorageProvider.js +3 -3
  175. package/dist/mjs/providers/storage/fs-storage-provider.d.ts +19 -0
  176. package/dist/mjs/providers/storage/fs-storage-provider.js +113 -0
  177. package/dist/mjs/providers/storage/getStorageProvider.js +4 -1
  178. package/dist/mjs/providers/storage/parseStorageCredentials.d.ts +5 -0
  179. package/dist/mjs/providers/storage/parseStorageCredentials.js +17 -0
  180. package/dist/mjs/providers/storage/types.d.ts +22 -0
  181. package/dist/mjs/staticModels/Consensus.d.ts +3 -2
  182. package/dist/mjs/staticModels/Consensus.js +22 -11
  183. package/dist/mjs/staticModels/LoaderSecretsPublicKeys.js +4 -4
  184. package/dist/mjs/staticModels/LoaderSessions.d.ts +2 -2
  185. package/dist/mjs/staticModels/LoaderSessions.js +6 -6
  186. package/dist/mjs/staticModels/OfferResources.d.ts +3 -1
  187. package/dist/mjs/staticModels/OfferResources.js +34 -9
  188. package/dist/mjs/staticModels/Offers.js +10 -2
  189. package/dist/mjs/staticModels/OffersStorageAllocated.d.ts +1 -2
  190. package/dist/mjs/staticModels/OffersStorageAllocated.js +11 -11
  191. package/dist/mjs/staticModels/OffersStorageRequests.js +5 -4
  192. package/dist/mjs/staticModels/Orders.d.ts +5 -4
  193. package/dist/mjs/staticModels/Orders.js +7 -6
  194. package/dist/mjs/staticModels/SecretRequests.d.ts +1 -1
  195. package/dist/mjs/staticModels/SecretRequests.js +15 -8
  196. package/dist/mjs/staticModels/TeeOffers.d.ts +0 -2
  197. package/dist/mjs/staticModels/TeeOffers.js +5 -38
  198. package/dist/mjs/store.js +2 -2
  199. package/dist/mjs/tee/QuoteParser.d.ts +61 -6
  200. package/dist/mjs/tee/QuoteParser.js +248 -29
  201. package/dist/mjs/tee/QuoteValidator.d.ts +13 -0
  202. package/dist/mjs/tee/QuoteValidator.js +149 -35
  203. package/dist/mjs/tee/TcbSerializer.d.ts +20 -0
  204. package/dist/mjs/tee/TcbSerializer.js +23 -0
  205. package/dist/mjs/tee/TeeBlockVerifier.d.ts +1 -6
  206. package/dist/mjs/tee/TeeBlockVerifier.js +5 -52
  207. package/dist/mjs/tee/TeeCertificateService.d.ts +13 -0
  208. package/dist/mjs/tee/TeeCertificateService.js +35 -0
  209. package/dist/mjs/tee/errors.d.ts +6 -3
  210. package/dist/mjs/tee/errors.js +7 -4
  211. package/dist/mjs/tee/helpers.d.ts +1 -1
  212. package/dist/mjs/tee/helpers.js +2 -7
  213. package/dist/mjs/tee/types.d.ts +50 -9
  214. package/dist/mjs/tee/types.js +28 -2
  215. package/dist/mjs/types/DistributedSecretStorage.d.ts +7 -0
  216. package/dist/mjs/types/Offer.d.ts +33 -7
  217. package/dist/mjs/types/Offer.js +16 -1
  218. package/dist/mjs/types/OfferVersion.d.ts +13 -0
  219. package/dist/mjs/types/OfferVersion.js +6 -0
  220. package/dist/mjs/types/Order.d.ts +8 -2
  221. package/dist/mjs/types/Order.js +3 -1
  222. package/dist/mjs/types/SlotInfo.d.ts +1 -0
  223. package/dist/mjs/types/Superpro.d.ts +2 -1
  224. package/dist/mjs/types/Superpro.js +2 -1
  225. package/dist/mjs/types/TeeOfferInfo.d.ts +2 -1
  226. package/dist/mjs/types/index.d.ts +1 -0
  227. package/dist/mjs/types/index.js +2 -1
  228. package/dist/mjs/types/storage/StorageAccess.d.ts +3 -3
  229. package/dist/mjs/utils/CryptoKeysTransformer.d.ts +6 -1
  230. package/dist/mjs/utils/CryptoKeysTransformer.js +48 -3
  231. package/dist/mjs/utils/NonceTracker.js +1 -1
  232. package/dist/mjs/utils/helper.d.ts +7 -1
  233. package/dist/mjs/utils/helper.js +80 -1
  234. package/dist/mjs/utils/helpers/OrderArgsHelper.d.ts +17 -0
  235. package/dist/mjs/utils/helpers/OrderArgsHelper.js +80 -0
  236. package/dist/mjs/utils/helpers/index.d.ts +2 -0
  237. package/dist/mjs/utils/helpers/index.js +3 -1
  238. package/dist/mjs/utils/helpers/uploadObjectToStorage.d.ts +13 -0
  239. package/dist/mjs/utils/helpers/uploadObjectToStorage.js +48 -0
  240. package/dist/mjs/utils/schema-validators/index.d.ts +1 -0
  241. package/dist/mjs/utils/schema-validators/index.js +2 -0
  242. package/dist/mjs/utils/schema-validators/validator.d.ts +7 -0
  243. package/dist/mjs/utils/schema-validators/validator.js +45 -0
  244. package/package.json +7 -6
@@ -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) {
@@ -334,9 +413,32 @@ export class QuoteValidator {
334
413
  return 'Quote verification failed.';
335
414
  }
336
415
  }
416
+ async checkQuote(quote, dataBlob) {
417
+ const logger = this.logger.child({ method: this.checkQuote.name });
418
+ const quoteBuffer = Buffer.from(quote);
419
+ const quoteStatus = await this.validate(quoteBuffer);
420
+ if (quoteStatus.quoteValidationStatus !== QuoteValidationStatuses.UpToDate) {
421
+ if (quoteStatus.quoteValidationStatus === QuoteValidationStatuses.Error) {
422
+ throw new Error('Quote is invalid');
423
+ }
424
+ else {
425
+ logger.warn(quoteStatus, 'Quote validation status is not UpToDate');
426
+ }
427
+ }
428
+ const userDataCheckResult = await this.isQuoteHasUserData(quoteBuffer, Buffer.from(dataBlob));
429
+ if (!userDataCheckResult) {
430
+ throw new Error('Quote has invalid user data');
431
+ }
432
+ }
433
+ async checkSignature(quoteBuffer) {
434
+ await QuoteValidator.checkSignature(quoteBuffer);
435
+ }
337
436
  async validate(quoteBuffer) {
338
437
  try {
339
- const quote = this.teeSgxParser.parseQuote(quoteBuffer);
438
+ const quoteType = TeeParser.determineQuoteType(quoteBuffer);
439
+ const quote = quoteType.type === QuoteType.SGX
440
+ ? this.teeSgxParser.parseQuote(quoteBuffer)
441
+ : this.teeTdxParser.parseQuote(quoteBuffer);
340
442
  const report = this.teeSgxParser.parseReport(quote.qeReport);
341
443
  const { pckCert, rootCertPem } = await this.getCertificates(quote);
342
444
  await this.validateQuoteStructure(quote, report, pckCert.publicKey.keyRaw);
@@ -344,10 +446,10 @@ export class QuoteValidator {
344
446
  const sgxExtensionData = this.getSgxExtensionData(pckCert);
345
447
  const fmspc = this.getDataFromExtension(sgxExtensionData, FMSPC_OID, asn1.Type.OCTETSTRING);
346
448
  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);
449
+ const tcbData = await this.getTcbInfo(fmspc, rootCertPem, quoteType.type);
450
+ const qeIdentity = await this.getQEIdentity(rootCertPem, quoteType.type);
349
451
  const qeIdentityStatus = this.getQEIdentityStatus(report, qeIdentity);
350
- const tcbStatus = this.getTcbStatus(fmspc, pceId, tcbData, sgxExtensionData);
452
+ const tcbStatus = this.getTcbStatus(fmspc, pceId, tcbData, sgxExtensionData); // TODO method 'validate' isn't only for tcb - extract this from quote validator
351
453
  const quoteValidationStatus = this.getQuoteValidationStatus(qeIdentityStatus, tcbStatus);
352
454
  this.logger.info(`Quote validation status is ${quoteValidationStatus}`);
353
455
  return {
@@ -365,10 +467,22 @@ export class QuoteValidator {
365
467
  }
366
468
  }
367
469
  async isQuoteHasUserData(quoteBuffer, userDataBuffer) {
368
- const quote = this.teeSgxParser.parseQuote(quoteBuffer);
369
- const report = this.teeSgxParser.parseReport(quote.report);
470
+ const quoteType = TeeParser.determineQuoteType(quoteBuffer);
471
+ const quote = quoteType.type === QuoteType.SGX
472
+ ? this.teeSgxParser.parseQuote(quoteBuffer)
473
+ : this.teeTdxParser.parseQuote(quoteBuffer);
474
+ let slicedQuoteData;
370
475
  const userDataHash = await this.getSha256Hash(userDataBuffer);
371
- const slicedQuoteData = report.userData.slice(0, userDataHash.length);
476
+ if (quoteType.type === QuoteType.SGX) {
477
+ slicedQuoteData = this.teeSgxParser
478
+ .parseReport(quote.report)
479
+ .userData.slice(0, userDataHash.length);
480
+ }
481
+ else {
482
+ slicedQuoteData = this.teeTdxParser
483
+ .parseBody(quote.tdQuoteBody)
484
+ .reportData.slice(0, userDataHash.length);
485
+ }
372
486
  const compareResult = Buffer.compare(slicedQuoteData, userDataHash);
373
487
  return compareResult === 0;
374
488
  }
@@ -381,4 +495,4 @@ export class QuoteValidator {
381
495
  return Buffer.from(hashData.hash, hashData.encoding);
382
496
  }
383
497
  }
384
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVvdGVWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVlL1F1b3RlVmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxXQUFXLEVBQWEsTUFBTSxZQUFZLENBQUM7QUFDcEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFaEQsT0FBTyxVQUFVLE1BQU0sY0FBYyxDQUFDO0FBRXRDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakUsT0FBTyxNQUFNLE1BQU0sb0JBQW9CLENBQUM7QUFFeEMsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLFFBQVEsQ0FBQztBQUN4QixNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQztBQUU3QixNQUFNLGtCQUFrQixHQUFHLHVDQUF1QyxDQUFDO0FBQ25FLE1BQU0scUJBQXFCLEdBQUcsbUVBQW1FLENBQUM7QUFDbEcsTUFBTSxPQUFPLEdBQUcsdUJBQXVCLENBQUM7QUFDeEMsTUFBTSxTQUFTLEdB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
498
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVvdGVWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVlL1F1b3RlVmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBd0IsTUFBTSxPQUFPLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sUUFBUSxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEtBQUssTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFFLFdBQVcsRUFBYSxNQUFNLFlBQVksQ0FBQztBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ2xELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pFLE9BQU8sRUFHTCxTQUFTLEdBR1YsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxVQUFVLE1BQU0sY0FBYyxDQUFDO0FBRXRDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakUsT0FBTyxNQUFNLE1BQU0sb0JBQW9CLENBQUM7QUFDeEMsT0FBTyxFQUFFLDJCQUEyQixFQUFFLDhCQUE4QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFOUYsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLFFBQVEsQ0FB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
@@ -0,0 +1,20 @@
1
+ import { TcbVerifiedStatus } from '@super-protocol/dto-js';
2
+ import { BlockchainId } from '../types/index.js';
3
+ export type TcbData = {
4
+ checkingTcbId: string;
5
+ pubKey: string;
6
+ checkingTcbIds: BlockchainId[];
7
+ checkingTcbMarks: TcbVerifiedStatus[];
8
+ deviceId: string;
9
+ benchmark: number;
10
+ properties: string;
11
+ };
12
+ export type VersionedTcbData = {
13
+ v: number;
14
+ [key: string]: unknown;
15
+ };
16
+ export declare class TcbDataSerializer {
17
+ private static readonly VERSION;
18
+ static serialize(data: TcbData): Uint8Array;
19
+ static deserialize(buffer: Uint8Array): TcbData;
20
+ }
@@ -0,0 +1,23 @@
1
+ import { decode, encode } from '@msgpack/msgpack';
2
+ export class TcbDataSerializer {
3
+ static VERSION = 1; // Current version of the data structure
4
+ static serialize(data) {
5
+ const serializedData = {
6
+ v: TcbDataSerializer.VERSION,
7
+ quote: data,
8
+ };
9
+ return encode(serializedData, { sortKeys: true });
10
+ }
11
+ static deserialize(buffer) {
12
+ const { v, ...rest } = decode(buffer);
13
+ switch (v) {
14
+ case 1: {
15
+ return rest;
16
+ }
17
+ // Future versions can be handled here with additional cases
18
+ default:
19
+ throw new Error(`Unsupported version: ${v}`);
20
+ }
21
+ }
22
+ }
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGNiU2VyaWFsaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZWUvVGNiU2VyaWFsaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBbUJsRCxNQUFNLE9BQU8saUJBQWlCO0lBQ3BCLE1BQU0sQ0FBVSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsd0NBQXdDO0lBRTdFLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBYTtRQUM1QixNQUFNLGNBQWMsR0FBcUI7WUFDdkMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLE9BQU87WUFDNUIsS0FBSyxFQUFFLElBQUk7U0FDWixDQUFDO1FBRUYsT0FBTyxNQUFNLENBQUMsY0FBYyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBa0I7UUFDbkMsTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQXFCLENBQUM7UUFFMUQsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNWLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDUCxPQUFPLElBQWUsQ0FBQztZQUN6QixDQUFDO1lBQ0QsNERBQTREO1lBQzVEO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakQsQ0FBQztJQUNILENBQUMifQ==
@@ -1,10 +1,5 @@
1
- import { TLBlockUnserializeResultType } from '@super-protocol/tee-lib';
2
1
  import { TCB } from '../models/index.js';
3
- import { BlockchainId } from '../types/index.js';
4
2
  export declare class TeeBlockVerifier {
5
- static verifiedTlbHashes: Map<string, string>;
6
- static verifiedTcbs: Set<BlockchainId>;
7
- private static checkQuote;
3
+ private static readonly verifiedTcbs;
8
4
  static verifyTcb(tcb: TCB, quoteString: string, pubKey: string, sgxApiUrl: string): Promise<void>;
9
- static verifyTlb(tlb: TLBlockUnserializeResultType, tlbString: string, offerId: string, sgxApiUrl: string): Promise<void>;
10
5
  }
@@ -1,37 +1,9 @@
1
- import { HashAlgorithm, Encoding } from '@super-protocol/dto-js';
2
- import { TLBlockSerializerV1 } from '@super-protocol/tee-lib';
3
1
  import logger from '../logger.js';
4
2
  import { config } from '../config.js';
5
- import { TeeSgxParser } from './QuoteParser.js';
6
3
  import { QuoteValidator } from './QuoteValidator.js';
7
- import { QuoteValidationStatuses } from './statuses.js';
8
- import Crypto from '../crypto/index.js';
4
+ import { TcbDataSerializer } from './TcbSerializer.js';
9
5
  export class TeeBlockVerifier {
10
- static verifiedTlbHashes = new Map();
11
6
  static verifiedTcbs = new Set();
12
- static async checkQuote(quote, dataBlob, sgxApiUrl) {
13
- const quoteBuffer = Buffer.from(quote);
14
- const validator = new QuoteValidator(sgxApiUrl);
15
- const quoteStatus = await validator.validate(quoteBuffer);
16
- if (quoteStatus.quoteValidationStatus !== QuoteValidationStatuses.UpToDate) {
17
- if (quoteStatus.quoteValidationStatus === QuoteValidationStatuses.Error) {
18
- throw new Error('Quote is invalid');
19
- }
20
- else {
21
- logger.warn(quoteStatus, 'Quote validation status is not UpToDate');
22
- }
23
- }
24
- const userDataCheckResult = await validator.isQuoteHasUserData(quoteBuffer, Buffer.from(dataBlob));
25
- if (!userDataCheckResult) {
26
- throw new Error('Quote has invalid user data');
27
- }
28
- const parser = new TeeSgxParser();
29
- const parsedQuote = parser.parseQuote(quote);
30
- const report = parser.parseReport(parsedQuote.report);
31
- if (report.mrSigner.toString('hex') !== config.TEE_LOADER_TRUSTED_MRSIGNER) {
32
- throw new Error('Quote has invalid MR signer');
33
- }
34
- }
35
7
  static async verifyTcb(tcb, quoteString, pubKey, sgxApiUrl) {
36
8
  // check cache
37
9
  if (this.verifiedTcbs.has(tcb.tcbId)) {
@@ -44,9 +16,9 @@ export class TeeBlockVerifier {
44
16
  pubKey,
45
17
  ...(await tcb.getPublicData()),
46
18
  };
47
- const serializer = new TLBlockSerializerV1();
48
- const dataBlob = await serializer.serializeAnyData(signedTcbData);
49
- await this.checkQuote(quote, dataBlob, sgxApiUrl);
19
+ const validator = new QuoteValidator(sgxApiUrl);
20
+ await validator.checkQuote(quote, TcbDataSerializer.serialize(signedTcbData));
21
+ await validator.checkSignature(quote);
50
22
  // update cache
51
23
  this.verifiedTcbs.add(tcb.tcbId);
52
24
  if (this.verifiedTcbs.size > config.TLB_CACHE_SIZE) {
@@ -56,24 +28,5 @@ export class TeeBlockVerifier {
56
28
  }
57
29
  logger.trace(tcb.tcbId, `TCB id = ${tcb.tcbId} added to the cache. Cache size: ${this.verifiedTcbs.size}, cache limit: ${config.TLB_CACHE_SIZE}`);
58
30
  }
59
- static async verifyTlb(tlb, tlbString, offerId, sgxApiUrl) {
60
- const tlbHash = await Crypto.createHash(Buffer.from(tlbString), {
61
- algo: HashAlgorithm.SHA256,
62
- encoding: Encoding.base64,
63
- });
64
- if (this.verifiedTlbHashes.has(tlbHash.hash)) {
65
- logger.trace(tlbHash, `TLB hash of offer ${this.verifiedTlbHashes.get(tlbHash.hash)} loaded from the cache. Cache size: ${this.verifiedTlbHashes.size}, cache limit: ${config.TLB_CACHE_SIZE}`);
66
- return;
67
- }
68
- const quoteBuffer = Buffer.from(tlb.quote);
69
- await this.checkQuote(quoteBuffer, tlb.dataBlob, sgxApiUrl);
70
- this.verifiedTlbHashes.set(tlbHash.hash, offerId);
71
- if (this.verifiedTlbHashes.size > config.TLB_CACHE_SIZE) {
72
- const [key, value] = this.verifiedTlbHashes.entries().next().value;
73
- this.verifiedTlbHashes.delete(key);
74
- logger.trace(key, `TLB hash of offer ${value} removed from the cache. Cache size: ${this.verifiedTlbHashes.size}, cache limit: ${config.TLB_CACHE_SIZE}`);
75
- }
76
- logger.trace(tlbHash.hash, `TLB hash of offer ${offerId} added to the cache. Cache size: ${this.verifiedTlbHashes.size}, cache limit: ${config.TLB_CACHE_SIZE}`);
77
- }
78
31
  }
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVlQmxvY2tWZXJpZmllci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZWUvVGVlQmxvY2tWZXJpZmllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBZ0MsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RixPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUM7QUFDbEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUV0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV4RCxPQUFPLE1BQU0sTUFBTSxvQkFBb0IsQ0FBQztBQUV4QyxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLE1BQU0sQ0FBQyxpQkFBaUIsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUMxRCxNQUFNLENBQUMsWUFBWSxHQUFzQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRTNDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUM3QixLQUFpQixFQUNqQixRQUFvQixFQUNwQixTQUFpQjtRQUVqQixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sU0FBUyxHQUFHLElBQUksY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sV0FBVyxHQUFHLE1BQU0sU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxRCxJQUFJLFdBQVcsQ0FBQyxxQkFBcUIsS0FBSyx1QkFBdUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMzRSxJQUFJLFdBQVcsQ0FBQyxx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
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVlQmxvY2tWZXJpZmllci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZWUvVGVlQmxvY2tWZXJpZmllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUM7QUFDbEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUV0QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFdkQsTUFBTSxPQUFPLGdCQUFnQjtJQUNuQixNQUFNLENBQVUsWUFBWSxHQUFzQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRXBFLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUNwQixHQUFRLEVBQ1IsV0FBbUIsRUFDbkIsTUFBYyxFQUNkLFNBQWlCO1FBRWpCLGNBQWM7UUFDZCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLENBQUMsS0FBSyxxQkFBcUIsQ0FBQyxDQUFDO1lBQ3pELE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDakQsTUFBTSxhQUFhLEdBQUc7WUFDcEIsYUFBYSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFO1lBQ25DLE1BQU07WUFDTixHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDL0IsQ0FBQztRQUVGLE1BQU0sU0FBUyxHQUFHLElBQUksY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sU0FBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDOUUsTUFBTSxTQUFTLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXRDLGVBQWU7UUFDZixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDbkQsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBeUIsQ0FBQztZQUM3RSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQyxNQUFNLENBQUMsS0FBSyxDQUNWLEtBQUssRUFDTCxZQUFZLEtBQUssd0NBQXdDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxrQkFBa0IsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUN6SCxDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sQ0FBQyxLQUFLLENBQ1YsR0FBRyxDQUFDLEtBQUssRUFDVCxZQUFZLEdBQUcsQ0FBQyxLQUFLLG9DQUFvQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksa0JBQWtCLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FDekgsQ0FBQztJQUNKLENBQUMifQ==
@@ -0,0 +1,13 @@
1
+ /// <reference types="node" />
2
+ export type ParseTlsCertificateResult = {
3
+ userData: Buffer;
4
+ mrEnclave: Buffer;
5
+ mrSigner: Buffer;
6
+ dataHash: Buffer;
7
+ };
8
+ export declare class TeeCertificateService {
9
+ private readonly certOidQuote;
10
+ private getCertificatePublicKey;
11
+ parseAndValidateCertificate(certificatePem: string | Buffer, sgxApiUrl: string): Promise<ParseTlsCertificateResult>;
12
+ fromRawToPem(data: Uint8Array): string;
13
+ }
@@ -0,0 +1,35 @@
1
+ import forge from 'node-forge';
2
+ import { TeeSgxParser } from './QuoteParser.js';
3
+ import { QuoteValidator } from './QuoteValidator.js';
4
+ export class TeeCertificateService {
5
+ certOidQuote = '0.6.9.42.840.113741.1337.6';
6
+ getCertificatePublicKey(certificate) {
7
+ const publicKeyDer = forge.asn1
8
+ .toDer(forge.pki.publicKeyToAsn1(certificate.publicKey))
9
+ .getBytes();
10
+ return Buffer.from(publicKeyDer, 'binary');
11
+ }
12
+ async parseAndValidateCertificate(certificatePem, sgxApiUrl) {
13
+ const pem = Buffer.isBuffer(certificatePem) ? certificatePem.toString() : certificatePem;
14
+ const certificate = forge.pki.certificateFromPem(pem);
15
+ const extensions = certificate.extensions;
16
+ const quote = extensions.find((ext) => ext.id === this.certOidQuote);
17
+ const quoteBuffer = Buffer.from(quote.value, 'binary');
18
+ const validator = new QuoteValidator(sgxApiUrl);
19
+ await validator.checkQuote(quoteBuffer, this.getCertificatePublicKey(certificate));
20
+ const parser = new TeeSgxParser();
21
+ const parsedQuote = parser.parseQuote(quoteBuffer);
22
+ const report = parser.parseReport(parsedQuote.report);
23
+ return {
24
+ userData: Buffer.from(parsedQuote.header.userData),
25
+ mrEnclave: Buffer.from(report.mrEnclave),
26
+ mrSigner: Buffer.from(report.mrSigner),
27
+ dataHash: Buffer.from(report.dataHash),
28
+ };
29
+ }
30
+ fromRawToPem(data) {
31
+ const base64 = Buffer.from(data).toString('base64');
32
+ return `-----BEGIN CERTIFICATE-----\n${base64.match(/.{1,64}/g).join('\n')}\n-----END CERTIFICATE-----`;
33
+ }
34
+ }
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVlQ2VydGlmaWNhdGVTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlZS9UZWVDZXJ0aWZpY2F0ZVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFTckQsTUFBTSxPQUFPLHFCQUFxQjtJQUNmLFlBQVksR0FBRyw0QkFBNEIsQ0FBQztJQUVyRCx1QkFBdUIsQ0FBQyxXQUFrQztRQUNoRSxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsSUFBSTthQUM1QixLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ3ZELFFBQVEsRUFBRSxDQUFDO1FBRWQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsS0FBSyxDQUFDLDJCQUEyQixDQUMvQixjQUErQixFQUMvQixTQUFpQjtRQUVqQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztRQUN6RixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUM7UUFFMUMsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDckUsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sU0FBUyxHQUFHLElBQUksY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sU0FBUyxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFFbkYsTUFBTSxNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNsQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXRELE9BQU87WUFDTCxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUNsRCxTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1lBQ3hDLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDdEMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztTQUN2QyxDQUFDO0lBQ0osQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFnQjtRQUMzQixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwRCxPQUFPLGdDQUFnQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUM7SUFDM0csQ0FBQztDQUNGIn0=
@@ -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
  }