/* * Copyright (C) 2022 Richard Hughes * * SPDX-License-Identifier: LGPL-2.1+ */ #include "config.h" #include "fu-intel-me-common.h" gboolean fu_intel_me_mkhi_result_to_error(FuMkhiResult result, GError **error) { if (result == MKHI_STATUS_SUCCESS) return TRUE; switch (result) { case MKHI_STATUS_NOT_SUPPORTED: case MKHI_STATUS_NOT_AVAILABLE: case MKHI_STATUS_NOT_SET: g_set_error(error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, "not supported [0x%x]", result); break; default: g_set_error(error, G_IO_ERROR, G_IO_ERROR_FAILED, "generic failure [0x%x]", result); break; } return FALSE; } gboolean fu_intel_me_mkhi_verify_header(const FuMkhiHeader *hdr_req, const FuMkhiHeader *hdr_res, GError **error) { if (hdr_req->group_id != hdr_res->group_id) { g_set_error(error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, "invalid response group ID, requested 0x%x and got 0x%x", hdr_req->group_id, hdr_res->group_id); return FALSE; } if (hdr_req->command != hdr_res->command) { g_set_error(error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, "invalid response command, requested 0x%x and got 0x%x", (guint)hdr_req->command, (guint)hdr_res->command); return FALSE; } if (!hdr_res->is_resp) { g_set_error_literal(error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, "invalid response group ID, not a response!"); return FALSE; } return fu_intel_me_mkhi_result_to_error(hdr_res->result, error); } GString * fu_intel_me_convert_checksum(GByteArray *buf, GError **error) { gboolean seen_non00_data = FALSE; gboolean seen_nonff_data = FALSE; g_autoptr(GString) checksum = g_string_new(NULL); /* create checksum, but only if non-zero and set */ for (gsize i = 0; i < buf->len; i++) { if (!seen_non00_data && buf->data[i] != 0x00) seen_non00_data = TRUE; if (!seen_nonff_data && buf->data[i] != 0xFF) seen_nonff_data = TRUE; g_string_append_printf(checksum, "%02x", buf->data[i]); } if (!seen_non00_data) { g_set_error_literal(error, G_IO_ERROR, G_IO_ERROR_NOT_INITIALIZED, "buffer was all 0x00"); return NULL; } if (!seen_nonff_data) { g_set_error_literal(error, G_IO_ERROR, G_IO_ERROR_NOT_INITIALIZED, "buffer was all 0xFF"); return NULL; } /* success */ return g_steal_pointer(&checksum); }