1
1
"""
2
2
All function in this module take and return :class:`bytes`
3
3
"""
4
+ import hashlib
4
5
import sys
6
+ from base64 import b64decode
5
7
from os import urandom as random_bytes
6
8
from struct import pack
7
- from base64 import b64decode
8
9
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 .asymmetric import rsa , padding
13
+ from cryptography .hazmat .primitives .hmac import HMAC
14
+ from cryptography .hazmat .primitives .serialization import load_der_public_key
13
15
14
16
15
17
class UniverseKey (object ):
16
18
"""Public keys for Universes"""
17
19
18
- Public = rsa_import_key (b64decode ("""
20
+ Public = load_der_public_key (b64decode ("""
19
21
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDf7BrWLBBmLBc1OhSwfFkRf53T
20
22
2Ct64+AVzRkeRuh7h3SiGEYxqQMUeYKO6UWiSRKpI2hzic9pobFhRr3Bvr/WARvY
21
23
gdTckPv+T1JzZsuVcNfFjrocejN1oWI0Rrtgt4Bo+hOneoo3S57G9F1fOpn5nsQ6
@@ -39,8 +41,14 @@ def generate_session_key(hmac_secret=b''):
39
41
:rtype: :class:`tuple`
40
42
"""
41
43
session_key = random_bytes (32 )
42
- encrypted_session_key = PKCS1_OAEP .new (UniverseKey .Public , SHA1 )\
43
- .encrypt (session_key + hmac_secret )
44
+ encrypted_session_key = UniverseKey .Public .encrypt (
45
+ session_key + hmac_secret ,
46
+ padding .OAEP (
47
+ mgf = padding .MGF1 (algorithm = hashes .SHA1 ()),
48
+ algorithm = hashes .SHA256 (),
49
+ label = None
50
+ )
51
+ )
44
52
45
53
return (session_key , encrypted_session_key )
46
54
@@ -49,7 +57,13 @@ def symmetric_encrypt(message, key):
49
57
return symmetric_encrypt_with_iv (message , key , iv )
50
58
51
59
def symmetric_encrypt_ecb (message , key ):
52
- return AES .new (key , AES .MODE_ECB ).encrypt (pad (message ))
60
+ padder = padding .PKCS7 (algorithms .AES .block_size ).padder ()
61
+ plaintext = padder .update (message )
62
+ plaintext += padder .finalize ()
63
+ encryptor = Cipher (algorithms .AES (key ), modes .ECB ()).encryptor ()
64
+ cyphertext = encryptor .update (plaintext )
65
+ cyphertext += encryptor .finalize ()
66
+ return cyphertext
53
67
54
68
def symmetric_encrypt_HMAC (message , key , hmac_secret ):
55
69
prefix = random_bytes (3 )
@@ -58,19 +72,33 @@ def symmetric_encrypt_HMAC(message, key, hmac_secret):
58
72
return symmetric_encrypt_with_iv (message , key , iv )
59
73
60
74
def symmetric_encrypt_iv (iv , key ):
61
- return AES .new (key , AES .MODE_ECB ).encrypt (iv )
75
+ encryptor = Cipher (algorithms .AES (key ), modes .ECB ()).encryptor ()
76
+ cyphertext = encryptor .update (iv )
77
+ cyphertext += encryptor .finalize ()
78
+ return cyphertext
62
79
63
80
def symmetric_encrypt_with_iv (message , key , iv ):
64
81
encrypted_iv = symmetric_encrypt_iv (iv , key )
65
- cyphertext = AES .new (key , AES .MODE_CBC , iv ).encrypt (pad (message ))
82
+ padder = padding .PKCS7 (algorithms .AES .block_size ).padder ()
83
+ plaintext = padder .update (message )
84
+ plaintext += padder .finalize ()
85
+ encryptor = Cipher (algorithms .AES (key ), modes .CBC (iv )).encryptor ()
86
+ cyphertext = encryptor .update (plaintext )
87
+ cyphertext += encryptor .finalize ()
66
88
return encrypted_iv + cyphertext
67
89
68
90
def symmetric_decrypt (cyphertext , key ):
69
91
iv = symmetric_decrypt_iv (cyphertext , key )
70
92
return symmetric_decrypt_with_iv (cyphertext , key , iv )
71
93
72
94
def symmetric_decrypt_ecb (cyphertext , key ):
73
- return unpad (AES .new (key , AES .MODE_ECB ).decrypt (cyphertext ))
95
+ decryptor = Cipher (algorithms .AES (key ), modes .ECB ()).decryptor ()
96
+ plaintext = decryptor .update (cyphertext )
97
+ plaintext += decryptor .finalize ()
98
+ unpadder = padding .PKCS7 (algorithms .AES .block_size ).unpadder ()
99
+ message = unpadder .update (plaintext )
100
+ message += unpadder .finalize ()
101
+ return message
74
102
75
103
def symmetric_decrypt_HMAC (cyphertext , key , hmac_secret ):
76
104
""":raises: :class:`RuntimeError` when HMAC verification fails"""
@@ -85,19 +113,33 @@ def symmetric_decrypt_HMAC(cyphertext, key, hmac_secret):
85
113
return message
86
114
87
115
def symmetric_decrypt_iv (cyphertext , key ):
88
- return AES .new (key , AES .MODE_ECB ).decrypt (cyphertext [:BS ])
116
+ decryptor = Cipher (algorithms .AES (key ), modes .ECB ()).decryptor ()
117
+ iv = decryptor .update (cyphertext [:BS ])
118
+ iv += decryptor .finalize ()
119
+ return iv
89
120
90
121
def symmetric_decrypt_with_iv (cyphertext , key , iv ):
91
- return unpad (AES .new (key , AES .MODE_CBC , iv ).decrypt (cyphertext [BS :]))
122
+ decryptor = Cipher (algorithms .AES (key ), modes .CBC (iv )).decryptor ()
123
+ plaintext = decryptor .update (cyphertext [BS :])
124
+ plaintext += decryptor .finalize ()
125
+ unpadder = padding .PKCS7 (algorithms .AES .block_size ).unpadder ()
126
+ message = unpadder .update (plaintext )
127
+ message += unpadder .finalize ()
128
+ return message
92
129
93
130
def hmac_sha1 (secret , data ):
94
- return HMAC .new (secret , data , SHA1 ).digest ()
131
+ h = HMAC (secret , hashes .SHA1 ())
132
+ h .update (data )
133
+ return h .finalize ()
95
134
96
135
def sha1_hash (data ):
97
- return SHA1 . new (data ).digest ()
136
+ return hashlib . sha1 (data ).digest ()
98
137
99
138
def rsa_publickey (mod , exp ):
100
- return rsa_construct (( mod , exp ) )
139
+ return rsa . RSAPublicNumbers ( e = exp , n = mod ). public_key ( )
101
140
102
141
def pkcs1v15_encrypt (key , message ):
103
- return PKCS1_v1_5 .new (key ).encrypt (message )
142
+ key .encrypt (
143
+ message ,
144
+ padding .PKCS1v15 ,
145
+ )
0 commit comments