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 .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
13
16
14
17
15
18
class UniverseKey (object ):
16
19
"""Public keys for Universes"""
17
20
18
- Public = rsa_import_key (b64decode ("""
21
+ Public = load_der_public_key (b64decode ("""
19
22
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDf7BrWLBBmLBc1OhSwfFkRf53T
20
23
2Ct64+AVzRkeRuh7h3SiGEYxqQMUeYKO6UWiSRKpI2hzic9pobFhRr3Bvr/WARvY
21
24
gdTckPv+T1JzZsuVcNfFjrocejN1oWI0Rrtgt4Bo+hOneoo3S57G9F1fOpn5nsQ6
@@ -39,8 +42,14 @@ def generate_session_key(hmac_secret=b''):
39
42
:rtype: :class:`tuple`
40
43
"""
41
44
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
+ )
44
53
45
54
return (session_key , encrypted_session_key )
46
55
@@ -49,7 +58,13 @@ def symmetric_encrypt(message, key):
49
58
return symmetric_encrypt_with_iv (message , key , iv )
50
59
51
60
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
53
68
54
69
def symmetric_encrypt_HMAC (message , key , hmac_secret ):
55
70
prefix = random_bytes (3 )
@@ -58,19 +73,33 @@ def symmetric_encrypt_HMAC(message, key, hmac_secret):
58
73
return symmetric_encrypt_with_iv (message , key , iv )
59
74
60
75
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
62
80
63
81
def symmetric_encrypt_with_iv (message , key , iv ):
64
82
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 ()
66
89
return encrypted_iv + cyphertext
67
90
68
91
def symmetric_decrypt (cyphertext , key ):
69
92
iv = symmetric_decrypt_iv (cyphertext , key )
70
93
return symmetric_decrypt_with_iv (cyphertext , key , iv )
71
94
72
95
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
74
103
75
104
def symmetric_decrypt_HMAC (cyphertext , key , hmac_secret ):
76
105
""":raises: :class:`RuntimeError` when HMAC verification fails"""
@@ -85,19 +114,33 @@ def symmetric_decrypt_HMAC(cyphertext, key, hmac_secret):
85
114
return message
86
115
87
116
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
89
121
90
122
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
92
130
93
131
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 ()
95
135
96
136
def sha1_hash (data ):
97
- return SHA1 . new (data ).digest ()
137
+ return hashlib . sha1 (data ).digest ()
98
138
99
139
def rsa_publickey (mod , exp ):
100
- return rsa_construct (( mod , exp ) )
140
+ return rsa . RSAPublicNumbers ( e = exp , n = mod ). public_key ( )
101
141
102
142
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