Skip to content

Commit 02dfeec

Browse files
author
Jérémy James Toussaint
committed
Renamed ContribAuth to WorkerpoolAuthorization
1 parent f057d86 commit 02dfeec

22 files changed

+421
-243
lines changed

src/main/java/com/iexec/worker/chain/ContributionAuthorizationService.java

Lines changed: 0 additions & 61 deletions
This file was deleted.

src/main/java/com/iexec/worker/chain/ContributionService.java

Lines changed: 35 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,7 @@
55
import com.iexec.common.contribution.Contribution;
66
import com.iexec.common.replicate.ReplicateStatusCause;
77
import com.iexec.common.result.ComputedFile;
8-
import com.iexec.common.security.Signature;
9-
import com.iexec.common.tee.TeeEnclaveChallengeSignature;
108
import com.iexec.common.utils.BytesUtils;
11-
import com.iexec.common.utils.HashUtils;
12-
import com.iexec.common.utils.SignatureUtils;
13-
149
import com.iexec.common.worker.result.ResultUtils;
1510
import lombok.extern.slf4j.Slf4j;
1611
import org.springframework.stereotype.Service;
@@ -19,20 +14,25 @@
1914
import java.util.Optional;
2015

2116
import static com.iexec.common.replicate.ReplicateStatusCause.*;
22-
import static com.iexec.common.utils.SignatureUtils.isExpectedSignerOnSignedMessageHash;
2317

2418

2519
@Slf4j
2620
@Service
2721
public class ContributionService {
2822

2923
private IexecHubService iexecHubService;
30-
private ContributionAuthorizationService contributionAuthorizationService;
24+
private WorkerpoolAuthorizationService workerpoolAuthorizationService;
25+
private EnclaveAuthorizationService enclaveAuthorizationService;
26+
private CredentialsService credentialsService;
3127

3228
public ContributionService(IexecHubService iexecHubService,
33-
ContributionAuthorizationService contributionAuthorizationService) {
29+
WorkerpoolAuthorizationService workerpoolAuthorizationService,
30+
EnclaveAuthorizationService enclaveAuthorizationService,
31+
CredentialsService credentialsService) {
3432
this.iexecHubService = iexecHubService;
35-
this.contributionAuthorizationService = contributionAuthorizationService;
33+
this.workerpoolAuthorizationService = workerpoolAuthorizationService;
34+
this.enclaveAuthorizationService = enclaveAuthorizationService;
35+
this.credentialsService = credentialsService;
3636
}
3737

3838
public boolean isChainTaskInitialized(String chainTaskId) {
@@ -63,20 +63,20 @@ public Optional<ReplicateStatusCause> getCannotContributeStatusCause(String chai
6363
return Optional.of(CONTRIBUTION_ALREADY_SET);
6464
}
6565

66-
if (!isContributionAuthorizationPresent(chainTaskId)) {
67-
return Optional.of(CONTRIBUTION_AUTHORIZATION_NOT_FOUND);
66+
if (!isWorkerpoolAuthorizationPresent(chainTaskId)) {
67+
return Optional.of(CONTRIBUTION_AUTHORIZATION_NOT_FOUND);//TODO Rename status to WORKERPOOL_AUTHORIZATION_NOT_FOUND
6868
}
6969

7070
return Optional.empty();
7171
}
7272

73-
private boolean isContributionAuthorizationPresent(String chainTaskId) {
74-
ContributionAuthorization contributionAuthorization =
75-
contributionAuthorizationService.getContributionAuthorization(chainTaskId);
76-
if (contributionAuthorization != null){
73+
private boolean isWorkerpoolAuthorizationPresent(String chainTaskId) {
74+
WorkerpoolAuthorization workerpoolAuthorization =
75+
workerpoolAuthorizationService.getWorkerpoolAuthorization(chainTaskId);
76+
if (workerpoolAuthorization != null) {
7777
return true;
7878
}
79-
log.error("ContributionAuthorization missing [chainTaskId:{}]", chainTaskId);
79+
log.error("WorkerpoolAuthorization missing [chainTaskId:{}]", chainTaskId);
8080
return false;
8181
}
8282

@@ -105,14 +105,6 @@ private boolean isContributionUnsetToContribute(ChainTask chainTask) {
105105
return chainContribution.getStatus().equals(ChainContributionStatus.UNSET);
106106
}
107107

108-
public boolean isContributionAuthorizationValid(ContributionAuthorization auth, String signerAddress) {
109-
// create the hash that was used in the signature in the core
110-
byte[] message = BytesUtils.stringToBytes(
111-
HashUtils.concatenateAndHash(auth.getWorkerWallet(), auth.getChainTaskId(), auth.getEnclaveChallenge()));
112-
113-
return SignatureUtils.isSignatureValid(message, auth.getSignature(), signerAddress);
114-
}
115-
116108
public boolean isContributionDeadlineReached(String chainTaskId) {
117109
Optional<ChainTask> oTask = iexecHubService.getChainTask(chainTaskId);
118110
if (!oTask.isPresent()) return true;
@@ -136,43 +128,36 @@ public Optional<ChainReceipt> contribute(Contribution contribution) {
136128
return Optional.of(chainReceipt);
137129
}
138130

139-
public boolean putContributionAuthorization(ContributionAuthorization contributionAuthorization) {
140-
return contributionAuthorizationService.putContributionAuthorization(contributionAuthorization);
131+
public boolean putWorkerpoolAuthorization(WorkerpoolAuthorization workerpoolAuthorization) {
132+
return workerpoolAuthorizationService.putWorkerpoolAuthorization(workerpoolAuthorization);
141133
}
142134

143-
public ContributionAuthorization getContributionAuthorization(String chainTaskId) {
144-
return contributionAuthorizationService.getContributionAuthorization(chainTaskId);
135+
public WorkerpoolAuthorization getWorkerpoolAuthorization(String chainTaskId) {
136+
return workerpoolAuthorizationService.getWorkerpoolAuthorization(chainTaskId);
145137
}
146138

147-
/*
148-
* TODO See if it possible to remove useless fields from ContributionAuthorization:
149-
* remove/merge, define Contribution/ContributionAuthorization responsibilities
150-
*/
151-
//TODO Add unit test
152-
public Contribution getContribution(ComputedFile computedFile, ContributionAuthorization contributionAuthorization) {
139+
public Contribution getContribution(ComputedFile computedFile) {
153140
String chainTaskId = computedFile.getTaskId();
141+
WorkerpoolAuthorization workerpoolAuthorization = workerpoolAuthorizationService.getWorkerpoolAuthorization(chainTaskId);
142+
if (workerpoolAuthorization == null) {
143+
log.error("Cant getContribution (cant getWorkerpoolAuthorization) [chainTaskId:{}]", chainTaskId);
144+
return null;
145+
}
146+
154147
String resultDigest = computedFile.getResultDigest();
155148
String resultHash = ResultUtils.computeResultHash(chainTaskId, resultDigest);
156-
String resultSeal = ResultUtils.computeResultSeal(contributionAuthorization.getWorkerWallet(), chainTaskId, resultDigest);
149+
String resultSeal = ResultUtils.computeResultSeal(credentialsService.getCredentials().getAddress(), chainTaskId, resultDigest);
150+
String workerpoolSignature = workerpoolAuthorization.getSignature().getValue();
151+
String enclaveChallenge = workerpoolAuthorization.getEnclaveChallenge();
157152
String enclaveSignature = computedFile.getEnclaveSignature();
158153

159154
boolean isTeeTask = iexecHubService.isTeeTask(chainTaskId);
160155
if (isTeeTask) {
161-
if (enclaveSignature.isEmpty()){
162-
log.error("Cannot contribute enclave signature not found [chainTaskId:{}]", chainTaskId);
156+
if (!enclaveAuthorizationService.isVerifiedEnclaveSignature(chainTaskId,
157+
resultHash, resultSeal, enclaveSignature, enclaveChallenge)){
158+
log.error("Cant getContribution (isVerifiedEnclaveSignature false) [chainTaskId:{}]", chainTaskId);
163159
return null;
164160
}
165-
166-
String messageHash = TeeEnclaveChallengeSignature.getMessageHash(resultHash, resultSeal);
167-
168-
boolean isExpectedSigner = isExpectedSignerOnSignedMessageHash(messageHash,
169-
new Signature(enclaveSignature), contributionAuthorization.getEnclaveChallenge());
170-
171-
if (!isExpectedSigner){
172-
log.error("Cannot contribute enclave signature invalid [chainTaskId:{}]", chainTaskId);
173-
return null;
174-
}
175-
176161
} else {
177162
enclaveSignature = BytesUtils.EMPTY_HEXASTRING_64;
178163
}
@@ -182,9 +167,9 @@ public Contribution getContribution(ComputedFile computedFile, ContributionAutho
182167
.resultDigest(resultDigest)
183168
.resultHash(resultHash)
184169
.resultSeal(resultSeal)
185-
.enclaveChallenge(contributionAuthorization.getEnclaveChallenge())
170+
.enclaveChallenge(enclaveChallenge)
186171
.enclaveSignature(enclaveSignature)
187-
.workerPoolSignature(contributionAuthorization.getSignature().getValue())
172+
.workerPoolSignature(workerpoolSignature)
188173
.build();
189174
}
190175

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.iexec.worker.chain;
2+
3+
import com.iexec.common.security.Signature;
4+
import com.iexec.common.tee.TeeEnclaveChallengeSignature;
5+
import lombok.extern.slf4j.Slf4j;
6+
import org.springframework.stereotype.Service;
7+
8+
import static com.iexec.common.utils.SignatureUtils.isExpectedSignerOnSignedMessageHash;
9+
10+
11+
@Slf4j
12+
@Service
13+
public class EnclaveAuthorizationService {
14+
15+
public boolean isVerifiedEnclaveSignature(String chainTaskId, String resultHash, String resultSeal,
16+
String enclaveSignature, String enclaveChallenge) {
17+
if (enclaveChallenge == null || enclaveChallenge.isEmpty()) {
18+
log.error("Cant verify enclave signature (enclave challenge not found) [chainTaskId:{}]", chainTaskId);
19+
return false;
20+
}
21+
22+
if (enclaveSignature == null || enclaveSignature.isEmpty()) {
23+
log.error("Cant verify enclave signature (enclave signature not found) [chainTaskId:{}]", chainTaskId);
24+
return false;
25+
}
26+
27+
String messageHash = TeeEnclaveChallengeSignature.getMessageHash(resultHash, resultSeal);
28+
29+
return isExpectedSignerOnSignedMessageHash(messageHash,
30+
new Signature(enclaveSignature), enclaveChallenge);
31+
}
32+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.iexec.worker.chain;
2+
3+
import com.iexec.common.chain.WorkerpoolAuthorization;
4+
import com.iexec.common.utils.BytesUtils;
5+
import com.iexec.common.utils.HashUtils;
6+
import com.iexec.common.utils.SignatureUtils;
7+
import com.iexec.worker.config.PublicConfigurationService;
8+
import lombok.extern.slf4j.Slf4j;
9+
import org.springframework.stereotype.Service;
10+
11+
import javax.annotation.PostConstruct;
12+
import java.util.Map;
13+
import java.util.concurrent.ConcurrentHashMap;
14+
15+
16+
@Slf4j
17+
@Service
18+
public class WorkerpoolAuthorizationService {
19+
20+
private PublicConfigurationService publicConfigurationService;
21+
private Map<String, WorkerpoolAuthorization> workerpoolAuthorizations;
22+
private String corePublicAddress;
23+
24+
public WorkerpoolAuthorizationService(PublicConfigurationService publicConfigurationService) {
25+
this.publicConfigurationService = publicConfigurationService;
26+
}
27+
28+
@PostConstruct
29+
public void initIt() {
30+
corePublicAddress = publicConfigurationService.getSchedulerPublicAddress();
31+
workerpoolAuthorizations = new ConcurrentHashMap<>();
32+
}
33+
34+
35+
public boolean isWorkerpoolAuthorizationValid(WorkerpoolAuthorization auth, String signerAddress) {
36+
// create the hash that was used in the signature in the core
37+
byte[] message = BytesUtils.stringToBytes(
38+
HashUtils.concatenateAndHash(auth.getWorkerWallet(), auth.getChainTaskId(), auth.getEnclaveChallenge()));
39+
40+
return SignatureUtils.isSignatureValid(message, auth.getSignature(), signerAddress);
41+
}
42+
43+
public boolean putWorkerpoolAuthorization(WorkerpoolAuthorization workerpoolAuthorization) {
44+
if (workerpoolAuthorization == null || workerpoolAuthorization.getChainTaskId() == null) {
45+
log.error("Cant putWorkerpoolAuthorization (null) [workerpoolAuthorization:{}]", workerpoolAuthorization);
46+
return false;
47+
}
48+
49+
if (!isWorkerpoolAuthorizationValid(workerpoolAuthorization, corePublicAddress)) {
50+
log.error("Cant putWorkerpoolAuthorization (invalid) [workerpoolAuthorization:{}]", workerpoolAuthorization);
51+
return false;
52+
}
53+
workerpoolAuthorizations.putIfAbsent(workerpoolAuthorization.getChainTaskId(), workerpoolAuthorization);
54+
return true;
55+
}
56+
57+
WorkerpoolAuthorization getWorkerpoolAuthorization(String chainTaskId) {
58+
return workerpoolAuthorizations.get(chainTaskId);
59+
}
60+
}

src/main/java/com/iexec/worker/docker/ComputationService.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.iexec.worker.docker;
22

3-
import com.iexec.common.chain.ContributionAuthorization;
3+
import com.iexec.common.chain.WorkerpoolAuthorization;
44
import com.iexec.common.dapp.DappType;
55
import com.iexec.common.sms.secret.TaskSecrets;
66
import com.iexec.common.task.TaskDescription;
@@ -11,7 +11,6 @@
1111
import com.iexec.worker.result.ResultService;
1212
import com.iexec.worker.sms.SmsService;
1313
import com.iexec.worker.tee.scone.SconeTeeService;
14-
1514
import com.iexec.worker.utils.LoggingUtils;
1615
import lombok.extern.slf4j.Slf4j;
1716
import org.apache.commons.io.FilenameUtils;
@@ -83,14 +82,14 @@ public boolean isAppDownloaded(String imageUri) {
8382
}
8483

8584
public boolean runNonTeeComputation(TaskDescription taskDescription,
86-
ContributionAuthorization contributionAuth) {
85+
WorkerpoolAuthorization workerpoolAuthorization) {
8786
String chainTaskId = taskDescription.getChainTaskId();
8887
String imageUri = taskDescription.getAppUri();
8988
String cmd = taskDescription.getCmd();
9089
long maxExecutionTime = taskDescription.getMaxExecutionTime();
9190

9291
// fetch task secrets from SMS
93-
Optional<TaskSecrets> oTaskSecrets = smsService.fetchTaskSecrets(contributionAuth);
92+
Optional<TaskSecrets> oTaskSecrets = smsService.fetchTaskSecrets(workerpoolAuthorization);
9493
if (!oTaskSecrets.isPresent()) {
9594
log.warn("No secrets fetched for this task, will continue [chainTaskId:{}]:", chainTaskId);
9695
} else {
@@ -131,7 +130,7 @@ public boolean runNonTeeComputation(TaskDescription taskDescription,
131130
.build();
132131

133132
DockerExecutionResult appExecutionResult = customDockerClient.execute(dockerExecutionConfig);
134-
if (shouldPrintDeveloperLogs(taskDescription)){
133+
if (shouldPrintDeveloperLogs(taskDescription)) {
135134
log.info("Developer logs of computing stage [chainTaskId:{}, logs:{}]", chainTaskId,
136135
getDockerExecutionDeveloperLogs(chainTaskId, appExecutionResult));
137136
}
@@ -145,8 +144,8 @@ public boolean runNonTeeComputation(TaskDescription taskDescription,
145144
}
146145

147146
public boolean runTeeComputation(TaskDescription taskDescription,
148-
ContributionAuthorization contributionAuth) {
149-
String chainTaskId = contributionAuth.getChainTaskId();
147+
WorkerpoolAuthorization workerpoolAuthorization) {
148+
String chainTaskId = workerpoolAuthorization.getChainTaskId();
150149
String imageUri = taskDescription.getAppUri();
151150
String datasetUri = taskDescription.getDatasetUri();
152151
String cmd = taskDescription.getCmd();
@@ -159,7 +158,7 @@ public boolean runTeeComputation(TaskDescription taskDescription,
159158
return false;
160159
}
161160

162-
String secureSessionId = smsService.createTeeSession(contributionAuth);
161+
String secureSessionId = smsService.createTeeSession(workerpoolAuthorization);
163162
if (secureSessionId.isEmpty()) {
164163
log.error("Cannot compute TEE task without secure session [chainTaskId:{}]", chainTaskId);
165164
return false;
@@ -195,7 +194,7 @@ public boolean runTeeComputation(TaskDescription taskDescription,
195194
// run computation
196195
DockerExecutionResult appExecutionResult = customDockerClient.execute(appExecutionConfig);
197196

198-
if (shouldPrintDeveloperLogs(taskDescription)){
197+
if (shouldPrintDeveloperLogs(taskDescription)) {
199198
log.info("Developer logs of computing stage [chainTaskId:{}, logs:{}]", chainTaskId,
200199
getDockerExecutionDeveloperLogs(chainTaskId, appExecutionResult));
201200
}

0 commit comments

Comments
 (0)