From 9fcfaac781ff7e1eb9a6f03fee4ddb9484120e3d Mon Sep 17 00:00:00 2001 From: VakarisZ Date: Wed, 2 Jun 2021 12:04:33 +0300 Subject: [PATCH] Improved exceptions thrown in configuration decryption and unit tests. --- .../cc/services/utils/config_encryption.py | 24 +- .../utils/cyphertexts_for_encryption_test.py | 206 ++++++++++++++++++ .../services/utils/test_config_encryption.py | 25 ++- vulture_allowlist.py | 1 + 4 files changed, 248 insertions(+), 8 deletions(-) create mode 100644 monkey/tests/unit_tests/monkey_island/cc/services/utils/cyphertexts_for_encryption_test.py diff --git a/monkey/monkey_island/cc/services/utils/config_encryption.py b/monkey/monkey_island/cc/services/utils/config_encryption.py index 9a3783a47..086ad00a6 100644 --- a/monkey/monkey_island/cc/services/utils/config_encryption.py +++ b/monkey/monkey_island/cc/services/utils/config_encryption.py @@ -1,14 +1,17 @@ import base64 import io import json -from typing import Dict +import logging +from typing import Dict, Union import pyAesCrypt -from common.utils.exceptions import FailedDecryption, NoCredentialsError +from common.utils.exceptions import InvalidCredentialsError, NoCredentialsError BUFFER_SIZE = pyAesCrypt.crypto.bufferSizeDef +logger = logging.getLogger(__name__) + def encrypt_config(config: Dict, password: str) -> str: plaintext_config_stream = io.BytesIO(json.dumps(config).encode()) @@ -19,15 +22,20 @@ def encrypt_config(config: Dict, password: str) -> str: ) ciphertext_b64 = base64.b64encode(ciphertext_config_stream.getvalue()) + logger.info("Configuration encrypted.") return ciphertext_b64.decode() -def decrypt_config(cyphertext: str, password: str) -> Dict: +def decrypt_config(cyphertext: Union[str, dict], password: str) -> Dict: if not password: raise NoCredentialsError - cyphertext = base64.b64decode(cyphertext) + try: + cyphertext = base64.b64decode(cyphertext) + except TypeError: + logger.info("Configuration doesn't require decryption.") + return cyphertext ciphertext_config_stream = io.BytesIO(cyphertext) dec_plaintext_config_stream = io.BytesIO() @@ -43,7 +51,11 @@ def decrypt_config(cyphertext: str, password: str) -> Dict: len_ciphertext_config_stream, ) except ValueError as ex: - raise FailedDecryption(str(ex)) - + if str(ex).startswith("Wrong password"): + logger.info("Wrong password for configuration provided.") + raise InvalidCredentialsError + else: + logger.info("Configuration is corrupted.") + raise ex plaintext_config = json.loads(dec_plaintext_config_stream.getvalue().decode("utf-8")) return plaintext_config diff --git a/monkey/tests/unit_tests/monkey_island/cc/services/utils/cyphertexts_for_encryption_test.py b/monkey/tests/unit_tests/monkey_island/cc/services/utils/cyphertexts_for_encryption_test.py new file mode 100644 index 000000000..532d152bb --- /dev/null +++ b/monkey/tests/unit_tests/monkey_island/cc/services/utils/cyphertexts_for_encryption_test.py @@ -0,0 +1,206 @@ +MALFORMED_CYPHER_TEXT_TOO_SHORT = ( + b"AES\x02\x00\x00\x1bCREATED_BY\x00pyAesCrypt " + b"6.0.0\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" +) + +MALFORMED_CYPHER_TEXT_CORRUPTED = ( + b"AES\x02\x00\x00\x1bCREATED_BY\x00pyAesCrypt " + b"6.0.0\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + b"\x00\x00\x00\x00\x00\xc2\xc3w0\xe5\x06\xd2\xb9\x05b\xce\xb2\xc7" + b"\x18f\x87j|y\xcd\xbd\\(" + b"V\xfa!%\xcc@\x11\x98>\x9c^\x11\xa1\x82\xe9@\x89\xde\xe9\xb2)h\xb2" + b"`\x07y\x01\xa8zr\xd0\xe2\xb9m\xb1&\xb5f\x95\x80\x98\xac\xa6\x04.8" + b"\xf0\xbf\xee\x18!\xf5T\x04a\xb5\xb2Q\xb0|\xff\xe7\xdd)F\xd5E\xa6" + b"\xbf\xf6\xb0D\x02\x92\xb9Z\x01 " + b"F\x9f.9\x92zc\x9bI\xaf\rB6\xcb\r\x1b\xbf\xb8m\xbdBBt5\x9d\xc9\xeb" + b"\x9b\xe0u\xe8'H5\x96\x11\xbf>\xa7\xaa\xb4\x06\x1e\xb7\x99\xf1\x86" + b"\xd1\x81\x8e.\xf5\xdf\xc7Z\x18\xc5\xe9\xfc\\\x135B\xd6!-\x0c\xad" + b"\xc4!\xa5-\x02\x19V\x80\xe1\x98\xe3\x9a\xeb\xb5\xb1^\x94/F\x1c" + b"\x92f\x011\x05\x86\xdb\xdaQ\xa7\xff\x15&\x83\xca\x0b\xbf|k\x0em" + b'"\xf4\xb67\xc0\x8f\xe1\xa0s\x1e\xf0\xec\x98\xd0Zk2\xa4\x85v{' + b"P\xaa\x96\xb3\xa4N\xd0," + b"\xf9\xcbiq\xa7IP\xd9\x1d\x8a\x0fW\xf4\x8fnGc\x9e22!\xf24\xa3:\xbd" + b"\x83\x93\xc5Hq\xcc\xc9\xbd\xef\x9b\xa6f!\xd4p\x8c\x9cN\x0f\xc9d" + b"\xf5o\xa6\x1c\xf8\xed\\/r\x8c\x8d\xa9\x85\xe5\x19]J\x02S\x10\xef" + b"\x1ffg\xaf\x1f\x077}\x81\x9d\xe6\xaa\x99k\xec\x19\xe90\xef\x0b\x93" + b"\x0eZ\x96hq\x1be\\_\\d\x1c\xc9\xcb\xd1\x87E?$\x0f\x93\xf9\xa8Z\x10" + b"\xd4)\xb4j\xa4\x16\xaa'\xda\xd0]Fz\xd7\xff\xff9\xe8\xfd\xa0H\xe3" + b"\x814\xc6t[\x0e\x81\xf4\x12N\xbc\xb9(" + b"SU\xd9^%\xaeQc\xc7\xf8\xcayo9\xb3\xef\x194\xa3\xe2\xfcZ\xf6[" + b'\xd4]2\x1a\xe8u\x92\x19*~\x93b\x13\xed"\xd2\xcaV\x05R.&D\xb0m' + b"\x93rb\x15\xe2=\xfb\xb9\xcc+\x0f\x9c\x1c\xff\xe4\x18a\x85\xe4\xd0s" + b"\xed\xc3H\x88\x07P\xbed\x0c\xf7\x97j\x1d\xf2'\xce&\xbe1A\xca\x0e" + b"\xb3H\x08\x01\xc5\x87F#\xf6TB\xc5\x9f\\\x9ex\x06\xd3\x85&\xdf\x9a" + b"\\X\x1d\x9bm\xe60\xf3;\x06\xa9o7\x99\xa3:\xce\xbb\xba\xe3\xc4\xe5" + b"\xa9\x01\xfbJ\x11tJ\xd4\xc7\xc7\xf1s=8k\xc29c\x8c\xdfdA\xf76\xdd" + b"\xdd\xf8\x16\xf3\x8d\x96gP\xad\xd4\r1\xd3\x1d@\xbb#o\x98\x13\x9d" + b"'\xb2\xb5\x1dl\xe5\x01\xce\x0f\x80\x7f5\x80\x1dp>\xee_\xc2OK\x95" + b"\xd5\x16E\xea\x82\xf5\xa8\x88A\xa2\x1e\x0c\xc8\x05\x81\xda\xfe\xb6" + b"\xe5\x8f\xd8W\xb4\xbeS\xcd\x130\x0c\xa4\xd9\x1d\xf6\x96\xa3\xee" + b"\xb30\xbd " + b"\t\\\xd6\xa1\x8b\x85\x16\xf6dJ4\xd7\x85\x96|3\xae\xab\xb7>\xf8\xf9" + b"\xf7h\x8f\xcc\x9b=B]G\xd5L3g\xbd%\x84\xbe\xf4\x8a\x07\xb3\x863" + b"\xc2uz\x84-\xe436\x14\xbd\xda\xc74.\xdan\x8e\x04VJq\xcdo\x8a\x05" + b"\xe6\xec\x84\xdc\xa9\x84\xb3\xa5T\xa7M\x05\xfc\xc3\x04\xd6p\xb0y" + b"\x83\xc2\xc7i\x9at.\x1dh\x99\xfe}(\x98\xa7){" + b"\xa9\xa6\xa63\xcc'0A\xd9Q\x99-\xd0$)\xbda\xa0\xbf#\x9e\x19\xe5" + b"\xb7q\x89\xda\xbaj\x1b\xe3\x8aW\xb6\xd0\xc5\x819\xfa\x8d\x9a\x14" + b"\xaf\xb1\x08\x97>*\x7f(" + b"\x9c\xd3\x99o3\xbew'/\x14\x9e\x9f#_\xaaDgg\xa6\xc7\xa6}8J\x14\xa8" + b"\xcb\xbf\xdeQ," + b"zHze\xbfe\xdfr|\xbd\x9dd\xfb\xccq\x18\x9dw\x01\xe5JY\x1b\xca\x12" + b"\xaed]\xadi\x7f\x0c`6\xb6X\xbe0\x83b\xc6\xc5>\x1e\xab\xfa\xb7\x0c" + b"\x08\xf6\xa9\xed\x14\xc9(\xf1m\xc6\x90w\xe9\x85\x9d{" + b"\xba\x93x\x00\xf7\x8d\x0f\xa2\xef\xc5\xfexp\xb2\xa9\xf4\xbb\x80" + b"\x13\x8e2bm\xf0U2\x1a\xa7\xa4PK\x11\xc7\xab3\n\xe5(" + b"y\x05\x1a\x07\x0e\x8cO\xee\xc9\x83\x84L\xae\x19\xc1\xab\xbf\xc9" + b'\xae\x8a\xe3\xbb\x19c\x0f0\xa9\xe8\x1e\xfe\xcb\xa3T"p\r\xe8b}Y\x86' + b"\xc0s\x9d\x1bc\xd6\xec\xab6\xd5\xcf\xfaw\x7f\xa8K\xe4Z4Sj\xe8\xda" + b"`\xe9\x8e\xf0M\xee5G\xc6\xb6\xef\x97\r&C\xa60\xcc\xf4\xb8\xd0a\x16" + b"!\xda=\xd4\xb4\x84\xc6\x99\xf4\x9c[" + b"\xda'R\x80\xf1\xa2m\xe0\x14\x1b\xe2\xee\xd6\x81\xf2\x19\xe6\x9aC" + b"\xac6\xb8\xe9\x89\xe9\xb4UM\x027\xc4(" + b"\n\xe3\x8a\x85a\xad7~\xa71\xd1w065a\x87T\xbc\x89v\xca\xe4\x80\x9f" + b"\xe1\x10p\x1c\x14\xc2\x0c-\xd4q\x0e'\xcf[" + b"\xe0\x163Jj\xd1\x03u%B:\xda\xc9\x08*\xf1\x1d,\x80,," + b"I\xcc\x8c\xe9\xb8U{" + b"\xcb\xde\x8b\x1dB\xd9\xa1\xf1\xcfY\x14\x16\x86\xd9\xe4\x8d\xc0\xc5" + b'<^\xce"\n\xdd\xdf\x1cb\xf1M\xb8\x10$\xcf\x04\x1bU*\xe9\x19\x8c\xf7' + b"\xff\xfdl\xaf\x92\x11\xdb{" + b"\x1c\\\r" + b"\x90\x0fva," + b"\xcc\x18j\xab\"4'\xd3\xcfo|yE\xb8\xa1\xc0\x927\xa7\x1dh\xba\xab" + b"|\x8b\xeb\xf2G\xcc\xd2a2al\xa55\xb6\xd5\xc5\xc1\xa6q\t\xca\xf4\xdc" + b"\x9b\x00\x9b\xe2\xa3\xd7\xd4\x19\x88\x05\xb2\x0e\xc8\xf3\x0b>\x18" + b"\xcfd\x05m\x85\nB*\xa2$\xf6I'\xe4\xa2_w1*\xe2z4#\n\xcf\xd9J\xa3" + b'\xf9q\xc4\xc1"\xf9\xbd\xb3J,' + b"J\xd4v+U\x8c\xafG\x86\xae\xce/w\xee\x94x\xb1h7z\xbd\x02\x12\xc6" + b"\x16\xcb\x14\x80(\xab\xfb\x16{" + b"\xb2\xd1\xe9\xd9\xd7\xd9\x9bq`\xdfRB5\x04t\x8d\nq\x1a\r@k\xec\x04" + b"\xb2\x8c\x00\x00\xe4\x86;\xae\xbe\x9b\x0ccp\xdd\xb8~\xb6\x9b1\xf1" + b"'\x12\x99\xab\xcah\xd1i\xa9r\x18\xfc\x93" + b"\x86W{{\x92\xa9(" + b'\xee"C\xa3uG\xc3s\xb8\xc6\xb7\xb9\x17\xf3\xe3n;\x16\x08\x9e,' + b"\xbd\x0f\xbe.\xd9\xc3F\xa0\xfe\x84\x1f\x8a\x97\xc9T\xea\x08_\xc5I" + b"\xf9v\tI\xf0\x0e\xbex\xd9\x9f\xe7Z\xd6\x1a]\xc1\xbb\x97 " + b"\x8a\x8f\x00\x1f\x92.\xc1WC\xd8\xe3\x86\x98PV\xfbWV\xbd\xdf\xd5" + b">1yo\xf1\xabV\xb2\xdf\x97\x82$0\xc8#\xbe\xbb\xe1\xed\x08\x8c@7\xab" + b"~\xdf\x8c\xf9\xbb\x9e\xc6\xa0Q\x85}\xe7\x00|\xe7'\x00{" + b"\xd9v1\xd5\x8a-C," + b"\xa7S\xfc\xc3\x83\xef\xadV\x1b\n\x1b\xb3\x0bK\xa0\xc6\x02i\xf6\x80" + b"\x06F>\x01\x01\xef\xe3\x19\xbf\xb1\xe0S~9\x88\xc5\x9a{" + b"K\x9e8rFp\xa3\xcclX," + b"\xe5\xf1o\x90\xa3\x13\x9c\xf0\xcd\xf3l@\xb60\xde\x19\xcen\x19\x80w" + b"\x0b\xfd\xa8\xafuP\xef-/\x92*\xdd\x93\xdc=9\x90\x0f-\xc4wxa\xc1" + b"\xb7SSe\x0fY\xc3!\xee\x16\xdc\xf8\x93\x03<\x1d?\xec\xce\xcf\xd5" + b"|)\xabu;Y!\xd6M\xcc\xbd\xcc\xec\xa6J\xb7\xbci\x91)\x14h\xec\xc3R" + b"\xb6/\xfcA\xab\x9f\xb8.W\x92\xc4\x8b\xa3D\x91\x8a\xb1\xbc\tJ\xd5" + b"\xb98\xe6c\xcc\xa6'\xb7NK\xf8\xdal\xabd\xc4\xde\xea\xd4~\t\xd9" + b"\xd3\x7f\xb8\xe1J\x8e\xf9X\xe4\xcd\x04\xa0\xc0vp\xe9\xe7\x8e\xd0[" + b"m\xe2\x8dY\x8c\xcd\x81Ny\xac\xbb`\x10ky\x1c\xe3\x9a\x1b\x88G\x1d" + b"\xdc\xc8\xa6\xf7\x1f\xbf\x87\xe9\xac\xfc5/\x8c\xf7k\x85\xb8\xc7d" + b"\x11\xe2\xd8T\x0c\x1a\x85\xc5\x93-\xfe\x85\x87\x03\xb4\x97\x97" + b"~\xb5\xcf|\x05\xf4SE1\xddf?\xae\xe5\xfd\x8c\xf0qu\x92sPz`\xa2\xb6" + b")\xa1\x08A\x18\xb0>\xc4\t\x17|\xac\xccH\x7f\x85\xd2zCK\xf7\xf5" + b'\x12{\x7f_\xc2"\xd6XQ>\x12W1\x06\xbe\xa1\x0f\xf0K\xd9\xaa\x1a\x90' + b"\xee\x90U\xf0\xec$\x1a\xc4\xe07\x92\x1f\xc4\xb5g\xebz\x900\x04\xb6" + b"\xec\xdd\x19iG\xfc=\xef\x0f\xaap\xb4h\xda\xcak\xf9\xc2\xdf%]\xad" + b"\xf5|\x19\xd2\xe46\xb6\x11k#\xf6\xa7t\xc1\xf4\x13B\x08\xeej\xe89" + b"\xbe\xfc\xbds\x19\xcf\xe5'\x84P\xf5\xd5\x88\x18\x1d`k\t%\xb9{" + b'\xa1\xec&\x9f\xee$R"\x81(\xe25V8m\x84\xa3Qb=CZ\x1d\xc6\xc7{' + b'\xc9"\xfcSW\xdb\xce\xd5\x0f%\xff\x85\xbb\xcbS\x83+\x9aA\x1e\xe6uf' + b"\xf9\xa8K\xc3(\xaa/\xe8[" + b"\xa9U|M\x0f\xdb\xea\\\xf5\x06\xbeK\xb67>~\x8a-\x8b\x08\xbc\rV\xbe" + b"\xa4=+|\xc6\xc1A\x02Jv\x8e\x99\x89E\xae\xe8\xac1\xb7a\xd9\xdeN" + b"\x934\xae\r\x91\xe3\x05M\x04\xb0\xb0-S\xdf\xe3A\x99h\x7fJ\xbf\xcfl" + b"\r(s4sj\xe0\x8eD\xc2\xb4\xa3\xb6\x8a\x9f\x0f," + b"\xbeU\xf3\xa0h\xb4\x9b\xf9O\xf20\xdc2\xcf\xd9(" + b">n'dc\xd9\xce3!z_\x16\xe6\xac\x8cg\x80][" + b"n\xe8\xf6\xdb\x92FJ\x19\xd0\xb5\xc4LM\xfb\xaa&\xd9\xfb1\x11l\xb1" + b'\x82\xc0\xe0\xf7\x91\xf8c"\xac\xe0\x11\xcd\x11\xd7\xa5\x82M\xf9' + b"\x13V\x8b\n\xde7\x87\xbd\xb6\xe4\\z\x15#\xbb\xec\xe3\xe9c{" + b"\xd5\xa3\x98\xf5\x0f)\x86W\xf1H\x92DU|I\x0f\x83I\xa9\xe4\x1c\x7f" + b"&>\x84\x08>S+H\xf5\xbc\x1c\xfd8\xb8\x19\xda\x08\xb4\x9a\xf9\xc9" + b"\x16\x0f\xda\x10\x07\xbd\xb7\x14\x92`\\\xbd=\xe2\xec^\xca\x14Q\x9a" + b"\xc4\xdd\xcf\xf8{" + b"D\x03\xb3\xb0\xf9\x8c7\x19\xf1\xe2\x07I\xa8/\xc6\x9b\r\x1f\xb87" + b"\xe8\x99\xff\xaf\xd7\xe2\x91\xbb\x88\xc2\xaem|\xeb0T}\x83\x80\xe9" + b"*D\xb1\xe4\xa5p\xa14\xda\x9d\xeaR\x9f\x0c\xe0\xc5\xb6b\x82\xff\x80" + b"\x86J\xa0\xa6Eg\xd3b\x99X\xc3\xb98\xa2\x18\xb8\xe6\xc3\x01T\x8d" + b"\xf2b\\\xa5\xa2\xc5\x89\x85\x9c\x1a\r.\xcc\xe1x\x9f\xc3\x10\x7fc" + b"\x00'\x10h\x1f\x82\x1e\xcel\xc1\xe3\xe5Rq\x10\xa2=\xe2\x1f\x93\xff\x04\xd8\xd3\x1eL\x8e8W" + b"\xef!\x8e\xdb\x14\x1c\xa1tz\xee\xca\x89dA\xe1\xa9K\x96/\x96\xc9YS" + b"\xcc\x07vM\xaeCi\xfc\xfdA\x01," + b"\xb0\x06J\xb7\xf5\x84\xf7\x1e\xc6\x05\xc5\tw\x9e\xf4\x0bH~.ah\x04" + b"\xce%\xbdK\xc4\xbbM\x82\x0c\xcd\xf4\x99\x9c\xa5^\x97\xfcj\xbe" + b'"_\x01\xec(' + b"\xd4\xb8\xddmF\xe9S\xaa\x92\xdc\xa4a\xee\x02\x84N\xe6\xb1\xc8\x1b" + b"\xb0\xb6\x90#>\xaeKk:\xf6\xef\x10\xe8\x03q\xac\\\x19\x1f\x17r\xc7" + b"\xdf\xce\x8fC\xd8\xb3C\xf8\x99\xb5\x15\x8a\x9b\xdc\xc0\xd1U\xa7.B" + b"\x9c\xb3\xe0G\x90Qf|\x9d\x97v\xfbD\x95B\xf3\xa1\xa6=\x08\xea\xee" + b"\xfd\xa9\xaa:\x80\xeb\x992\xcf\x9ed\x16\xd2\x92\xdaW\xd1\xb4P" + b'\\\x9e\x9d"\xcb\xc3\xf0Q\xeb\x96\x90*\xaf\xe2{' + b"\xf6y\xf6\xc6\x87jM'G\xcb," + b"\x9c\xbb\xcc\xf3\xab\xf4\xd0\xd7\x0c\x98H\n\xbb\xf0\xc2\x16\xe6" + b"\xcd\xd8\xa0\x02@6\xcbg\x1a\xc7\x16\xd4r\x0f\xbb\x04\xad\x1dY\xa0" + b":\x086d\x10V\xd5\x1cbKA\xb0\xbcjd\x9d8\xfc\xbc~\xeb!\xf8\xf0\xf4" + b"\xd2\x06\x9c<\xdcK\xda\xdbi\x1b\xf3\x9d\xdb\x97\xfe\xdfq(" + b"'\xb8\x8b(\x06o\x06\xba\x9a\x1d\xc6U_<9\x820,~\x92Z^\xf1 " + b"\xa0\xa5\xd1\xd4h\xae\x90u\xf5\xe8\x87&\xe9\x94\xec\xa9\xaa\xc7" + b"\x7fW\xd5\x99\x86\xa3\xf5rWa\x9f\xbb]D(" + b"zF\xa9\x04\xa2PZ\\\xe5\xff\xac\xa0\x93xV\x93\x9d\x0e\xe8?\x9d\xa1w" + b":m~\x92a\x98I\xdf\xe8\xf3\xae\xed\xf5\xfd(" + b"rj\xb2\x86\n7@\xe6=\xed\x1b\x91\xe3No\xdf:c\\_\xb4z\xdej\x98\xf4G" + b"\xaeES)\xcb\xbeu\xb7\xec\x00t1W(" + b"J\x85L\xa7\xf8B\x14\xc4w\x99\xbe~\xef\xabp\xf3\x02\xbf!\xd4\xca" + b"\xc1U\x13\xf2\xc0k&\xb3V\xc1Bu:\x1f\x910k&*\x84\\r\x1f0\xdc\xd8" + b"\x05Kg\xc1e\x125[" + b"q\x9b\xe9;Hb\x19S\xfcP\xb3\xa7\x88\xcb)P\x1c\xe1\x06F\xc3\xeb\x08" + b"\xbd" +) diff --git a/monkey/tests/unit_tests/monkey_island/cc/services/utils/test_config_encryption.py b/monkey/tests/unit_tests/monkey_island/cc/services/utils/test_config_encryption.py index 87996756f..8f3ba4cbf 100644 --- a/monkey/tests/unit_tests/monkey_island/cc/services/utils/test_config_encryption.py +++ b/monkey/tests/unit_tests/monkey_island/cc/services/utils/test_config_encryption.py @@ -2,13 +2,18 @@ import json import os import pytest +from tests.unit_tests.monkey_island.cc.services.utils.cyphertexts_for_encryption_test import ( + MALFORMED_CYPHER_TEXT_CORRUPTED, + MALFORMED_CYPHER_TEXT_TOO_SHORT, +) +from common.utils.exceptions import InvalidCredentialsError from monkey_island.cc.services.utils.config_encryption import decrypt_config, encrypt_config MONKEY_CONFIGS_DIR_PATH = "monkey_configs" STANDARD_PLAINTEXT_MONKEY_CONFIG_FILENAME = "monkey_config_standard.json" - PASSWORD = "hello123" +INCORRECT_PASSWORD = "goodbye321" @pytest.fixture @@ -22,5 +27,21 @@ def plaintext_config(data_for_tests_dir): def test_encrypt_decrypt_config(plaintext_config): encrypted_config = encrypt_config(plaintext_config, PASSWORD) - encrypted_config = encrypted_config assert decrypt_config(encrypted_config, PASSWORD) == plaintext_config + + +def test_encrypt_decrypt_config__wrong_password(plaintext_config): + encrypted_config = encrypt_config(plaintext_config, PASSWORD) + with pytest.raises(InvalidCredentialsError): + decrypt_config(encrypted_config, INCORRECT_PASSWORD) + + +def test_encrypt_decrypt_config__malformed(): + with pytest.raises(ValueError): + decrypt_config(MALFORMED_CYPHER_TEXT_TOO_SHORT, PASSWORD) + with pytest.raises(ValueError): + decrypt_config(MALFORMED_CYPHER_TEXT_CORRUPTED, PASSWORD) + + +def test_decrypt_config__unencrypted(plaintext_config): + assert plaintext_config == decrypt_config(plaintext_config, PASSWORD) diff --git a/vulture_allowlist.py b/vulture_allowlist.py index 5d91f94fd..8ee281d60 100644 --- a/vulture_allowlist.py +++ b/vulture_allowlist.py @@ -169,6 +169,7 @@ build_from_config_file_contents # unused method 'build_from_config_file_content mock_port_in_env_singleton # monkey\tests\unit_tests\monkey_island\cc\services\test_config.py:26: ISLAND # unused variable (monkey/monkey_island/cc/services/utils/node_states.py:14) MONKEY_LINUX_RUNNING # unused variable (monkey/monkey_island/cc/services/utils/node_states.py:26) +import_status # \monkey_island\cc\resources\configuration_import.py:19 # these are not needed for it to work, but may be useful extra information to understand what's going on WINDOWS_PBA_TYPE # unused variable (monkey/monkey_island/cc/resources/pba_file_upload.py:23)