int cmd_interface_spdm_process_request()

in core/spdm/cmd_interface_spdm_responder.c [21:132]


int cmd_interface_spdm_process_request (const struct cmd_interface *intf,
	struct cmd_interface_msg *request)
{
	const struct cmd_interface_spdm_responder *spdm_responder =
		(const struct cmd_interface_spdm_responder*) intf;
	uint8_t req_code;
	int status = 0;
	struct spdm_secure_session_manager *session_manager;

	if ((spdm_responder == NULL) || (request == NULL)) {
		status = CMD_HANDLER_SPDM_RESPONDER_INVALID_ARGUMENT;
		goto exit;
	}
	session_manager = spdm_responder->session_manager;

	/* Reset the validity of the last session id. */
	if (session_manager != NULL) {
		session_manager->reset_last_session_id_validity (session_manager);
	}

	/* If the request is secure, decode it. */
	if (request->is_encrypted == true) {
		if (session_manager == NULL) {
			status = CMD_HANDLER_SPDM_RESPONDER_INVALID_REQUEST;
			goto exit;
		}

		status = session_manager->decode_secure_message (session_manager, request);
		if (status != 0) {
			/* Note: Response is not being encoded in case of a decode failure. */
			spdm_generate_error_response (request, 0, SPDM_ERROR_DECRYPT_ERROR, 0x00, NULL, 0, 0,
				status);
			status = 0;
			goto exit;
		}
	}

	/* Pre-process the request and get the command Id. */
	status = spdm_get_command_id (request, &req_code);
	if (status != 0) {
		goto exit;
	}

	switch (req_code) {
		case SPDM_REQUEST_GET_VERSION:
			status = spdm_get_version (spdm_responder, request);
			break;

		case SPDM_REQUEST_GET_CAPABILITIES:
			status = spdm_get_capabilities (spdm_responder, request);
			break;

		case SPDM_REQUEST_NEGOTIATE_ALGORITHMS:
			status = spdm_negotiate_algorithms (spdm_responder, request);
			break;

		case SPDM_REQUEST_GET_DIGESTS:
			status = spdm_get_digests (spdm_responder, request);
			break;

		case SPDM_REQUEST_GET_CERTIFICATE:
			status = spdm_get_certificate (spdm_responder, request);
			break;

		case SPDM_REQUEST_CHALLENGE:
			status = spdm_challenge (spdm_responder, request);
			break;

		case SPDM_REQUEST_GET_MEASUREMENTS:
			status = spdm_get_measurements (spdm_responder, request);
			break;

		case SPDM_REQUEST_KEY_EXCHANGE:
			status = spdm_key_exchange (spdm_responder, request);
			break;

		case SPDM_REQUEST_FINISH:
			status = spdm_finish (spdm_responder, request);
			break;

		case SPDM_REQUEST_END_SESSION:
			status = spdm_end_session (spdm_responder, request);
			break;

		case SPDM_REQUEST_VENDOR_DEFINED_REQUEST:
			status = spdm_vendor_defined_request (spdm_responder, request);
			break;

		default:
			spdm_generate_error_response (request, 0, SPDM_ERROR_UNSUPPORTED_REQUEST, 0x00, NULL, 0,
				req_code, CMD_HANDLER_SPDM_RESPONDER_UNSUPPORTED_OPERATION);
			break;
	}

	if ((status == 0) && (request->is_encrypted == true)) {
		/* If the request was encoded and was succesfully decoded, encode the response. */
		status = session_manager->encode_secure_message (session_manager, request);
		if (status != 0) {
			/**
			 * Note: An error of SPDM_ERROR_DECRYPT_ERROR is being sent to the requester to
			 * to terminate the session. */
			spdm_generate_error_response (request, 0, SPDM_ERROR_DECRYPT_ERROR, 0x00, NULL, 0,
				req_code, status);
			status = 0;
			goto exit;
		}
	}

exit:

	return status;
}