@@ -272,15 +272,19 @@ def _authenticate_scram(credentials, sock_info, mechanism):
272
272
raise OperationFailure ("Server returned an invalid nonce." )
273
273
274
274
without_proof = b"c=biws,r=" + rnonce
275
- keys = cache .data
276
- if keys :
277
- client_key , server_key = keys
275
+ if cache .data :
276
+ client_key , server_key , csalt , citerations = cache .data
278
277
else :
278
+ client_key , server_key , csalt , citerations = None , None , None , None
279
+
280
+ # Salt and / or iterations could change for a number of different
281
+ # reasons. Either changing invalidates the cache.
282
+ if not client_key or salt != csalt or iterations != citerations :
279
283
salted_pass = _hi (
280
284
digest , data , standard_b64decode (salt ), iterations )
281
285
client_key = _hmac (salted_pass , b"Client Key" , digestmod ).digest ()
282
286
server_key = _hmac (salted_pass , b"Server Key" , digestmod ).digest ()
283
- cache .data = (client_key , server_key )
287
+ cache .data = (client_key , server_key , salt , iterations )
284
288
stored_key = digestmod (client_key ).digest ()
285
289
auth_msg = b"," .join ((first_bare , server_first , without_proof ))
286
290
client_sig = _hmac (stored_key , auth_msg , digestmod ).digest ()
0 commit comments