55import com .iexec .common .contribution .Contribution ;
66import com .iexec .common .replicate .ReplicateStatusCause ;
77import com .iexec .common .result .ComputedFile ;
8- import com .iexec .common .security .Signature ;
9- import com .iexec .common .tee .TeeEnclaveChallengeSignature ;
108import com .iexec .common .utils .BytesUtils ;
11- import com .iexec .common .utils .HashUtils ;
12- import com .iexec .common .utils .SignatureUtils ;
13-
149import com .iexec .common .worker .result .ResultUtils ;
1510import lombok .extern .slf4j .Slf4j ;
1611import org .springframework .stereotype .Service ;
1914import java .util .Optional ;
2015
2116import static com .iexec .common .replicate .ReplicateStatusCause .*;
22- import static com .iexec .common .utils .SignatureUtils .isExpectedSignerOnSignedMessageHash ;
2317
2418
2519@ Slf4j
2620@ Service
2721public 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
0 commit comments