Files
bancho.py/app/encryption.py
2025-04-04 21:30:31 +09:00

60 lines
1.6 KiB
Python

from __future__ import annotations
from base64 import b64decode
from base64 import b64encode
from py3rijndael import Pkcs7Padding
from py3rijndael import RijndaelCbc
def encrypt_score_aes_data(
# to encode
score_data: list[str],
client_hash: str,
# used for encoding
iv_b64: bytes,
osu_version: str,
) -> tuple[bytes, bytes]:
"""Encrypt the score data to base64."""
# TODO: perhaps this should return TypedDict?
# attempt to encrypt score data
aes = RijndaelCbc(
key=f"osu!-scoreburgr---------{osu_version}".encode(),
iv=b64decode(iv_b64),
padding=Pkcs7Padding(32),
block_size=32,
)
score_data_joined = ":".join(score_data)
score_data_b64 = b64encode(aes.encrypt(score_data_joined.encode()))
client_hash_b64 = b64encode(aes.encrypt(client_hash.encode()))
return score_data_b64, client_hash_b64
def decrypt_score_aes_data(
# to decode
score_data_b64: bytes,
client_hash_b64: bytes,
# used for decoding
iv_b64: bytes,
osu_version: str,
) -> tuple[list[str], str]:
"""Decrypt the base64'ed score data."""
# TODO: perhaps this should return TypedDict?
# attempt to decrypt score data
aes = RijndaelCbc(
key=f"osu!-scoreburgr---------{osu_version}".encode(),
iv=b64decode(iv_b64),
padding=Pkcs7Padding(32),
block_size=32,
)
score_data = aes.decrypt(b64decode(score_data_b64)).decode().split(":")
client_hash_decoded = aes.decrypt(b64decode(client_hash_b64)).decode()
# score data is delimited by colons (:).
return score_data, client_hash_decoded