Skip to content

Commit c16b85c

Browse files
committed
Port to cryptography.
1 parent f405ffa commit c16b85c

File tree

3 files changed

+63
-20
lines changed

3 files changed

+63
-20
lines changed

requirements.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
six>=1.10.0
2-
pycryptodomex>=3.7.0
2+
cryptography>=3.1
33
requests>=2.9.1
44
vdf>=3.3
55
gevent>=1.3.0

setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
install_requires = [
1818
'six>=1.10',
19-
'pycryptodomex>=3.7.0',
19+
'cryptography>=3.1',
2020
'requests>=2.9.1',
2121
'vdf>=3.3',
2222
'cachetools>=3.0.0',

steam/core/crypto.py

+61-18
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,24 @@
11
"""
22
All function in this module take and return :class:`bytes`
33
"""
4+
import hashlib
45
import sys
6+
from base64 import b64decode
57
from os import urandom as random_bytes
68
from struct import pack
7-
from base64 import b64decode
89

9-
from Cryptodome.Hash import SHA1, HMAC
10-
from Cryptodome.PublicKey.RSA import import_key as rsa_import_key, construct as rsa_construct
11-
from Cryptodome.Cipher import PKCS1_OAEP, PKCS1_v1_5
12-
from Cryptodome.Cipher import AES as AES
10+
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
11+
from cryptography.hazmat.primitives import hashes
12+
from cryptography.hazmat.primitives.padding import PKCS7
13+
from cryptography.hazmat.primitives.asymmetric import rsa, padding
14+
from cryptography.hazmat.primitives.hmac import HMAC
15+
from cryptography.hazmat.primitives.serialization import load_der_public_key
1316

1417

1518
class UniverseKey(object):
1619
"""Public keys for Universes"""
1720

18-
Public = rsa_import_key(b64decode("""
21+
Public = load_der_public_key(b64decode("""
1922
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDf7BrWLBBmLBc1OhSwfFkRf53T
2023
2Ct64+AVzRkeRuh7h3SiGEYxqQMUeYKO6UWiSRKpI2hzic9pobFhRr3Bvr/WARvY
2124
gdTckPv+T1JzZsuVcNfFjrocejN1oWI0Rrtgt4Bo+hOneoo3S57G9F1fOpn5nsQ6
@@ -39,8 +42,14 @@ def generate_session_key(hmac_secret=b''):
3942
:rtype: :class:`tuple`
4043
"""
4144
session_key = random_bytes(32)
42-
encrypted_session_key = PKCS1_OAEP.new(UniverseKey.Public, SHA1)\
43-
.encrypt(session_key + hmac_secret)
45+
encrypted_session_key = UniverseKey.Public.encrypt(
46+
session_key + hmac_secret,
47+
padding.OAEP(
48+
mgf=padding.MGF1(algorithm=hashes.SHA1()),
49+
algorithm=hashes.SHA256(),
50+
label=None
51+
)
52+
)
4453

4554
return (session_key, encrypted_session_key)
4655

@@ -49,7 +58,13 @@ def symmetric_encrypt(message, key):
4958
return symmetric_encrypt_with_iv(message, key, iv)
5059

5160
def symmetric_encrypt_ecb(message, key):
52-
return AES.new(key, AES.MODE_ECB).encrypt(pad(message))
61+
padder = PKCS7(algorithms.AES.block_size).padder()
62+
plaintext = padder.update(message)
63+
plaintext += padder.finalize()
64+
encryptor = Cipher(algorithms.AES(key), modes.ECB()).encryptor()
65+
cyphertext = encryptor.update(plaintext)
66+
cyphertext += encryptor.finalize()
67+
return cyphertext
5368

5469
def symmetric_encrypt_HMAC(message, key, hmac_secret):
5570
prefix = random_bytes(3)
@@ -58,19 +73,33 @@ def symmetric_encrypt_HMAC(message, key, hmac_secret):
5873
return symmetric_encrypt_with_iv(message, key, iv)
5974

6075
def symmetric_encrypt_iv(iv, key):
61-
return AES.new(key, AES.MODE_ECB).encrypt(iv)
76+
encryptor = Cipher(algorithms.AES(key), modes.ECB()).encryptor()
77+
cyphertext = encryptor.update(iv)
78+
cyphertext += encryptor.finalize()
79+
return cyphertext
6280

6381
def symmetric_encrypt_with_iv(message, key, iv):
6482
encrypted_iv = symmetric_encrypt_iv(iv, key)
65-
cyphertext = AES.new(key, AES.MODE_CBC, iv).encrypt(pad(message))
83+
padder = PKCS7(algorithms.AES.block_size).padder()
84+
plaintext = padder.update(message)
85+
plaintext += padder.finalize()
86+
encryptor = Cipher(algorithms.AES(key), modes.CBC(iv)).encryptor()
87+
cyphertext = encryptor.update(plaintext)
88+
cyphertext += encryptor.finalize()
6689
return encrypted_iv + cyphertext
6790

6891
def symmetric_decrypt(cyphertext, key):
6992
iv = symmetric_decrypt_iv(cyphertext, key)
7093
return symmetric_decrypt_with_iv(cyphertext, key, iv)
7194

7295
def symmetric_decrypt_ecb(cyphertext, key):
73-
return unpad(AES.new(key, AES.MODE_ECB).decrypt(cyphertext))
96+
decryptor = Cipher(algorithms.AES(key), modes.ECB()).decryptor()
97+
plaintext = decryptor.update(cyphertext)
98+
plaintext += decryptor.finalize()
99+
unpadder = PKCS7(algorithms.AES.block_size).unpadder()
100+
message = unpadder.update(plaintext)
101+
message += unpadder.finalize()
102+
return message
74103

75104
def symmetric_decrypt_HMAC(cyphertext, key, hmac_secret):
76105
""":raises: :class:`RuntimeError` when HMAC verification fails"""
@@ -85,19 +114,33 @@ def symmetric_decrypt_HMAC(cyphertext, key, hmac_secret):
85114
return message
86115

87116
def symmetric_decrypt_iv(cyphertext, key):
88-
return AES.new(key, AES.MODE_ECB).decrypt(cyphertext[:BS])
117+
decryptor = Cipher(algorithms.AES(key), modes.ECB()).decryptor()
118+
iv = decryptor.update(cyphertext[:BS])
119+
iv += decryptor.finalize()
120+
return iv
89121

90122
def symmetric_decrypt_with_iv(cyphertext, key, iv):
91-
return unpad(AES.new(key, AES.MODE_CBC, iv).decrypt(cyphertext[BS:]))
123+
decryptor = Cipher(algorithms.AES(key), modes.CBC(iv)).decryptor()
124+
plaintext = decryptor.update(cyphertext[BS:])
125+
plaintext += decryptor.finalize()
126+
unpadder = PKCS7(algorithms.AES.block_size).unpadder()
127+
message = unpadder.update(plaintext)
128+
message += unpadder.finalize()
129+
return message
92130

93131
def hmac_sha1(secret, data):
94-
return HMAC.new(secret, data, SHA1).digest()
132+
h = HMAC(secret, hashes.SHA1())
133+
h.update(data)
134+
return h.finalize()
95135

96136
def sha1_hash(data):
97-
return SHA1.new(data).digest()
137+
return hashlib.sha1(data).digest()
98138

99139
def rsa_publickey(mod, exp):
100-
return rsa_construct((mod, exp))
140+
return rsa.RSAPublicNumbers(e=exp, n=mod).public_key()
101141

102142
def pkcs1v15_encrypt(key, message):
103-
return PKCS1_v1_5.new(key).encrypt(message)
143+
key.encrypt(
144+
message,
145+
padding.PKCS1v15,
146+
)

0 commit comments

Comments
 (0)