snapshot of https://github.com/zulip/zulip.git @ 48c69911c7dd4e03b20552eb3bd77ad8151c1357 (2026-09-15)
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
This commit is contained in:
51
zerver/lib/mobile_auth_otp.py
Normal file
51
zerver/lib/mobile_auth_otp.py
Normal file
@@ -0,0 +1,51 @@
|
||||
# Simple one-time-pad library, to be used for encrypting Zulip API
|
||||
# keys when sending them to the mobile apps via new standard mobile
|
||||
# authentication flow. This encryption is used to protect against
|
||||
# credential-stealing attacks where a malicious app registers the
|
||||
# zulip:// URL on a device, which might otherwise allow it to hijack a
|
||||
# user's API key.
|
||||
#
|
||||
# The decryption logic here isn't actually used by the flow; we just
|
||||
# have it here as part of testing the overall library.
|
||||
|
||||
from zerver.models import UserProfile
|
||||
|
||||
|
||||
def xor_hex_strings(bytes_a: str, bytes_b: str) -> str:
|
||||
"""Given two hex strings of equal length, return a hex string with
|
||||
the bitwise xor of the two hex strings."""
|
||||
assert len(bytes_a) == len(bytes_b)
|
||||
return "".join(f"{int(x, 16) ^ int(y, 16):x}" for x, y in zip(bytes_a, bytes_b, strict=False))
|
||||
|
||||
|
||||
def ascii_to_hex(input_string: str) -> str:
|
||||
"""Given an ascii string, encode it as a hex string"""
|
||||
return input_string.encode().hex()
|
||||
|
||||
|
||||
def hex_to_ascii(input_string: str) -> str:
|
||||
"""Given a hex array, decode it back to a string"""
|
||||
return bytes.fromhex(input_string).decode()
|
||||
|
||||
|
||||
def otp_encrypt_api_key(api_key: str, otp: str) -> str:
|
||||
assert len(otp) == UserProfile.API_KEY_LENGTH * 2
|
||||
hex_encoded_api_key = ascii_to_hex(api_key)
|
||||
assert len(hex_encoded_api_key) == UserProfile.API_KEY_LENGTH * 2
|
||||
return xor_hex_strings(hex_encoded_api_key, otp)
|
||||
|
||||
|
||||
def otp_decrypt_api_key(otp_encrypted_api_key: str, otp: str) -> str:
|
||||
assert len(otp) == UserProfile.API_KEY_LENGTH * 2
|
||||
assert len(otp_encrypted_api_key) == UserProfile.API_KEY_LENGTH * 2
|
||||
hex_encoded_api_key = xor_hex_strings(otp_encrypted_api_key, otp)
|
||||
return hex_to_ascii(hex_encoded_api_key)
|
||||
|
||||
|
||||
def is_valid_otp(otp: str) -> bool:
|
||||
try:
|
||||
assert len(otp) == UserProfile.API_KEY_LENGTH * 2
|
||||
[int(c, 16) for c in otp]
|
||||
return True
|
||||
except Exception:
|
||||
return False
|
||||
Reference in New Issue
Block a user