Skip to content

Commit a9b33bf

Browse files
authored
fix: check each dataset order volume is valid for a bulk processing deal (#321)
1 parent 71f5f90 commit a9b33bf

File tree

2 files changed

+61
-27
lines changed

2 files changed

+61
-27
lines changed

src/main/java/com/iexec/sms/tee/session/base/SecretSessionBaseService.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
public class SecretSessionBaseService {
6363

6464
static final String EMPTY_STRING_VALUE = "";
65-
static final BigInteger BULK_DATASET_VOLUME = BigInteger.TWO.pow(53).subtract(BigInteger.ONE);
65+
static final BigInteger BULK_DATASET_VOLUME = BigInteger.TWO.pow(53).subtract(BigInteger.TWO);
6666
static final String IEXEC_DATASET_PREFIX = "IEXEC_DATASET_";
6767
static final String IEXEC_DATASET_URL_SUFFIX = "_URL";
6868
static final String IEXEC_DATASET_CHECKSUM_SUFFIX = "_CHECKSUM";
@@ -213,9 +213,14 @@ private Map<String, String> getBulkDatasetTokens(final int index,
213213

214214
boolean isBulkDatasetOrderCompatibleWithDeal(final DatasetOrder datasetOrder, final TaskDescription taskDescription) {
215215
try {
216-
log.debug("Check dataset order against deal [chainTaskId:{}, deal:{}, dataset:{}",
216+
log.debug("Check dataset order against deal [chainTaskId:{}, deal:{}, dataset:{}]",
217217
taskDescription.getChainTaskId(), taskDescription.getChainDealId(), datasetOrder.getDataset());
218218
iexecHubService.assertDatasetDealCompatibility(datasetOrder, taskDescription.getChainDealId());
219+
// if BULK_DATASET_VOLUME is greater than dataset order volume, it is an error
220+
if (BULK_DATASET_VOLUME.compareTo(datasetOrder.getVolume()) > 0) {
221+
throw new IllegalStateException(
222+
String.format("Dataset order volume %s is invalid for bulk processing", datasetOrder.getVolume()));
223+
}
219224
return true;
220225
} catch (Exception e) {
221226
log.error("Failed to perform all checks on dataset [chainTaskId:{}, dataset:{}, error:{}]",

src/test/java/com/iexec/sms/tee/session/base/SecretSessionBaseServiceTests.java

Lines changed: 54 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -245,11 +245,11 @@ void shouldNotGetSecretsTokensSinceDealParamsAreMissing() {
245245
// endregion
246246

247247
// region getPreComputeTokens
248-
private DatasetOrder createDatasetOrderForBulk(final EIP712Domain pocoDomain,
249-
final Credentials credentials,
250-
final BigInteger datasetPrice,
248+
private DatasetOrder createDatasetOrderForBulk(final BigInteger datasetPrice,
251249
final BigInteger volume,
252-
final OrderTag orderTag) {
250+
final OrderTag orderTag) throws Exception {
251+
final EIP712Domain pocoDomain = new EIP712Domain(65535, "");
252+
final Credentials credentials = Credentials.create(Keys.createEcKeyPair());
253253
final SignerService signerService = new SignerService(null, 65535, credentials);
254254
final String datasetAddress = createEthereumAddress();
255255
final DatasetOrder datasetOrder = DatasetOrder.builder()
@@ -265,18 +265,31 @@ private DatasetOrder createDatasetOrderForBulk(final EIP712Domain pocoDomain,
265265
return (DatasetOrder) signerService.signOrderForDomain(datasetOrder, pocoDomain);
266266
}
267267

268+
private Map<String, String> expectedTokens(final String datasetAddress, final boolean empty) {
269+
return Map.ofEntries(
270+
Map.entry("IEXEC_BULK_SLICE_SIZE", "1"),
271+
Map.entry("IEXEC_DATASET_1_URL", empty ? "" : DATASET_URL),
272+
Map.entry("IEXEC_DATASET_1_CHECKSUM", empty ? "" : DATASET_CHECKSUM),
273+
Map.entry("IEXEC_DATASET_1_KEY", empty ? "" : DATASET_KEY),
274+
Map.entry("IEXEC_DATASET_1_FILENAME", datasetAddress)
275+
);
276+
}
277+
268278
@Test
269-
void shouldGetPreComputeBulkProcessingTokensForInvalidOrder() throws Exception {
279+
void validateBulkDatasetVolume() {
280+
assertThat(BULK_DATASET_VOLUME.longValue()).isEqualTo(9007199254740990L);
281+
}
282+
283+
@Test
284+
void shouldGetPreComputeBulkProcessingTokensForPoCoRejectedOrder() throws Exception {
270285
final DealParams dealParams = DealParams.builder().bulkCid("bulkCid").build();
271286
final TaskDescription taskDescription = createTaskDescription(dealParams, enclaveConfig).build();
272287
final TeeSessionRequest request = createSessionRequest(taskDescription);
273288
final TeeChallenge challenge = TeeChallenge.builder()
274289
.credentials(EthereumCredentials.generate())
275290
.build();
276-
final EIP712Domain pocoDomain = new EIP712Domain(65535, "");
277-
final Credentials credentials = Credentials.create(Keys.createEcKeyPair());
278291
final DatasetOrder signedDatasetOrder = createDatasetOrderForBulk(
279-
pocoDomain, credentials, BigInteger.ONE, BigInteger.ONE, OrderTag.STANDARD);
292+
BigInteger.ONE, BigInteger.ONE, OrderTag.STANDARD);
280293
final String datasetAddress = signedDatasetOrder.getDataset();
281294

282295
when(ipfsClient.readBulkCid("bulkCid")).thenReturn(List.of("ordersCid"));
@@ -291,13 +304,36 @@ void shouldGetPreComputeBulkProcessingTokensForInvalidOrder() throws Exception {
291304

292305
assertThat(enclaveBase.getName()).isEqualTo("pre-compute");
293306
assertThat(enclaveBase.getMrenclave()).isEqualTo(PRE_COMPUTE_FINGERPRINT);
294-
assertThat(enclaveBase.getEnvironment()).containsAllEntriesOf(Map.ofEntries(
295-
Map.entry("IEXEC_BULK_SLICE_SIZE", "1"),
296-
Map.entry("IEXEC_DATASET_1_URL", ""),
297-
Map.entry("IEXEC_DATASET_1_CHECKSUM", ""),
298-
Map.entry("IEXEC_DATASET_1_KEY", ""),
299-
Map.entry("IEXEC_DATASET_1_FILENAME", datasetAddress)
300-
));
307+
assertThat(enclaveBase.getEnvironment()).containsAllEntriesOf(
308+
expectedTokens(datasetAddress, true));
309+
}
310+
311+
@Test
312+
void shouldGetPreComputeBulkProcessingTokensForSmsRejectedOrder() throws Exception {
313+
final DealParams dealParams = DealParams.builder().bulkCid("bulkCid").build();
314+
final TaskDescription taskDescription = createTaskDescription(dealParams, enclaveConfig).build();
315+
final TeeSessionRequest request = createSessionRequest(taskDescription);
316+
final TeeChallenge challenge = TeeChallenge.builder()
317+
.credentials(EthereumCredentials.generate())
318+
.build();
319+
final DatasetOrder signedDatasetOrder = createDatasetOrderForBulk(
320+
BigInteger.ONE, BigInteger.ONE, OrderTag.STANDARD);
321+
final String datasetAddress = signedDatasetOrder.getDataset();
322+
323+
when(ipfsClient.readBulkCid("bulkCid")).thenReturn(List.of("ordersCid"));
324+
when(ipfsClient.readOrders("ordersCid")).thenReturn(List.of(signedDatasetOrder));
325+
when(iexecHubService.getChainDataset(datasetAddress)).thenReturn(Optional.of(ChainDataset.builder().chainDatasetId(datasetAddress).build()));
326+
doNothing().when(iexecHubService).assertDatasetDealCompatibility(signedDatasetOrder, DEAL_ID);
327+
328+
final SecretEnclaveBase enclaveBase = teeSecretsService.getPreComputeTokens(
329+
request,
330+
getSignTokens(challenge.getCredentials().getPrivateKey())
331+
);
332+
333+
assertThat(enclaveBase.getName()).isEqualTo("pre-compute");
334+
assertThat(enclaveBase.getMrenclave()).isEqualTo(PRE_COMPUTE_FINGERPRINT);
335+
assertThat(enclaveBase.getEnvironment()).containsAllEntriesOf(
336+
expectedTokens(datasetAddress, true));
301337
}
302338

303339
@Test
@@ -308,10 +344,8 @@ void shouldGetPreComputeBulkProcessingTokensForValidOrder() throws Exception {
308344
final TeeChallenge challenge = TeeChallenge.builder()
309345
.credentials(EthereumCredentials.generate())
310346
.build();
311-
final EIP712Domain pocoDomain = new EIP712Domain(65535, "");
312-
final Credentials credentials = Credentials.create(Keys.createEcKeyPair());
313347
final DatasetOrder signedDatasetOrder = createDatasetOrderForBulk(
314-
pocoDomain, credentials, BigInteger.ZERO, BULK_DATASET_VOLUME, OrderTag.TEE_SCONE);
348+
BigInteger.ZERO, BULK_DATASET_VOLUME, OrderTag.TEE_SCONE);
315349
final String datasetAddress = signedDatasetOrder.getDataset();
316350
final ChainDataset chainDataset = ChainDataset.builder()
317351
.chainDatasetId(datasetAddress)
@@ -332,13 +366,8 @@ void shouldGetPreComputeBulkProcessingTokensForValidOrder() throws Exception {
332366

333367
assertThat(enclaveBase.getName()).isEqualTo("pre-compute");
334368
assertThat(enclaveBase.getMrenclave()).isEqualTo(PRE_COMPUTE_FINGERPRINT);
335-
assertThat(enclaveBase.getEnvironment()).containsAllEntriesOf(Map.ofEntries(
336-
Map.entry("IEXEC_BULK_SLICE_SIZE", "1"),
337-
Map.entry("IEXEC_DATASET_1_URL", DATASET_URL),
338-
Map.entry("IEXEC_DATASET_1_CHECKSUM", DATASET_CHECKSUM),
339-
Map.entry("IEXEC_DATASET_1_KEY", DATASET_KEY),
340-
Map.entry("IEXEC_DATASET_1_FILENAME", datasetAddress)
341-
));
369+
assertThat(enclaveBase.getEnvironment()).containsAllEntriesOf(
370+
expectedTokens(datasetAddress, false));
342371
}
343372

344373
@Test

0 commit comments

Comments
 (0)