diff --git a/setup.py b/setup.py index 8db0600..0b7f7af 100644 --- a/setup.py +++ b/setup.py @@ -14,6 +14,7 @@ with open(path.join(here, 'steam/__init__.py'), encoding='utf-8') as f: install_requires = [ 'requests', 'vdf', + 'pycrypto', ] if sys.version_info < (3, 4): diff --git a/steam/client/__init__.py b/steam/client/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/steam/client/crypto.py b/steam/client/crypto.py new file mode 100644 index 0000000..7b772ab --- /dev/null +++ b/steam/client/crypto.py @@ -0,0 +1,35 @@ +from base64 import b64decode +from Crypto import Random +from Crypto.Cipher import PKCS1_OAEP, AES +from Crypto.PublicKey import RSA + +public_key = """ +MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDf7BrWLBBmLBc1OhSwfFkRf53T +2Ct64+AVzRkeRuh7h3SiGEYxqQMUeYKO6UWiSRKpI2hzic9pobFhRr3Bvr/WARvY +gdTckPv+T1JzZsuVcNfFjrocejN1oWI0Rrtgt4Bo+hOneoo3S57G9F1fOpn5nsQ6 +6WOiu4gZKODnFMBCiQIBEQ== +""" + +BS = AES.block_size +pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS) +unpad = lambda s: s[0:-ord(s[-1])] + + +def generate_session_key(): + session_key = Random.new().read(32) + cipher = PKCS1_OAEP.new(RSA.importKey(b64decode(public_key))) + encrypted_session_key = cipher.encrypt(session_key) + return (session_key, encrypted_session_key) + + +def encrypt(message, key): + iv = Random.new().read(BS) + encrypted_iv = AES.new(key, AES.MODE_ECB).encrypt(iv) + cyphertext = AES.new(key, AES.MODE_CBC, iv).encrypt(pad(message)) + return encrypted_iv + cyphertext + + +def decrypt(cyphertext, key): + iv = AES.new(key, AES.MODE_ECB).decrypt(cyphertext[:BS]) + message = AES.new(key, AES.MODE_CBC, iv).decrypt(cyphertext[BS:]) + return unpad(message)