From 9afd5b19709ba98c0c35c2db691fe5f0bfd42459 Mon Sep 17 00:00:00 2001 From: Sergi Delgado Segura Date: Fri, 10 Apr 2020 13:31:57 +0200 Subject: [PATCH] Gets rid of cli_pk file The public key can be generated from the private, and the latter has to be loaded anyway, so there's no point storing both --- cli/__init__.py | 1 - cli/teos_cli.py | 64 ++++++++++++++++++++++--------------------------- 2 files changed, 29 insertions(+), 36 deletions(-) diff --git a/cli/__init__.py b/cli/__init__.py index 9316550..5e3f3ac 100644 --- a/cli/__init__.py +++ b/cli/__init__.py @@ -10,7 +10,6 @@ DEFAULT_CONF = { "API_PORT": {"value": 9814, "type": int}, "LOG_FILE": {"value": "teos_cli.log", "type": str, "path": True}, "APPOINTMENTS_FOLDER_NAME": {"value": "appointment_receipts", "type": str, "path": True}, - "CLI_PUBLIC_KEY": {"value": "cli_pk.der", "type": str, "path": True}, "CLI_PRIVATE_KEY": {"value": "cli_sk.der", "type": str, "path": True}, "TEOS_PUBLIC_KEY": {"value": "teos_pk.der", "type": str, "path": True}, } diff --git a/cli/teos_cli.py b/cli/teos_cli.py index c53dac2..d6dd84b 100644 --- a/cli/teos_cli.py +++ b/cli/teos_cli.py @@ -26,30 +26,30 @@ from common.tools import is_256b_hex_str, is_locator, compute_locator, is_compre logger = Logger(actor="Client", log_name_prefix=LOG_PREFIX) -def register(compressed_pk, teos_url): +def register(user_id, teos_url): """ Registers the user to the tower. Args: - compressed_pk (:obj:`str`): a 33-byte hex-encoded compressed public key representing the user. + user_id (:obj:`str`): a 33-byte hex-encoded compressed public key representing the user. teos_url (:obj:`str`): the teos base url. Returns: :obj:`dict`: a dictionary containing the tower response if the registration succeeded. Raises: - :obj:`InvalidParameter `: if `compressed_pk` is invalid. + :obj:`InvalidParameter `: if `user_id` is invalid. :obj:`ConnectionError`: if the client cannot connect to the tower. :obj:`TowerResponseError `: if the tower responded with an error, or the response was invalid. """ - if not is_compressed_pk(compressed_pk): + if not is_compressed_pk(user_id): raise InvalidParameter("The cli public key is not valid") # Send request to the server. register_endpoint = "{}/register".format(teos_url) - data = {"public_key": compressed_pk} + data = {"public_key": user_id} logger.info("Registering in the Eye of Satoshi") response = process_post_response(post_request(data, register_endpoint)) @@ -57,7 +57,7 @@ def register(compressed_pk, teos_url): return response -def add_appointment(appointment_data, cli_sk, teos_pk, teos_url): +def add_appointment(appointment_data, cli_sk, teos_id, teos_url): """ Manages the add_appointment command. @@ -73,7 +73,7 @@ def add_appointment(appointment_data, cli_sk, teos_pk, teos_url): Args: appointment_data (:obj:`dict`): a dictionary containing the appointment data. cli_sk (:obj:`PrivateKey`): the client's private key. - teos_pk (:obj:`PublicKey`): the tower's public key. + teos_id (:obj:`str`): the tower's compressed public key. teos_url (:obj:`str`): the teos base url. Returns: @@ -119,7 +119,7 @@ def add_appointment(appointment_data, cli_sk, teos_pk, teos_url): raise TowerResponseError("The response does not contain the signature of the appointment") rpk = Cryptographer.recover_pk(appointment.serialize(), signature) - if not teos_pk != Cryptographer.get_compressed_pk(rpk): + if teos_id != Cryptographer.get_compressed_pk(rpk): raise TowerResponseError("The returned appointment's signature is invalid") logger.info("Appointment accepted and signed by the Eye of Satoshi") @@ -128,14 +128,14 @@ def add_appointment(appointment_data, cli_sk, teos_pk, teos_url): return appointment, signature -def get_appointment(locator, cli_sk, teos_pk, teos_url): +def get_appointment(locator, cli_sk, teos_id, teos_url): """ Gets information about an appointment from the tower. Args: locator (:obj:`str`): the appointment locator used to identify it. cli_sk (:obj:`PrivateKey`): the client's private key. - teos_pk (:obj:`PublicKey`): the tower's public key. + teos_id (:obj:`PublicKey`): the tower's compressed public key. teos_url (:obj:`str`): the teos base url. Returns: @@ -149,7 +149,7 @@ def get_appointment(locator, cli_sk, teos_pk, teos_url): response was invalid. """ - # FIXME: All responses from the tower should be signed. Not using teos_pk atm. + # FIXME: All responses from the tower should be signed. Not using teos_id atm. if not is_locator(locator): raise InvalidParameter("The provided locator is not valid", locator=locator) @@ -199,18 +199,17 @@ def get_all_appointments(teos_url): return None -def load_keys(teos_pk_path, cli_sk_path, cli_pk_path): +def load_keys(teos_pk_path, cli_sk_path): """ Loads all the keys required so sign, send, and verify the appointment. Args: teos_pk_path (:obj:`str`): path to the tower public key file. cli_sk_path (:obj:`str`): path to the client private key file. - cli_pk_path (:obj:`str`): path to the client public key file. Returns: - :obj:`tuple`: a three-item tuple containing a ``PrivateKey``, a ``PublicKey`` and a ``str`` - representing the tower pk, user sk and user compressed pk respectively. + :obj:`tuple`: a three-item tuple containing a ``str``, a ``PrivateKey`` and a ``str`` + representing the tower id (compressed pk), user sk and user id (compressed pk) respectively. Raises: :obj:`InvalidKey `: if any of the keys is invalid or cannot be loaded. @@ -222,30 +221,27 @@ def load_keys(teos_pk_path, cli_sk_path, cli_pk_path): if not cli_sk_path: raise InvalidKey("Client's private key file not found. Please check your settings") - if not cli_pk_path: - raise InvalidKey("Client's public key file not found. Please check your settings") - try: teos_pk_der = Cryptographer.load_key_file(teos_pk_path) - teos_pk = PublicKey(teos_pk_der) + teos_id = Cryptographer.get_compressed_pk(PublicKey(teos_pk_der)) - except ValueError: - raise InvalidKey("TEOS public key is invalid or cannot be parsed") + except (InvalidParameter, InvalidKey, ValueError): + raise InvalidKey("TEOS public key cannot be loaded") - cli_sk_der = Cryptographer.load_key_file(cli_sk_path) - cli_sk = Cryptographer.load_private_key_der(cli_sk_der) + try: + cli_sk_der = Cryptographer.load_key_file(cli_sk_path) + cli_sk = Cryptographer.load_private_key_der(cli_sk_der) - if cli_sk is None: + except (InvalidParameter, InvalidKey): raise InvalidKey("Client private key is invalid or cannot be parsed") try: - cli_pk_der = Cryptographer.load_key_file(cli_pk_path) - compressed_cli_pk = Cryptographer.get_compressed_pk(PublicKey(cli_pk_der)) + client_id = Cryptographer.get_compressed_pk(cli_sk.public_key) - except ValueError: - raise InvalidKey("Client public key is invalid or cannot be parsed") + except (InvalidParameter, InvalidKey): + raise InvalidKey("Client public key cannot be loaded") - return teos_pk, cli_sk, compressed_cli_pk + return teos_id, cli_sk, client_id def post_request(data, endpoint): @@ -406,17 +402,15 @@ def main(command, args, command_line_conf): teos_url = "http://" + teos_url try: - teos_pk, cli_sk, compressed_cli_pk = load_keys( - config.get("TEOS_PUBLIC_KEY"), config.get("CLI_PRIVATE_KEY"), config.get("CLI_PUBLIC_KEY") - ) + teos_id, cli_sk, client_id = load_keys(config.get("TEOS_PUBLIC_KEY"), config.get("CLI_PRIVATE_KEY")) if command == "register": - register_data = register(compressed_cli_pk, teos_url) + register_data = register(client_id, teos_url) logger.info("Registration succeeded. Available slots: {}".format(register_data.get("available_slots"))) if command == "add_appointment": appointment_data = parse_add_appointment_args(args) - appointment, signature = add_appointment(appointment_data, cli_sk, teos_pk, teos_url) + appointment, signature = add_appointment(appointment_data, cli_sk, teos_id, teos_url) save_appointment_receipt(appointment.to_dict(), signature, config.get("APPOINTMENTS_FOLDER_NAME")) elif command == "get_appointment": @@ -429,7 +423,7 @@ def main(command, args, command_line_conf): if arg_opt in ["-h", "--help"]: sys.exit(help_get_appointment()) - appointment_data = get_appointment(arg_opt, cli_sk, teos_pk, teos_url) + appointment_data = get_appointment(arg_opt, cli_sk, teos_id, teos_url) if appointment_data: print(appointment_data)