int cmd_interface_system_process_request()

in core/cmd_interface/cmd_interface_system.c [21:284]


int cmd_interface_system_process_request (const struct cmd_interface *intf,
	struct cmd_interface_msg *request)
{
	const struct cmd_interface_system *interface = (const struct cmd_interface_system*) intf;
	uint8_t command_id;
	uint8_t command_set;
	int status;

	status = cmd_interface_process_cerberus_protocol_message (&interface->base, request,
		&command_id, &command_set, true, true);
	if (status != 0) {
		return status;
	}

	switch (command_id) {
		case CERBERUS_PROTOCOL_GET_FW_VERSION:
			status = cerberus_protocol_get_fw_version (interface->fw_version, request);
			break;

		case CERBERUS_PROTOCOL_GET_DIGEST:
			status = cerberus_protocol_get_certificate_digest (interface->attestation,
				interface->base.session, request);
			break;

		case CERBERUS_PROTOCOL_GET_CERTIFICATE:
			status = cerberus_protocol_get_certificate (interface->attestation, request);
			break;

		case CERBERUS_PROTOCOL_ATTESTATION_CHALLENGE:
			status = cerberus_protocol_get_challenge_response (interface->attestation,
				interface->base.session, request);
			break;

		case CERBERUS_PROTOCOL_GET_LOG_INFO:
			status = cerberus_protocol_get_log_info (interface->pcr_store, request);
			break;

		case CERBERUS_PROTOCOL_READ_LOG:
			status = cerberus_protocol_log_read (interface->pcr_store, interface->hash, request);
			break;

		case CERBERUS_PROTOCOL_CLEAR_LOG:
			status = cerberus_protocol_log_clear (interface->background, request);
			break;

		case CERBERUS_PROTOCOL_GET_PFM_ID: {
			const struct pfm_manager *pfm_mgr[2] = {
				interface->pfm_manager_0, interface->pfm_manager_1
			};

			status = cerberus_protocol_get_pfm_id (pfm_mgr, 2, request);
			break;
		}

		case CERBERUS_PROTOCOL_GET_PFM_SUPPORTED_FW: {
			const struct pfm_manager *pfm_mgr[2] = {
				interface->pfm_manager_0, interface->pfm_manager_1
			};

			status = cerberus_protocol_get_pfm_fw (pfm_mgr, 2, request);
			break;
		}

		case CERBERUS_PROTOCOL_INIT_PFM_UPDATE: {
			const struct manifest_cmd_interface *pfm_cmd[2] = {interface->pfm_0, interface->pfm_1};

			status = cerberus_protocol_pfm_update_init (pfm_cmd, 2, request);
			break;
		}

		case CERBERUS_PROTOCOL_PFM_UPDATE: {
			const struct manifest_cmd_interface *pfm_cmd[2] = {interface->pfm_0, interface->pfm_1};

			status = cerberus_protocol_pfm_update (pfm_cmd, 2, request);
			break;
		}

		case CERBERUS_PROTOCOL_COMPLETE_PFM_UPDATE: {
			const struct manifest_cmd_interface *pfm_cmd[2] = {interface->pfm_0, interface->pfm_1};

			status = cerberus_protocol_pfm_update_complete (pfm_cmd, 2,	request);
			break;
		}

		case CERBERUS_PROTOCOL_GET_CFM_ID:
			status = cerberus_protocol_get_cfm_id (interface->cfm_manager, request);
			break;

		case CERBERUS_PROTOCOL_INIT_CFM_UPDATE:
			status = cerberus_protocol_cfm_update_init (interface->cfm, request);
			break;

		case CERBERUS_PROTOCOL_CFM_UPDATE:
			status = cerberus_protocol_cfm_update (interface->cfm, request);
			break;

		case CERBERUS_PROTOCOL_COMPLETE_CFM_UPDATE:
			status = cerberus_protocol_cfm_update_complete (interface->cfm, request);
			break;

		case CERBERUS_PROTOCOL_GET_PCD_ID:
			status = cerberus_protocol_get_pcd_id (interface->pcd_manager, request);
			break;

		case CERBERUS_PROTOCOL_INIT_PCD_UPDATE:
			status = cerberus_protocol_pcd_update_init (interface->pcd, request);
			break;

		case CERBERUS_PROTOCOL_PCD_UPDATE:
			status = cerberus_protocol_pcd_update (interface->pcd, request);
			break;

		case CERBERUS_PROTOCOL_COMPLETE_PCD_UPDATE:
			status = cerberus_protocol_pcd_update_complete (interface->pcd, request);
			break;

		case CERBERUS_PROTOCOL_GET_PCD_SUPPORTED_COMPONENT_IDS:
			status = cerberus_protocol_get_pcd_component_ids (interface->pcd_manager, request);
			break;

		case CERBERUS_PROTOCOL_GET_CFM_SUPPORTED_COMPONENT_IDS:
			status = cerberus_protocol_get_cfm_component_ids (interface->cfm_manager, request);
			break;

		case CERBERUS_PROTOCOL_INIT_FW_UPDATE:
			status = cerberus_protocol_fw_update_init (interface->control, request);
			break;

		case CERBERUS_PROTOCOL_FW_UPDATE:
			status = cerberus_protocol_fw_update (interface->control, request);
			break;

		case CERBERUS_PROTOCOL_COMPLETE_FW_UPDATE:
			status = cerberus_protocol_fw_update_start (interface->control, request);
			break;

		case CERBERUS_PROTOCOL_GET_UPDATE_STATUS: {
			const struct manifest_cmd_interface *pfm_cmd[2] = {interface->pfm_0, interface->pfm_1};
			struct host_processor *host[2] = {interface->host_0, interface->host_1};

			status = cerberus_protocol_get_update_status (interface->control, 2, pfm_cmd,
				interface->cfm, interface->pcd, host, interface->recovery_cmd_0,
				interface->recovery_cmd_1, interface->background, request);
			break;
		}

		case CERBERUS_PROTOCOL_GET_EXT_UPDATE_STATUS:
			status = cerberus_protocol_get_extended_update_status (interface->control,
				interface->recovery_manager_0, interface->recovery_manager_1,
				interface->recovery_cmd_0, interface->recovery_cmd_1, request);
			break;

		case CERBERUS_PROTOCOL_GET_DEVICE_CAPABILITIES:
			status = cerberus_protocol_get_device_capabilities (interface->device_manager, request);
			break;

		case CERBERUS_PROTOCOL_RESET_COUNTER:
			status = cerberus_protocol_reset_counter (interface->cmd_device, request);
			break;

		case CERBERUS_PROTOCOL_UNSEAL_MESSAGE:
			status = cerberus_protocol_unseal_message (interface->background, request);
			break;

		case CERBERUS_PROTOCOL_UNSEAL_MESSAGE_RESULT:
			status = cerberus_protocol_unseal_message_result (interface->background, request);
			break;

		case CERBERUS_PROTOCOL_EXPORT_CSR:
			status = cerberus_protocol_export_csr (interface->riot, request);
			break;

		case CERBERUS_PROTOCOL_IMPORT_CA_SIGNED_CERT:
			status = cerberus_protocol_import_ca_signed_cert (interface->riot,
				interface->background, request);
			break;

		case CERBERUS_PROTOCOL_GET_SIGNED_CERT_STATE:
			status = cerberus_protocol_get_signed_cert_state (interface->background, request);
			break;

		case CERBERUS_PROTOCOL_RESET_CONFIG:
			status = cerberus_protocol_reset_config (interface->auth, interface->background,
				request);
			break;

		case CERBERUS_PROTOCOL_PREPARE_RECOVERY_IMAGE:
			status = cerberus_protocol_prepare_recovery_image (interface->recovery_cmd_0,
				interface->recovery_cmd_1, request);
			break;

		case CERBERUS_PROTOCOL_UPDATE_RECOVERY_IMAGE:
			status = cerberus_protocol_update_recovery_image (interface->recovery_cmd_0,
				interface->recovery_cmd_1, request);
			break;

		case CERBERUS_PROTOCOL_ACTIVATE_RECOVERY_IMAGE:
			status = cerberus_protocol_activate_recovery_image (interface->recovery_cmd_0,
				interface->recovery_cmd_1, request);
			break;

		case CERBERUS_PROTOCOL_GET_RECOVERY_IMAGE_VERSION:
			status = cerberus_protocol_get_recovery_image_id (interface->recovery_manager_0,
				interface->recovery_manager_1, request);
			break;

		case CERBERUS_PROTOCOL_GET_HOST_STATE:
			status = cerberus_protocol_get_host_reset_status (interface->host_0_ctrl,
				interface->host_1_ctrl, request);
			break;

		case CERBERUS_PROTOCOL_GET_DEVICE_INFO:
			status = cerberus_protocol_get_device_info (interface->cmd_device, request);
			break;

		case CERBERUS_PROTOCOL_GET_DEVICE_ID:
			status = cerberus_protocol_get_device_id (&interface->device_id, request);
			break;

		case CERBERUS_PROTOCOL_GET_ATTESTATION_DATA:
			status = cerberus_protocol_get_attestation_data (interface->pcr_store, request);
			break;

		case CERBERUS_PROTOCOL_GET_ATTESTATION_SUMMARY:
			status = cerberus_protocol_get_attestation_summary (interface->device_manager, request);
			break;

#ifdef CMD_ENABLE_HEAP_STATS
		case CERBERUS_PROTOCOL_DIAG_HEAP_USAGE:
			return cerberus_protocol_heap_stats (interface->cmd_device, request);
#endif

#ifdef CMD_SUPPORT_ENCRYPTED_SESSIONS
		case CERBERUS_PROTOCOL_EXCHANGE_KEYS:
			status = cerberus_protocol_key_exchange (interface->base.session, request,
				request->is_encrypted);
			break;

		case CERBERUS_PROTOCOL_SESSION_SYNC:
			status = cerberus_protocol_session_sync (interface->base.session, request,
				request->is_encrypted);
			break;
#endif

#ifdef CMD_SUPPORT_DEBUG_COMMANDS
		case CERBERUS_PROTOCOL_DEBUG_GET_ATTESTATION_STATE:
			status = cerberus_protocol_get_attestation_state (interface->device_manager, request);
			break;

		case CERBERUS_PROTOCOL_DEBUG_FILL_LOG:
			status = cerberus_protocol_debug_fill_log (interface->background, request);
			break;
#endif

		default:
			return CMD_HANDLER_UNKNOWN_REQUEST;
	}

	if (status == 0) {
		status = cmd_interface_prepare_response (&interface->base, request);
	}

	return status;
}