55use SimpleSAML \Configuration ;
66use SimpleSAML \Logger ;
77use SimpleSAML \Module \perun \databaseCommand \ChallengesDbCmd ;
8+ use SimpleSAML \Error \Exception ;
89use Jose \Component \KeyManagement \JWKFactory ;
910use Jose \Component \Core \AlgorithmManager ;
1011use Jose \Component \Signature \JWSBuilder ;
@@ -30,6 +31,7 @@ class ChallengeManager
3031
3132 private $ challengeDbCmd ;
3233
34+ private $ sigAlg ;
3335 private $ hashAlg ;
3436 private $ challengeLength ;
3537
@@ -42,45 +44,36 @@ public function __construct()
4244 $ this ->challengeDbCmd = new ChallengesDbCmd ();
4345 $ config = Configuration::getConfig (self ::CONFIG_FILE_NAME );
4446 $ this ->hashAlg = $ config ->getString (self ::HASH_ALG , 'sha512 ' );
45- $ this ->sighAlg = $ config ->getString (self ::SIG_ALG , 'sha512 ' );
47+ $ this ->sigAlg = $ config ->getString (self ::SIG_ALG , 'sha512 ' );
4648 $ this ->challengeLength = $ config ->getInteger (self ::CHALLENGE_LENGTH , 32 );
4749 $ this ->pubKey = $ config ->getString (self ::PUB_KEY );
4850 $ this ->privKey = $ config ->getString (self ::PRIV_KEY );
4951 }
5052
5153 public function generateChallenge ($ id , $ scriptName ): string
5254 {
53- try {
54- $ challenge = hash ($ this ->hashAlg , random_bytes ($ this ->challengeLength ));
55- } catch (Exception $ ex ) {
56- http_response_code (500 );
57- throw new Exception ('ChallengeManager.generateChallenge: Error while generating a challenge ' );
58- }
55+ $ challenge = hash ($ this ->hashAlg , random_bytes ($ this ->challengeLength ));
5956
6057 if (empty ($ id ) ||
6158 empty ($ scriptName ) ||
6259 !$ this ->challengeDbCmd ->insertChallenge ($ challenge , $ id , $ scriptName )) {
63- Logger::error (self ::LOG_PREFIX . 'Error while creating a challenge ' );
64- http_response_code (500 );
65- throw new Exception ('ChallengeManager.generateChallenge: Error while generating a challenge ' );
60+ throw new Exception ('ChallengeManager.generateChallenge: Error while storing a challenge to DB. ' );
6661 }
6762 return $ challenge ;
6863 }
6964
70- public function generateToken ($ id , $ scriptName , $ data )
65+ public function generateToken ($ id , $ scriptName , $ data ): string
7166 {
72-
73- $ challenge = $ this ->generateChallenge ($ id , $ scriptName );
74-
75- if (empty ($ challenge )) {
76- Logger::error ('Retrieving the challenge was not successful. ' );
77- return ;
67+ try {
68+ $ challenge = $ this ->generateChallenge ($ id , $ scriptName );
69+ } catch (\Exception $ ex ) {
70+ throw new Exception ('ChallengeManager.generateToken: Error while generating a challenge ' );
7871 }
7972
8073 $ jwk = JWKFactory::createFromKeyFile ($ this ->privKey );
8174 $ algorithmManager = new AlgorithmManager (
8275 [
83- self ::getAlgorithm ('Signature \\Algorithm ' , $ this ->sighAlg )
76+ self ::getAlgorithm ('Signature \\Algorithm ' , $ this ->sigAlg )
8477 ]
8578 );
8679 $ jwsBuilder = new JWSBuilder ($ algorithmManager );
@@ -90,13 +83,14 @@ public function generateToken($id, $scriptName, $data)
9083 'exp ' => time () + 300 ,
9184 'challenge ' => $ challenge ,
9285 'id ' => $ id ,
86+ 'scriptName ' => $ scriptName ,
9387 'data ' => $ data
9488 ]);
9589
9690 $ jws = $ jwsBuilder
9791 ->create ()
9892 ->withPayload ($ payload )
99- ->addSignature ($ jwk , ['alg ' => $ this ->sighAlg ])
93+ ->addSignature ($ jwk , ['alg ' => $ this ->sigAlg ])
10094 ->build ();
10195
10296 $ serializer = new CompactSerializer ();
@@ -109,7 +103,7 @@ public function decodeToken($token)
109103 {
110104 $ algorithmManager = new AlgorithmManager (
111105 [
112- self ::getAlgorithm ('Signature \\Algorithm ' , $ this ->sighAlg )
106+ self ::getAlgorithm ('Signature \\Algorithm ' , $ this ->sigAlg )
113107 ]
114108 );
115109 $ jwsVerifier = new JWSVerifier ($ algorithmManager );
@@ -119,7 +113,7 @@ public function decodeToken($token)
119113 $ jws = $ serializerManager ->unserialize ($ token );
120114
121115 $ headerCheckerManager = new HeaderCheckerManager (
122- [new AlgorithmChecker ([$ this ->sighAlg ])],
116+ [new AlgorithmChecker ([$ this ->sigAlg ])],
123117 [new JWSTokenSupport ()]
124118 );
125119
@@ -128,9 +122,7 @@ public function decodeToken($token)
128122 $ isVerified = $ jwsVerifier ->verifyWithKey ($ jws , $ jwk , 0 );
129123
130124 if (!$ isVerified ) {
131- Logger::error ('Perun.updateUes: The token signature is invalid! ' );
132- http_response_code (401 );
133- exit ;
125+ throw new Exception ('ChallengeManager.decodeToken: The token signature is invalid! ' );
134126 }
135127
136128 $ claimCheckerManager = new ClaimCheckerManager (
@@ -146,10 +138,11 @@ public function decodeToken($token)
146138
147139 $ challenge = $ claims ['challenge ' ];
148140 $ id = $ claims ['id ' ];
141+ $ scriptName = $ claims ['scriptName ' ];
149142
150143 $ challengeManager = new ChallengeManager ();
151144
152- $ challengeDb = $ challengeManager ->readChallengeFromDb ($ id );
145+ $ challengeDb = $ challengeManager ->readChallengeFromDb ($ id, $ scriptName );
153146
154147 $ checkAccessSucceeded = self ::checkAccess ($ challenge , $ challengeDb );
155148 $ challengeSuccessfullyDeleted = $ challengeManager ->deleteChallengeFromDb ($ id );
@@ -161,32 +154,23 @@ public function decodeToken($token)
161154 return $ claims ;
162155 }
163156
164- private function readChallengeFromDb ($ id )
157+ private function readChallengeFromDb ($ id, $ scriptName )
165158 {
166- if (empty ($ id )) {
167- http_response_code (400 );
159+ if (empty ($ id ) || empty ($ scriptName )) {
168160 return null ;
169161 }
170162
171- $ result = $ this ->challengeDbCmd ->readChallenge ($ id );
172-
173- if ($ result === null ) {
174- http_response_code (500 );
175- }
176-
177- return $ result ;
163+ return $ this ->challengeDbCmd ->readChallenge ($ id , $ scriptName );
178164 }
179165
180166 private static function checkAccess ($ challenge , $ challengeDb ): bool
181167 {
182168 if (empty ($ challenge ) || empty ($ challengeDb )) {
183- http_response_code (400 );
184169 return false ;
185170 }
186171
187172 if (!hash_equals ($ challengeDb , $ challenge )) {
188173 Logger::error (self ::LOG_PREFIX . 'Hashes are not equal. ' );
189- http_response_code (401 );
190174 return false ;
191175 }
192176
@@ -196,13 +180,11 @@ private static function checkAccess($challenge, $challengeDb): bool
196180 private function deleteChallengeFromDb ($ id ): bool
197181 {
198182 if (empty ($ id )) {
199- http_response_code (400 );
200183 return false ;
201184 }
202185
203186 if (!$ this ->challengeDbCmd ->deleteChallenge ($ id )) {
204187 Logger::error (self ::LOG_PREFIX . 'Error while deleting challenge from the database. ' );
205- http_response_code (500 );
206188 return false ;
207189 }
208190
0 commit comments