Improved exceptions thrown in configuration decryption and unit tests.

This commit is contained in:
VakarisZ 2021-06-02 12:04:33 +03:00
parent 321dd2c55e
commit 9fcfaac781
4 changed files with 248 additions and 8 deletions

View File

@ -1,14 +1,17 @@
import base64 import base64
import io import io
import json import json
from typing import Dict import logging
from typing import Dict, Union
import pyAesCrypt import pyAesCrypt
from common.utils.exceptions import FailedDecryption, NoCredentialsError from common.utils.exceptions import InvalidCredentialsError, NoCredentialsError
BUFFER_SIZE = pyAesCrypt.crypto.bufferSizeDef BUFFER_SIZE = pyAesCrypt.crypto.bufferSizeDef
logger = logging.getLogger(__name__)
def encrypt_config(config: Dict, password: str) -> str: def encrypt_config(config: Dict, password: str) -> str:
plaintext_config_stream = io.BytesIO(json.dumps(config).encode()) 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()) ciphertext_b64 = base64.b64encode(ciphertext_config_stream.getvalue())
logger.info("Configuration encrypted.")
return ciphertext_b64.decode() 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: if not password:
raise NoCredentialsError 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) ciphertext_config_stream = io.BytesIO(cyphertext)
dec_plaintext_config_stream = io.BytesIO() dec_plaintext_config_stream = io.BytesIO()
@ -43,7 +51,11 @@ def decrypt_config(cyphertext: str, password: str) -> Dict:
len_ciphertext_config_stream, len_ciphertext_config_stream,
) )
except ValueError as ex: 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")) plaintext_config = json.loads(dec_plaintext_config_stream.getvalue().decode("utf-8"))
return plaintext_config return plaintext_config

View File

@ -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\xb8<SeV\xfd\x89\x15\xbd\x85\x14d'\xd1<\xc6\xd0\xe9"
b"\r\xc0r\x05\xe7\xb3\x190\x99\xae*\xfa\xc0\xcam2\xe2\xf4ZK\xe6\x99"
b"\xc5s1Y\x9f\x05\xdc\xdb\xb2\xf3;\xf8\r\xdd\xe1A\x9b/|\x07\x08\xb9P"
b'+W\xe1c]\x93\x12\xaa{"ra\xf08['
b"R\xec\xe8m\x8a\xdf\xc6z\x84\xdd4\xb87\xc4\x9d\x9e\xd0\xde\x10\x00"
b"\xd1\x00\xb8\xae\xb8#uQ=c\x12\x1c\xef\x96\xec\x1a\xfe.I\x14\x8f"
b"\xf8\x07\xb8E<\xac\xf5q\xb6\xcd\x94v\xe7\x86\xa8\r\xdf\xdb\x93\x9a"
b"\x9c\xfb\xbf^\x9eg\xa2\xb9\xb1\x8e\xbe*\xd5\xea\xcd\xc1\xfbt\xc0"
b"\x98t\xfa>U{"
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\\<Dr\xea\x94\xd8*!\x15\x80!\x8b\xb57\xe9\xb9cW\xdc\x0c\xf9"
b"\x8f\xdfUe4\xa95\xba\xe0B\x1c\xf4v\x11\xd0u\x0c\x13t\xbc\xec>\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<j\xe4\t\x0b\x14\xb6.\xc4^\\\x9d\x1axJ*\xcc\x9b\xce\xff "
b"\xa4G\x03\xd7_#\x87Q\x1b\xce\x99\xbb\xf5\x114\x82\x0b\xe5,"
b"\x15\xc6\x1b\xb3\xeer#6\xd9\x1f\x14\x7f\xba\xd57\xfe\x06\xf5\x01"
b'\x03\xed\xda\x81"_\xb6o\xf2 '
b'|!r\x9b\xdd\xd0\xb7%\xf4&\x8b\x81\xd08L\xf8\xc1"U|g\xf3\xc2\x98'
b"\x10;!b\x8e\xebF\xf2\x08\xc3\xafZ\x9b\xed\x81\x9eg\x1e\x98G@\xb3"
b"\xc2\xdb\xe07\x9e\xa9\xd3\x1a(\xc5\xca\x95\x89\x01&\xfb^\xe6$,"
b"\x14o#\xba\x85\xcc?O9 "
b"s\x14p\x02\xf8\xd3v\xeb.+/L\xde\x05\xcd\xb4\xae\x81A\x9a\xb9\xc9"
b"\x1a+<\x81\xcew\xd1\xa9~3c]\xbe;>\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\xe5R<O\x18\xc1f\xee}\xef\xbd"
b"\xc5\xe0("
b"VjO\x874+\xf2X\x0fWTo\x82\\\x9d/_\x894\xfb6#\xa5\xb4`\xe7\x90O\xf8"
b"\xad\xc4R\x97\xe1\x18h\xe5\xb40.\xf7Y\xf3Bp\x82\xf3\x13\xdc\x06"
b"/1yB\xe5\xbc_\x016\x00\xf8\xd22\x80\x9d\x94\x08)\xd2\x8d\xf3s2\xa1"
b"\x88\xe7\xfbu3Ak\x98\xf3\xf0\x89\x80\xc1\xe1\xa6y\xb4\xe6\xb9\xce"
b"\x08&\xef\xd0\x10\xd59\xa3!YS\x9d\x98\x1b\x08\xd7\x8f\xdcA\xb9\xfa"
b"\xf6(\xb7Xf\xbbB7\x1a\x9e\xab\x1f\xd7\x01\x9a7\xbe\xe5a\x17\xd2"
b"\x9e1+tS "
b"\x12\x7f\xc7\xaf\x1d\x95f\xbc\x83\xbb\x86\xff\xac\x8ap\xd0y\xaf$r"
b'\x08sh\x81\xd4\x85\xfe\x04\xe3-\xfe?\xa1"\x83m\x19\\u\x13~\xfc\x12'
b"\xd3\xa8\x88%\xc9\xc7G\xa2.OH\x133`K)_\xe3\xcd\xfaC*R\xaf\x16\xcf"
b"\xb9\x0f\xb7\xb8\xd0\x95\x91\x11\x89o\x16\xdd{"
b"E\x01\xa6\xa2\x8d\x8b\xd2\x877`\xd0\xacB\x93e5C\x9d\xcer\x16\xa6"
b'\x80\xdfx\x0f\x15\xf0\xc9\x9c\xaey\x8b\x13\x1dE"\xe8^\x9f\x96n'
b";\xa8\xf9\x08\x93\xa8\x1fQ\xfa\xa5e\xa2e\xd9\xed\xdfH\x1f\x99\xe6t"
b";R\xe5=\xff\x81\xab\xd0\x8d\x85\xc8\x9f\x82\x11 "
b"\x03\xa0\x92\xb0\x17\xeb\xda\x14\xeb\x11\xd9\x08b\x0b\xba\x86\xb3U"
b"\xf2\xf3\xbdr\t\xc6\x0f\xa8\xd5\x98\xf7\xe5N\xc6\x8d\x8c\x11\xe36"
b"\x8c\x10/\x7fG\xd5\x96\x1f\x9d\xdfm\xbd\xcf\x9a:\x0ec\x1d\x88\x94s"
b"\x90A\x94\xd0\xde\xe9\xfd\x7f\xf3\xb2\x0b\x16\xeb\x15v "
b"A\xa6A\xa9:\xaa>q\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"
)

View File

@ -2,13 +2,18 @@ import json
import os import os
import pytest 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 from monkey_island.cc.services.utils.config_encryption import decrypt_config, encrypt_config
MONKEY_CONFIGS_DIR_PATH = "monkey_configs" MONKEY_CONFIGS_DIR_PATH = "monkey_configs"
STANDARD_PLAINTEXT_MONKEY_CONFIG_FILENAME = "monkey_config_standard.json" STANDARD_PLAINTEXT_MONKEY_CONFIG_FILENAME = "monkey_config_standard.json"
PASSWORD = "hello123" PASSWORD = "hello123"
INCORRECT_PASSWORD = "goodbye321"
@pytest.fixture @pytest.fixture
@ -22,5 +27,21 @@ def plaintext_config(data_for_tests_dir):
def test_encrypt_decrypt_config(plaintext_config): def test_encrypt_decrypt_config(plaintext_config):
encrypted_config = encrypt_config(plaintext_config, PASSWORD) encrypted_config = encrypt_config(plaintext_config, PASSWORD)
encrypted_config = encrypted_config
assert decrypt_config(encrypted_config, PASSWORD) == plaintext_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)

View File

@ -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: 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) 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) 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 # 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) WINDOWS_PBA_TYPE # unused variable (monkey/monkey_island/cc/resources/pba_file_upload.py:23)