@super-protocol/sdk-js 3.4.0-beta.2 → 3.4.0-beta.21

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 (107) hide show
  1. package/dist/cjs/certificates/crl.d.ts +6 -0
  2. package/dist/cjs/certificates/crl.js +66 -0
  3. package/dist/cjs/certificates/helper.d.ts +23 -0
  4. package/dist/cjs/certificates/helper.js +176 -0
  5. package/dist/cjs/certificates/index.d.ts +2 -0
  6. package/dist/cjs/certificates/index.js +19 -0
  7. package/dist/cjs/certificates/ocsp.d.ts +9 -0
  8. package/dist/cjs/certificates/ocsp.js +124 -0
  9. package/dist/cjs/certificates/types.d.ts +4 -0
  10. package/dist/cjs/certificates/types.js +3 -0
  11. package/dist/cjs/connectors/BaseConnector.d.ts +1 -0
  12. package/dist/cjs/connectors/BaseConnector.js +1 -1
  13. package/dist/cjs/connectors/BlockchainConnector.js +2 -2
  14. package/dist/cjs/constants.d.ts +9 -0
  15. package/dist/cjs/constants.js +11 -2
  16. package/dist/cjs/contracts/abi.d.ts +8 -8
  17. package/dist/cjs/contracts/abi.js +9 -9
  18. package/dist/cjs/crypto/types.d.ts +0 -4
  19. package/dist/cjs/crypto/utils.d.ts +2 -3
  20. package/dist/cjs/crypto/utils.js +46 -26
  21. package/dist/cjs/crypto/utils.spec.d.ts +1 -0
  22. package/dist/cjs/crypto/utils.spec.js +176 -0
  23. package/dist/cjs/index.d.ts +2 -0
  24. package/dist/cjs/index.js +5 -2
  25. package/dist/cjs/models/Offer.js +12 -8
  26. package/dist/cjs/models/Order.d.ts +1 -1
  27. package/dist/cjs/models/Order.js +4 -2
  28. package/dist/cjs/providers/storage/fs-storage-provider.js +3 -4
  29. package/dist/cjs/staticModels/OfferResources.js +3 -3
  30. package/dist/cjs/staticModels/OffersStorageRequests.js +3 -3
  31. package/dist/cjs/staticModels/Orders.d.ts +3 -3
  32. package/dist/cjs/staticModels/Orders.js +9 -3
  33. package/dist/cjs/staticModels/SecretRequests.js +2 -2
  34. package/dist/cjs/store.d.ts +2 -0
  35. package/dist/cjs/store.js +3 -1
  36. package/dist/cjs/tee/OrderReportService.d.ts +0 -3
  37. package/dist/cjs/tee/OrderReportService.js +12 -28
  38. package/dist/cjs/tee/QuoteValidator.js +2 -2
  39. package/dist/cjs/tee/TeeCertificateService.d.ts +1 -5
  40. package/dist/cjs/tee/TeeCertificateService.js +20 -36
  41. package/dist/cjs/tee/TeeSignatureVerifier.d.ts +2 -2
  42. package/dist/cjs/tee/TeeSignatureVerifier.js +3 -3
  43. package/dist/cjs/types/Order.js +7 -3
  44. package/dist/cjs/utils/TxManager.d.ts +3 -1
  45. package/dist/cjs/utils/TxManager.js +41 -4
  46. package/dist/cjs/utils/helper.d.ts +1 -1
  47. package/dist/cjs/utils/helper.js +8 -9
  48. package/dist/cjs/utils/order/index.d.ts +1 -0
  49. package/dist/cjs/utils/order/index.js +2 -1
  50. package/dist/cjs/utils/order/types.d.ts +2 -3
  51. package/dist/cjs/utils/order/validate-order.js +18 -9
  52. package/dist/cjs/utils/order/versify.d.ts +2 -0
  53. package/dist/cjs/utils/order/versify.js +43 -0
  54. package/dist/mjs/certificates/crl.d.ts +6 -0
  55. package/dist/mjs/certificates/crl.js +39 -0
  56. package/dist/mjs/certificates/helper.d.ts +23 -0
  57. package/dist/mjs/certificates/helper.js +146 -0
  58. package/dist/mjs/certificates/index.d.ts +2 -0
  59. package/dist/mjs/certificates/index.js +3 -0
  60. package/dist/mjs/certificates/ocsp.d.ts +9 -0
  61. package/dist/mjs/certificates/ocsp.js +94 -0
  62. package/dist/mjs/certificates/types.d.ts +4 -0
  63. package/dist/mjs/certificates/types.js +2 -0
  64. package/dist/mjs/connectors/BaseConnector.d.ts +1 -0
  65. package/dist/mjs/connectors/BaseConnector.js +1 -1
  66. package/dist/mjs/connectors/BlockchainConnector.js +2 -2
  67. package/dist/mjs/constants.d.ts +9 -0
  68. package/dist/mjs/constants.js +10 -1
  69. package/dist/mjs/contracts/abi.d.ts +8 -8
  70. package/dist/mjs/contracts/abi.js +9 -9
  71. package/dist/mjs/crypto/types.d.ts +0 -4
  72. package/dist/mjs/crypto/utils.d.ts +2 -3
  73. package/dist/mjs/crypto/utils.js +46 -26
  74. package/dist/mjs/crypto/utils.spec.d.ts +1 -0
  75. package/dist/mjs/crypto/utils.spec.js +174 -0
  76. package/dist/mjs/index.d.ts +2 -0
  77. package/dist/mjs/index.js +3 -1
  78. package/dist/mjs/models/Offer.js +12 -8
  79. package/dist/mjs/models/Order.d.ts +1 -1
  80. package/dist/mjs/models/Order.js +4 -2
  81. package/dist/mjs/providers/storage/fs-storage-provider.js +3 -4
  82. package/dist/mjs/staticModels/OfferResources.js +3 -3
  83. package/dist/mjs/staticModels/OffersStorageRequests.js +3 -3
  84. package/dist/mjs/staticModels/Orders.d.ts +3 -3
  85. package/dist/mjs/staticModels/Orders.js +10 -4
  86. package/dist/mjs/staticModels/SecretRequests.js +2 -2
  87. package/dist/mjs/store.d.ts +2 -0
  88. package/dist/mjs/store.js +4 -2
  89. package/dist/mjs/tee/OrderReportService.d.ts +0 -3
  90. package/dist/mjs/tee/OrderReportService.js +13 -29
  91. package/dist/mjs/tee/QuoteValidator.js +2 -2
  92. package/dist/mjs/tee/TeeCertificateService.d.ts +1 -5
  93. package/dist/mjs/tee/TeeCertificateService.js +20 -36
  94. package/dist/mjs/tee/TeeSignatureVerifier.d.ts +2 -2
  95. package/dist/mjs/tee/TeeSignatureVerifier.js +3 -3
  96. package/dist/mjs/types/Order.js +7 -3
  97. package/dist/mjs/utils/TxManager.d.ts +3 -1
  98. package/dist/mjs/utils/TxManager.js +42 -5
  99. package/dist/mjs/utils/helper.d.ts +1 -1
  100. package/dist/mjs/utils/helper.js +9 -10
  101. package/dist/mjs/utils/order/index.d.ts +1 -0
  102. package/dist/mjs/utils/order/index.js +2 -1
  103. package/dist/mjs/utils/order/types.d.ts +2 -3
  104. package/dist/mjs/utils/order/validate-order.js +18 -9
  105. package/dist/mjs/utils/order/versify.d.ts +2 -0
  106. package/dist/mjs/utils/order/versify.js +36 -0
  107. package/package.json +4 -4
@@ -47,10 +47,10 @@ async function getMaxPriorityFeePerGasGasStation() {
47
47
  let url;
48
48
  switch (store_js_1.default.chainId) {
49
49
  case constants_js_1.POLYGON_AMOY_CHAIN_ID:
50
- url = 'https://gasstation.polygon.technology/amoy';
50
+ url = constants_js_1.POLYGON_AMOY_GASSTATION_URL;
51
51
  break;
52
52
  case constants_js_1.POLYGON_MAIN_CHAIN_ID:
53
- url = 'https://gasstation.polygon.technology/v2';
53
+ url = constants_js_1.POLYGON_MAIN_GASSTATION_URL;
54
54
  break;
55
55
  default:
56
56
  return;
@@ -84,11 +84,13 @@ async function getMaxPriorityFeePerGasGasStation() {
84
84
  * Merge transaction options from arguments and from store
85
85
  * Used in all set methods
86
86
  */
87
- const createTransactionOptions = async (options) => {
87
+ const createTransactionOptions = async (externalTransactionSigner, options) => {
88
88
  if (!options)
89
89
  options = {};
90
90
  if (!options.from)
91
91
  options.from = store_js_1.default.actionAccount;
92
+ if (externalTransactionSigner)
93
+ return options;
92
94
  if (!options.gas)
93
95
  options.gas = BigInt(0);
94
96
  if (!options.maxPriorityFeePerGas) {
@@ -101,7 +103,7 @@ const createTransactionOptions = async (options) => {
101
103
  if (maxPriorityFeePerGasGasStation && maxPriorityFeePerGas > maxPriorityFeePerGasGasStation) {
102
104
  maxPriorityFeePerGas = maxPriorityFeePerGasGasStation;
103
105
  }
104
- options.maxPriorityFeePerGas = (maxPriorityFeePerGas * 3n) / 2n;
106
+ options.maxPriorityFeePerGas = (0, exports.multiplyBigIntByNumber)(maxPriorityFeePerGas, store_js_1.default.maxPriorityFeePerGasMultiplier);
105
107
  }
106
108
  if (!options.maxFeePerGas) {
107
109
  const web3 = options.web3 || store_js_1.default.web3Https;
@@ -109,10 +111,7 @@ const createTransactionOptions = async (options) => {
109
111
  throw Error('web3 is undefined, define it in transaction options or initialize BlockchainConnector with web3 instance.');
110
112
  }
111
113
  const baseFee = await (0, exports.getBaseBlockFee)(web3);
112
- const multiplier = 10n;
113
- options.maxFeePerGas =
114
- (baseFee > options.maxPriorityFeePerGas ? baseFee : options.maxPriorityFeePerGas) *
115
- multiplier;
114
+ options.maxFeePerGas = (0, exports.multiplyBigIntByNumber)(options.maxPriorityFeePerGas + baseFee, store_js_1.default.maxFeePerGasMultiplier);
116
115
  }
117
116
  delete options.web3;
118
117
  return options;
@@ -480,4 +479,4 @@ const preparePrivateKey = (pk) => {
480
479
  return pk.startsWith('0x') ? pk : '0x' + pk;
481
480
  };
482
481
  exports.preparePrivateKey = preparePrivateKey;
483
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2hlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyREFBZ0M7QUFFaEMsZ0RBQXlEO0FBRXpELG1EQUE2QztBQTBCN0Msa0RBS3lCO0FBQ3pCLG1DQUFnQztBQUVoQyxrREFBMEI7QUFFMUI7OztHQUdHO0FBQ0ksTUFBTSwrQkFBK0IsR0FBRyxDQUFDLGtCQUF1QyxFQUFRLEVBQUU7SUFDL0YsSUFBSSxDQUFDLGtCQUFLLENBQUMsYUFBYSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsSUFBSTtRQUNuRCxNQUFNLElBQUksS0FBSyxDQUNiLHdJQUF3SSxDQUN6SSxDQUFDO0FBQ04sQ0FBQyxDQUFDO0FBTFcsUUFBQSwrQkFBK0IsbUNBSzFDO0FBRUY7O0dBRUc7QUFDSSxNQUFNLDhCQUE4QixHQUFHLENBQzVDLGtCQUF1QyxFQUM5QixFQUFFO0lBQ1gsK0hBQStIO0lBQy9ILE9BQU8sQ0FBQyxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQztBQUNwQyxDQUFDLENBQUM7QUFMVyxRQUFBLDhCQUE4QixrQ0FLekM7QUFFSyxNQUFNLGVBQWUsR0FBRyxDQUFDLElBQVUsRUFBbUIsRUFBRTtJQUM3RCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsYUFBdUIsQ0FBQyxDQUFDO0FBQzVFLENBQUMsQ0FBQztBQUZXLFFBQUEsZUFBZSxtQkFFMUI7QUFFSyxNQUFNLHVCQUF1QixHQUFHLENBQUMsSUFBVSxFQUFtQixFQUFFO0lBQ3JFLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0FBQzVDLENBQUMsQ0FBQztBQUZXLFFBQUEsdUJBQXVCLDJCQUVsQztBQUVLLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxHQUFXLEVB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
482
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2hlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyREFBZ0M7QUFFaEMsZ0RBQXlEO0FBRXpELG1EQUE2QztBQTBCN0Msa0RBT3lCO0FBQ3pCLG1DQUFnQztBQUVoQyxrREFBMEI7QUFFMUI7OztHQUdHO0FBQ0ksTUFBTSwrQkFBK0IsR0FBRyxDQUFDLGtCQUF1QyxFQUFRLEVBQUU7SUFDL0YsSUFBSSxDQUFDLGtCQUFLLENBQUMsYUFBYSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsSUFBSTtRQUNuRCxNQUFNLElBQUksS0FBSyxDQUNiLHdJQUF3SSxDQUN6SSxDQUFDO0FBQ04sQ0FBQyxDQUFDO0FBTFcsUUFBQSwrQkFBK0IsbUNBSzFDO0FBRUY7O0dBRUc7QUFDSSxNQUFNLDhCQUE4QixHQUFHLENBQzVDLGtCQUF1QyxFQUM5QixFQUFFO0lBQ1gsK0hBQStIO0lBQy9ILE9BQU8sQ0FBQyxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQztBQUNwQyxDQUFDLENBQUM7QUFMVyxRQUFBLDhCQUE4QixrQ0FLekM7QUFFSyxNQUFNLGVBQWUsR0FBRyxDQUFDLElBQVUsRUFBbUIsRUFBRTtJQUM3RCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsYUFBdUIsQ0FBQyxDQUFDO0FBQzVFLENBQUMsQ0FBQztBQUZXLFFBQUEsZUFBZSxtQkFFMUI7QUFFSyxNQUFNLHVCQUF1QixHQUFHLENBQUMsSUFBVSxFQUFtQixFQUFFO0lBQ3JFLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0FBQzVDLENBQUMsQ0FBQztBQUZXLFFBQUEsdUJBQXVCLDJCQUVsQztBQUVLLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxHQUFXLEVB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
@@ -1,3 +1,4 @@
1
1
  export * from './complete-order.js';
2
2
  export * from './types.js';
3
3
  export * from './validate-order.js';
4
+ export * from './versify.js';
@@ -17,4 +17,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./complete-order.js"), exports);
18
18
  __exportStar(require("./types.js"), exports);
19
19
  __exportStar(require("./validate-order.js"), exports);
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvb3JkZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHNEQUFvQztBQUNwQyw2Q0FBMkI7QUFDM0Isc0RBQW9DIn0=
20
+ __exportStar(require("./versify.js"), exports);
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvb3JkZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHNEQUFvQztBQUNwQyw2Q0FBMkI7QUFDM0Isc0RBQW9DO0FBQ3BDLCtDQUE2QiJ9
@@ -1,5 +1,5 @@
1
1
  import { Encryption, StorageProviderResource } from '@super-protocol/dto-js';
2
- import { BlockchainId, OfferInfo, OfferType, OrderArgs, OrderInfo, OrderStatus } from '../../types/index.js';
2
+ import { BlockchainId, OfferInfo, OfferType, OrderArgs, OrderInfo, OrderStatus, VersionedOfferId } from '../../types/index.js';
3
3
  export type SolutionOfferProperties = {
4
4
  portForwarding?: number;
5
5
  groupingOffers?: boolean;
@@ -15,12 +15,11 @@ export type ValidateOrderParams = {
15
15
  orderArgs: OrderArgs;
16
16
  offerId: BlockchainId;
17
17
  offerType: OfferType;
18
- offerVersion: number;
19
18
  };
20
19
  };
21
20
  export type ValidateOrderOptions = {
22
21
  isRestrictedByOfferType: (offerId: BlockchainId, type: OfferType) => Promise<boolean>;
23
- isRestrictionsPermitThatOffer: (offerId: BlockchainId, otherOfferId: BlockchainId) => Promise<boolean>;
22
+ isRestrictionsPermitThatOffer: (offerId: BlockchainId, otherOfferId: VersionedOfferId) => Promise<boolean>;
24
23
  };
25
24
  type TerminatedOrderStatus = OrderStatus.Done | OrderStatus.Canceled | OrderStatus.Error;
26
25
  export type CompleteOrderParams = {
@@ -13,7 +13,7 @@ const defaultOptions = {
13
13
  return new Offer_js_1.default(offerId).isRestrictedByOfferType(type);
14
14
  },
15
15
  isRestrictionsPermitThatOffer(offerId, otherOfferId) {
16
- return new Offer_js_1.default(offerId).isRestrictionsPermitThatOffer(otherOfferId);
16
+ return new Offer_js_1.default(offerId).isRestrictionsPermitThatOffer(otherOfferId.id, otherOfferId.version);
17
17
  },
18
18
  };
19
19
  const validatePort = (port) => {
@@ -50,21 +50,30 @@ const validateOrder = async (params, options = defaultOptions) => {
50
50
  if (!params.parentOrder)
51
51
  throw Error('Offer restricted by TEE, but no parent offer found');
52
52
  // Check if parent offer complies with restrictions
53
- const restrictionsPermitParentOffer = await options.isRestrictionsPermitThatOffer(params.order.offerId, params.parentOrder.offerId);
53
+ const parentOrderOfferId = {
54
+ id: params.parentOrder.offerId,
55
+ version: 0,
56
+ };
57
+ const restrictionsPermitParentOffer = await options.isRestrictionsPermitThatOffer(params.order.offerId, parentOrderOfferId);
54
58
  if (!restrictionsPermitParentOffer)
55
59
  throw Error("Parent TEE offer doesn't comply with restrictions");
56
60
  if (params.parentOrder.offerType !== index_js_1.OfferType.TeeOffer)
57
61
  throw Error('Offer restricted by TEE, but parent offer is not TEE');
58
62
  // Check if each input offer (from parent order) complies with restrictions
59
63
  const inputOffersTypes = new Map();
60
- await Promise.all(params.parentOrder.orderArgs.inputOffersIds.map(async (offerId) => {
61
- if (offerId === params.order.offerId)
64
+ await Promise.all(params.parentOrder.orderArgs.inputOffersIds.map(async (inputOfferId, index) => {
65
+ if (inputOfferId === params.order.offerId)
62
66
  return true;
63
- const type = await new Offer_js_1.default(offerId).getOfferType();
64
- inputOffersTypes.set(type, true);
65
- const restrictionsPermitParentOffer = await options.isRestrictionsPermitThatOffer(params.order.offerId, offerId);
67
+ const offerType = await new Offer_js_1.default(inputOfferId).getOfferType();
68
+ inputOffersTypes.set(offerType, true);
69
+ const inputOfferVersion = params.parentOrder.orderArgs.inputOffersVersions[index];
70
+ const otherInputOfferId = {
71
+ id: inputOfferId,
72
+ version: inputOfferVersion,
73
+ };
74
+ const restrictionsPermitParentOffer = await options.isRestrictionsPermitThatOffer(params.order.offerId, otherInputOfferId);
66
75
  if (!restrictionsPermitParentOffer)
67
- throw Error(`TEE input offer ${type}: ${offerId} doesn't comply with restrictions`);
76
+ throw Error(`TEE input offer doesn't comply with restrictions (inputOfferId=${inputOfferId}, inputOfferVersion=${inputOfferVersion}, offerType=${offerType}, parentOrderOfferId=${params.parentOrder?.offerId})`);
68
77
  }));
69
78
  // Check if all required (by restrictions) offer types exist in input offers (from parent order)
70
79
  params.order.offerInfo.restrictions.types.forEach((type) => {
@@ -75,4 +84,4 @@ const validateOrder = async (params, options = defaultOptions) => {
75
84
  });
76
85
  };
77
86
  exports.validateOrder = validateOrder;
78
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtb3JkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvb3JkZXIvdmFsaWRhdGUtb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscURBQWdEO0FBQ2hELHFFQUEwQztBQUMxQyxtREFBNkQ7QUFHN0QsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLHlCQUFVLENBQUMsQ0FBQztBQUU5QyxNQUFNLGNBQWMsR0FBeUI7SUFDM0MsdUJBQXVCLENBQUMsT0FBZSxFQUFFLElBQWU7UUFDdEQsT0FBTyxJQUFJLGtCQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELDZCQUE2QixDQUFDLE9BQWUsRUFBRSxZQUFvQjtRQUNqRSxPQUFPLElBQUksa0JBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4RSxDQUFDO0NBQ0YsQ0FBQztBQUVGLE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBcUIsRUFBVSxFQUFFO0lBQ3JELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLElBQUksQ0FBQyxJQUFJLFVBQVUsR0FBRyxLQUFLLEVBQUUsQ0FBQztRQUMzRSxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFDRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDbkQsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLFVBQVUsaUNBQWlDLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQyxDQUFDO0FBRUssTUFBTSxh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
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtb3JkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvb3JkZXIvdmFsaWRhdGUtb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscURBQWdEO0FBQ2hELHFFQUEwQztBQUMxQyxtREFBK0U7QUFHL0UsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLHlCQUFVLENBQUMsQ0FBQztBQUU5QyxNQUFNLGNBQWMsR0FBeUI7SUFDM0MsdUJBQXVCLENBQUMsT0FBZSxFQUFFLElBQWU7UUFDdEQsT0FBTyxJQUFJLGtCQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELDZCQUE2QixDQUFDLE9BQWUsRUFBRSxZQUE4QjtRQUMzRSxPQUFPLElBQUksa0JBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqRyxDQUFDO0NBQ0YsQ0FBQztBQUVGLE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBcUIsRUFBVSxFQUFFO0lBQ3JELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLElBQUksQ0FBQyxJQUFJLFVBQVUsR0FBRyxLQUFLLEVBQUUsQ0FBQztRQUMzRSxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFDRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDbkQsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLFVBQVUsaUNBQWlDLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBQ0QsT0FBTyxVQUFVLENB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
@@ -0,0 +1,2 @@
1
+ import { OrderInfo } from '../../types/index.js';
2
+ export declare const versify: (info: OrderInfo, isTeeOffer: boolean) => Promise<OrderInfo>;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.versify = void 0;
7
+ const Offer_js_1 = __importDefault(require("../../models/Offer.js"));
8
+ const versify = async (info, isTeeOffer) => {
9
+ const { offerId, offerVersion, args } = info;
10
+ const getActualOfferVersion = async (params) => {
11
+ if (params.isTeeOffer || params.offerId === '0') {
12
+ return params.offerVersion;
13
+ }
14
+ const actualVersion = params.offerVersion
15
+ ? params.offerVersion
16
+ : await new Offer_js_1.default(params.offerId).getLastVersionNumber();
17
+ return actualVersion || 0;
18
+ };
19
+ args.outputOfferVersion;
20
+ return {
21
+ ...info,
22
+ offerVersion: await getActualOfferVersion({
23
+ isTeeOffer,
24
+ offerId,
25
+ offerVersion,
26
+ }),
27
+ args: {
28
+ ...args,
29
+ outputOfferVersion: await getActualOfferVersion({
30
+ isTeeOffer,
31
+ offerId: args.outputOfferId,
32
+ offerVersion: args.outputOfferVersion,
33
+ }),
34
+ inputOffersVersions: await Promise.all(args.inputOffersVersions.map((offerVersion, index) => getActualOfferVersion({
35
+ isTeeOffer: false,
36
+ offerId: args.inputOffersIds[index],
37
+ offerVersion,
38
+ }))),
39
+ },
40
+ };
41
+ };
42
+ exports.versify = versify;
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lmeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9vcmRlci92ZXJzaWZ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLHFFQUEwQztBQUVuQyxNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsSUFBZSxFQUFFLFVBQW1CLEVBQXNCLEVBQUU7SUFDeEYsTUFBTSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQzdDLE1BQU0scUJBQXFCLEdBQUcsS0FBSyxFQUFFLE1BSXBDLEVBQW1CLEVBQUU7UUFDcEIsSUFBSSxNQUFNLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDaEQsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDO1FBQzdCLENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsWUFBWTtZQUN2QyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVk7WUFDckIsQ0FBQyxDQUFDLE1BQU0sSUFBSSxrQkFBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBRTNELE9BQU8sYUFBYSxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDLENBQUM7SUFFRixJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFFeEIsT0FBTztRQUNMLEdBQUcsSUFBSTtRQUNQLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO1lBQ3hDLFVBQVU7WUFDVixPQUFPO1lBQ1AsWUFBWTtTQUNiLENBQUM7UUFDRixJQUFJLEVBQUU7WUFDSixHQUFHLElBQUk7WUFDUCxrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO2dCQUM5QyxVQUFVO2dCQUNWLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYTtnQkFDM0IsWUFBWSxFQUFFLElBQUksQ0FBQyxrQkFBa0I7YUFDdEMsQ0FBQztZQUNGLG1CQUFtQixFQUFFLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDcEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUNuRCxxQkFBcUIsQ0FBQztnQkFDcEIsVUFBVSxFQUFFLEtBQUs7Z0JBQ2pCLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztnQkFDbkMsWUFBWTthQUNiLENBQUMsQ0FDSCxDQUNGO1NBQ0Y7S0FDRixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBN0NXLFFBQUEsT0FBTyxXQTZDbEIifQ==
@@ -0,0 +1,6 @@
1
+ import * as pkijs from 'pkijs';
2
+ export declare class CRLHelper {
3
+ static getCRLFromCerts(certs: pkijs.Certificate[]): Promise<pkijs.CertificateRevocationList[]>;
4
+ private static getCRLRequestData;
5
+ private static getCRLResponse;
6
+ }
@@ -0,0 +1,39 @@
1
+ import * as pkijs from 'pkijs';
2
+ import { CertificatesHelper } from './helper.js';
3
+ import { OID_CRL_DISTRIBUTION_POINTS } from '../constants.js';
4
+ import { helpers } from '../index.js';
5
+ export class CRLHelper {
6
+ static async getCRLFromCerts(certs) {
7
+ const crlRequestsData = certs.map(this.getCRLRequestData).filter(Boolean);
8
+ if (!crlRequestsData.length) {
9
+ return [];
10
+ }
11
+ const crlResponseResults = await Promise.allSettled(crlRequestsData.map((reqData) => this.getCRLResponse(reqData)));
12
+ const rejectedCRLResponses = crlResponseResults
13
+ .filter(helpers.isRejected)
14
+ .map((result) => result.reason);
15
+ if (rejectedCRLResponses.length) {
16
+ throw new Error(`Can't get CRL responses for some certificates (reasons=${rejectedCRLResponses.join(';\n')})`);
17
+ }
18
+ return crlResponseResults.filter(helpers.isFulfilled).map((result) => result.value);
19
+ }
20
+ static getCRLRequestData(cert) {
21
+ const authorityExtension = CertificatesHelper.getExtensionValue(cert, OID_CRL_DISTRIBUTION_POINTS);
22
+ if (!authorityExtension) {
23
+ return;
24
+ }
25
+ const extensionValue = pkijs.ExtensionValueFactory.fromBER(OID_CRL_DISTRIBUTION_POINTS, authorityExtension);
26
+ const findType6DistributionPointExtension = (entry) => entry.type === 6;
27
+ const crlUrlDistributionPoints = extensionValue?.distributionPoints.find((point) => point.distributionPoint?.some(findType6DistributionPointExtension));
28
+ const crlUrl = crlUrlDistributionPoints?.distributionPoint?.find(findType6DistributionPointExtension)?.value;
29
+ if (!crlUrl) {
30
+ return;
31
+ }
32
+ return { crlUrl };
33
+ }
34
+ static async getCRLResponse(data) {
35
+ const response = await CertificatesHelper.downloadCertWithCache(data.crlUrl);
36
+ return pkijs.CertificateRevocationList.fromBER(response);
37
+ }
38
+ }
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NlcnRpZmljYXRlcy9jcmwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFJdEMsTUFBTSxPQUFPLFNBQVM7SUFDcEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQzFCLEtBQTBCO1FBRTFCLE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBcUIsQ0FBQztRQUM5RixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzVCLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUNqRCxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQy9ELENBQUM7UUFFRixNQUFNLG9CQUFvQixHQUFHLGtCQUFrQjthQUM1QyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQzthQUMxQixHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQyxJQUFJLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQ2IsMERBQTBELG9CQUFvQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUM5RixDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sa0JBQWtCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRU8sTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQXVCO1FBQ3RELE1BQU0sa0JBQWtCLEdBQUcsa0JBQWtCLENBQUMsaUJBQWlCLENBQzdELElBQUksRUFDSiwyQkFBMkIsQ0FDNUIsQ0FBQztRQUNGLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3hCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FDeEQsMkJBQTJCLEVBQzNCLGtCQUFrQixDQUNZLENBQUM7UUFFakMsTUFBTSxtQ0FBbUMsR0FBRyxDQUFDLEtBQXdCLEVBQVcsRUFBRSxDQUNoRixLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQztRQUVuQixNQUFNLHdCQUF3QixHQUFHLGNBQWMsRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNoRixLQUFLLENBQUMsaUJBQXFELEVBQUUsSUFBSSxDQUNoRSxtQ0FBbUMsQ0FDcEMsQ0FDRixDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQ1Ysd0JBQXdCLEVBQUUsaUJBQzNCLEVBQUUsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLEVBQUUsS0FBSyxDQUFDO1FBQ3BELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE9BQU87UUFDVCxDQUFDO1FBRUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFTyxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FDakMsSUFBb0I7UUFFcEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFN0UsT0FBTyxLQUFLLENBQUMseUJBQXlCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNELENBQUM7Q0FDRiJ9
@@ -0,0 +1,23 @@
1
+ /// <reference types="node" />
2
+ import * as pkijs from 'pkijs';
3
+ import { ValidateCertChainResult } from './types.js';
4
+ export declare class CertificatesHelper {
5
+ private static downloadedCertificateCache;
6
+ static derToPem(data: ArrayBuffer): string;
7
+ static pemToDer(certPem: string): Uint8Array;
8
+ static splitPemCerts(certs: string): string[];
9
+ static getDomain(certPem: string): string | undefined;
10
+ static getExtensionValue(certParam: string | pkijs.Certificate, oid: string): Buffer | undefined;
11
+ static extractCAFromChain(certsPem: string): {
12
+ certs: string;
13
+ ca: string;
14
+ };
15
+ static pemChainToDer(certsPem: string): Uint8Array[];
16
+ static derChainToPem(certsDer: Uint8Array[]): string;
17
+ static downloadCertWithCache(url: string): Promise<Buffer>;
18
+ static sortCertsFromLeafToRoot(certsPem: string | string[]): pkijs.Certificate[];
19
+ static validateCertChain(certsPem: string | string[], caPem: string | string[], options?: {
20
+ offline?: boolean;
21
+ }): Promise<ValidateCertChainResult>;
22
+ private static toPkiCerts;
23
+ }
@@ -0,0 +1,146 @@
1
+ import _ from 'lodash';
2
+ import axios from 'axios';
3
+ import forge from 'node-forge';
4
+ import * as pkijs from 'pkijs';
5
+ import { createMemoryCache } from '../utils/cache/memory.js';
6
+ import { OCSPHelper } from './ocsp.js';
7
+ import { CRLHelper } from './crl.js';
8
+ //pkijs initCryptoEngine method doesn't work properly in nodejs
9
+ //https://github.com/PeculiarVentures/PKI.js/blob/91c596be220c5010b38415a68bd100942dfd321e/src/CryptoEngine/CryptoEngineInit.ts#L4
10
+ try {
11
+ pkijs.getEngine();
12
+ }
13
+ catch (err) {
14
+ if (err.message === `Please call 'setEngine' before call to 'getEngine'`) {
15
+ pkijs.setEngine('Node', new pkijs.CryptoEngine({ name: 'Node', crypto: require('crypto').webcrypto }));
16
+ }
17
+ }
18
+ export class CertificatesHelper {
19
+ static downloadedCertificateCache = createMemoryCache();
20
+ static derToPem(data) {
21
+ return forge.pem.encode({
22
+ contentDomain: null,
23
+ dekInfo: null,
24
+ headers: [],
25
+ procType: null,
26
+ type: 'CERTIFICATE',
27
+ body: Buffer.from(data).toString('binary'),
28
+ });
29
+ }
30
+ static pemToDer(certPem) {
31
+ return Buffer.from(forge.pki.pemToDer(certPem).bytes(), 'binary');
32
+ }
33
+ static splitPemCerts(certs) {
34
+ const pemRegex = /(-----BEGIN CERTIFICATE-----[\s\S]*?-----END CERTIFICATE-----)/g;
35
+ return certs.match(pemRegex) || [];
36
+ }
37
+ static getDomain(certPem) {
38
+ const cert = forge.pki.certificateFromPem(certPem);
39
+ return cert.subject.attributes.find((attribute) => attribute.name === 'commonName')
40
+ ?.value;
41
+ }
42
+ static getExtensionValue(certParam, oid) {
43
+ const cert = typeof certParam === 'string'
44
+ ? pkijs.Certificate.fromBER(CertificatesHelper.pemToDer(certParam))
45
+ : certParam;
46
+ const extension = cert.extensions?.find((ext) => ext.extnID === oid);
47
+ return extension && Buffer.from(extension.extnValue.valueBlock.toBER());
48
+ }
49
+ static extractCAFromChain(certsPem) {
50
+ const certs = CertificatesHelper.toPkiCerts(certsPem);
51
+ const splitCerts = _.partition(certs, (cert) => !cert.issuer.isEqual(cert.subject));
52
+ const toPemChain = (certs) => certs.map((cert) => CertificatesHelper.derToPem(cert.toSchema().toBER())).join('\n');
53
+ return {
54
+ certs: toPemChain(splitCerts[0]),
55
+ ca: toPemChain(splitCerts[1]),
56
+ };
57
+ }
58
+ static pemChainToDer(certsPem) {
59
+ const certs = CertificatesHelper.splitPemCerts(certsPem);
60
+ return certs.map((certPem) => CertificatesHelper.pemToDer(certPem));
61
+ }
62
+ static derChainToPem(certsDer) {
63
+ return certsDer.map(CertificatesHelper.derToPem).join('').trim();
64
+ }
65
+ static async downloadCertWithCache(url) {
66
+ const responseData = await CertificatesHelper.downloadedCertificateCache.wrap(url, async () => {
67
+ const response = await axios(url, {
68
+ responseType: 'arraybuffer',
69
+ });
70
+ return response?.data;
71
+ }, {
72
+ ttl: 5 * 60 * 1000, //5 min
73
+ });
74
+ return responseData;
75
+ }
76
+ static sortCertsFromLeafToRoot(certsPem) {
77
+ const allCerts = CertificatesHelper.toPkiCerts(certsPem);
78
+ const leafs = allCerts.filter((certToCheck) => !allCerts.some((certsToCheckWith) => certToCheck.subject.isEqual(certsToCheckWith.issuer)));
79
+ const buildChain = (leaf) => {
80
+ const chain = [leaf];
81
+ let currentCert = leaf;
82
+ do {
83
+ currentCert = allCerts.find((potentialIssuer) => currentCert?.issuer.isEqual(potentialIssuer.subject) &&
84
+ !currentCert.subject.isEqual(currentCert.issuer));
85
+ if (currentCert) {
86
+ chain.push(currentCert);
87
+ }
88
+ } while (currentCert);
89
+ return chain;
90
+ };
91
+ const chains = leafs.map(buildChain).sort((one, two) => two.length - one.length);
92
+ return chains.flat();
93
+ }
94
+ static async validateCertChain(certsPem, caPem, options = {}) {
95
+ const { offline } = options;
96
+ // reverse() is needed because pkijs expects certificates to be ordered from root to leaf
97
+ const sortedCerts = CertificatesHelper.sortCertsFromLeafToRoot(certsPem).reverse();
98
+ const ca = CertificatesHelper.toPkiCerts(caPem);
99
+ try {
100
+ const crls = offline ? [] : await CRLHelper.getCRLFromCerts(sortedCerts);
101
+ const ocspBaseResponses = offline
102
+ ? []
103
+ : await OCSPHelper.getOCSPResponseFromCerts(sortedCerts, ca);
104
+ const chainEngine = new pkijs.CertificateChainValidationEngine({
105
+ certs: sortedCerts,
106
+ trustedCerts: ca,
107
+ ocsps: ocspBaseResponses,
108
+ crls,
109
+ });
110
+ const verifyResult = await chainEngine.verify();
111
+ if (!verifyResult.result) {
112
+ return {
113
+ success: false,
114
+ errorMessage: verifyResult.resultMessage,
115
+ };
116
+ }
117
+ /**
118
+ * When verifying a certificate chain, chainEngine.verify() attempts to find a valid
119
+ * certification path using the provided certificates. It may ignore certificates that
120
+ * don't belong to the valid chain.
121
+ *
122
+ * This check ensures that all certificates we initially provided were actually used
123
+ * in the valid certification path that CertificateChainValidationEngine constructed.
124
+ * If any certificate was ignored/not used, we throw an error.
125
+ */
126
+ const isEachCertVerified = sortedCerts.every((cert) => verifyResult.certificatePath?.find((verifiedCert) => verifiedCert.serialNumber.isEqual(cert.serialNumber)));
127
+ if (!isEachCertVerified) {
128
+ throw new Error('Some of certificates do not belong to chain');
129
+ }
130
+ return {
131
+ success: true,
132
+ };
133
+ }
134
+ catch (err) {
135
+ return {
136
+ success: false,
137
+ errorMessage: err.message,
138
+ };
139
+ }
140
+ }
141
+ static toPkiCerts(certs) {
142
+ const certsArray = Array.isArray(certs) ? certs : CertificatesHelper.splitPemCerts(certs);
143
+ return certsArray.map((certPem) => pkijs.Certificate.fromBER(CertificatesHelper.pemToDer(certPem)));
144
+ }
145
+ }
146
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NlcnRpZmljYXRlcy9oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ3ZCLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEtBQUssTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN2QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXJDLCtEQUErRDtBQUMvRCxrSUFBa0k7QUFDbEksSUFBSSxDQUFDO0lBQ0gsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ3BCLENBQUM7QUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ2IsSUFBSyxHQUFhLENBQUMsT0FBTyxLQUFLLG9EQUFvRCxFQUFFLENBQUM7UUFDcEYsS0FBSyxDQUFDLFNBQVMsQ0FDYixNQUFNLEVBQ04sSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQzlFLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sT0FBTyxrQkFBa0I7SUFDckIsTUFBTSxDQUFDLDBCQUEwQixHQUFHLGlCQUFpQixFQUFFLENBQUM7SUFFaEUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFpQjtRQUMvQixPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQ3RCLGFBQWEsRUFBRSxJQUFJO1lBQ25CLE9BQU8sRUFBRSxJQUFJO1lBQ2IsT0FBTyxFQUFFLEVBQUU7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
@@ -0,0 +1,2 @@
1
+ export * from './helper.js';
2
+ export * from './types.js';
@@ -0,0 +1,3 @@
1
+ export * from './helper.js';
2
+ export * from './types.js';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2VydGlmaWNhdGVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsWUFBWSxDQUFDIn0=
@@ -0,0 +1,9 @@
1
+ import * as pkijs from 'pkijs';
2
+ export declare class OCSPHelper {
3
+ static getOCSPResponseFromCerts(certs: pkijs.Certificate[], ca: pkijs.Certificate[]): Promise<pkijs.BasicOCSPResponse[]>;
4
+ private static getOCSPRequestData;
5
+ private static getOCSPResponse;
6
+ private static sendOCSPRequest;
7
+ private static getNonceForRequest;
8
+ private static getNonceFromResponse;
9
+ }