@requestnetwork/transaction-manager 0.36.1 → 0.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/dist/channel-parser.d.ts +3 -2
- package/dist/channel-parser.d.ts.map +1 -1
- package/dist/channel-parser.js +5 -3
- package/dist/channel-parser.js.map +1 -1
- package/dist/transaction-manager.d.ts +5 -4
- package/dist/transaction-manager.d.ts.map +1 -1
- package/dist/transaction-manager.js +9 -8
- package/dist/transaction-manager.js.map +1 -1
- package/dist/transactions-factory.d.ts +3 -3
- package/dist/transactions-factory.d.ts.map +1 -1
- package/dist/transactions-factory.js +102 -37
- package/dist/transactions-factory.js.map +1 -1
- package/dist/transactions-parser.d.ts +3 -2
- package/dist/transactions-parser.d.ts.map +1 -1
- package/dist/transactions-parser.js +118 -71
- package/dist/transactions-parser.js.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -17,10 +17,10 @@ npm install @requestnetwork/transaction-manager
|
|
|
17
17
|
In order to decrypt encrypted transactions, you must provide a decryption provider.
|
|
18
18
|
You can see the specification of decryption provider [here](./specs/decryption-provider.md).
|
|
19
19
|
|
|
20
|
-
An example of implementation of a decryption provider is available in the package: [epk-
|
|
20
|
+
An example of implementation of a decryption provider is available in the package: [epk-cipher](../epk-cipher/)
|
|
21
21
|
|
|
22
22
|
```javascript
|
|
23
|
-
import EthereumPrivateKeyDecryptionProvider from '@requestnetwork/epk-
|
|
23
|
+
import EthereumPrivateKeyDecryptionProvider from '@requestnetwork/epk-cipher';
|
|
24
24
|
import { TransactionManager } from '@requestnetwork/transaction-manager';
|
|
25
25
|
|
|
26
26
|
// Decryption provider setup
|
|
@@ -87,7 +87,7 @@ const { result } = await transactionManager.persistTransaction(data, channelId,
|
|
|
87
87
|
### Get Transactions from channel id
|
|
88
88
|
|
|
89
89
|
```javascript
|
|
90
|
-
import EthereumPrivateKeyDecryptionProvider from '@requestnetwork/epk-
|
|
90
|
+
import EthereumPrivateKeyDecryptionProvider from '@requestnetwork/epk-cipher';
|
|
91
91
|
import { DataAccessTypes, SignatureTypes } from '@requestnetwork/types';
|
|
92
92
|
import { TransactionManager } from '@requestnetwork/transaction-manager';
|
|
93
93
|
|
|
@@ -111,7 +111,7 @@ const {
|
|
|
111
111
|
### Get Transactions from topic
|
|
112
112
|
|
|
113
113
|
```typescript
|
|
114
|
-
import EthereumPrivateKeyDecryptionProvider from '@requestnetwork/epk-
|
|
114
|
+
import EthereumPrivateKeyDecryptionProvider from '@requestnetwork/epk-cipher';
|
|
115
115
|
import { DataAccessTypes, SignatureTypes } from '@requestnetwork/types';
|
|
116
116
|
import { TransactionManager } from '@requestnetwork/transaction-manager';
|
|
117
117
|
|
package/dist/channel-parser.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { DecryptionProviderTypes, EncryptionTypes, TransactionTypes } from '@requestnetwork/types';
|
|
1
|
+
import { CipherProviderTypes, DecryptionProviderTypes, EncryptionTypes, TransactionTypes } from '@requestnetwork/types';
|
|
2
2
|
/**
|
|
3
3
|
* Class to parse channels from a list of transactions and their channel id
|
|
4
4
|
*/
|
|
5
5
|
export default class ChannelParser {
|
|
6
6
|
private transactionParser;
|
|
7
|
-
|
|
7
|
+
private cipherProvider?;
|
|
8
|
+
constructor(decryptionProvider?: DecryptionProviderTypes.IDecryptionProvider, cipherProvider?: CipherProviderTypes.ICipherProvider);
|
|
8
9
|
/**
|
|
9
10
|
* Decrypts and cleans a channel by removing the wrong transactions
|
|
10
11
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel-parser.d.ts","sourceRoot":"","sources":["../src/channel-parser.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"channel-parser.d.ts","sourceRoot":"","sources":["../src/channel-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,eAAe,EACf,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AAI/B;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,aAAa;IAChC,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,cAAc,CAAC,CAAsC;gBAG3D,kBAAkB,CAAC,EAAE,uBAAuB,CAAC,mBAAmB,EAChE,cAAc,CAAC,EAAE,mBAAmB,CAAC,eAAe;IAKtD;;;;;;OAMG;IACU,sBAAsB,CACjC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,gBAAgB,CAAC,uBAAuB,EAAE,GACvD,OAAO,CAAC;QACT,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;QACrC,YAAY,EAAE,KAAK,CAAC,gBAAgB,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAAC;QACrE,mBAAmB,EAAE,KAAK,CAAC,gBAAgB,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;KACzE,CAAC;IA8GF;;;;;;OAMG;IACU,2BAA2B,CAEtC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,gBAAgB,CAAC,uBAAuB,EAAE,GACvD,OAAO,CAAC;QACT,WAAW,EAAE,gBAAgB,CAAC,WAAW,CAAC;QAC1C,UAAU,EAAE,eAAe,CAAC,qBAAqB,GAAG,SAAS,CAAC;QAC9D,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;KACtC,CAAC;CA8EH"}
|
package/dist/channel-parser.js
CHANGED
|
@@ -7,8 +7,9 @@ const transactions_parser_1 = require("./transactions-parser");
|
|
|
7
7
|
* Class to parse channels from a list of transactions and their channel id
|
|
8
8
|
*/
|
|
9
9
|
class ChannelParser {
|
|
10
|
-
constructor(decryptionProvider) {
|
|
11
|
-
this.transactionParser = new transactions_parser_1.default(decryptionProvider);
|
|
10
|
+
constructor(decryptionProvider, cipherProvider) {
|
|
11
|
+
this.transactionParser = new transactions_parser_1.default(decryptionProvider, cipherProvider);
|
|
12
|
+
this.cipherProvider = cipherProvider;
|
|
12
13
|
}
|
|
13
14
|
/**
|
|
14
15
|
* Decrypts and cleans a channel by removing the wrong transactions
|
|
@@ -112,6 +113,7 @@ class ChannelParser {
|
|
|
112
113
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
113
114
|
// use of .reduce instead of .map to keep a sequential execution
|
|
114
115
|
const channelTypeAndKey = yield transactions.reduce((accumulatorPromise, timestampedTransaction) => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
116
|
+
var _a;
|
|
115
117
|
const result = yield accumulatorPromise;
|
|
116
118
|
// Skip remaining transactions if channel is CLEAR or after channelKey is found
|
|
117
119
|
if (result.channelType === types_1.TransactionTypes.ChannelType.CLEAR || result.channelKey) {
|
|
@@ -124,7 +126,7 @@ class ChannelParser {
|
|
|
124
126
|
}
|
|
125
127
|
catch (error) {
|
|
126
128
|
// If the transaction is encrypted but the channel key is not found, save channelType and encryptionMethod
|
|
127
|
-
if (error.message.startsWith('Impossible to decrypt the channel key from this transaction') &&
|
|
129
|
+
if (((_a = error === null || error === void 0 ? void 0 : error.message) === null || _a === void 0 ? void 0 : _a.startsWith('Impossible to decrypt the channel key from this transaction')) &&
|
|
128
130
|
result.channelType === types_1.TransactionTypes.ChannelType.UNKNOWN) {
|
|
129
131
|
result.channelType = types_1.TransactionTypes.ChannelType.ENCRYPTED;
|
|
130
132
|
result.encryptionMethod = timestampedTransaction.transaction.encryptionMethod;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel-parser.js","sourceRoot":"","sources":["../src/channel-parser.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"channel-parser.js","sourceRoot":"","sources":["../src/channel-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { DataAccessTypes, DecryptionProviderTypes, EncryptionTypes, TransactionTypes } from '@requestnetwork/types';
|
|
1
|
+
import { CipherProviderTypes, DataAccessTypes, DecryptionProviderTypes, EncryptionTypes, TransactionTypes } from '@requestnetwork/types';
|
|
2
2
|
/**
|
|
3
3
|
* Implementation of TransactionManager layer without encryption
|
|
4
4
|
*/
|
|
5
5
|
export default class TransactionManager implements TransactionTypes.ITransactionManager {
|
|
6
6
|
private dataAccess;
|
|
7
7
|
private channelParser;
|
|
8
|
-
|
|
8
|
+
private cipherProvider?;
|
|
9
|
+
constructor(dataAccess: DataAccessTypes.IDataAccess, decryptionProvider?: DecryptionProviderTypes.IDecryptionProvider, cipherProvider?: CipherProviderTypes.ICipherProvider);
|
|
9
10
|
/**
|
|
10
11
|
* Persists a transaction and topics in storage. If encryptionParams is given, the transaction will be encrypted
|
|
11
12
|
*
|
|
@@ -34,7 +35,7 @@ export default class TransactionManager implements TransactionTypes.ITransaction
|
|
|
34
35
|
* @param updatedBetween filter the channel whose received new data in the boundaries
|
|
35
36
|
* @returns list of channels indexed by topic
|
|
36
37
|
*/
|
|
37
|
-
getChannelsByTopic(topic: string, updatedBetween?: TransactionTypes.ITimestampBoundaries): Promise<TransactionTypes.IReturnGetTransactionsByChannels>;
|
|
38
|
+
getChannelsByTopic(topic: string, updatedBetween?: TransactionTypes.ITimestampBoundaries, page?: number, pageSize?: number): Promise<TransactionTypes.IReturnGetTransactionsByChannels>;
|
|
38
39
|
/**
|
|
39
40
|
* Gets a list of channels indexed by topics
|
|
40
41
|
*
|
|
@@ -42,7 +43,7 @@ export default class TransactionManager implements TransactionTypes.ITransaction
|
|
|
42
43
|
* @param updatedBetween filter the channel whose hasn't received new data in the boundaries
|
|
43
44
|
* @returns list of channels indexed by topics
|
|
44
45
|
*/
|
|
45
|
-
getChannelsByMultipleTopics(topics: string[], updatedBetween?: TransactionTypes.ITimestampBoundaries): Promise<TransactionTypes.IReturnGetTransactionsByChannels>;
|
|
46
|
+
getChannelsByMultipleTopics(topics: string[], updatedBetween?: TransactionTypes.ITimestampBoundaries, page?: number, pageSize?: number): Promise<TransactionTypes.IReturnGetTransactionsByChannels>;
|
|
46
47
|
/**
|
|
47
48
|
* Parses the return of getChannels function from data-access layer
|
|
48
49
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction-manager.d.ts","sourceRoot":"","sources":["../src/transaction-manager.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,eAAe,EACf,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AAQ/B;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,kBAAmB,YAAW,gBAAgB,CAAC,mBAAmB;IACrF,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,aAAa,CAAgB;
|
|
1
|
+
{"version":3,"file":"transaction-manager.d.ts","sourceRoot":"","sources":["../src/transaction-manager.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,uBAAuB,EACvB,eAAe,EACf,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AAQ/B;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,kBAAmB,YAAW,gBAAgB,CAAC,mBAAmB;IACrF,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,cAAc,CAAC,CAAsC;gBAG3D,UAAU,EAAE,eAAe,CAAC,WAAW,EACvC,kBAAkB,CAAC,EAAE,uBAAuB,CAAC,mBAAmB,EAChE,cAAc,CAAC,EAAE,mBAAmB,CAAC,eAAe;IAOtD;;;;;;;;;OASG;IACU,kBAAkB,CAC7B,eAAe,EAAE,gBAAgB,CAAC,gBAAgB,EAClD,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,MAAM,EAAO,EACrB,gBAAgB,GAAE,eAAe,CAAC,qBAAqB,EAAO,GAC7D,OAAO,CAAC,gBAAgB,CAAC,yBAAyB,CAAC;IAgGtD;;;;;;;;OAQG;IACU,0BAA0B,CACrC,SAAS,EAAE,MAAM,EACjB,mBAAmB,CAAC,EAAE,gBAAgB,CAAC,oBAAoB,GAC1D,OAAO,CAAC,gBAAgB,CAAC,sBAAsB,CAAC;IA4BnD;;;;;;OAMG;IACU,kBAAkB,CAC7B,KAAK,EAAE,MAAM,EACb,cAAc,CAAC,EAAE,gBAAgB,CAAC,oBAAoB,EACtD,IAAI,CAAC,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,gBAAgB,CAAC,gCAAgC,CAAC;IAW7D;;;;;;OAMG;IACU,2BAA2B,CACtC,MAAM,EAAE,MAAM,EAAE,EAChB,cAAc,CAAC,EAAE,gBAAgB,CAAC,oBAAoB,EACtD,IAAI,CAAC,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,gBAAgB,CAAC,gCAAgC,CAAC;IAW7D;;;;;OAKG;YACW,qBAAqB;CA6BpC"}
|
|
@@ -11,9 +11,10 @@ const transactions_factory_1 = require("./transactions-factory");
|
|
|
11
11
|
* Implementation of TransactionManager layer without encryption
|
|
12
12
|
*/
|
|
13
13
|
class TransactionManager {
|
|
14
|
-
constructor(dataAccess, decryptionProvider) {
|
|
14
|
+
constructor(dataAccess, decryptionProvider, cipherProvider) {
|
|
15
15
|
this.dataAccess = dataAccess;
|
|
16
|
-
this.channelParser = new channel_parser_1.default(decryptionProvider);
|
|
16
|
+
this.channelParser = new channel_parser_1.default(decryptionProvider, cipherProvider);
|
|
17
|
+
this.cipherProvider = cipherProvider;
|
|
17
18
|
}
|
|
18
19
|
/**
|
|
19
20
|
* Persists a transaction and topics in storage. If encryptionParams is given, the transaction will be encrypted
|
|
@@ -39,7 +40,7 @@ class TransactionManager {
|
|
|
39
40
|
}
|
|
40
41
|
else {
|
|
41
42
|
// create an encrypted channel
|
|
42
|
-
transaction = yield transactions_factory_1.default.createEncryptedTransactionInNewChannel(transactionData, encryptionParams);
|
|
43
|
+
transaction = yield transactions_factory_1.default.createEncryptedTransactionInNewChannel(transactionData, encryptionParams, this.cipherProvider);
|
|
43
44
|
channelEncryptionMethod = transaction.encryptionMethod;
|
|
44
45
|
}
|
|
45
46
|
// Add the transaction to an existing channel
|
|
@@ -58,7 +59,7 @@ class TransactionManager {
|
|
|
58
59
|
if (!channelKey) {
|
|
59
60
|
throw new Error(`Impossible to decrypt the channel key of: ${channelId}`);
|
|
60
61
|
}
|
|
61
|
-
transaction = yield transactions_factory_1.default.createEncryptedTransaction(transactionData, channelKey, encryptionParams);
|
|
62
|
+
transaction = yield transactions_factory_1.default.createEncryptedTransaction(transactionData, channelKey, encryptionParams, this.cipherProvider);
|
|
62
63
|
channelEncryptionMethod = encryptionMethod;
|
|
63
64
|
}
|
|
64
65
|
}
|
|
@@ -131,9 +132,9 @@ class TransactionManager {
|
|
|
131
132
|
* @param updatedBetween filter the channel whose received new data in the boundaries
|
|
132
133
|
* @returns list of channels indexed by topic
|
|
133
134
|
*/
|
|
134
|
-
getChannelsByTopic(topic, updatedBetween) {
|
|
135
|
+
getChannelsByTopic(topic, updatedBetween, page, pageSize) {
|
|
135
136
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
136
|
-
const resultGetTx = yield this.dataAccess.getChannelsByTopic(topic, updatedBetween);
|
|
137
|
+
const resultGetTx = yield this.dataAccess.getChannelsByTopic(topic, updatedBetween, page, pageSize);
|
|
137
138
|
return this.parseMultipleChannels(resultGetTx);
|
|
138
139
|
});
|
|
139
140
|
}
|
|
@@ -144,9 +145,9 @@ class TransactionManager {
|
|
|
144
145
|
* @param updatedBetween filter the channel whose hasn't received new data in the boundaries
|
|
145
146
|
* @returns list of channels indexed by topics
|
|
146
147
|
*/
|
|
147
|
-
getChannelsByMultipleTopics(topics, updatedBetween) {
|
|
148
|
+
getChannelsByMultipleTopics(topics, updatedBetween, page, pageSize) {
|
|
148
149
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
149
|
-
const resultGetTx = yield this.dataAccess.getChannelsByMultipleTopics(topics, updatedBetween);
|
|
150
|
+
const resultGetTx = yield this.dataAccess.getChannelsByMultipleTopics(topics, updatedBetween, page, pageSize);
|
|
150
151
|
return this.parseMultipleChannels(resultGetTx);
|
|
151
152
|
});
|
|
152
153
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction-manager.js","sourceRoot":"","sources":["../src/transaction-manager.ts"],"names":[],"mappings":";;;AAAA,4DAA4D;AAC5D,
|
|
1
|
+
{"version":3,"file":"transaction-manager.js","sourceRoot":"","sources":["../src/transaction-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EncryptionTypes, TransactionTypes } from '@requestnetwork/types';
|
|
1
|
+
import { CipherProviderTypes, EncryptionTypes, TransactionTypes } from '@requestnetwork/types';
|
|
2
2
|
/**
|
|
3
3
|
* Class to create transactions (clear and encrypted)
|
|
4
4
|
*/
|
|
@@ -17,7 +17,7 @@ export default class TransactionsFactory {
|
|
|
17
17
|
* @param encryptionParams Array of the encryption parameters to encrypt the key with
|
|
18
18
|
* @returns the encrypted transaction
|
|
19
19
|
*/
|
|
20
|
-
static createEncryptedTransactionInNewChannel(data: TransactionTypes.ITransactionData, encryptionParams: EncryptionTypes.IEncryptionParameters[]): Promise<TransactionTypes.IPersistedTransaction>;
|
|
20
|
+
static createEncryptedTransactionInNewChannel(data: TransactionTypes.ITransactionData, encryptionParams: EncryptionTypes.IEncryptionParameters[], cipherProvider?: CipherProviderTypes.ICipherProvider): Promise<TransactionTypes.IPersistedTransaction>;
|
|
21
21
|
/**
|
|
22
22
|
* Creates an encrypted transaction with a channel key
|
|
23
23
|
*
|
|
@@ -27,6 +27,6 @@ export default class TransactionsFactory {
|
|
|
27
27
|
|
|
28
28
|
* @returns the encrypted transaction
|
|
29
29
|
*/
|
|
30
|
-
static createEncryptedTransaction(data: TransactionTypes.ITransactionData, channelKey: EncryptionTypes.IEncryptionParameters, encryptionParams?: EncryptionTypes.IEncryptionParameters[]): Promise<TransactionTypes.IPersistedTransaction>;
|
|
30
|
+
static createEncryptedTransaction(data: TransactionTypes.ITransactionData, channelKey: EncryptionTypes.IEncryptionParameters, encryptionParams?: EncryptionTypes.IEncryptionParameters[], cipherProvider?: CipherProviderTypes.ICipherProvider): Promise<TransactionTypes.IPersistedTransaction>;
|
|
31
31
|
}
|
|
32
32
|
//# sourceMappingURL=transactions-factory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactions-factory.d.ts","sourceRoot":"","sources":["../src/transactions-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"transactions-factory.d.ts","sourceRoot":"","sources":["../src/transactions-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAO/F;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,mBAAmB;IACtC;;;;;OAKG;WACiB,sBAAsB,CACxC,IAAI,EAAE,gBAAgB,CAAC,gBAAgB,GACtC,OAAO,CAAC,gBAAgB,CAAC,qBAAqB,CAAC;IAUlD;;;;;;OAMG;WACiB,sCAAsC,CACxD,IAAI,EAAE,gBAAgB,CAAC,gBAAgB,EACvC,gBAAgB,EAAE,eAAe,CAAC,qBAAqB,EAAE,EACzD,cAAc,CAAC,EAAE,mBAAmB,CAAC,eAAe,GACnD,OAAO,CAAC,gBAAgB,CAAC,qBAAqB,CAAC;IAsHlD;;;;;;;;OAQG;WACiB,0BAA0B,CAC5C,IAAI,EAAE,gBAAgB,CAAC,gBAAgB,EACvC,UAAU,EAAE,eAAe,CAAC,qBAAqB,EACjD,gBAAgB,GAAE,eAAe,CAAC,qBAAqB,EAAO,EAC9D,cAAc,CAAC,EAAE,mBAAmB,CAAC,eAAe,GACnD,OAAO,CAAC,gBAAgB,CAAC,qBAAqB,CAAC;CAoHnD"}
|
|
@@ -32,10 +32,8 @@ class TransactionsFactory {
|
|
|
32
32
|
* @param encryptionParams Array of the encryption parameters to encrypt the key with
|
|
33
33
|
* @returns the encrypted transaction
|
|
34
34
|
*/
|
|
35
|
-
static createEncryptedTransactionInNewChannel(data, encryptionParams) {
|
|
35
|
+
static createEncryptedTransactionInNewChannel(data, encryptionParams, cipherProvider) {
|
|
36
36
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
37
|
-
// format encryption method property
|
|
38
|
-
const encryptionMethod = `${types_1.EncryptionTypes.METHOD.ECIES}-${types_1.EncryptionTypes.METHOD.AES256_GCM}`;
|
|
39
37
|
// Generate a key for the AES encryption
|
|
40
38
|
const symmetricKey = yield (0, utils_1.generate32BufferKey)();
|
|
41
39
|
// Encrypt the data with the key and the AES256-GCM algorithm
|
|
@@ -49,24 +47,59 @@ class TransactionsFactory {
|
|
|
49
47
|
catch (error) {
|
|
50
48
|
throw new Error('Data not parsable');
|
|
51
49
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
50
|
+
let encryptionMethod = '';
|
|
51
|
+
let keys = {};
|
|
52
|
+
// TODO: refactor this part once the decryption provider is removed and the cipher provider is used
|
|
53
|
+
if (encryptionParams.every((encryptionParam) => encryptionParam.method === types_1.EncryptionTypes.METHOD.ECIES)) {
|
|
54
|
+
encryptionMethod = `${types_1.EncryptionTypes.METHOD.ECIES}-${types_1.EncryptionTypes.METHOD.AES256_GCM}`;
|
|
55
|
+
// Compute key encryption and identity hash for every encryption parameters given
|
|
56
|
+
const encryptedKeyAndIdentityHashesPromises = encryptionParams.map((encryptionParam) => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
57
|
+
const identityEncryption = (0, utils_1.getIdentityFromEncryptionParams)(encryptionParam);
|
|
58
|
+
const multiFormattedIdentity = MultiFormat.serialize(identityEncryption);
|
|
59
|
+
if (cipherProvider &&
|
|
60
|
+
'supportedMethods' in cipherProvider &&
|
|
61
|
+
'supportedIdentityTypes' in cipherProvider &&
|
|
62
|
+
'isIdentityRegistered' in cipherProvider) {
|
|
63
|
+
const encryptedKey = yield cipherProvider.encrypt(symmetricKey, { encryptionParams });
|
|
64
|
+
return { encryptedKey, multiFormattedIdentity };
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
const encryptedKey = yield (0, utils_1.encrypt)(symmetricKey, encryptionParam);
|
|
68
|
+
return { encryptedKey, multiFormattedIdentity };
|
|
69
|
+
}
|
|
70
|
+
}));
|
|
71
|
+
const encryptedKeyAndIdentityHashes = yield Promise.all(encryptedKeyAndIdentityHashesPromises);
|
|
72
|
+
// Create the encrypted keys object - Encrypted keys indexed by identity multi-format
|
|
73
|
+
keys = encryptedKeyAndIdentityHashes.reduce((allKeys, keyAndHash) => {
|
|
74
|
+
const encryptedKeySerialized = MultiFormat.serialize(keyAndHash.encryptedKey);
|
|
75
|
+
allKeys[keyAndHash.multiFormattedIdentity] = encryptedKeySerialized;
|
|
76
|
+
return allKeys;
|
|
77
|
+
}, {});
|
|
78
|
+
}
|
|
79
|
+
else if (encryptionParams.every((encryptionParam) => encryptionParam.method === types_1.EncryptionTypes.METHOD.KMS)) {
|
|
80
|
+
encryptionMethod = `${types_1.EncryptionTypes.METHOD.KMS}-${types_1.EncryptionTypes.METHOD.AES256_GCM}`;
|
|
81
|
+
if (!cipherProvider) {
|
|
82
|
+
throw new Error('cipherProvider is required for KMS encryption');
|
|
83
|
+
}
|
|
84
|
+
const encryptResponse = yield cipherProvider.encrypt(symmetricKey, {
|
|
85
|
+
encryptionParams,
|
|
86
|
+
});
|
|
87
|
+
if (!encryptResponse) {
|
|
88
|
+
throw new Error('Invalid encryption response from cipher provider');
|
|
89
|
+
}
|
|
90
|
+
keys = Object.fromEntries(encryptionParams.map((encryptionParam) => {
|
|
91
|
+
return [
|
|
92
|
+
encryptionParam.key,
|
|
93
|
+
MultiFormat.serialize({
|
|
94
|
+
type: types_1.EncryptionTypes.METHOD.KMS,
|
|
95
|
+
value: JSON.stringify(encryptResponse),
|
|
96
|
+
}),
|
|
97
|
+
];
|
|
98
|
+
}));
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
throw new Error(`encryptionParams method must be all: ${types_1.EncryptionTypes.METHOD.ECIES} or ${types_1.EncryptionTypes.METHOD.KMS}`);
|
|
55
102
|
}
|
|
56
|
-
// Compute key encryption and identity hash for every encryption parameters given
|
|
57
|
-
const encryptedKeyAndIdentityHashesPromises = encryptionParams.map((encryptionParam) => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
58
|
-
const encryptedKey = yield (0, utils_1.encrypt)(symmetricKey, encryptionParam);
|
|
59
|
-
const identityEncryption = (0, utils_1.getIdentityFromEncryptionParams)(encryptionParam);
|
|
60
|
-
const multiFormattedIdentity = MultiFormat.serialize(identityEncryption);
|
|
61
|
-
return { encryptedKey, multiFormattedIdentity };
|
|
62
|
-
}));
|
|
63
|
-
const encryptedKeyAndIdentityHashes = yield Promise.all(encryptedKeyAndIdentityHashesPromises);
|
|
64
|
-
// Create the encrypted keys object - Encrypted keys indexed by identity multi-format
|
|
65
|
-
const keys = encryptedKeyAndIdentityHashes.reduce((allKeys, keyAndHash) => {
|
|
66
|
-
const encryptedKeySerialized = MultiFormat.serialize(keyAndHash.encryptedKey);
|
|
67
|
-
allKeys[keyAndHash.multiFormattedIdentity] = encryptedKeySerialized;
|
|
68
|
-
return allKeys;
|
|
69
|
-
}, {});
|
|
70
103
|
const encryptedDataSerialized = MultiFormat.serialize(encryptedData);
|
|
71
104
|
return { encryptedData: encryptedDataSerialized, keys, encryptionMethod };
|
|
72
105
|
});
|
|
@@ -80,7 +113,7 @@ class TransactionsFactory {
|
|
|
80
113
|
|
|
81
114
|
* @returns the encrypted transaction
|
|
82
115
|
*/
|
|
83
|
-
static createEncryptedTransaction(data, channelKey, encryptionParams = []) {
|
|
116
|
+
static createEncryptedTransaction(data, channelKey, encryptionParams = [], cipherProvider) {
|
|
84
117
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
85
118
|
// check if the encryption method is the good one
|
|
86
119
|
if (channelKey.method !== types_1.EncryptionTypes.METHOD.AES256_GCM) {
|
|
@@ -95,29 +128,61 @@ class TransactionsFactory {
|
|
|
95
128
|
throw new Error('Data not parsable');
|
|
96
129
|
}
|
|
97
130
|
const encryptedDataSerialized = MultiFormat.serialize(encryptedData);
|
|
131
|
+
let keys = {};
|
|
98
132
|
if (encryptionParams.length === 0) {
|
|
99
133
|
return { encryptedData: encryptedDataSerialized };
|
|
100
134
|
}
|
|
101
135
|
else {
|
|
102
136
|
// FIXME: Refactor, duplicated from createEncryptedTransactionInNewChannel
|
|
103
137
|
// Check that all the encryption parameters given are ECIES (the only encryption method supported for now)
|
|
104
|
-
if (
|
|
105
|
-
|
|
138
|
+
if (encryptionParams.every((encryptionParam) => encryptionParam.method === types_1.EncryptionTypes.METHOD.ECIES)) {
|
|
139
|
+
// Compute key encryption and identity hash for every encryption parameters given
|
|
140
|
+
const encryptedKeyAndIdentityHashesPromises = encryptionParams.map((encryptionParam) => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
141
|
+
const identityEncryption = (0, utils_1.getIdentityFromEncryptionParams)(encryptionParam);
|
|
142
|
+
const multiFormattedIdentity = MultiFormat.serialize(identityEncryption);
|
|
143
|
+
if (cipherProvider &&
|
|
144
|
+
'supportedMethods' in cipherProvider &&
|
|
145
|
+
'supportedIdentityTypes' in cipherProvider &&
|
|
146
|
+
'isIdentityRegistered' in cipherProvider) {
|
|
147
|
+
const encryptedKey = yield cipherProvider.encrypt(channelKey.key, { encryptionParams });
|
|
148
|
+
return { encryptedKey, multiFormattedIdentity };
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
const encryptedKey = yield (0, utils_1.encrypt)(channelKey.key, encryptionParam);
|
|
152
|
+
return { encryptedKey, multiFormattedIdentity };
|
|
153
|
+
}
|
|
154
|
+
}));
|
|
155
|
+
const encryptedKeyAndIdentityHashes = yield Promise.all(encryptedKeyAndIdentityHashesPromises);
|
|
156
|
+
// Create the encrypted keys object - Encrypted keys indexed by identity multi-format
|
|
157
|
+
keys = encryptedKeyAndIdentityHashes.reduce((allKeys, keyAndHash) => {
|
|
158
|
+
const encryptedKeySerialized = MultiFormat.serialize(keyAndHash.encryptedKey);
|
|
159
|
+
allKeys[keyAndHash.multiFormattedIdentity] = encryptedKeySerialized;
|
|
160
|
+
return allKeys;
|
|
161
|
+
}, {});
|
|
162
|
+
}
|
|
163
|
+
else if (encryptionParams.every((encryptionParam) => encryptionParam.method === types_1.EncryptionTypes.METHOD.KMS)) {
|
|
164
|
+
if (!cipherProvider) {
|
|
165
|
+
throw new Error('cipherProvider is required for KMS encryption');
|
|
166
|
+
}
|
|
167
|
+
const encryptResponse = yield cipherProvider.encrypt(channelKey.key, {
|
|
168
|
+
encryptionParams,
|
|
169
|
+
});
|
|
170
|
+
if (!encryptResponse) {
|
|
171
|
+
throw new Error('Invalid encryption response from cipher provider');
|
|
172
|
+
}
|
|
173
|
+
keys = Object.fromEntries(encryptionParams.map((encryptionParam) => {
|
|
174
|
+
return [
|
|
175
|
+
encryptionParam.key,
|
|
176
|
+
MultiFormat.serialize({
|
|
177
|
+
type: types_1.EncryptionTypes.METHOD.KMS,
|
|
178
|
+
value: JSON.stringify(encryptResponse),
|
|
179
|
+
}),
|
|
180
|
+
];
|
|
181
|
+
}));
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
throw new Error(`encryptionParams method must be all: ${types_1.EncryptionTypes.METHOD.ECIES} or ${types_1.EncryptionTypes.METHOD.KMS}`);
|
|
106
185
|
}
|
|
107
|
-
// Compute key encryption and identity hash for every encryption parameters given
|
|
108
|
-
const encryptedKeyAndIdentityHashesPromises = encryptionParams.map((encryptionParam) => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
109
|
-
const encryptedKey = yield (0, utils_1.encrypt)(channelKey.key, encryptionParam);
|
|
110
|
-
const identityEncryption = (0, utils_1.getIdentityFromEncryptionParams)(encryptionParam);
|
|
111
|
-
const multiFormattedIdentity = MultiFormat.serialize(identityEncryption);
|
|
112
|
-
return { encryptedKey, multiFormattedIdentity };
|
|
113
|
-
}));
|
|
114
|
-
const encryptedKeyAndIdentityHashes = yield Promise.all(encryptedKeyAndIdentityHashesPromises);
|
|
115
|
-
// Create the encrypted keys object - Encrypted keys indexed by identity multi-format
|
|
116
|
-
const keys = encryptedKeyAndIdentityHashes.reduce((allKeys, keyAndHash) => {
|
|
117
|
-
const encryptedKeySerialized = MultiFormat.serialize(keyAndHash.encryptedKey);
|
|
118
|
-
allKeys[keyAndHash.multiFormattedIdentity] = encryptedKeySerialized;
|
|
119
|
-
return allKeys;
|
|
120
|
-
}, {});
|
|
121
186
|
return { encryptedData: encryptedDataSerialized, keys };
|
|
122
187
|
}
|
|
123
188
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactions-factory.js","sourceRoot":"","sources":["../src/transactions-factory.ts"],"names":[],"mappings":";;;AAAA,4DAA4D;AAC5D,
|
|
1
|
+
{"version":3,"file":"transactions-factory.js","sourceRoot":"","sources":["../src/transactions-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { DecryptionProviderTypes, EncryptionTypes, TransactionTypes } from '@requestnetwork/types';
|
|
1
|
+
import { CipherProviderTypes, DecryptionProviderTypes, EncryptionTypes, TransactionTypes } from '@requestnetwork/types';
|
|
2
2
|
/**
|
|
3
3
|
* Class to parse transactions
|
|
4
4
|
*/
|
|
5
5
|
export default class TransactionsParser {
|
|
6
6
|
private decryptionProvider;
|
|
7
|
-
|
|
7
|
+
private cipherProvider;
|
|
8
|
+
constructor(decryptionProvider?: DecryptionProviderTypes.IDecryptionProvider, cipherProvider?: CipherProviderTypes.ICipherProvider);
|
|
8
9
|
/**
|
|
9
10
|
* Parses a persisted transaction into a ClearTransaction or EncryptedTransaction, and decrypts the channel key if needed
|
|
10
11
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactions-parser.d.ts","sourceRoot":"","sources":["../src/transactions-parser.ts"],"names":[],"mappings":"AACA,OAAO,EACL,uBAAuB,EACvB,eAAe,EAEf,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AAK/B;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,kBAAkB;IACrC,OAAO,CAAC,kBAAkB,CAA0D;
|
|
1
|
+
{"version":3,"file":"transactions-parser.d.ts","sourceRoot":"","sources":["../src/transactions-parser.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,eAAe,EAEf,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AAK/B;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,kBAAkB;IACrC,OAAO,CAAC,kBAAkB,CAA0D;IACpF,OAAO,CAAC,cAAc,CAAkD;gBAGtE,kBAAkB,CAAC,EAAE,uBAAuB,CAAC,mBAAmB,EAChE,cAAc,CAAC,EAAE,mBAAmB,CAAC,eAAe;IAMtD;;;;;;;;OAQG;IACU,yBAAyB,CACpC,oBAAoB,EAAE,gBAAgB,CAAC,qBAAqB,EAC5D,WAAW,EAAE,gBAAgB,CAAC,WAAW,EACzC,UAAU,CAAC,EAAE,eAAe,CAAC,qBAAqB,EAClD,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC;QACT,WAAW,EAAE,gBAAgB,CAAC,YAAY,CAAC;QAC3C,UAAU,CAAC,EAAE,eAAe,CAAC,qBAAqB,CAAC;QACnD,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IAmFF;;;;;;OAMG;YACW,iBAAiB;CAkHhC"}
|
|
@@ -9,8 +9,9 @@ const encrypted_transaction_1 = require("./encrypted-transaction");
|
|
|
9
9
|
* Class to parse transactions
|
|
10
10
|
*/
|
|
11
11
|
class TransactionsParser {
|
|
12
|
-
constructor(decryptionProvider) {
|
|
12
|
+
constructor(decryptionProvider, cipherProvider) {
|
|
13
13
|
this.decryptionProvider = decryptionProvider;
|
|
14
|
+
this.cipherProvider = cipherProvider;
|
|
14
15
|
}
|
|
15
16
|
/**
|
|
16
17
|
* Parses a persisted transaction into a ClearTransaction or EncryptedTransaction, and decrypts the channel key if needed
|
|
@@ -37,45 +38,51 @@ class TransactionsParser {
|
|
|
37
38
|
}
|
|
38
39
|
// looks like an encrypted transaction
|
|
39
40
|
if (persistedTransaction.encryptedData) {
|
|
40
|
-
if (
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
// no
|
|
46
|
-
if (!
|
|
47
|
-
|
|
48
|
-
|
|
41
|
+
if ((this.cipherProvider && this.cipherProvider.isDecryptionAvailable()) ||
|
|
42
|
+
!this.cipherProvider) {
|
|
43
|
+
if (channelType === types_1.TransactionTypes.ChannelType.CLEAR) {
|
|
44
|
+
throw new Error('Encrypted transactions are not allowed in clear channel');
|
|
45
|
+
}
|
|
46
|
+
// no channel key, try to decrypt it and validate encryption method
|
|
47
|
+
if (!channelKey) {
|
|
48
|
+
// no encryptionMethod, this is first tx, must contain encryptionMethod
|
|
49
|
+
if (!encryptionMethod) {
|
|
50
|
+
if (!persistedTransaction.encryptionMethod || !persistedTransaction.keys) {
|
|
51
|
+
throw new Error('the properties "encryptionMethod" and "keys" are needed to compute the channel key');
|
|
52
|
+
}
|
|
53
|
+
encryptionMethod = persistedTransaction.encryptionMethod;
|
|
54
|
+
channelKey = yield this.decryptChannelKey(persistedTransaction.keys, encryptionMethod);
|
|
55
|
+
}
|
|
56
|
+
// given encryptionMethod, this not first tx, must not contain encryptionMethod
|
|
57
|
+
else {
|
|
58
|
+
if (persistedTransaction.encryptionMethod) {
|
|
59
|
+
throw new Error('the "encryptionMethod" property has been already given for this channel');
|
|
60
|
+
}
|
|
61
|
+
if (!persistedTransaction.keys) {
|
|
62
|
+
throw new Error('the "keys" property is needed to compute the channel key');
|
|
63
|
+
}
|
|
64
|
+
channelKey = yield this.decryptChannelKey(persistedTransaction.keys, encryptionMethod);
|
|
49
65
|
}
|
|
50
|
-
encryptionMethod = persistedTransaction.encryptionMethod;
|
|
51
|
-
channelKey = yield this.decryptChannelKey(persistedTransaction.keys, encryptionMethod);
|
|
52
66
|
}
|
|
53
|
-
// given
|
|
67
|
+
// given channel key, validate encryption method
|
|
54
68
|
else {
|
|
55
|
-
|
|
56
|
-
|
|
69
|
+
// no encryptionMethod, this is first tx, must contain encryptionMethod
|
|
70
|
+
if (!encryptionMethod) {
|
|
71
|
+
if (!persistedTransaction.encryptionMethod) {
|
|
72
|
+
throw new Error('the "encryptionMethod" property is needed to use the channel key');
|
|
73
|
+
}
|
|
74
|
+
encryptionMethod = persistedTransaction.encryptionMethod;
|
|
57
75
|
}
|
|
58
|
-
|
|
59
|
-
|
|
76
|
+
// given encryptionMethod, this not first tx, must not contain encryptionMethod
|
|
77
|
+
else {
|
|
78
|
+
if (persistedTransaction.encryptionMethod) {
|
|
79
|
+
throw new Error('the "encryptionMethod" property has been already given for this channel');
|
|
80
|
+
}
|
|
60
81
|
}
|
|
61
|
-
channelKey = yield this.decryptChannelKey(persistedTransaction.keys, encryptionMethod);
|
|
62
82
|
}
|
|
63
83
|
}
|
|
64
|
-
// given channel key, validate encryption method
|
|
65
84
|
else {
|
|
66
|
-
|
|
67
|
-
if (!encryptionMethod) {
|
|
68
|
-
if (!persistedTransaction.encryptionMethod) {
|
|
69
|
-
throw new Error('the "encryptionMethod" property is needed to use the channel key');
|
|
70
|
-
}
|
|
71
|
-
encryptionMethod = persistedTransaction.encryptionMethod;
|
|
72
|
-
}
|
|
73
|
-
// given encryptionMethod, this not first tx, must not contain encryptionMethod
|
|
74
|
-
else {
|
|
75
|
-
if (persistedTransaction.encryptionMethod) {
|
|
76
|
-
throw new Error('the "encryptionMethod" property has been already given for this channel');
|
|
77
|
-
}
|
|
78
|
-
}
|
|
85
|
+
throw new Error('Decryption is not available');
|
|
79
86
|
}
|
|
80
87
|
return {
|
|
81
88
|
channelKey,
|
|
@@ -95,51 +102,91 @@ class TransactionsParser {
|
|
|
95
102
|
*/
|
|
96
103
|
decryptChannelKey(keys, encryptionMethod) {
|
|
97
104
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
throw new Error(`No decryption provider given`);
|
|
101
|
-
}
|
|
105
|
+
let errorReason = '';
|
|
106
|
+
let channelKey = '';
|
|
102
107
|
let channelKeyMethod;
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
108
|
+
if (this.cipherProvider &&
|
|
109
|
+
encryptionMethod === `${types_1.EncryptionTypes.METHOD.KMS}-${types_1.EncryptionTypes.METHOD.AES256_GCM}`) {
|
|
110
|
+
const entries = Object.entries(keys);
|
|
111
|
+
if (entries.length === 0) {
|
|
112
|
+
throw new Error('No encryption keys provided');
|
|
113
|
+
}
|
|
114
|
+
let encryptResponse;
|
|
115
|
+
try {
|
|
116
|
+
encryptResponse = JSON.parse(MultiFormat.deserialize(entries[0][1]).value);
|
|
117
|
+
}
|
|
118
|
+
catch (e) {
|
|
119
|
+
throw new Error('Invalid encryption response format');
|
|
120
|
+
}
|
|
121
|
+
const encryptionParams = entries.map((entry) => {
|
|
122
|
+
return {
|
|
123
|
+
method: types_1.EncryptionTypes.METHOD.KMS,
|
|
124
|
+
key: entry[0],
|
|
125
|
+
};
|
|
126
|
+
});
|
|
127
|
+
try {
|
|
128
|
+
channelKey = yield this.cipherProvider.decrypt(encryptResponse, {
|
|
129
|
+
encryptionParams,
|
|
130
|
+
});
|
|
131
|
+
channelKeyMethod = types_1.EncryptionTypes.METHOD.AES256_GCM;
|
|
132
|
+
}
|
|
133
|
+
catch (e) {
|
|
134
|
+
errorReason = e.message;
|
|
135
|
+
}
|
|
109
136
|
}
|
|
110
137
|
else {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
138
|
+
// Check if the decryption provider is given
|
|
139
|
+
if (!this.decryptionProvider && !this.cipherProvider) {
|
|
140
|
+
throw new Error(`No decryption or cipher provider given`);
|
|
141
|
+
}
|
|
142
|
+
// Check the encryption method
|
|
143
|
+
if (encryptionMethod === `${types_1.EncryptionTypes.METHOD.ECIES}-${types_1.EncryptionTypes.METHOD.AES256_CBC}`) {
|
|
144
|
+
channelKeyMethod = types_1.EncryptionTypes.METHOD.AES256_CBC;
|
|
145
|
+
}
|
|
146
|
+
else if (encryptionMethod === `${types_1.EncryptionTypes.METHOD.ECIES}-${types_1.EncryptionTypes.METHOD.AES256_GCM}`) {
|
|
147
|
+
channelKeyMethod = types_1.EncryptionTypes.METHOD.AES256_GCM;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
throw new Error(`Encryption method not supported: ${encryptionMethod}`);
|
|
151
|
+
}
|
|
152
|
+
// Try to decrypt the channelKey
|
|
153
|
+
channelKey = yield Object.keys(keys || {}).reduce((decryptedChannelKeyPromise, identityMultiFormatted) => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
154
|
+
var _a;
|
|
155
|
+
let decryptedChannelKey = yield decryptedChannelKeyPromise;
|
|
156
|
+
if (keys && decryptedChannelKey === '') {
|
|
157
|
+
let identity;
|
|
158
|
+
try {
|
|
159
|
+
identity = MultiFormat.deserialize(identityMultiFormatted);
|
|
160
|
+
}
|
|
161
|
+
catch (e) {
|
|
162
|
+
// if we cannot deserialize it, just ignore this identity
|
|
163
|
+
}
|
|
164
|
+
// Ignore what is not an identity Ethereum address
|
|
165
|
+
if (identity && identity.type === types_1.IdentityTypes.TYPE.ETHEREUM_ADDRESS) {
|
|
166
|
+
// Check if we can decrypt the key with this identity
|
|
167
|
+
if ((this.decryptionProvider &&
|
|
168
|
+
(yield this.decryptionProvider.isIdentityRegistered(identity))) ||
|
|
169
|
+
(this.cipherProvider &&
|
|
170
|
+
typeof this.cipherProvider.isIdentityRegistered === 'function' &&
|
|
171
|
+
(yield this.cipherProvider.isIdentityRegistered(identity)))) {
|
|
172
|
+
try {
|
|
173
|
+
const key = MultiFormat.deserialize(keys[identityMultiFormatted]);
|
|
174
|
+
decryptedChannelKey = this.cipherProvider
|
|
175
|
+
? yield this.cipherProvider.decrypt(key, {
|
|
176
|
+
identity,
|
|
177
|
+
})
|
|
178
|
+
: yield ((_a = this.decryptionProvider) === null || _a === void 0 ? void 0 : _a.decrypt(key, identity));
|
|
179
|
+
}
|
|
180
|
+
catch (e) {
|
|
181
|
+
errorReason = e.message;
|
|
182
|
+
}
|
|
136
183
|
}
|
|
137
184
|
}
|
|
138
185
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
}
|
|
142
|
-
if (channelKey === '') {
|
|
186
|
+
return decryptedChannelKey;
|
|
187
|
+
}), Promise.resolve(''));
|
|
188
|
+
}
|
|
189
|
+
if (channelKey === '' || !channelKeyMethod) {
|
|
143
190
|
throw new Error(`Impossible to decrypt the channel key from this transaction (${errorReason})`);
|
|
144
191
|
}
|
|
145
192
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactions-parser.js","sourceRoot":"","sources":["../src/transactions-parser.ts"],"names":[],"mappings":";;;AAAA,4DAA4D;AAC5D,
|
|
1
|
+
{"version":3,"file":"transactions-parser.js","sourceRoot":"","sources":["../src/transactions-parser.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@requestnetwork/transaction-manager",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.38.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -39,9 +39,9 @@
|
|
|
39
39
|
"test:watch": "yarn test --watch"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@requestnetwork/multi-format": "0.
|
|
43
|
-
"@requestnetwork/types": "0.
|
|
44
|
-
"@requestnetwork/utils": "0.
|
|
42
|
+
"@requestnetwork/multi-format": "0.21.0",
|
|
43
|
+
"@requestnetwork/types": "0.47.0",
|
|
44
|
+
"@requestnetwork/utils": "0.47.0",
|
|
45
45
|
"tslib": "2.5.0"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
@@ -53,5 +53,5 @@
|
|
|
53
53
|
"ts-node": "10.9.1",
|
|
54
54
|
"typescript": "5.1.3"
|
|
55
55
|
},
|
|
56
|
-
"gitHead": "
|
|
56
|
+
"gitHead": "c16bcd97afc61eea7c07a44cd7593f668bef3d4c"
|
|
57
57
|
}
|