aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--modules/sasl/scram.py13
1 files changed, 8 insertions, 5 deletions
diff --git a/modules/sasl/scram.py b/modules/sasl/scram.py
index 19ec4e8c..463843e4 100644
--- a/modules/sasl/scram.py
+++ b/modules/sasl/scram.py
@@ -51,6 +51,9 @@ class SCRAM(object):
def _hash(self, msg: bytes) -> bytes:
return hashlib.new(self._algo, msg).digest()
+ def _constant_time_compare(self, b1: bytes, b2: bytes):
+ return hmac.compare_digest(b1, b2)
+
def client_first(self) -> bytes:
self.state = SCRAMState.ClientFirst
self._client_first = b"n=%s,r=%s" % (
@@ -93,14 +96,14 @@ class SCRAM(object):
self.state = SCRAMState.Failed
return False
- verifier = pieces[b"v"]
+ verifier = base64.b64decode(pieces[b"v"])
server_key = self._hmac(self._salted_password, b"Server Key")
server_signature = self._hmac(server_key, self._auth_message)
- if server_signature != base64.b64decode(verifier):
- self.state = SCRAMState.VerifyFailed
- return False
- else:
+ if self._constant_time_compare(server_signature, verifier):
self.state = SCRAMState.Success
return True
+ else:
+ self.state = SCRAMState.VerifyFailed
+ return False