Skip to content

Commit 066a7ae

Browse files
committed
Cleanup aes.py
Signed-off-by: Ivan Kanakarakis <[email protected]>
1 parent a3d278d commit 066a7ae

File tree

1 file changed

+36
-40
lines changed

1 file changed

+36
-40
lines changed

src/saml2/aes.py

Lines changed: 36 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,58 @@
1-
#!/usr/bin/env python
21
import os
3-
from base64 import b64encode
42
from base64 import b64decode
3+
from base64 import b64encode
54

65
from Cryptodome import Random
76
from Cryptodome.Cipher import AES
87

9-
__author__ = 'rolandh'
108

119
POSTFIX_MODE = {
12-
"cbc": AES.MODE_CBC,
13-
"cfb": AES.MODE_CFB,
14-
"ecb": AES.MODE_CFB,
10+
'cbc': AES.MODE_CBC,
11+
'cfb': AES.MODE_CFB,
12+
'ecb': AES.MODE_CFB,
1513
}
1614

1715
BLOCK_SIZE = 16
1816

1917

2018
class AESCipher(object):
21-
def __init__(self, key, iv=""):
19+
def __init__(self, key, iv=None):
2220
"""
23-
2421
:param key: The encryption key
2522
:param iv: Init vector
2623
:return: AESCipher instance
2724
"""
2825
self.key = key
2926
self.iv = iv
3027

31-
def build_cipher(self, iv="", alg="aes_128_cbc"):
28+
def build_cipher(self, iv=None, alg='aes_128_cbc'):
3229
"""
3330
:param iv: init vector
3431
:param alg: cipher algorithm
3532
:return: A Cipher instance
3633
"""
37-
typ, bits, cmode = alg.split("_")
34+
typ, bits, cmode = alg.split('_')
3835

3936
if not iv:
40-
if self.iv:
41-
iv = self.iv
42-
else:
43-
iv = Random.new().read(AES.block_size)
44-
else:
45-
assert len(iv) == AES.block_size
37+
iv = self.iv if self.iv else Random.new().read(AES.block_size)
4638

47-
if bits not in ["128", "192", "256"]:
48-
raise Exception("Unsupported key length")
49-
try:
50-
assert len(self.key) == int(bits) >> 3
51-
except AssertionError:
52-
raise Exception("Wrong Key length")
39+
if len(iv) != AES.block_size:
40+
raise Exception('Wrong iv size')
41+
42+
if bits not in ['128', '192', '256']:
43+
raise Exception('Unsupported key length')
44+
45+
if len(self.key) != int(bits) >> 3:
46+
raise Exception('Wrong Key length')
5347

5448
try:
55-
return AES.new(self.key, POSTFIX_MODE[cmode], iv), iv
49+
result = AES.new(self.key, POSTFIX_MODE[cmode], iv)
5650
except KeyError:
57-
raise Exception("Unsupported chaining mode")
58-
51+
raise Exception('Unsupported chaining mode')
52+
else:
53+
return result, iv
5954

60-
def encrypt(self, msg, iv=None, alg="aes_128_cbc", padding="PKCS#7",
55+
def encrypt(self, msg, iv=None, alg='aes_128_cbc', padding='PKCS#7',
6156
b64enc=True, block_size=BLOCK_SIZE):
6257
"""
6358
:param key: The encryption key
@@ -69,51 +64,52 @@ def encrypt(self, msg, iv=None, alg="aes_128_cbc", padding="PKCS#7",
6964
:return: The encrypted message
7065
"""
7166

72-
if padding == "PKCS#7":
67+
if padding == 'PKCS#7':
7368
_block_size = block_size
74-
elif padding == "PKCS#5":
69+
elif padding == 'PKCS#5':
7570
_block_size = 8
7671
else:
7772
_block_size = 0
7873

7974
if _block_size:
8075
plen = _block_size - (len(msg) % _block_size)
8176
c = chr(plen)
82-
msg += c*plen
77+
msg += c * plen
8378

8479
cipher, iv = self.build_cipher(iv, alg)
8580
cmsg = iv + cipher.encrypt(msg)
81+
8682
if b64enc:
87-
return b64encode(cmsg)
83+
enc_msg = b64encode(cmsg)
8884
else:
89-
return cmsg
85+
enc_msg = cmsg
9086

87+
return enc_msg
9188

92-
def decrypt(self, msg, iv=None, alg="aes_128_cbc", padding="PKCS#7", b64dec=True):
89+
def decrypt(self, msg, iv=None, alg='aes_128_cbc', padding='PKCS#7',
90+
b64dec=True):
9391
"""
9492
:param key: The encryption key
9593
:param iv: init vector
9694
:param msg: Base64 encoded message to be decrypted
9795
:return: The decrypted message
9896
"""
99-
if b64dec:
100-
data = b64decode(msg)
101-
else:
102-
data = msg
97+
data = b64decode(msg) if b64dec else msg
10398

10499
_iv = data[:AES.block_size]
105100
if iv:
106101
assert iv == _iv
107102
cipher, iv = self.build_cipher(iv, alg=alg)
108103
res = cipher.decrypt(data)[AES.block_size:]
109-
if padding in ["PKCS#5", "PKCS#7"]:
104+
if padding in ['PKCS#5', 'PKCS#7']:
110105
res = res[:-ord(res[-1])]
111106
return res
112107

113-
if __name__ == "__main__":
114-
key_ = "1234523451234545" # 16 byte key
108+
109+
if __name__ == '__main__':
110+
key_ = '1234523451234545' # 16 byte key
115111
# Iff padded, the message doesn't have to be multiple of 16 in length
116-
msg_ = "ToBeOrNotTobe W.S."
112+
msg_ = 'ToBeOrNotTobe W.S.'
117113
aes = AESCipher(key_)
118114
iv_ = os.urandom(16)
119115
encrypted_msg = aes.encrypt(key_, msg_, iv_)

0 commit comments

Comments
 (0)