Module rugged.tuf.validators.key

Validator for Rugged TUF repository keys.

In the context of this validation, and "expected key" is a key defined in the keys dictionary in config. An "unexpected key" is any key found on disk that is not defined in config.

Classes

class KeyValidator
Expand source code
class KeyValidator():

    def validate_config_keys(self) -> None:
        """ Check that all configured keys exist on disk. """
        key_manager = KeyManager()
        for role_name, key_names in config['keys'].get().items():
            for key_name in key_names:
                if not key_manager.load_signing_key(key_name, role_name):
                    error = f"The '{key_name}' signing key configured for the '{role_name}' role was not found "\
                            "in storage."
                    raise RuggedKeyError(error)
                if not key_manager.load_verification_key(key_name, role_name):
                    error = f"The '{key_name}' verification key configured for the '{role_name}' role was not "\
                            "found in storage."
                    raise RuggedKeyError(error)
            log.debug(f"All configured keys for '{role_name}' role exist in storage.")

    def validate_storage_keys(self) -> None:
        """ Check that only configured keys exist on disk. """
        for role_name, key_names in KeyManager().find_keys().items():
            for key_name in key_names:
                if key_name not in config['keys'].get()[role_name]:
                    error = f"The '{key_name}' key for the '{role_name}' role found in storage does not exist in "\
                            "configuration."
                    raise RuggedKeyError(error)
            log.debug(f"Only configured keys for '{role_name}' role exist in storage.")

    def validate_repo_keys(self) -> None:
        """ Check that keys in the repository match the keys on disk. """
        # @TODO: Support HSM-based root keys
        repo = RuggedRepository()
        # @TODO: Perhaps only load Root metadata, to minimize memory usage.
        repo.load()
        keys_from_root_metadata = repo.roles['root'].signed.keys
        for key_index, key in repo.keys.items():
            key_index_parts = key_index.split(RUGGED_KEY_INDEX_DELIMITER)
            role_name = key_index_parts[0]
            key_name = key_index_parts[1]
            if key['keyid'] not in keys_from_root_metadata.keys():
                raise RuggedKeyError(f"Root metadata is missing '{key_name}' key for '{role_name}' role.")
            del keys_from_root_metadata[key['keyid']]
            log.debug(f"Root metadata contains the '{key_name}' key for the '{role_name}' role.")
        log.debug("Root metadata contains all configured keys.")
        if keys_from_root_metadata:
            for keyid in keys_from_root_metadata.keys():
                log.error(f"Root metadata contains unexpected key with ID: {keyid}")
            raise RuggedKeyError("Root metadata contains an unexpected key.")
        log.debug("Root metadata contains only configured keys.")

Methods

def validate_config_keys(self) ‑> None
Expand source code
def validate_config_keys(self) -> None:
    """ Check that all configured keys exist on disk. """
    key_manager = KeyManager()
    for role_name, key_names in config['keys'].get().items():
        for key_name in key_names:
            if not key_manager.load_signing_key(key_name, role_name):
                error = f"The '{key_name}' signing key configured for the '{role_name}' role was not found "\
                        "in storage."
                raise RuggedKeyError(error)
            if not key_manager.load_verification_key(key_name, role_name):
                error = f"The '{key_name}' verification key configured for the '{role_name}' role was not "\
                        "found in storage."
                raise RuggedKeyError(error)
        log.debug(f"All configured keys for '{role_name}' role exist in storage.")

Check that all configured keys exist on disk.

def validate_repo_keys(self) ‑> None
Expand source code
def validate_repo_keys(self) -> None:
    """ Check that keys in the repository match the keys on disk. """
    # @TODO: Support HSM-based root keys
    repo = RuggedRepository()
    # @TODO: Perhaps only load Root metadata, to minimize memory usage.
    repo.load()
    keys_from_root_metadata = repo.roles['root'].signed.keys
    for key_index, key in repo.keys.items():
        key_index_parts = key_index.split(RUGGED_KEY_INDEX_DELIMITER)
        role_name = key_index_parts[0]
        key_name = key_index_parts[1]
        if key['keyid'] not in keys_from_root_metadata.keys():
            raise RuggedKeyError(f"Root metadata is missing '{key_name}' key for '{role_name}' role.")
        del keys_from_root_metadata[key['keyid']]
        log.debug(f"Root metadata contains the '{key_name}' key for the '{role_name}' role.")
    log.debug("Root metadata contains all configured keys.")
    if keys_from_root_metadata:
        for keyid in keys_from_root_metadata.keys():
            log.error(f"Root metadata contains unexpected key with ID: {keyid}")
        raise RuggedKeyError("Root metadata contains an unexpected key.")
    log.debug("Root metadata contains only configured keys.")

Check that keys in the repository match the keys on disk.

def validate_storage_keys(self) ‑> None
Expand source code
def validate_storage_keys(self) -> None:
    """ Check that only configured keys exist on disk. """
    for role_name, key_names in KeyManager().find_keys().items():
        for key_name in key_names:
            if key_name not in config['keys'].get()[role_name]:
                error = f"The '{key_name}' key for the '{role_name}' role found in storage does not exist in "\
                        "configuration."
                raise RuggedKeyError(error)
        log.debug(f"Only configured keys for '{role_name}' role exist in storage.")

Check that only configured keys exist on disk.