Skip to content

Commit

Permalink
Merge pull request #125 from Mahad-10/fix-salt-in-cra
Browse files Browse the repository at this point in the history
Implement salt in WAMPCRA authenticate
  • Loading branch information
Mahad-10 authored Dec 19, 2024
2 parents c05bba6 + d259b80 commit 1b9a4d2
Showing 1 changed file with 25 additions and 1 deletion.
26 changes: 25 additions & 1 deletion wampproto/auth/wampcra.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,34 @@ def __init__(self, authid: str, secret: str, auth_extra: dict = None):
self._secret = secret

def authenticate(self, challenge: messages.Challenge) -> messages.Authenticate:
signed = sign_wampcra_challenge(challenge.extra["challenge"], self._secret.encode())
salt = challenge.extra.get("salt", None)
iterations = challenge.extra.get("iterations", 0)
key_length = challenge.extra.get("keylen", 0)

if salt is not None:
raw_secret = derive_cra_key(salt, self._secret, iterations, key_length)
else:
raw_secret = self._secret.encode()

signed = sign_wampcra_challenge(challenge.extra["challenge"], raw_secret)
return messages.Authenticate(AuthenticateFields(signed, {}))


def derive_cra_key(salt_str: str, secret: str, iterations: int, key_length: int) -> bytes:
salt = salt_str.encode("utf-8")
secret_bytes = secret.encode("utf-8")

if iterations == 0:
raise ValueError("iterations string required in extra & should be greater than 0")

if key_length == 0:
raise ValueError("keylen string missing in extra & should be greater than 0")

derived_key = hashlib.pbkdf2_hmac("sha256", secret_bytes, salt, iterations, key_length)

return base64.b64encode(derived_key)


def utcnow() -> str:
ts = datetime.datetime.utcnow()
return f"{ts.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3]}Z"
Expand Down

0 comments on commit 1b9a4d2

Please sign in to comment.