Skip to content

Commit 3de4c8d

Browse files
authored
remove CBC padding (#269)
1 parent 5f9d771 commit 3de4c8d

File tree

2 files changed

+18
-28
lines changed

2 files changed

+18
-28
lines changed

cterasdk/direct/crypto.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ def decrypt_block(block, encryption_key):
2828
encrypted_data = block[17:]
2929
logging.getLogger('cterasdk.direct').debug('Decrypting Block.')
3030
decryptor = Cipher(algorithms.AES(encryption_key), modes.CBC(initialization_vector)).decryptor()
31-
return decryptor.update(encrypted_data)
31+
decrypted_data = decryptor.update(encrypted_data)
32+
return decrypted_data[:-decrypted_data[-1]] # Remove CBC Padding
3233
except ValueError as error:
3334
logging.getLogger('cterasdk.direct').error('Failed to decrypt block. Key error. %s', error)
3435
except UnsupportedAlgorithm as error:

cterasdk/direct/decompressor.py

Lines changed: 16 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,45 +7,34 @@ def decompress(compressed_block):
77
"""
88
Decompress a Block.
99
10-
:param bytes block: Compressed Block
11-
:returns: Decompressed Block
12-
:rtype: bytes
13-
"""
14-
return decompress_with_magic_header(compressed_block) \
15-
if compressed_block.startswith(b'\x82SNAPPY\x00') else decompress_without_magic_header(compressed_block)
16-
17-
18-
def decompress_with_magic_header(compressed_block):
19-
"""
20-
Decompress a Block.
21-
2210
:param bytes block: Compressed Block
2311
:returns: Decompressed Block
2412
:rtype: bytes
2513
"""
2614
try:
27-
logging.getLogger('cterasdk.direct').debug('Decompressing Block.')
28-
decompressed_block = bytearray()
29-
size_of_data = len(compressed_block)
30-
chunk_size, chunk_start = 4, 16
31-
while chunk_start < size_of_data:
32-
chunk_end = chunk_start + chunk_size + int.from_bytes(compressed_block[chunk_start:chunk_start + chunk_size])
33-
chunk_start = chunk_start + chunk_size
34-
if chunk_end > size_of_data:
35-
break
36-
decompressed_block.extend(snappy.decompress(compressed_block[chunk_start:chunk_end]))
37-
chunk_start = chunk_end
38-
return decompressed_block
15+
return decompress_with_magic_header(compressed_block) \
16+
if compressed_block.startswith(b'\x82SNAPPY\x00') else snappy.uncompress(compressed_block)
3917
except snappy.UncompressError:
4018
raise DirectIOError()
4119

4220

43-
def decompress_without_magic_header(compressed_block):
21+
def decompress_with_magic_header(compressed_block):
4422
"""
4523
Decompress a Block.
4624
47-
:param bytes compressed_block: Compressed Block
25+
:param bytes block: Compressed Block
4826
:returns: Decompressed Block
4927
:rtype: bytes
5028
"""
51-
return snappy.uncompress(compressed_block[:compressed_block.rfind(b'EOF') + 3])
29+
logging.getLogger('cterasdk.direct').debug('Decompressing Block.')
30+
decompressed_block = bytearray()
31+
size_of_data = len(compressed_block)
32+
chunk_size, chunk_start = 4, 16
33+
while chunk_start < size_of_data:
34+
chunk_end = chunk_start + chunk_size + int.from_bytes(compressed_block[chunk_start:chunk_start + chunk_size])
35+
chunk_start = chunk_start + chunk_size
36+
if chunk_end > size_of_data:
37+
break
38+
decompressed_block.extend(snappy.decompress(compressed_block[chunk_start:chunk_end]))
39+
chunk_start = chunk_end
40+
return decompressed_block

0 commit comments

Comments
 (0)