From 8b493aef2aa168d16a61f563ba8b8e70d3cc8044 Mon Sep 17 00:00:00 2001 From: "kevin.suresh" Date: Wed, 18 Jun 2025 15:47:07 +0530 Subject: [PATCH 1/3] Add porting layer to support FreeRTOS Add porting layer files for FreeRTOS Clear compilation warnings by replacing malloc with fcs_malloc --- CMakeLists.txt | 5 +- cmake/arch.cmake | 2 +- cmake/os.cmake | 2 +- lib/include/os/freertos/CMakeLists.txt | 4 + lib/include/os/freertos/libfcs_logging.h | 79 + lib/include/os/freertos/libfcs_utils.h | 32 + lib/src/common/libfcs.c | 2 +- lib/src/os/freertos/CMakeLists.txt | 9 + lib/src/os/freertos/libfcs_logging.c | 55 + lib/src/os/freertos/libfcs_osal.c | 1388 +++++++++++++++++ lib/src/os/freertos/libfcs_utils.c | 153 ++ third_party/CMakeLists.txt | 5 +- toolchain/freertos_aarch64/CMakeLists.txt | 36 + .../aarch64-none-elf-gcc.cmake | 32 + .../freertos_aarch64/include/CMakeLists.txt | 10 + .../include/libfcs_osal_types.h | 118 ++ toolchain/freertos_aarch64/toolchain.cmake | 26 + 17 files changed, 1952 insertions(+), 6 deletions(-) create mode 100644 lib/include/os/freertos/CMakeLists.txt create mode 100644 lib/include/os/freertos/libfcs_logging.h create mode 100644 lib/include/os/freertos/libfcs_utils.h create mode 100644 lib/src/os/freertos/CMakeLists.txt create mode 100644 lib/src/os/freertos/libfcs_logging.c create mode 100644 lib/src/os/freertos/libfcs_osal.c create mode 100644 lib/src/os/freertos/libfcs_utils.c create mode 100644 toolchain/freertos_aarch64/CMakeLists.txt create mode 100644 toolchain/freertos_aarch64/aarch64-none-elf-gcc.cmake create mode 100644 toolchain/freertos_aarch64/include/CMakeLists.txt create mode 100644 toolchain/freertos_aarch64/include/libfcs_osal_types.h create mode 100644 toolchain/freertos_aarch64/toolchain.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 310c9a4..59b31d7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,6 +62,9 @@ write_basic_package_version_file(FCS.cmake add_subdirectory(third_party) add_subdirectory(include) add_subdirectory(lib) -add_subdirectory(app) + +if(${ARCH} STREQUAL linux_aarch64) + add_subdirectory(app) +endif() add_subdirectory(toolchain) diff --git a/cmake/arch.cmake b/cmake/arch.cmake index 507c33a..c24e1c2 100644 --- a/cmake/arch.cmake +++ b/cmake/arch.cmake @@ -8,4 +8,4 @@ if (NOT DEFINED ARCH) endif () # Setup platform toolchain file. -include(${CMAKE_SOURCE_DIR}/toolchain/${ARCH}/toolchain.cmake) +include(${CMAKE_CURRENT_SOURCE_DIR}/toolchain/${ARCH}/toolchain.cmake) diff --git a/cmake/os.cmake b/cmake/os.cmake index 75edf74..facbe04 100644 --- a/cmake/os.cmake +++ b/cmake/os.cmake @@ -8,4 +8,4 @@ if (NOT DEFINED OS) endif () # Setup platform toolchain file. -include(${CMAKE_SOURCE_DIR}/toolchain/${OS}/toolchain.cmake) +include(${CMAKE_CURRENT_SOURCE_DIR}/toolchain/${OS}/toolchain.cmake) diff --git a/lib/include/os/freertos/CMakeLists.txt b/lib/include/os/freertos/CMakeLists.txt new file mode 100644 index 0000000..d449a60 --- /dev/null +++ b/lib/include/os/freertos/CMakeLists.txt @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: MIT-0 +# Copyright (C) 2025 Altera + +target_include_directories(FCS PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}") diff --git a/lib/include/os/freertos/libfcs_logging.h b/lib/include/os/freertos/libfcs_logging.h new file mode 100644 index 0000000..b819662 --- /dev/null +++ b/lib/include/os/freertos/libfcs_logging.h @@ -0,0 +1,79 @@ +/* SPDX-License-Identifier: MIT-0 */ +/* + * Copyright (C) 2025 Altera + */ + +/** + * + * @file libfcs_logging.h + * @brief logging API used inside LibFCS + */ + +#ifndef LIBFCS_LOGGING_H +#define LIBFCS_LOGGING_H + +#include +#include "osal_log.h" +//#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @brief FCS log levels + * + */ +enum fcs_loglevel { + L_LOG_NONE = 0, + L_LOG_ERROR = 1, + L_LOG_WARN = 2, + L_LOG_INFO = 3, + L_LOG_DEBUG = 4, +}; + + +#undef FCS_LOG_DBG +#define FCS_LOG_DBG(...) DEBUG(__VA_ARGS__) + +#undef FCS_LOG_INF +#define FCS_LOG_INF(...) INFO(__VA_ARGS__) + +#undef FCS_LOG_WRN +#define FCS_LOG_WRN(...) WARN(__VA_ARGS__) + +#undef FCS_LOG_ERR +#define FCS_LOG_ERR(...) ERROR(__VA_ARGS__) + +/** + * @brief set logging level of logger system + * + * @param level logging level + * @return 0 on success, negative number on error. + */ +FCS_OSAL_INT fcs_set_logging(enum fcs_loglevel level); + +/** + * @brief initialize logging + * + * @param log_file file to log the messages. + * @return 0 on success, negative number on error. + */ +FCS_OSAL_INT fcs_logging_init(FCS_OSAL_CHAR *log_file); + +/** + * @brief logging function each platform needs to define + * + * @param level logging level + * @param format string format + * + * @return Nil + */ +FCS_OSAL_VOID fcs_logger(enum fcs_loglevel level, const FCS_OSAL_CHAR *format, ...); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* LIBFCS_LOGGING_H */ diff --git a/lib/include/os/freertos/libfcs_utils.h b/lib/include/os/freertos/libfcs_utils.h new file mode 100644 index 0000000..9721dec --- /dev/null +++ b/lib/include/os/freertos/libfcs_utils.h @@ -0,0 +1,32 @@ +#ifndef LIBFCS_UTILS_H +#define LIBFCS_UTILS_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "libfcs_osal.h" + +/** + * @brief Gets the file size + * + * @param[in] file Name of the file. It shall contain the source device + * also.(eg: /usb/file) + */ +uint32_t fat_get_size( const char *file ); +/** + * @brief Reads contents of the file + * + * @param[in] file Name of the file. It shall contain the source device + * also.(eg: /usb/file) + * @param[in, out] buffer Buffer to store contents + */ + +uint32_t fat_read( const char *FileName, void *buffer ); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +// #endif +#endif diff --git a/lib/src/common/libfcs.c b/lib/src/common/libfcs.c index 26ee024..5c20aeb 100644 --- a/lib/src/common/libfcs.c +++ b/lib/src/common/libfcs.c @@ -2937,7 +2937,7 @@ static FCS_OSAL_INT fcs_fit_image_hash_verify(FCS_OSAL_UUID *session_uuid, FCS_OSAL_SIZE cal_hash_size = FCS_SHA_384_DIGEST_SIZE; struct fcs_digest_get_req get_digest_req; - cal_hash = (FCS_OSAL_CHAR *)malloc(FCS_SHA_384_DIGEST_SIZE); + cal_hash = (FCS_OSAL_CHAR *)fcs_malloc(FCS_SHA_384_DIGEST_SIZE); if (!cal_hash) { FCS_LOG_ERR("Error in allocating memory for image hash\n"); return -ENOMEM; diff --git a/lib/src/os/freertos/CMakeLists.txt b/lib/src/os/freertos/CMakeLists.txt new file mode 100644 index 0000000..b3c7ba9 --- /dev/null +++ b/lib/src/os/freertos/CMakeLists.txt @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: MIT-0 +# Copyright (C) 2025 Altera + +cmake_minimum_required(VERSION 3.20) + +target_sources(FCS PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/libfcs_logging.c") +target_sources(FCS PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/libfcs_osal.c") +target_sources(FCS PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/libfcs_utils.c") + diff --git a/lib/src/os/freertos/libfcs_logging.c b/lib/src/os/freertos/libfcs_logging.c new file mode 100644 index 0000000..4814917 --- /dev/null +++ b/lib/src/os/freertos/libfcs_logging.c @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT-0 +/* + * Copyright (C) 2025 Altera + */ + +#include +#include +#include + +static enum fcs_loglevel fcs_curr_loglevel = LIBRARY_LOG_LEVEL; + +FCS_OSAL_INT fcs_set_logging(enum fcs_loglevel level) +{ + if (level > L_LOG_DEBUG) { + FCS_LOG_ERR("wrong log level provided : %d", level); + return -1; + } + fcs_curr_loglevel = level; + return 0; +} + +FCS_OSAL_INT fcs_logging_init(FCS_OSAL_CHAR *loglevel) +{ + if (loglevel == NULL) { + FCS_LOG_INF("No log level provided, setting to default as LOG_INFO"); + return fcs_set_logging(LOG_INFO); + } + + if (strcmp(loglevel, "log_off") == 0) + { + return fcs_set_logging(L_LOG_NONE); + } + else if (strcmp(loglevel, "log_err") == 0) + { + return fcs_set_logging(L_LOG_ERROR); + } + else if (strcmp(loglevel, "log_wrn") == 0) + { + return fcs_set_logging(L_LOG_WARN); + } + else if (strcmp(loglevel, "log_inf") == 0) + { + return fcs_set_logging(L_LOG_INFO); + } + else if (strcmp(loglevel, "log_dbg") == 0) + { + return fcs_set_logging(L_LOG_DEBUG); + } + else + { + /* do nothing */ + } + + return -1; +} diff --git a/lib/src/os/freertos/libfcs_osal.c b/lib/src/os/freertos/libfcs_osal.c new file mode 100644 index 0000000..9471a64 --- /dev/null +++ b/lib/src/os/freertos/libfcs_osal.c @@ -0,0 +1,1388 @@ +// SPDX-License-Identifier: MIT-0 +/* + * Copyright (C) 2025 Altera + */ + + +#include +#include +#include +#include "osal.h" +#include "socfpga_fcs.h" +#include "libfcs_utils.h" +#include +#include +#include + +#define SDOS_OWNER_ID_OFFSET 12U +#define SDOS_OWNER_ID_SIZE 8U +#define HKDF_INPUT_SIZE 80U +#define HKDF_MAX_SIZE 4096U + + +static FCS_OSAL_INT fcs_freertos_api_binding(struct libfcs_osal_intf *intf); +FCS_OSAL_INT fcs_freertos_open_service_session(struct fcs_cmd_context *ctx); +FCS_OSAL_INT +fcs_freertos_close_service_session(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_random_number_ext(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_import_service_key(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_export_service_key(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_remove_service_key(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_get_service_key_info(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_create_service_key(struct fcs_cmd_context *ctx); +FCS_OSAL_INT +fcs_freertos_service_get_provision_data(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_counter_set(struct fcs_cmd_context *ctx); +FCS_OSAL_INT +fcs_freertos_counter_set_preauthorized(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_hkdf_request(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_aes_crypt(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_ecdh_req(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_get_digest(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_mac_verify(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_sdos_encrypt(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_sdos_decrypt(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_get_chip_id(struct fcs_cmd_context *ctx); +FCS_OSAL_INT +fcs_freertos_attestation_get_certificate(struct fcs_cmd_context *ctx); +FCS_OSAL_INT +fcs_freertos_attestation_cert_reload(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_mctp_cmd_send(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_get_jtag_idcode(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_get_device_identity(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_qspi_open(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_qspi_close(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_qspi_set_cs(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_qspi_read(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_qspi_write(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_qspi_erase(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_ecdsa_get_pub_key(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_ecdsa_hash_sign(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_ecdsa_hash_verify(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_ecdsa_sha2_data_sign(struct fcs_cmd_context *ctx); +FCS_OSAL_INT +fcs_freertos_ecdsa_sha2_data_verify(struct fcs_cmd_context *ctx); +FCS_OSAL_INT fcs_freertos_hps_img_validate(struct fcs_cmd_context *ctx); + +/** + * @brief Allocate memory of given size. + * + * @param size allocate memory size. + * @return Pointer to the allocated memory, or NULL if size is 0 or allocation + * fails. + */ +FCS_OSAL_VOID *fcs_malloc(FCS_OSAL_SIZE size) +{ + if (size == 0) { + FCS_LOG_ERR("Attempted to allocate zero size memory\n"); + return NULL; + } + FCS_OSAL_VOID *ptr = pvPortMalloc(size); + + if (!ptr) + { + FCS_LOG_ERR("Memory allocation failed\n"); + } + + return ptr; +} + +/** + * @brief Free allocated memory. + * + * @param ptr Pointer to the memory to free. + */ +FCS_OSAL_VOID fcs_osal_free(FCS_OSAL_VOID *ptr) +{ + if (ptr != NULL) + { + vPortFree(ptr); + } + else + { + FCS_LOG_WRN("Attempted to free a NULL pointer\n"); + } +} + +/** + * @brief Initialize a mutex. + * + * @param mutex Pointer to the mutex. + * + * @return 0 on success, negative value on error. + */ +FCS_OSAL_INT fcs_mutex_init(FCS_OSAL_MUTEX *mutex) +{ + if (!mutex) { + FCS_LOG_ERR("Invalid mutex pointer provided to fcs mutex init\n"); + return -1; + } + + *mutex = xSemaphoreCreateMutex(); + + if (*mutex == NULL) + { + FCS_LOG_ERR("Mutex initialization failed\n"); + return -1; + } + return 0; +} + +/** + * @brief Lock the mutex with a timeout. + * + * @param mutex Pointer to the mutex. + * @param time Timeout value in milliseconds. + * + * @return 0 on success, negative value on error. + */ +FCS_OSAL_INT fcs_mutex_timedlock(FCS_OSAL_MUTEX *mutex, FCS_OSAL_U32 const time) +{ + FCS_OSAL_INT ret; + + /* Check if the mutex pointer is NULL */ + if (!mutex) { + FCS_LOG_ERR("Invalid mutex pointer provided to fcs mutex timedlock\n"); + return -1; // Return invalid argument error + } + + ret = osal_mutex_lock(*mutex, time); + if (ret == pdTRUE) + { + return 0; + } + else + { + return -1; + } +} + +/** + * @brief Release the mutex. + * + * @param mutex Pointer to the mutex. + * + * @return 0 on success, negative value on error. + */ +FCS_OSAL_INT fcs_mutex_unlock(FCS_OSAL_MUTEX *mutex) +{ + /* Check if the mutex pointer is NULL */ + if (!mutex) { + FCS_LOG_ERR("Invalid mutex pointer provided to fcs mutex unlock\n"); + return -1; /* Return invalid argument error */ + } + if (osal_mutex_unlock(*mutex) == false) + { + return -1; + } + return 0; +} + +/** + * @brief Destroy the mutex. + * + * @param mutex Pointer to the mutex. + * + * @return 0 on success, negative value on error. + */ +FCS_OSAL_INT fcs_mutex_destroy(FCS_OSAL_MUTEX *mutex) +{ + /* Check if the mutex pointer is NULL */ + if (!mutex) { + FCS_LOG_ERR("Invalid mutex pointer provided to fcs mutex destroy\n"); + return -1; /* Return invalid argument error */ + } + + /* Destroy the mutex */ + (void) osal_mutex_delete(*mutex); + + return 0; +} + +/** + * @brief allocate memory for the buffer and copy the file content to the buffer + * + * @param filename file name to read + * @param buffer to copy the file content + * + * @return FCS_OSAL_INT + */ + +FCS_OSAL_INT fcs_alloc_and_cpy_file_to_mem(const FCS_OSAL_CHAR *filename, + FCS_OSAL_CHAR **buffer) +{ + uint32_t file_size, bytes_read; + file_size = fat_get_size(filename); + *buffer = pvPortMalloc(file_size); + + bytes_read = fat_read(filename, *buffer); + if (bytes_read != file_size) + { + FCS_LOG_ERR("Failed to read file"); + vPortFree(*buffer); + *buffer = NULL; + return -1; // Error reading file + } + return bytes_read; +} + +/** + * @brief prints debug information + * + * @param fit - pointer to the FIT image header + * @param noffset - component image node offset + * @param prop_name - fir node property name + * @param err - error code + */ +static FCS_OSAL_VOID fcs_freertos_fit_get_debug(const FCS_OSAL_VOID *fit, + FCS_OSAL_INT noffset, + FCS_OSAL_VOID *prop_name, + FCS_OSAL_INT err) +{ + FCS_LOG_DBG( + "Can't get '%s' property from FIT 0x%08lx, node: offset %d, name %s (%s)\n", + (FCS_OSAL_CHAR *)prop_name, (ulong)fit, noffset, + fdt_get_name(fit, noffset, NULL), fdt_strerror(err)); +} + +/** + * @brief sanity check FIT image format. + * runs a basic sanity FIT image verification. + * Routine checks for mandatory properties, nodes, etc. + * + * @param fit - pointer to the FIT format image header + * + * @return 0, on success, EINVAL, on failure + */ +static FCS_OSAL_INT fcs_freertos_fit_check_format(FCS_OSAL_CHAR *fit) +{ +/* mandatory / node 'description' property */ + if (!fdt_getprop(fit, 0, FIT_DESC_PROP, NULL)) { + FCS_LOG_DBG("Wrong FIT format: no description\n"); + return -EINVAL; + } + + if (IMAGE_ENABLE_TIMESTAMP == 0) { +/* mandatory / node 'timestamp' property */ + if (!fdt_getprop(fit, 0, FIT_TIMESTAMP_PROP, NULL)) { + FCS_LOG_DBG("Wrong FIT format: no timestamp\n"); + return -EINVAL; + } + } + +/* mandatory subimages parent '/images' node */ + if (fdt_path_offset(fit, FIT_PARENT_NODE_PATH) < 0) { + FCS_LOG_DBG("Wrong FIT format: no images parent node\n"); + return -EINVAL; + } + + return 0; +} + +/** + * @brief Get the data pointer of the image in the FIT image + * + * @param fit - pointer to the FIT format image header + * @param noffset - offset to the image node + * @param data_size - pointer to store the data size + * + * @return 0 on success, other value on failure + */ +static FCS_OSAL_INT fcs_freertos_fit_image_get_data_size(FCS_OSAL_CHAR *fit, + FCS_OSAL_INT noffset, + FCS_OSAL_INT *data_size) +{ + const FCS_OSAL_U32 *val; + + val = (FCS_OSAL_U32*) fdt_getprop((const FCS_OSAL_VOID *)fit, noffset, + FIT_DATA_SIZE_PROP, NULL); + if (!val) + { + return -ENOENT; + } + + *data_size = fdt32_to_cpu(*val); + + return 0; +} + +/** + * @brief Get the offset of the data in the FIT image + * + * @param fit - pointer to the FIT format image header + * @param noffset - component image node offset + * @param data_position - holds the data-position property + * + * @return 0 on success, other value on failure + */ +static FCS_OSAL_INT fcs_freertos_fit_image_get_data_position(FCS_OSAL_CHAR *fit, + FCS_OSAL_INT noffset, + int *data_position) +{ + const FCS_OSAL_U32 *val; + + val = (FCS_OSAL_U32*) fdt_getprop((const FCS_OSAL_VOID *)fit, noffset, + FIT_DATA_POSITION_PROP, NULL); + if (!val) + { + return -ENOENT; + } + + *data_position = fdt32_to_cpu(*val); + + return 0; +} + +/** + * @brief Get 'data-offset' property from a given image node. + * + * @param fit - pointer to the FIT image header + * @param noffset - component image node offset + * @param data_offset - holds the data-offset property + * + * @return 0 on success, other value on failure + */ +static FCS_OSAL_INT +fcs_freertos_fit_image_get_data_offset(FCS_OSAL_CHAR *fit, FCS_OSAL_INT noffset, + FCS_OSAL_INT *data_offset) +{ + const FCS_OSAL_U32 *val; + + val = (FCS_OSAL_U32*) fdt_getprop((const FCS_OSAL_VOID *)fit, noffset, + FIT_DATA_OFFSET_PROP, NULL); + if (!val) + { + return -ENOENT; + } + + *data_offset = fdt32_to_cpu(*val); + + return 0; +} + +/** + * @brief finds data property in a given component image node. + * If the property is found its data start address and size are returned to + * the caller. + * + * @param fit - pointer to the FIT image header + * @param noffset - component image node offset + * @param data - pointer to store the data pointer + * @param size - pointer to store the data size + * + * @return 0 on success, other value on failure + * + */ +static FCS_OSAL_INT fcs_freertos_fit_img_get_data(const FCS_OSAL_VOID *fit, + FCS_OSAL_INT noffset, + const FCS_OSAL_VOID **data, + FCS_OSAL_SIZE *size) +{ + int len; + + *data = fdt_getprop(fit, noffset, FIT_DATA_PROP, + &len); + if (!*data) { + (void) fcs_freertos_fit_get_debug(fit, noffset, FIT_DATA_PROP, len); + *size = 0; + return -1; + } + + *size = len; + return 0; +} + +/** + * @brief returns fdt error message for the given error code + */ +const FCS_OSAL_CHAR *fcs_fit_strerror(FCS_OSAL_INT err) +{ + return fdt_strerror(err); +} + +/** + * @brief Verify the FIT image header. + * + * @param fit Pointer to the FIT buffer. + * @param size FIT size. + * + * @return 0 on success, negative value on error. + */ +FCS_OSAL_INT fcs_fit_verify_header(FCS_OSAL_CHAR *fit) +{ + if (!fdt_check_header((const FCS_OSAL_VOID *)fit) || + !fcs_freertos_fit_check_format(fit)) + { + return -1; + } + return 0; +} + +/** + * @brief Get the position of the node in the FIT image + * + * @param fit - pointer to the FIT format image header + * @param path - path to the node + * + * @return offset to the node + */ +FCS_OSAL_INT fcs_fit_get_noffset(FCS_OSAL_CHAR *fit, const FCS_OSAL_CHAR *path) +{ + return fdt_path_offset((const FCS_OSAL_VOID *)fit, path); +} + +/** + * @brief Get the next node in the FIT image + * + * @param fit - pointer to the FIT format image header + * @param offset - offset to the node + * @param depth - pointer to store the depth + * + * @return offset to the next node + */ +FCS_OSAL_INT fcs_fit_next_node(FCS_OSAL_CHAR *fit, FCS_OSAL_INT offset, + FCS_OSAL_INT *depth) +{ + return fdt_next_node((const FCS_OSAL_VOID *)fit, offset, depth); +} + +/** + * @brief Get the position of the data in the FIT image + * + * @param fit - pointer to the FIT format image header + * @param noffset - offset to the image node + * @param offset - pointer to store the data position + * @param data - pointer to store the data pointer + * @param size - pointer to store the data size + * + * @return 0 on success, other value on failure + */ +FCS_OSAL_INT fcs_fit_image_get_data_and_size(FCS_OSAL_CHAR *fit, + FCS_OSAL_INT noffset, + FCS_OSAL_CHAR **data, + FCS_OSAL_SIZE *size) +{ + bool external_data = false; + int offset = 0; + int len = 0; + int ret; + + if (!fcs_freertos_fit_image_get_data_position(fit, noffset, &offset)) { + external_data = true; + } else if (!fcs_freertos_fit_image_get_data_offset(fit, noffset, &offset)) { + external_data = true; +/* + * For FIT with external data, figure out where + * the external images start. This is the base + * for the data-offset properties in each image. + */ + offset += ((fdt_totalsize((const FCS_OSAL_VOID *)fit) + 3U) & ~3U); + } + else + { + /*do nothing*/ + } + + if (external_data) { + FCS_LOG_DBG("External Data\n"); + ret = fcs_freertos_fit_image_get_data_size(fit, noffset, &len); + *data = fit + offset; + *size = len; + } else { + ret = fcs_freertos_fit_img_get_data((const FCS_OSAL_VOID *)fit, + noffset, (const FCS_OSAL_VOID **)data, size); + } + + return ret; +} + +/** + * @brief Open a service session + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_open_service_session(struct fcs_cmd_context *ctx) +{ + char uuid[FCS_OSAL_UUID_SIZE] = {0}; + FCS_OSAL_INT ret = run_fcs_open_service_session(uuid); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + if (ret == 0) + { + (void) memcpy(ctx->open_session.suuid, uuid, FCS_OSAL_UUID_SIZE); + *ctx->open_session.suuid_len = FCS_OSAL_UUID_SIZE; + } + else + { + (void) memset(ctx->open_session.suuid, 0U, FCS_OSAL_UUID_SIZE); + *ctx->open_session.suuid_len = 0U; + } + return 0; + } + return ret; +} + +/** + * @brief Close service session + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_close_service_session(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_close_service_session(ctx->close_session.suuid); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Get provisioned data inforamtion + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT +fcs_freertos_service_get_provision_data(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_service_get_provision_data( + ctx->prov_data.data, ctx->prov_data.data_len); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Generate a random number + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_random_number_ext(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_random_number_ext(ctx->rng.rng, + ctx->rng.suuid, + ctx->rng.context_id, + ctx->rng.rng_len); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Import a service key + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_import_service_key(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_import_service_key(ctx->import_key.suuid, + ctx->import_key.key, + ctx->import_key.key_len, ctx->import_key.status, + ctx->import_key.status_len); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Export a service key object + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_export_service_key(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_export_service_key(ctx->export_key.suuid, + ctx->export_key.key_id, + ctx->export_key.key, ctx->export_key.key_len); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Remove service key + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_remove_service_key(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_remove_service_key(ctx->remove_key.suuid, + ctx->remove_key.key_id); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Get service key information + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_get_service_key_info(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_get_service_key_info(ctx->key_info.suuid, + ctx->key_info.key_id, + ctx->key_info.info, ctx->key_info.info_len); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + + return ret; +} + +/** + * @brief Create a service key + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_create_service_key(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_create_service_key(ctx->create_key.suuid, + ctx->create_key.key, + ctx->create_key.key_len, ctx->create_key.status, + ctx->create_key.status_len); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Perform counter set + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_counter_set(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_send_certificate(ctx->ctr_set.ccert, + ctx->ctr_set.ccert_len, (uint32_t*)ctx->ctr_set.status); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + /* status size is always 4 bytes for counter set*/ + *ctx->ctr_set.status_len = sizeof(uint32_t); + return ret; +} + +/** + * @brief Perform counter set preauth + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT +fcs_freertos_counter_set_preauthorized(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_service_counter_set_preauthorized( + ctx->ctr_set_preauth.ctr_type, + ctx->ctr_set_preauth.ctr_val, ctx->ctr_set_preauth.test); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief HKDF request + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_hkdf_request(struct fcs_cmd_context *ctx) +{ + char *temp, *input_data; + input_data = (char*)(uintptr_t) pvPortMalloc(HKDF_MAX_SIZE); + if (input_data == NULL) + { + return -ENOMEM; + } + /* + * formatting input for HKDF request + * 4 bytes - input_data_size + * 80 bytes - input_data padded to 80 bytes with 0s + * 4 bytes - second_input_size + * 80 bytes - second_input_data padded to 80 bytes with 0 + * Output key object data + */ + temp = input_data; + (void) memset(temp, 0, HKDF_MAX_SIZE); + (void) memcpy(temp, &ctx->hkdf_req.ikm_len, sizeof(ctx->hkdf_req.ikm_len)); + temp += sizeof(ctx->hkdf_req.ikm_len); + (void) memcpy(temp, ctx->hkdf_req.ikm, ctx->hkdf_req.ikm_len); + temp += HKDF_INPUT_SIZE; + (void) memcpy(temp, &ctx->hkdf_req.info_len, sizeof(ctx->hkdf_req.info_len)); + temp += sizeof(ctx->hkdf_req.info_len); + (void) memcpy(temp, ctx->hkdf_req.info, ctx->hkdf_req.info_len); + temp += HKDF_INPUT_SIZE; + (void) memcpy(temp, ctx->hkdf_req.output_key_obj, + ctx->hkdf_req.output_key_obj_len); + + FCS_OSAL_INT ret = run_fcs_hkdf_request(ctx->hkdf_req.suuid, + ctx->hkdf_req.key_id, + ctx->hkdf_req.step_type, ctx->hkdf_req.mac_mode, input_data, + ctx->hkdf_req.output_key_obj_len, + ctx->hkdf_req.hkdf_resp); + vPortFree(input_data); + + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Get chip ID + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_get_chip_id(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_get_chip_id(ctx->chip_id.chip_id_lo, + ctx->chip_id.chip_id_hi); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Get an attestation certificate + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT +fcs_freertos_attestation_get_certificate(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_attestation_get_certificate( + ctx->attestation_cert.cert_request, + ctx->attestation_cert.cert, ctx->attestation_cert.cert_size); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Attestation certificate reload + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT +fcs_freertos_attestation_cert_reload(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_attestation_certificate_reload( + ctx->attestation_cert_reload.cert_request); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + + return ret; +} + +/** + * @brief Perform MCTP operation + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_mctp_cmd_send(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_mctp_cmd_send(ctx->mctp.mctp_req, + ctx->mctp.mctp_req_len, + ctx->mctp.mctp_resp, ctx->mctp.mctp_resp_len); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Get JTAG ID code + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_get_jtag_idcode(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_get_jtag_idcode(ctx->jtag_id.jtag_idcode); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Get device identity + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_get_device_identity(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_get_device_identity( + ctx->device_identity.identity, + ctx->device_identity.identity_len); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Open an access to QSPI interface + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_qspi_open(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_qspi_open(); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Close an access to QSPI interface + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_qspi_close(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_qspi_close(); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + + +/** + * @brief Chip select + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_qspi_set_cs(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_qspi_set_cs(ctx->qspi_cs.chipsel); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Read data from QSPI flash + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_qspi_read(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_qspi_read(ctx->qspi_write.qspi_addr, + ctx->qspi_write.len, + ctx->qspi_write.buffer); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} +/** + * @brief Write data to QSPI flash + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_qspi_write(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_qspi_write(ctx->qspi_write.qspi_addr, + ctx->qspi_write.len, + ctx->qspi_write.buffer); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Erase QSPI flash + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_qspi_erase(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_qspi_erase(ctx->qspi_erase.qspi_addr, + ctx->qspi_erase.len); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Perform AES encryption/decryption operation + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_aes_crypt(struct fcs_cmd_context *ctx) +{ + if (ctx->aes.mode == FCS_AES_GCM_GHASH) + { + *ctx->aes.op_len = 0; + } + else + { + *ctx->aes.op_len = ctx->aes.ip_len; + } + FCS_OSAL_INT ret = run_fcs_aes_cryption(ctx->aes.suuid, ctx->aes.kid, + ctx->aes.cid, + ctx->aes.crypt, + ctx->aes.mode, ctx->aes.iv_source, ctx->aes.iv, + ctx->aes.tag_len, + ctx->aes.aad_len, + ctx->aes.aad, + ctx->aes.tag, + ctx->aes.input, ctx->aes.ip_len, ctx->aes.output, + *ctx->aes.op_len); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +FCS_OSAL_INT fcs_freertos_ecdh_req(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_ecdh_request(ctx->ecdh_req.suuid, + ctx->ecdh_req.kid, + ctx->ecdh_req.cid, + ctx->ecdh_req.ecc_curve, ctx->ecdh_req.pubkey, + ctx->ecdh_req.pubkey_len, + ctx->ecdh_req.sh_secret, ctx->ecdh_req.sh_secret_len); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Generate digest + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_get_digest(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_get_digest(ctx->dgst.suuid, + ctx->dgst.context_id, + ctx->dgst.key_id, + ctx->dgst.sha_op_mode, ctx->dgst.sha_digest_sz, ctx->dgst.src, + ctx->dgst.src_len, ctx->dgst.digest, ctx->dgst.digest_len); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Verify HMAC + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_mac_verify(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_mac_verify(ctx->mac_verify.suuid, + ctx->mac_verify.context_id, + ctx->mac_verify.key_id, ctx->mac_verify.sha_digest_sz, + ctx->mac_verify.src, + ctx->mac_verify.src_size, ctx->mac_verify.dst, + ctx->mac_verify.dst_size, + ctx->mac_verify.user_data_size); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Validate an HPS image + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_hps_img_validate(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_send_certificate( + ctx->hps_img_validate.vab_cert, + ctx->hps_img_validate.vab_cert_len, ctx->hps_img_validate.resp); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Perform SDOS encryption operation + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_sdos_encrypt(struct fcs_cmd_context *ctx) +{ + (void) memcpy(&ctx->sdos.own, ctx->sdos.src + SDOS_OWNER_ID_OFFSET, + SDOS_OWNER_ID_SIZE); + FCS_OSAL_INT ret = run_fcs_sdos_encrypt(ctx->sdos.suuid, + ctx->sdos.context_id, + ctx->sdos.src, ctx->sdos.src_size, ctx->sdos.dst, + ctx->sdos.dst_size); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Perform SDOS decryption operation + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_sdos_decrypt(struct fcs_cmd_context *ctx) +{ + (void) memcpy(&ctx->sdos.own, ctx->sdos.src + SDOS_OWNER_ID_OFFSET, + SDOS_OWNER_ID_SIZE); + FCS_OSAL_INT ret = run_fcs_sdos_decrypt(ctx->sdos.suuid, + ctx->sdos.context_id, + ctx->sdos.src, ctx->sdos.src_size, ctx->sdos.dst, + ctx->sdos.dst_size, + ctx->sdos.own); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Get ECDSA public key + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_ecdsa_get_pub_key(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_ecdsa_get_public_key(ctx->ecdsa_pub_key.suuid, + ctx->ecdsa_pub_key.context_id, + ctx->ecdsa_pub_key.key_id, ctx->ecdsa_pub_key.ecc_curve, + ctx->ecdsa_pub_key.pubkey, ctx->ecdsa_pub_key.pubkey_len); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Generate ECDSA hash signature + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_ecdsa_hash_sign(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_ecdsa_hash_sign(ctx->ecdsa_hash_sign.suuid, + ctx->ecdsa_hash_sign.context_id, + ctx->ecdsa_hash_sign.key_id, ctx->ecdsa_hash_sign.ecc_curve, + ctx->ecdsa_hash_sign.src, ctx->ecdsa_hash_sign.src_len, + ctx->ecdsa_hash_sign.dst, ctx->ecdsa_hash_sign.dst_len); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Verify ECDSA hash signature + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_ecdsa_hash_verify(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_ecdsa_hash_verify(ctx->ecdsa_hash_verify.suuid, + ctx->ecdsa_hash_verify.context_id, + ctx->ecdsa_hash_verify.key_id, + ctx->ecdsa_hash_verify.ecc_curve, ctx->ecdsa_hash_verify.src, + ctx->ecdsa_hash_verify.src_len, + ctx->ecdsa_hash_verify.signature, + ctx->ecdsa_hash_verify.signature_len, + ctx->ecdsa_hash_verify.pubkey, + ctx->ecdsa_hash_verify.pubkey_len, ctx->ecdsa_hash_verify.dst, + ctx->ecdsa_hash_verify.dst_len); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Generate ECDSA SHA2 data signature + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_ecdsa_sha2_data_sign(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_ecdsa_sha2_data_sign( + ctx->ecdsa_sha2_data_sign.suuid, + ctx->ecdsa_sha2_data_sign.context_id, + ctx->ecdsa_sha2_data_sign.key_id, + ctx->ecdsa_sha2_data_sign.ecc_curve, + ctx->ecdsa_sha2_data_sign.src, + ctx->ecdsa_sha2_data_sign.src_len, + ctx->ecdsa_sha2_data_sign.dst, + ctx->ecdsa_sha2_data_sign.dst_len); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Verify ECDSA SHA2 data signature + * + * @param ctx Context pointer to the context of the command + * + * @return 0 on success, otherwise value on error. + */ +FCS_OSAL_INT fcs_freertos_ecdsa_sha2_data_verify(struct fcs_cmd_context *ctx) +{ + FCS_OSAL_INT ret = run_fcs_ecdsa_sha2_data_sign_verify( + ctx->ecdsa_sha2_data_verify.suuid, + ctx->ecdsa_sha2_data_verify.context_id, + ctx->ecdsa_sha2_data_verify.key_id, + ctx->ecdsa_sha2_data_verify.ecc_curve, + ctx->ecdsa_sha2_data_verify.src, + ctx->ecdsa_sha2_data_verify.src_len, + ctx->ecdsa_sha2_data_verify.signature, + ctx->ecdsa_sha2_data_verify.signature_len, + ctx->ecdsa_sha2_data_verify.pubkey, + ctx->ecdsa_sha2_data_verify.pubkey_len, + ctx->ecdsa_sha2_data_verify.dst, + ctx->ecdsa_sha2_data_verify.dst_len); + if (ret >= 0) + { + *ctx->error_code_addr = ret; + return 0; + } + return ret; +} + +/** + * @brief Bind the OSAL API to the interface. + * + * @param intf Pointer to the OSAL interface. + * + * @return 0 on success, negative value on error. + */ +static FCS_OSAL_INT fcs_freertos_api_binding(struct libfcs_osal_intf *intf) +{ + if (intf == NULL) { + FCS_LOG_ERR("Invalid argument: intf is NULL\n"); + return -1; + } + + intf->open_service_session = fcs_freertos_open_service_session; + intf->close_service_session = fcs_freertos_close_service_session; + intf->random_number_ext = fcs_freertos_random_number_ext; + intf->import_service_key = fcs_freertos_import_service_key; + intf->export_service_key = fcs_freertos_export_service_key; + intf->remove_service_key = fcs_freertos_remove_service_key; + intf->get_service_key_info = fcs_freertos_get_service_key_info; + intf->create_service_key = fcs_freertos_create_service_key; + intf->get_provision_data = fcs_freertos_service_get_provision_data; + intf->counter_set = fcs_freertos_counter_set; + intf->counter_set_preauthorized = fcs_freertos_counter_set_preauthorized; + intf->hkdf_request = fcs_freertos_hkdf_request; + intf->get_digest = fcs_freertos_get_digest; + intf->mac_verify = fcs_freertos_mac_verify; + intf->aes_crypt = fcs_freertos_aes_crypt; + intf->ecdh_req = fcs_freertos_ecdh_req; + intf->get_chip_id = fcs_freertos_get_chip_id; + intf->attestation_get_certificate = + fcs_freertos_attestation_get_certificate; + intf->attestation_cert_reload = fcs_freertos_attestation_cert_reload; + intf->mctp_cmd_send = fcs_freertos_mctp_cmd_send; + intf->get_jtag_idcode = fcs_freertos_get_jtag_idcode; + intf->get_device_identity = fcs_freertos_get_device_identity; + intf->qspi_open = fcs_freertos_qspi_open; + intf->qspi_close = fcs_freertos_qspi_close; + intf->qspi_cs = fcs_freertos_qspi_set_cs; + intf->qspi_read = fcs_freertos_qspi_read; + intf->qspi_write = fcs_freertos_qspi_write; + intf->qspi_erase = fcs_freertos_qspi_erase; + intf->sdos_encrypt = fcs_freertos_sdos_encrypt; + intf->sdos_decrypt = fcs_freertos_sdos_decrypt; + intf->ecdsa_get_pub_key = fcs_freertos_ecdsa_get_pub_key; + intf->ecdsa_hash_sign = fcs_freertos_ecdsa_hash_sign; + intf->ecdsa_hash_verify = fcs_freertos_ecdsa_hash_verify; + intf->ecdsa_sha2_data_sign = fcs_freertos_ecdsa_sha2_data_sign; + intf->ecdsa_sha2_data_verify = fcs_freertos_ecdsa_sha2_data_verify; + intf->hps_img_validate = fcs_freertos_hps_img_validate; + + return 0; +} + +/** + * @brief Initialize the OSAL. + * + * @param intf Pointer to the OSAL interface. + * @param loglevel set log level + * + * @return 0 on success, negative value on error. + */ + +FCS_OSAL_INT libfcs_osal_init(struct libfcs_osal_intf *intf, char *log_level) +{ + (void)log_level; + FCS_OSAL_INT ret; + + /* Bind the OSAL APIs */ + ret = fcs_freertos_api_binding(intf); + + if (ret != 0) { + FCS_LOG_ERR("Error in binding OSAL APIs\n"); + return ret; + } + + ret = fcs_init(); + + if (ret != 0) { + FCS_LOG_ERR("Error in initialsing driver\n"); + return ret; + } + return 0; +} diff --git a/lib/src/os/freertos/libfcs_utils.c b/lib/src/os/freertos/libfcs_utils.c new file mode 100644 index 0000000..dd59a43 --- /dev/null +++ b/lib/src/os/freertos/libfcs_utils.c @@ -0,0 +1,153 @@ +// SPDX-License-Identifier: MIT-0 +/* + * Copyright (C) 2025 Altera + */ + +#include "libfcs_utils.h" +#include "libfcs_logging.h" +#include "ff_sddisk.h" + +#define MOUNTED 1 +#define UNMOUNTED 0 +#define MOUNT_SD_CARD -1 +#define MOUNT_USB 0 + +static const char *sdmmc_mount = "/root/"; // Name of the mount point +static const char *usb_mount = "/usb/"; + +FF_Disk_t *xDiskObj = NULL; +uint8_t ucMountStatus = UNMOUNTED; + +static int fat_get_disk_type(const char *mptr) +{ + if (strncmp(mptr, sdmmc_mount, 6) == 0) + { + return 0; + } + else if (strncmp(mptr, usb_mount, 5) == 0) + { + return 1; + } + else + { + return -1; + } + + return -1; +} + +static int fat_mount( const char *MountName ) +{ + int mount_type = fat_get_disk_type(MountName); + if (mount_type == 0) + { + xDiskObj = FF_SDDiskInit(MountName, MOUNT_SD_CARD); + } + else if (mount_type == 1) + { + xDiskObj = FF_SDDiskInit(MountName, MOUNT_USB); + } + else + { + ERROR("Invalid mount point"); + return -1; + } + if (xDiskObj != NULL) + { + ucMountStatus = MOUNTED; + return mount_type; + } + else + { + ERROR("Mounting Failed"); + return -1; + } +} + +static void fat_unmount( void ) +{ + if (xDiskObj == NULL) + { + ERROR("No mounted devices"); + return; + } + FF_Unmount(xDiskObj); + FF_SDDiskDelete(xDiskObj); + xDiskObj = NULL; + ucMountStatus = UNMOUNTED; +} +uint32_t fat_get_size( const char *file ) +{ + int ret; + uint32_t file_size; + FF_Error_t xError; + FF_FILE *pxFile; + ret = fat_mount(file); + if (xDiskObj == NULL) + { + ERROR("Failed to mount"); + return 0; + } + if (ret == 0) + { + pxFile = + FF_Open(xDiskObj->pxIOManager, file + 5, FF_MODE_READ, &xError); + } + else + { + pxFile = + FF_Open(xDiskObj->pxIOManager, file + 4, FF_MODE_READ, &xError); + } + if ((pxFile == NULL) || (xError != FF_ERR_NONE)) + { + INFO("Failed to open file for reading\r\n"); + FF_Unmount(xDiskObj); + FF_SDDiskDelete(xDiskObj); + return 0; + } + + ret = FF_GetFileSize(pxFile, &file_size); + if (ret != 0) + { + ERROR("Error getting file size "); + return 0; + } + FF_Close(pxFile); + return file_size; +} +uint32_t fat_read( const char *file, void *buffer ) +{ + FF_Error_t xError; + uint32_t ulBytesRead = 0; + FF_FILE *pxFile; + int ret; + ret = fat_mount(file); + if (xDiskObj == NULL) + { + ERROR("Failed to mount"); + return 0; + } + if (ret == 0) + { + pxFile = FF_Open(xDiskObj->pxIOManager, file + 5, + FF_MODE_READ, &xError); + } + else if (ret == 1) + { + pxFile = FF_Open(xDiskObj->pxIOManager, file + 4, + FF_MODE_READ, &xError); + } + else + { + ERROR("Invalid mount point"); + return 0; + } + if (pxFile != NULL) + { + ulBytesRead = FF_Read(pxFile, 1, pxFile->ulFileSize, (uint8_t*)buffer); + FF_Close(pxFile); + } + fat_unmount(); + return ulBytesRead; +} + diff --git a/third_party/CMakeLists.txt b/third_party/CMakeLists.txt index 8f45fc3..5774507 100644 --- a/third_party/CMakeLists.txt +++ b/third_party/CMakeLists.txt @@ -25,6 +25,7 @@ if(FDT_LIBRARY STREQUAL FDT_LIBRARY-NOTFOUND) set(LIBFDT_BUILD_COMMAND CC=${CROSS_COMPILE}-gcc make -C ../libfdt libfdt > /dev/null) set(LIBFDT_INSTALL_COMMAND mkdir -p ${LIBFDT_INSTALL_DIR} && cp ../libfdt/libfdt/libfdt.so ${LIBFDT_INSTALL_DIR}/ && + cp ../libfdt/libfdt/libfdt.a ${LIBFDT_INSTALL_DIR}/ && cp ../libfdt/libfdt/libfdt.h ${LIBFDT_INSTALL_DIR} && cp ../libfdt/libfdt/libfdt_env.h ${LIBFDT_INSTALL_DIR} && cp ../libfdt/libfdt/fdt.h ${LIBFDT_INSTALL_DIR}) @@ -37,7 +38,7 @@ if(FDT_LIBRARY STREQUAL FDT_LIBRARY-NOTFOUND) CONFIGURE_COMMAND ${LIBFDT_CONFIGURE_COMMAND} # Command to configure the project BUILD_COMMAND ${LIBFDT_BUILD_COMMAND} # Command to build the project INSTALL_COMMAND ${LIBFDT_INSTALL_COMMAND} # Command to install the project - BUILD_BYPRODUCTS ${LIBFDT_INSTALL_DIR}/libfdt.so + BUILD_BYPRODUCTS ${LIBFDT_INSTALL_DIR}/libfdt.a ) # Add libfdt and libkcapi dependency for fcs @@ -47,7 +48,7 @@ if(FDT_LIBRARY STREQUAL FDT_LIBRARY-NOTFOUND) target_link_libraries( FCS PUBLIC - ${LIBFDT_INSTALL_DIR}/libfdt.so + ${LIBFDT_INSTALL_DIR}/libfdt.a ) target_include_directories(FCS PRIVATE "${LIBFDT_INSTALL_DIR}") diff --git a/toolchain/freertos_aarch64/CMakeLists.txt b/toolchain/freertos_aarch64/CMakeLists.txt new file mode 100644 index 0000000..f6273fb --- /dev/null +++ b/toolchain/freertos_aarch64/CMakeLists.txt @@ -0,0 +1,36 @@ +# SPDX-License-Identifier: MIT-0 +# Copyright (C) 2025 Altera + +cmake_minimum_required(VERSION 3.20) + +# Set output directories for different types of build artifacts +set_target_properties(FCS PROPERTIES + ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" # Directory for static libraries + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" # Directory for shared libraries + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" # Directory for executables +) + +# Set compile options for the FCS target +target_compile_options(FCS PRIVATE + -Wall # Enable all warnings + -Wextra # Enable extra warnings + -Wformat + -Wno-unused-parameter + -Wformat-security + -D_FORTIFY_SOURCE=2 + -march=armv8-a + -mtune=cortex-a55 + -mstrict-align + -g +) + +target_include_directories(FCS + PUBLIC + ${PROJECT_SOURCE_DIR}/../FreeRTOS/Fat-Fs/portable/common/ + ${PROJECT_SOURCE_DIR}/../FreeRTOS/Fat-Fs/include/ + ${PROJECT_SOURCE_DIR}/../osal/freertos/ + ${FREERTOS_CONFIG_HEADER_PATH} + ${driver_include_dirs} + ${RTOS_INCLUDES} + ) +add_subdirectory(include) diff --git a/toolchain/freertos_aarch64/aarch64-none-elf-gcc.cmake b/toolchain/freertos_aarch64/aarch64-none-elf-gcc.cmake new file mode 100644 index 0000000..662ecbd --- /dev/null +++ b/toolchain/freertos_aarch64/aarch64-none-elf-gcc.cmake @@ -0,0 +1,32 @@ +# SPDX-License-Identifier: MIT-0 +# Copyright (C) 2025 Altera + +set(CMAKE_AR ${CROSS_COMPILE}-gcc-ar${CMAKE_EXECUTABLE_SUFFIX}) +set(CMAKE_ASM_COMPILER ${CROSS_COMPILE}-gcc${CMAKE_EXECUTABLE_SUFFIX}) +set(CMAKE_C_COMPILER ${CROSS_COMPILE}-gcc${CMAKE_EXECUTABLE_SUFFIX}) +set(CMAKE_CXX_COMPILER ${CROSS_COMPILE}-g++${CMAKE_EXECUTABLE_SUFFIX}) +set(CMAKE_LINKER ${CROSS_COMPILE}-ld${CMAKE_EXECUTABLE_SUFFIX}) +set(CMAKE_OBJCOPY ${CROSS_COMPILE}-objcopy${CMAKE_EXECUTABLE_SUFFIX} CACHE INTERNAL "") +set(CMAKE_RANLIB ${CROSS_COMPILE}-ranlib${CMAKE_EXECUTABLE_SUFFIX} CACHE INTERNAL "") +set(CMAKE_SIZE ${CROSS_COMPILE}-size${CMAKE_EXECUTABLE_SUFFIX} CACHE INTERNAL "") +set(CMAKE_STRIP ${CROSS_COMPILE}-strip${CMAKE_EXECUTABLE_SUFFIX} CACHE INTERNAL "") +set(CMAKE_GCOV ${CROSS_COMPILE}-gcov${CMAKE_EXECUTABLE_SUFFIX} CACHE INTERNAL "") + +set(CMAKE_C_FLAGS "${APP_C_FLAGS} -Wno-psabi" CACHE INTERNAL "") +set(CMAKE_CXX_FLAGS "${APP_CXX_FLAGS} ${CMAKE_C_FLAGS}" CACHE INTERNAL "") + +set(CMAKE_C_FLAGS_DEBUG "-pg -O0 -g3" CACHE INTERNAL "") +set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE INTERNAL "") +set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}" CACHE INTERNAL "") +set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}" CACHE INTERNAL "") + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) +set(CMAKE_BUILD_WITH_INSTALL_RPATH ON) +set(CMAKE_FIND_ROOT_PATH /tmp) # dummy place to override the paths for cross compiling locally + +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR arm) +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Map=${CMAKE_BINARY_DIR}/fcs.map") diff --git a/toolchain/freertos_aarch64/include/CMakeLists.txt b/toolchain/freertos_aarch64/include/CMakeLists.txt new file mode 100644 index 0000000..c1f1f63 --- /dev/null +++ b/toolchain/freertos_aarch64/include/CMakeLists.txt @@ -0,0 +1,10 @@ +# SPDX-License-Identifier: MIT-0 +# Copyright (C) 2025 Altera + +target_include_directories(FCS PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}") + +target_sources(FCS PUBLIC +FILE_SET public_headers +TYPE HEADERS +BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} +FILES ${CMAKE_CURRENT_SOURCE_DIR}/libfcs_osal_types.h) diff --git a/toolchain/freertos_aarch64/include/libfcs_osal_types.h b/toolchain/freertos_aarch64/include/libfcs_osal_types.h new file mode 100644 index 0000000..3633c78 --- /dev/null +++ b/toolchain/freertos_aarch64/include/libfcs_osal_types.h @@ -0,0 +1,118 @@ +/* SPDX-License-Identifier: MIT-0 */ +/* + * Copyright (C) 2025 Altera + */ + +/** + * + * @file fcs_osal_types.h + * @brief contains OS abstraction layer data types for linux_aarch64 platform. + */ + +#ifndef FCS_OSAL_TYPES_H +#define FCS_OSAL_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ +#include +#include +#include "osal.h" + +#define FCS_GENERIC_ERR 0xff +#define FCS_OSAL_UUID_SIZE (16U) +#define FCS_OSAL_MAX_RESP_STATUS_SIZE (4U) +#define FCS_AES_CRYPT_BLOCK_SIZE (16U) +#define FCS_CIPHER_NAME_MAX_SIZE (32U) + +#define FCS_AES_BLOCK_MODE_ECB 0 +#define FCS_AES_BLOCK_MODE_CBC 1 +#define FCS_AES_BLOCK_MODE_CTR 2 +#define FCS_AES_BLOCK_MODE_GCM 3 +#define FCS_AES_BLOCK_MODE_GHASH 4 +#define FCS_MAX_AES_CRYPT_MODE 5 + +#define FCS_AES_GCM_MAX_AAD_SIZE 65535 +#define FCS_AES_GCM_TAG_SIZE 3 + +#define FCS_AES_IV_SOURCE_INTERNAL 1 +#define FCS_AES_IV_SOURCE_EXTERNAL 0 + +#define FCS_AES_ENCRYPT 0 +#define FCS_AES_DECRYPT 1 + +#define FCS_ECC_CURVE_NIST_P256 1 +#define FCS_ECC_CURVE_NIST_P384 2 +#define FCS_ECC_CURVE_BRAINPOOL_P256 3 +#define FCS_ECC_CURVE_BRAINPOOL_P384 4 +#define FCS_ECC_CURVE_MASK 0x4 + +#define FCS_ECDH_P256_PUBKEY_LEN 64 +#define FCS_ECDH_P384_PUBKEY_LEN 96 +#define FCS_ECDH_BP256_PUBKEY_LEN 64 +#define FCS_ECDH_BP384_PUBKEY_LEN 96 +#define FCS_ECDH_P256_SECRET_LEN 32 +#define FCS_ECDH_P384_SECRET_LEN 48 +#define FCS_ECDH_BP256_SECRET_LEN 32 +#define FCS_ECDH_BP384_SECRET_LEN 48 + +#define FCS_SHA_384 1 +#define FCS_SHA_384_DIGEST_SIZE 48 +#define FCS_CERT_LEN_PARAM_SZ sizeof(uint32_t) + +/** unsigned 64 bit*/ +typedef uint64_t FCS_OSAL_U64; +/** unsigned 32 bit*/ +typedef uint32_t FCS_OSAL_U32; +/** unsigned 16 bit*/ +typedef uint16_t FCS_OSAL_U16; +/** unsigned 8 bit*/ +typedef uint8_t FCS_OSAL_U8; + +/** signed 64 bit*/ +typedef int64_t FCS_OSAL_S64; +/** signed 32 bit*/ +typedef int32_t FCS_OSAL_S32; +/** unsigned 16 bit*/ +typedef int16_t FCS_OSAL_S16; +/** unsigned 8 bit*/ +typedef int8_t FCS_OSAL_S8; + +/** void type*/ +typedef void FCS_OSAL_VOID; +/** character data type*/ +typedef char FCS_OSAL_CHAR; +/** Unsigned character data type*/ +typedef unsigned char FCS_OSAL_UCHAR; +/** boolean data type*/ +typedef bool FCS_OSAL_BOOL; + +/** integer data type*/ +typedef int FCS_OSAL_INT; +/** unsigned integer data type*/ +typedef unsigned int FCS_OSAL_UINT; +/** data type to denote offset */ +typedef int FCS_OSAL_OFFSET; +/** data type to denote size*/ +typedef size_t FCS_OSAL_SIZE; + +/** mutex object type*/ +typedef SemaphoreHandle_t FCS_OSAL_MUTEX; +/** file object type*/ +typedef char* FCS_OSAL_FILE; +/** integer data type uuid for session ids*/ +typedef char FCS_OSAL_UUID; + +// TODO: which data type +typedef int FCS_OSAL_ERROR; + +// TODO: which data type +typedef int FCS_OSAL_RSIZE; + +typedef uintptr_t FCS_OSAL_UINTPTR; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/toolchain/freertos_aarch64/toolchain.cmake b/toolchain/freertos_aarch64/toolchain.cmake new file mode 100644 index 0000000..a10af36 --- /dev/null +++ b/toolchain/freertos_aarch64/toolchain.cmake @@ -0,0 +1,26 @@ +# SPDX-License-Identifier: MIT-0 +# Copyright (C) 2025 Altera + +# Set the cross-compiler prefix for aarch64 architecture +set(CROSS_COMPILE aarch64-none-elf) + +# Enable shared library building +set(SHARED_LIB ON) + +# Check if CMAKE_TOOLCHAIN_FILE is not already defined +if (NOT DEFINED CMAKE_TOOLCHAIN_FILE) + # Set the default toolchain to the cross-compiler GCC + set(DEFAULT_TOOLCHAIN ${CROSS_COMPILE}-gcc) + + # If TOOLCHAIN is not defined, use the default toolchain + if (NOT DEFINED TOOLCHAIN) + message(STATUS "'TOOLCHAIN' is not defined. Using '${DEFAULT_TOOLCHAIN}'") + set(TOOLCHAIN ${DEFAULT_TOOLCHAIN}) + endif () + + # Set the CMAKE_TOOLCHAIN_FILE to the path of the toolchain file + set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_LIST_DIR}/${TOOLCHAIN}.cmake) + +endif () + +set(OS freertos) From 02831bbd8a482ea1e3c3236c527b073a4eacca08 Mon Sep 17 00:00:00 2001 From: "kevin.suresh" Date: Mon, 14 Jul 2025 12:40:25 +0530 Subject: [PATCH 2/3] Remove FreeRTOS files from libfcs Modify thirdparty cmake to allow static libraries --- lib/include/os/freertos/CMakeLists.txt | 7 +- lib/include/os/freertos/libfcs_logging.h | 79 - lib/include/os/freertos/libfcs_utils.h | 32 - lib/src/os/freertos/CMakeLists.txt | 10 +- lib/src/os/freertos/libfcs_logging.c | 55 - lib/src/os/freertos/libfcs_osal.c | 1388 ----------------- lib/src/os/freertos/libfcs_utils.c | 153 -- third_party/CMakeLists.txt | 21 +- .../aarch64-none-elf-gcc.cmake | 32 - toolchain/freertos_aarch64/toolchain.cmake | 26 +- 10 files changed, 29 insertions(+), 1774 deletions(-) delete mode 100644 lib/include/os/freertos/libfcs_logging.h delete mode 100644 lib/include/os/freertos/libfcs_utils.h delete mode 100644 lib/src/os/freertos/libfcs_logging.c delete mode 100644 lib/src/os/freertos/libfcs_osal.c delete mode 100644 lib/src/os/freertos/libfcs_utils.c delete mode 100644 toolchain/freertos_aarch64/aarch64-none-elf-gcc.cmake diff --git a/lib/include/os/freertos/CMakeLists.txt b/lib/include/os/freertos/CMakeLists.txt index d449a60..2092a87 100644 --- a/lib/include/os/freertos/CMakeLists.txt +++ b/lib/include/os/freertos/CMakeLists.txt @@ -1,4 +1,9 @@ # SPDX-License-Identifier: MIT-0 # Copyright (C) 2025 Altera -target_include_directories(FCS PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}") +if(NOT DEFINED FREERTOS_TOOLCHAIN) + message(FATAL_ERROR "not building inside inside FreeRTOS") +endif() +set(SHARED_LIB OFF) +set(OS freertos) + diff --git a/lib/include/os/freertos/libfcs_logging.h b/lib/include/os/freertos/libfcs_logging.h deleted file mode 100644 index b819662..0000000 --- a/lib/include/os/freertos/libfcs_logging.h +++ /dev/null @@ -1,79 +0,0 @@ -/* SPDX-License-Identifier: MIT-0 */ -/* - * Copyright (C) 2025 Altera - */ - -/** - * - * @file libfcs_logging.h - * @brief logging API used inside LibFCS - */ - -#ifndef LIBFCS_LOGGING_H -#define LIBFCS_LOGGING_H - -#include -#include "osal_log.h" -//#include -#include - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/** - * @brief FCS log levels - * - */ -enum fcs_loglevel { - L_LOG_NONE = 0, - L_LOG_ERROR = 1, - L_LOG_WARN = 2, - L_LOG_INFO = 3, - L_LOG_DEBUG = 4, -}; - - -#undef FCS_LOG_DBG -#define FCS_LOG_DBG(...) DEBUG(__VA_ARGS__) - -#undef FCS_LOG_INF -#define FCS_LOG_INF(...) INFO(__VA_ARGS__) - -#undef FCS_LOG_WRN -#define FCS_LOG_WRN(...) WARN(__VA_ARGS__) - -#undef FCS_LOG_ERR -#define FCS_LOG_ERR(...) ERROR(__VA_ARGS__) - -/** - * @brief set logging level of logger system - * - * @param level logging level - * @return 0 on success, negative number on error. - */ -FCS_OSAL_INT fcs_set_logging(enum fcs_loglevel level); - -/** - * @brief initialize logging - * - * @param log_file file to log the messages. - * @return 0 on success, negative number on error. - */ -FCS_OSAL_INT fcs_logging_init(FCS_OSAL_CHAR *log_file); - -/** - * @brief logging function each platform needs to define - * - * @param level logging level - * @param format string format - * - * @return Nil - */ -FCS_OSAL_VOID fcs_logger(enum fcs_loglevel level, const FCS_OSAL_CHAR *format, ...); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* LIBFCS_LOGGING_H */ diff --git a/lib/include/os/freertos/libfcs_utils.h b/lib/include/os/freertos/libfcs_utils.h deleted file mode 100644 index 9721dec..0000000 --- a/lib/include/os/freertos/libfcs_utils.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef LIBFCS_UTILS_H -#define LIBFCS_UTILS_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#include "libfcs_osal.h" - -/** - * @brief Gets the file size - * - * @param[in] file Name of the file. It shall contain the source device - * also.(eg: /usb/file) - */ -uint32_t fat_get_size( const char *file ); -/** - * @brief Reads contents of the file - * - * @param[in] file Name of the file. It shall contain the source device - * also.(eg: /usb/file) - * @param[in, out] buffer Buffer to store contents - */ - -uint32_t fat_read( const char *FileName, void *buffer ); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -// #endif -#endif diff --git a/lib/src/os/freertos/CMakeLists.txt b/lib/src/os/freertos/CMakeLists.txt index b3c7ba9..2092a87 100644 --- a/lib/src/os/freertos/CMakeLists.txt +++ b/lib/src/os/freertos/CMakeLists.txt @@ -1,9 +1,9 @@ # SPDX-License-Identifier: MIT-0 # Copyright (C) 2025 Altera -cmake_minimum_required(VERSION 3.20) - -target_sources(FCS PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/libfcs_logging.c") -target_sources(FCS PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/libfcs_osal.c") -target_sources(FCS PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/libfcs_utils.c") +if(NOT DEFINED FREERTOS_TOOLCHAIN) + message(FATAL_ERROR "not building inside inside FreeRTOS") +endif() +set(SHARED_LIB OFF) +set(OS freertos) diff --git a/lib/src/os/freertos/libfcs_logging.c b/lib/src/os/freertos/libfcs_logging.c deleted file mode 100644 index 4814917..0000000 --- a/lib/src/os/freertos/libfcs_logging.c +++ /dev/null @@ -1,55 +0,0 @@ -// SPDX-License-Identifier: MIT-0 -/* - * Copyright (C) 2025 Altera - */ - -#include -#include -#include - -static enum fcs_loglevel fcs_curr_loglevel = LIBRARY_LOG_LEVEL; - -FCS_OSAL_INT fcs_set_logging(enum fcs_loglevel level) -{ - if (level > L_LOG_DEBUG) { - FCS_LOG_ERR("wrong log level provided : %d", level); - return -1; - } - fcs_curr_loglevel = level; - return 0; -} - -FCS_OSAL_INT fcs_logging_init(FCS_OSAL_CHAR *loglevel) -{ - if (loglevel == NULL) { - FCS_LOG_INF("No log level provided, setting to default as LOG_INFO"); - return fcs_set_logging(LOG_INFO); - } - - if (strcmp(loglevel, "log_off") == 0) - { - return fcs_set_logging(L_LOG_NONE); - } - else if (strcmp(loglevel, "log_err") == 0) - { - return fcs_set_logging(L_LOG_ERROR); - } - else if (strcmp(loglevel, "log_wrn") == 0) - { - return fcs_set_logging(L_LOG_WARN); - } - else if (strcmp(loglevel, "log_inf") == 0) - { - return fcs_set_logging(L_LOG_INFO); - } - else if (strcmp(loglevel, "log_dbg") == 0) - { - return fcs_set_logging(L_LOG_DEBUG); - } - else - { - /* do nothing */ - } - - return -1; -} diff --git a/lib/src/os/freertos/libfcs_osal.c b/lib/src/os/freertos/libfcs_osal.c deleted file mode 100644 index 9471a64..0000000 --- a/lib/src/os/freertos/libfcs_osal.c +++ /dev/null @@ -1,1388 +0,0 @@ -// SPDX-License-Identifier: MIT-0 -/* - * Copyright (C) 2025 Altera - */ - - -#include -#include -#include -#include "osal.h" -#include "socfpga_fcs.h" -#include "libfcs_utils.h" -#include -#include -#include - -#define SDOS_OWNER_ID_OFFSET 12U -#define SDOS_OWNER_ID_SIZE 8U -#define HKDF_INPUT_SIZE 80U -#define HKDF_MAX_SIZE 4096U - - -static FCS_OSAL_INT fcs_freertos_api_binding(struct libfcs_osal_intf *intf); -FCS_OSAL_INT fcs_freertos_open_service_session(struct fcs_cmd_context *ctx); -FCS_OSAL_INT -fcs_freertos_close_service_session(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_random_number_ext(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_import_service_key(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_export_service_key(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_remove_service_key(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_get_service_key_info(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_create_service_key(struct fcs_cmd_context *ctx); -FCS_OSAL_INT -fcs_freertos_service_get_provision_data(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_counter_set(struct fcs_cmd_context *ctx); -FCS_OSAL_INT -fcs_freertos_counter_set_preauthorized(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_hkdf_request(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_aes_crypt(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_ecdh_req(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_get_digest(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_mac_verify(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_sdos_encrypt(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_sdos_decrypt(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_get_chip_id(struct fcs_cmd_context *ctx); -FCS_OSAL_INT -fcs_freertos_attestation_get_certificate(struct fcs_cmd_context *ctx); -FCS_OSAL_INT -fcs_freertos_attestation_cert_reload(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_mctp_cmd_send(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_get_jtag_idcode(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_get_device_identity(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_qspi_open(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_qspi_close(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_qspi_set_cs(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_qspi_read(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_qspi_write(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_qspi_erase(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_ecdsa_get_pub_key(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_ecdsa_hash_sign(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_ecdsa_hash_verify(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_ecdsa_sha2_data_sign(struct fcs_cmd_context *ctx); -FCS_OSAL_INT -fcs_freertos_ecdsa_sha2_data_verify(struct fcs_cmd_context *ctx); -FCS_OSAL_INT fcs_freertos_hps_img_validate(struct fcs_cmd_context *ctx); - -/** - * @brief Allocate memory of given size. - * - * @param size allocate memory size. - * @return Pointer to the allocated memory, or NULL if size is 0 or allocation - * fails. - */ -FCS_OSAL_VOID *fcs_malloc(FCS_OSAL_SIZE size) -{ - if (size == 0) { - FCS_LOG_ERR("Attempted to allocate zero size memory\n"); - return NULL; - } - FCS_OSAL_VOID *ptr = pvPortMalloc(size); - - if (!ptr) - { - FCS_LOG_ERR("Memory allocation failed\n"); - } - - return ptr; -} - -/** - * @brief Free allocated memory. - * - * @param ptr Pointer to the memory to free. - */ -FCS_OSAL_VOID fcs_osal_free(FCS_OSAL_VOID *ptr) -{ - if (ptr != NULL) - { - vPortFree(ptr); - } - else - { - FCS_LOG_WRN("Attempted to free a NULL pointer\n"); - } -} - -/** - * @brief Initialize a mutex. - * - * @param mutex Pointer to the mutex. - * - * @return 0 on success, negative value on error. - */ -FCS_OSAL_INT fcs_mutex_init(FCS_OSAL_MUTEX *mutex) -{ - if (!mutex) { - FCS_LOG_ERR("Invalid mutex pointer provided to fcs mutex init\n"); - return -1; - } - - *mutex = xSemaphoreCreateMutex(); - - if (*mutex == NULL) - { - FCS_LOG_ERR("Mutex initialization failed\n"); - return -1; - } - return 0; -} - -/** - * @brief Lock the mutex with a timeout. - * - * @param mutex Pointer to the mutex. - * @param time Timeout value in milliseconds. - * - * @return 0 on success, negative value on error. - */ -FCS_OSAL_INT fcs_mutex_timedlock(FCS_OSAL_MUTEX *mutex, FCS_OSAL_U32 const time) -{ - FCS_OSAL_INT ret; - - /* Check if the mutex pointer is NULL */ - if (!mutex) { - FCS_LOG_ERR("Invalid mutex pointer provided to fcs mutex timedlock\n"); - return -1; // Return invalid argument error - } - - ret = osal_mutex_lock(*mutex, time); - if (ret == pdTRUE) - { - return 0; - } - else - { - return -1; - } -} - -/** - * @brief Release the mutex. - * - * @param mutex Pointer to the mutex. - * - * @return 0 on success, negative value on error. - */ -FCS_OSAL_INT fcs_mutex_unlock(FCS_OSAL_MUTEX *mutex) -{ - /* Check if the mutex pointer is NULL */ - if (!mutex) { - FCS_LOG_ERR("Invalid mutex pointer provided to fcs mutex unlock\n"); - return -1; /* Return invalid argument error */ - } - if (osal_mutex_unlock(*mutex) == false) - { - return -1; - } - return 0; -} - -/** - * @brief Destroy the mutex. - * - * @param mutex Pointer to the mutex. - * - * @return 0 on success, negative value on error. - */ -FCS_OSAL_INT fcs_mutex_destroy(FCS_OSAL_MUTEX *mutex) -{ - /* Check if the mutex pointer is NULL */ - if (!mutex) { - FCS_LOG_ERR("Invalid mutex pointer provided to fcs mutex destroy\n"); - return -1; /* Return invalid argument error */ - } - - /* Destroy the mutex */ - (void) osal_mutex_delete(*mutex); - - return 0; -} - -/** - * @brief allocate memory for the buffer and copy the file content to the buffer - * - * @param filename file name to read - * @param buffer to copy the file content - * - * @return FCS_OSAL_INT - */ - -FCS_OSAL_INT fcs_alloc_and_cpy_file_to_mem(const FCS_OSAL_CHAR *filename, - FCS_OSAL_CHAR **buffer) -{ - uint32_t file_size, bytes_read; - file_size = fat_get_size(filename); - *buffer = pvPortMalloc(file_size); - - bytes_read = fat_read(filename, *buffer); - if (bytes_read != file_size) - { - FCS_LOG_ERR("Failed to read file"); - vPortFree(*buffer); - *buffer = NULL; - return -1; // Error reading file - } - return bytes_read; -} - -/** - * @brief prints debug information - * - * @param fit - pointer to the FIT image header - * @param noffset - component image node offset - * @param prop_name - fir node property name - * @param err - error code - */ -static FCS_OSAL_VOID fcs_freertos_fit_get_debug(const FCS_OSAL_VOID *fit, - FCS_OSAL_INT noffset, - FCS_OSAL_VOID *prop_name, - FCS_OSAL_INT err) -{ - FCS_LOG_DBG( - "Can't get '%s' property from FIT 0x%08lx, node: offset %d, name %s (%s)\n", - (FCS_OSAL_CHAR *)prop_name, (ulong)fit, noffset, - fdt_get_name(fit, noffset, NULL), fdt_strerror(err)); -} - -/** - * @brief sanity check FIT image format. - * runs a basic sanity FIT image verification. - * Routine checks for mandatory properties, nodes, etc. - * - * @param fit - pointer to the FIT format image header - * - * @return 0, on success, EINVAL, on failure - */ -static FCS_OSAL_INT fcs_freertos_fit_check_format(FCS_OSAL_CHAR *fit) -{ -/* mandatory / node 'description' property */ - if (!fdt_getprop(fit, 0, FIT_DESC_PROP, NULL)) { - FCS_LOG_DBG("Wrong FIT format: no description\n"); - return -EINVAL; - } - - if (IMAGE_ENABLE_TIMESTAMP == 0) { -/* mandatory / node 'timestamp' property */ - if (!fdt_getprop(fit, 0, FIT_TIMESTAMP_PROP, NULL)) { - FCS_LOG_DBG("Wrong FIT format: no timestamp\n"); - return -EINVAL; - } - } - -/* mandatory subimages parent '/images' node */ - if (fdt_path_offset(fit, FIT_PARENT_NODE_PATH) < 0) { - FCS_LOG_DBG("Wrong FIT format: no images parent node\n"); - return -EINVAL; - } - - return 0; -} - -/** - * @brief Get the data pointer of the image in the FIT image - * - * @param fit - pointer to the FIT format image header - * @param noffset - offset to the image node - * @param data_size - pointer to store the data size - * - * @return 0 on success, other value on failure - */ -static FCS_OSAL_INT fcs_freertos_fit_image_get_data_size(FCS_OSAL_CHAR *fit, - FCS_OSAL_INT noffset, - FCS_OSAL_INT *data_size) -{ - const FCS_OSAL_U32 *val; - - val = (FCS_OSAL_U32*) fdt_getprop((const FCS_OSAL_VOID *)fit, noffset, - FIT_DATA_SIZE_PROP, NULL); - if (!val) - { - return -ENOENT; - } - - *data_size = fdt32_to_cpu(*val); - - return 0; -} - -/** - * @brief Get the offset of the data in the FIT image - * - * @param fit - pointer to the FIT format image header - * @param noffset - component image node offset - * @param data_position - holds the data-position property - * - * @return 0 on success, other value on failure - */ -static FCS_OSAL_INT fcs_freertos_fit_image_get_data_position(FCS_OSAL_CHAR *fit, - FCS_OSAL_INT noffset, - int *data_position) -{ - const FCS_OSAL_U32 *val; - - val = (FCS_OSAL_U32*) fdt_getprop((const FCS_OSAL_VOID *)fit, noffset, - FIT_DATA_POSITION_PROP, NULL); - if (!val) - { - return -ENOENT; - } - - *data_position = fdt32_to_cpu(*val); - - return 0; -} - -/** - * @brief Get 'data-offset' property from a given image node. - * - * @param fit - pointer to the FIT image header - * @param noffset - component image node offset - * @param data_offset - holds the data-offset property - * - * @return 0 on success, other value on failure - */ -static FCS_OSAL_INT -fcs_freertos_fit_image_get_data_offset(FCS_OSAL_CHAR *fit, FCS_OSAL_INT noffset, - FCS_OSAL_INT *data_offset) -{ - const FCS_OSAL_U32 *val; - - val = (FCS_OSAL_U32*) fdt_getprop((const FCS_OSAL_VOID *)fit, noffset, - FIT_DATA_OFFSET_PROP, NULL); - if (!val) - { - return -ENOENT; - } - - *data_offset = fdt32_to_cpu(*val); - - return 0; -} - -/** - * @brief finds data property in a given component image node. - * If the property is found its data start address and size are returned to - * the caller. - * - * @param fit - pointer to the FIT image header - * @param noffset - component image node offset - * @param data - pointer to store the data pointer - * @param size - pointer to store the data size - * - * @return 0 on success, other value on failure - * - */ -static FCS_OSAL_INT fcs_freertos_fit_img_get_data(const FCS_OSAL_VOID *fit, - FCS_OSAL_INT noffset, - const FCS_OSAL_VOID **data, - FCS_OSAL_SIZE *size) -{ - int len; - - *data = fdt_getprop(fit, noffset, FIT_DATA_PROP, - &len); - if (!*data) { - (void) fcs_freertos_fit_get_debug(fit, noffset, FIT_DATA_PROP, len); - *size = 0; - return -1; - } - - *size = len; - return 0; -} - -/** - * @brief returns fdt error message for the given error code - */ -const FCS_OSAL_CHAR *fcs_fit_strerror(FCS_OSAL_INT err) -{ - return fdt_strerror(err); -} - -/** - * @brief Verify the FIT image header. - * - * @param fit Pointer to the FIT buffer. - * @param size FIT size. - * - * @return 0 on success, negative value on error. - */ -FCS_OSAL_INT fcs_fit_verify_header(FCS_OSAL_CHAR *fit) -{ - if (!fdt_check_header((const FCS_OSAL_VOID *)fit) || - !fcs_freertos_fit_check_format(fit)) - { - return -1; - } - return 0; -} - -/** - * @brief Get the position of the node in the FIT image - * - * @param fit - pointer to the FIT format image header - * @param path - path to the node - * - * @return offset to the node - */ -FCS_OSAL_INT fcs_fit_get_noffset(FCS_OSAL_CHAR *fit, const FCS_OSAL_CHAR *path) -{ - return fdt_path_offset((const FCS_OSAL_VOID *)fit, path); -} - -/** - * @brief Get the next node in the FIT image - * - * @param fit - pointer to the FIT format image header - * @param offset - offset to the node - * @param depth - pointer to store the depth - * - * @return offset to the next node - */ -FCS_OSAL_INT fcs_fit_next_node(FCS_OSAL_CHAR *fit, FCS_OSAL_INT offset, - FCS_OSAL_INT *depth) -{ - return fdt_next_node((const FCS_OSAL_VOID *)fit, offset, depth); -} - -/** - * @brief Get the position of the data in the FIT image - * - * @param fit - pointer to the FIT format image header - * @param noffset - offset to the image node - * @param offset - pointer to store the data position - * @param data - pointer to store the data pointer - * @param size - pointer to store the data size - * - * @return 0 on success, other value on failure - */ -FCS_OSAL_INT fcs_fit_image_get_data_and_size(FCS_OSAL_CHAR *fit, - FCS_OSAL_INT noffset, - FCS_OSAL_CHAR **data, - FCS_OSAL_SIZE *size) -{ - bool external_data = false; - int offset = 0; - int len = 0; - int ret; - - if (!fcs_freertos_fit_image_get_data_position(fit, noffset, &offset)) { - external_data = true; - } else if (!fcs_freertos_fit_image_get_data_offset(fit, noffset, &offset)) { - external_data = true; -/* - * For FIT with external data, figure out where - * the external images start. This is the base - * for the data-offset properties in each image. - */ - offset += ((fdt_totalsize((const FCS_OSAL_VOID *)fit) + 3U) & ~3U); - } - else - { - /*do nothing*/ - } - - if (external_data) { - FCS_LOG_DBG("External Data\n"); - ret = fcs_freertos_fit_image_get_data_size(fit, noffset, &len); - *data = fit + offset; - *size = len; - } else { - ret = fcs_freertos_fit_img_get_data((const FCS_OSAL_VOID *)fit, - noffset, (const FCS_OSAL_VOID **)data, size); - } - - return ret; -} - -/** - * @brief Open a service session - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_open_service_session(struct fcs_cmd_context *ctx) -{ - char uuid[FCS_OSAL_UUID_SIZE] = {0}; - FCS_OSAL_INT ret = run_fcs_open_service_session(uuid); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - if (ret == 0) - { - (void) memcpy(ctx->open_session.suuid, uuid, FCS_OSAL_UUID_SIZE); - *ctx->open_session.suuid_len = FCS_OSAL_UUID_SIZE; - } - else - { - (void) memset(ctx->open_session.suuid, 0U, FCS_OSAL_UUID_SIZE); - *ctx->open_session.suuid_len = 0U; - } - return 0; - } - return ret; -} - -/** - * @brief Close service session - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_close_service_session(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_close_service_session(ctx->close_session.suuid); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Get provisioned data inforamtion - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT -fcs_freertos_service_get_provision_data(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_service_get_provision_data( - ctx->prov_data.data, ctx->prov_data.data_len); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Generate a random number - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_random_number_ext(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_random_number_ext(ctx->rng.rng, - ctx->rng.suuid, - ctx->rng.context_id, - ctx->rng.rng_len); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Import a service key - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_import_service_key(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_import_service_key(ctx->import_key.suuid, - ctx->import_key.key, - ctx->import_key.key_len, ctx->import_key.status, - ctx->import_key.status_len); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Export a service key object - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_export_service_key(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_export_service_key(ctx->export_key.suuid, - ctx->export_key.key_id, - ctx->export_key.key, ctx->export_key.key_len); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Remove service key - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_remove_service_key(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_remove_service_key(ctx->remove_key.suuid, - ctx->remove_key.key_id); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Get service key information - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_get_service_key_info(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_get_service_key_info(ctx->key_info.suuid, - ctx->key_info.key_id, - ctx->key_info.info, ctx->key_info.info_len); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - - return ret; -} - -/** - * @brief Create a service key - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_create_service_key(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_create_service_key(ctx->create_key.suuid, - ctx->create_key.key, - ctx->create_key.key_len, ctx->create_key.status, - ctx->create_key.status_len); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Perform counter set - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_counter_set(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_send_certificate(ctx->ctr_set.ccert, - ctx->ctr_set.ccert_len, (uint32_t*)ctx->ctr_set.status); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - /* status size is always 4 bytes for counter set*/ - *ctx->ctr_set.status_len = sizeof(uint32_t); - return ret; -} - -/** - * @brief Perform counter set preauth - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT -fcs_freertos_counter_set_preauthorized(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_service_counter_set_preauthorized( - ctx->ctr_set_preauth.ctr_type, - ctx->ctr_set_preauth.ctr_val, ctx->ctr_set_preauth.test); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief HKDF request - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_hkdf_request(struct fcs_cmd_context *ctx) -{ - char *temp, *input_data; - input_data = (char*)(uintptr_t) pvPortMalloc(HKDF_MAX_SIZE); - if (input_data == NULL) - { - return -ENOMEM; - } - /* - * formatting input for HKDF request - * 4 bytes - input_data_size - * 80 bytes - input_data padded to 80 bytes with 0s - * 4 bytes - second_input_size - * 80 bytes - second_input_data padded to 80 bytes with 0 - * Output key object data - */ - temp = input_data; - (void) memset(temp, 0, HKDF_MAX_SIZE); - (void) memcpy(temp, &ctx->hkdf_req.ikm_len, sizeof(ctx->hkdf_req.ikm_len)); - temp += sizeof(ctx->hkdf_req.ikm_len); - (void) memcpy(temp, ctx->hkdf_req.ikm, ctx->hkdf_req.ikm_len); - temp += HKDF_INPUT_SIZE; - (void) memcpy(temp, &ctx->hkdf_req.info_len, sizeof(ctx->hkdf_req.info_len)); - temp += sizeof(ctx->hkdf_req.info_len); - (void) memcpy(temp, ctx->hkdf_req.info, ctx->hkdf_req.info_len); - temp += HKDF_INPUT_SIZE; - (void) memcpy(temp, ctx->hkdf_req.output_key_obj, - ctx->hkdf_req.output_key_obj_len); - - FCS_OSAL_INT ret = run_fcs_hkdf_request(ctx->hkdf_req.suuid, - ctx->hkdf_req.key_id, - ctx->hkdf_req.step_type, ctx->hkdf_req.mac_mode, input_data, - ctx->hkdf_req.output_key_obj_len, - ctx->hkdf_req.hkdf_resp); - vPortFree(input_data); - - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Get chip ID - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_get_chip_id(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_get_chip_id(ctx->chip_id.chip_id_lo, - ctx->chip_id.chip_id_hi); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Get an attestation certificate - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT -fcs_freertos_attestation_get_certificate(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_attestation_get_certificate( - ctx->attestation_cert.cert_request, - ctx->attestation_cert.cert, ctx->attestation_cert.cert_size); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Attestation certificate reload - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT -fcs_freertos_attestation_cert_reload(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_attestation_certificate_reload( - ctx->attestation_cert_reload.cert_request); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - - return ret; -} - -/** - * @brief Perform MCTP operation - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_mctp_cmd_send(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_mctp_cmd_send(ctx->mctp.mctp_req, - ctx->mctp.mctp_req_len, - ctx->mctp.mctp_resp, ctx->mctp.mctp_resp_len); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Get JTAG ID code - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_get_jtag_idcode(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_get_jtag_idcode(ctx->jtag_id.jtag_idcode); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Get device identity - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_get_device_identity(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_get_device_identity( - ctx->device_identity.identity, - ctx->device_identity.identity_len); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Open an access to QSPI interface - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_qspi_open(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_qspi_open(); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Close an access to QSPI interface - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_qspi_close(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_qspi_close(); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - - -/** - * @brief Chip select - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_qspi_set_cs(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_qspi_set_cs(ctx->qspi_cs.chipsel); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Read data from QSPI flash - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_qspi_read(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_qspi_read(ctx->qspi_write.qspi_addr, - ctx->qspi_write.len, - ctx->qspi_write.buffer); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} -/** - * @brief Write data to QSPI flash - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_qspi_write(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_qspi_write(ctx->qspi_write.qspi_addr, - ctx->qspi_write.len, - ctx->qspi_write.buffer); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Erase QSPI flash - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_qspi_erase(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_qspi_erase(ctx->qspi_erase.qspi_addr, - ctx->qspi_erase.len); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Perform AES encryption/decryption operation - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_aes_crypt(struct fcs_cmd_context *ctx) -{ - if (ctx->aes.mode == FCS_AES_GCM_GHASH) - { - *ctx->aes.op_len = 0; - } - else - { - *ctx->aes.op_len = ctx->aes.ip_len; - } - FCS_OSAL_INT ret = run_fcs_aes_cryption(ctx->aes.suuid, ctx->aes.kid, - ctx->aes.cid, - ctx->aes.crypt, - ctx->aes.mode, ctx->aes.iv_source, ctx->aes.iv, - ctx->aes.tag_len, - ctx->aes.aad_len, - ctx->aes.aad, - ctx->aes.tag, - ctx->aes.input, ctx->aes.ip_len, ctx->aes.output, - *ctx->aes.op_len); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -FCS_OSAL_INT fcs_freertos_ecdh_req(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_ecdh_request(ctx->ecdh_req.suuid, - ctx->ecdh_req.kid, - ctx->ecdh_req.cid, - ctx->ecdh_req.ecc_curve, ctx->ecdh_req.pubkey, - ctx->ecdh_req.pubkey_len, - ctx->ecdh_req.sh_secret, ctx->ecdh_req.sh_secret_len); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Generate digest - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_get_digest(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_get_digest(ctx->dgst.suuid, - ctx->dgst.context_id, - ctx->dgst.key_id, - ctx->dgst.sha_op_mode, ctx->dgst.sha_digest_sz, ctx->dgst.src, - ctx->dgst.src_len, ctx->dgst.digest, ctx->dgst.digest_len); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Verify HMAC - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_mac_verify(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_mac_verify(ctx->mac_verify.suuid, - ctx->mac_verify.context_id, - ctx->mac_verify.key_id, ctx->mac_verify.sha_digest_sz, - ctx->mac_verify.src, - ctx->mac_verify.src_size, ctx->mac_verify.dst, - ctx->mac_verify.dst_size, - ctx->mac_verify.user_data_size); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Validate an HPS image - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_hps_img_validate(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_send_certificate( - ctx->hps_img_validate.vab_cert, - ctx->hps_img_validate.vab_cert_len, ctx->hps_img_validate.resp); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Perform SDOS encryption operation - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_sdos_encrypt(struct fcs_cmd_context *ctx) -{ - (void) memcpy(&ctx->sdos.own, ctx->sdos.src + SDOS_OWNER_ID_OFFSET, - SDOS_OWNER_ID_SIZE); - FCS_OSAL_INT ret = run_fcs_sdos_encrypt(ctx->sdos.suuid, - ctx->sdos.context_id, - ctx->sdos.src, ctx->sdos.src_size, ctx->sdos.dst, - ctx->sdos.dst_size); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Perform SDOS decryption operation - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_sdos_decrypt(struct fcs_cmd_context *ctx) -{ - (void) memcpy(&ctx->sdos.own, ctx->sdos.src + SDOS_OWNER_ID_OFFSET, - SDOS_OWNER_ID_SIZE); - FCS_OSAL_INT ret = run_fcs_sdos_decrypt(ctx->sdos.suuid, - ctx->sdos.context_id, - ctx->sdos.src, ctx->sdos.src_size, ctx->sdos.dst, - ctx->sdos.dst_size, - ctx->sdos.own); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Get ECDSA public key - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_ecdsa_get_pub_key(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_ecdsa_get_public_key(ctx->ecdsa_pub_key.suuid, - ctx->ecdsa_pub_key.context_id, - ctx->ecdsa_pub_key.key_id, ctx->ecdsa_pub_key.ecc_curve, - ctx->ecdsa_pub_key.pubkey, ctx->ecdsa_pub_key.pubkey_len); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Generate ECDSA hash signature - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_ecdsa_hash_sign(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_ecdsa_hash_sign(ctx->ecdsa_hash_sign.suuid, - ctx->ecdsa_hash_sign.context_id, - ctx->ecdsa_hash_sign.key_id, ctx->ecdsa_hash_sign.ecc_curve, - ctx->ecdsa_hash_sign.src, ctx->ecdsa_hash_sign.src_len, - ctx->ecdsa_hash_sign.dst, ctx->ecdsa_hash_sign.dst_len); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Verify ECDSA hash signature - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_ecdsa_hash_verify(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_ecdsa_hash_verify(ctx->ecdsa_hash_verify.suuid, - ctx->ecdsa_hash_verify.context_id, - ctx->ecdsa_hash_verify.key_id, - ctx->ecdsa_hash_verify.ecc_curve, ctx->ecdsa_hash_verify.src, - ctx->ecdsa_hash_verify.src_len, - ctx->ecdsa_hash_verify.signature, - ctx->ecdsa_hash_verify.signature_len, - ctx->ecdsa_hash_verify.pubkey, - ctx->ecdsa_hash_verify.pubkey_len, ctx->ecdsa_hash_verify.dst, - ctx->ecdsa_hash_verify.dst_len); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Generate ECDSA SHA2 data signature - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_ecdsa_sha2_data_sign(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_ecdsa_sha2_data_sign( - ctx->ecdsa_sha2_data_sign.suuid, - ctx->ecdsa_sha2_data_sign.context_id, - ctx->ecdsa_sha2_data_sign.key_id, - ctx->ecdsa_sha2_data_sign.ecc_curve, - ctx->ecdsa_sha2_data_sign.src, - ctx->ecdsa_sha2_data_sign.src_len, - ctx->ecdsa_sha2_data_sign.dst, - ctx->ecdsa_sha2_data_sign.dst_len); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Verify ECDSA SHA2 data signature - * - * @param ctx Context pointer to the context of the command - * - * @return 0 on success, otherwise value on error. - */ -FCS_OSAL_INT fcs_freertos_ecdsa_sha2_data_verify(struct fcs_cmd_context *ctx) -{ - FCS_OSAL_INT ret = run_fcs_ecdsa_sha2_data_sign_verify( - ctx->ecdsa_sha2_data_verify.suuid, - ctx->ecdsa_sha2_data_verify.context_id, - ctx->ecdsa_sha2_data_verify.key_id, - ctx->ecdsa_sha2_data_verify.ecc_curve, - ctx->ecdsa_sha2_data_verify.src, - ctx->ecdsa_sha2_data_verify.src_len, - ctx->ecdsa_sha2_data_verify.signature, - ctx->ecdsa_sha2_data_verify.signature_len, - ctx->ecdsa_sha2_data_verify.pubkey, - ctx->ecdsa_sha2_data_verify.pubkey_len, - ctx->ecdsa_sha2_data_verify.dst, - ctx->ecdsa_sha2_data_verify.dst_len); - if (ret >= 0) - { - *ctx->error_code_addr = ret; - return 0; - } - return ret; -} - -/** - * @brief Bind the OSAL API to the interface. - * - * @param intf Pointer to the OSAL interface. - * - * @return 0 on success, negative value on error. - */ -static FCS_OSAL_INT fcs_freertos_api_binding(struct libfcs_osal_intf *intf) -{ - if (intf == NULL) { - FCS_LOG_ERR("Invalid argument: intf is NULL\n"); - return -1; - } - - intf->open_service_session = fcs_freertos_open_service_session; - intf->close_service_session = fcs_freertos_close_service_session; - intf->random_number_ext = fcs_freertos_random_number_ext; - intf->import_service_key = fcs_freertos_import_service_key; - intf->export_service_key = fcs_freertos_export_service_key; - intf->remove_service_key = fcs_freertos_remove_service_key; - intf->get_service_key_info = fcs_freertos_get_service_key_info; - intf->create_service_key = fcs_freertos_create_service_key; - intf->get_provision_data = fcs_freertos_service_get_provision_data; - intf->counter_set = fcs_freertos_counter_set; - intf->counter_set_preauthorized = fcs_freertos_counter_set_preauthorized; - intf->hkdf_request = fcs_freertos_hkdf_request; - intf->get_digest = fcs_freertos_get_digest; - intf->mac_verify = fcs_freertos_mac_verify; - intf->aes_crypt = fcs_freertos_aes_crypt; - intf->ecdh_req = fcs_freertos_ecdh_req; - intf->get_chip_id = fcs_freertos_get_chip_id; - intf->attestation_get_certificate = - fcs_freertos_attestation_get_certificate; - intf->attestation_cert_reload = fcs_freertos_attestation_cert_reload; - intf->mctp_cmd_send = fcs_freertos_mctp_cmd_send; - intf->get_jtag_idcode = fcs_freertos_get_jtag_idcode; - intf->get_device_identity = fcs_freertos_get_device_identity; - intf->qspi_open = fcs_freertos_qspi_open; - intf->qspi_close = fcs_freertos_qspi_close; - intf->qspi_cs = fcs_freertos_qspi_set_cs; - intf->qspi_read = fcs_freertos_qspi_read; - intf->qspi_write = fcs_freertos_qspi_write; - intf->qspi_erase = fcs_freertos_qspi_erase; - intf->sdos_encrypt = fcs_freertos_sdos_encrypt; - intf->sdos_decrypt = fcs_freertos_sdos_decrypt; - intf->ecdsa_get_pub_key = fcs_freertos_ecdsa_get_pub_key; - intf->ecdsa_hash_sign = fcs_freertos_ecdsa_hash_sign; - intf->ecdsa_hash_verify = fcs_freertos_ecdsa_hash_verify; - intf->ecdsa_sha2_data_sign = fcs_freertos_ecdsa_sha2_data_sign; - intf->ecdsa_sha2_data_verify = fcs_freertos_ecdsa_sha2_data_verify; - intf->hps_img_validate = fcs_freertos_hps_img_validate; - - return 0; -} - -/** - * @brief Initialize the OSAL. - * - * @param intf Pointer to the OSAL interface. - * @param loglevel set log level - * - * @return 0 on success, negative value on error. - */ - -FCS_OSAL_INT libfcs_osal_init(struct libfcs_osal_intf *intf, char *log_level) -{ - (void)log_level; - FCS_OSAL_INT ret; - - /* Bind the OSAL APIs */ - ret = fcs_freertos_api_binding(intf); - - if (ret != 0) { - FCS_LOG_ERR("Error in binding OSAL APIs\n"); - return ret; - } - - ret = fcs_init(); - - if (ret != 0) { - FCS_LOG_ERR("Error in initialsing driver\n"); - return ret; - } - return 0; -} diff --git a/lib/src/os/freertos/libfcs_utils.c b/lib/src/os/freertos/libfcs_utils.c deleted file mode 100644 index dd59a43..0000000 --- a/lib/src/os/freertos/libfcs_utils.c +++ /dev/null @@ -1,153 +0,0 @@ -// SPDX-License-Identifier: MIT-0 -/* - * Copyright (C) 2025 Altera - */ - -#include "libfcs_utils.h" -#include "libfcs_logging.h" -#include "ff_sddisk.h" - -#define MOUNTED 1 -#define UNMOUNTED 0 -#define MOUNT_SD_CARD -1 -#define MOUNT_USB 0 - -static const char *sdmmc_mount = "/root/"; // Name of the mount point -static const char *usb_mount = "/usb/"; - -FF_Disk_t *xDiskObj = NULL; -uint8_t ucMountStatus = UNMOUNTED; - -static int fat_get_disk_type(const char *mptr) -{ - if (strncmp(mptr, sdmmc_mount, 6) == 0) - { - return 0; - } - else if (strncmp(mptr, usb_mount, 5) == 0) - { - return 1; - } - else - { - return -1; - } - - return -1; -} - -static int fat_mount( const char *MountName ) -{ - int mount_type = fat_get_disk_type(MountName); - if (mount_type == 0) - { - xDiskObj = FF_SDDiskInit(MountName, MOUNT_SD_CARD); - } - else if (mount_type == 1) - { - xDiskObj = FF_SDDiskInit(MountName, MOUNT_USB); - } - else - { - ERROR("Invalid mount point"); - return -1; - } - if (xDiskObj != NULL) - { - ucMountStatus = MOUNTED; - return mount_type; - } - else - { - ERROR("Mounting Failed"); - return -1; - } -} - -static void fat_unmount( void ) -{ - if (xDiskObj == NULL) - { - ERROR("No mounted devices"); - return; - } - FF_Unmount(xDiskObj); - FF_SDDiskDelete(xDiskObj); - xDiskObj = NULL; - ucMountStatus = UNMOUNTED; -} -uint32_t fat_get_size( const char *file ) -{ - int ret; - uint32_t file_size; - FF_Error_t xError; - FF_FILE *pxFile; - ret = fat_mount(file); - if (xDiskObj == NULL) - { - ERROR("Failed to mount"); - return 0; - } - if (ret == 0) - { - pxFile = - FF_Open(xDiskObj->pxIOManager, file + 5, FF_MODE_READ, &xError); - } - else - { - pxFile = - FF_Open(xDiskObj->pxIOManager, file + 4, FF_MODE_READ, &xError); - } - if ((pxFile == NULL) || (xError != FF_ERR_NONE)) - { - INFO("Failed to open file for reading\r\n"); - FF_Unmount(xDiskObj); - FF_SDDiskDelete(xDiskObj); - return 0; - } - - ret = FF_GetFileSize(pxFile, &file_size); - if (ret != 0) - { - ERROR("Error getting file size "); - return 0; - } - FF_Close(pxFile); - return file_size; -} -uint32_t fat_read( const char *file, void *buffer ) -{ - FF_Error_t xError; - uint32_t ulBytesRead = 0; - FF_FILE *pxFile; - int ret; - ret = fat_mount(file); - if (xDiskObj == NULL) - { - ERROR("Failed to mount"); - return 0; - } - if (ret == 0) - { - pxFile = FF_Open(xDiskObj->pxIOManager, file + 5, - FF_MODE_READ, &xError); - } - else if (ret == 1) - { - pxFile = FF_Open(xDiskObj->pxIOManager, file + 4, - FF_MODE_READ, &xError); - } - else - { - ERROR("Invalid mount point"); - return 0; - } - if (pxFile != NULL) - { - ulBytesRead = FF_Read(pxFile, 1, pxFile->ulFileSize, (uint8_t*)buffer); - FF_Close(pxFile); - } - fat_unmount(); - return ulBytesRead; -} - diff --git a/third_party/CMakeLists.txt b/third_party/CMakeLists.txt index 5774507..2baf037 100644 --- a/third_party/CMakeLists.txt +++ b/third_party/CMakeLists.txt @@ -38,18 +38,25 @@ if(FDT_LIBRARY STREQUAL FDT_LIBRARY-NOTFOUND) CONFIGURE_COMMAND ${LIBFDT_CONFIGURE_COMMAND} # Command to configure the project BUILD_COMMAND ${LIBFDT_BUILD_COMMAND} # Command to build the project INSTALL_COMMAND ${LIBFDT_INSTALL_COMMAND} # Command to install the project - BUILD_BYPRODUCTS ${LIBFDT_INSTALL_DIR}/libfdt.a + BUILD_BYPRODUCTS ${LIBFDT_INSTALL_DIR}/libfdt.a ${LIBFDT_INSTALL_DIR}/libfdt.so ) - # Add libfdt and libkcapi dependency for fcs add_dependencies(FCS libfdt) # link fdt library with FCS - target_link_libraries( - FCS - PUBLIC - ${LIBFDT_INSTALL_DIR}/libfdt.a - ) + if(LIBRARY_TYPE STREQUAL STATIC) + target_link_libraries( + FCS + PUBLIC + ${LIBFDT_INSTALL_DIR}/libfdt.a + ) + else() + target_link_libraries( + FCS + PUBLIC + ${LIBFDT_INSTALL_DIR}/libfdt.so + ) + endif() target_include_directories(FCS PRIVATE "${LIBFDT_INSTALL_DIR}") diff --git a/toolchain/freertos_aarch64/aarch64-none-elf-gcc.cmake b/toolchain/freertos_aarch64/aarch64-none-elf-gcc.cmake deleted file mode 100644 index 662ecbd..0000000 --- a/toolchain/freertos_aarch64/aarch64-none-elf-gcc.cmake +++ /dev/null @@ -1,32 +0,0 @@ -# SPDX-License-Identifier: MIT-0 -# Copyright (C) 2025 Altera - -set(CMAKE_AR ${CROSS_COMPILE}-gcc-ar${CMAKE_EXECUTABLE_SUFFIX}) -set(CMAKE_ASM_COMPILER ${CROSS_COMPILE}-gcc${CMAKE_EXECUTABLE_SUFFIX}) -set(CMAKE_C_COMPILER ${CROSS_COMPILE}-gcc${CMAKE_EXECUTABLE_SUFFIX}) -set(CMAKE_CXX_COMPILER ${CROSS_COMPILE}-g++${CMAKE_EXECUTABLE_SUFFIX}) -set(CMAKE_LINKER ${CROSS_COMPILE}-ld${CMAKE_EXECUTABLE_SUFFIX}) -set(CMAKE_OBJCOPY ${CROSS_COMPILE}-objcopy${CMAKE_EXECUTABLE_SUFFIX} CACHE INTERNAL "") -set(CMAKE_RANLIB ${CROSS_COMPILE}-ranlib${CMAKE_EXECUTABLE_SUFFIX} CACHE INTERNAL "") -set(CMAKE_SIZE ${CROSS_COMPILE}-size${CMAKE_EXECUTABLE_SUFFIX} CACHE INTERNAL "") -set(CMAKE_STRIP ${CROSS_COMPILE}-strip${CMAKE_EXECUTABLE_SUFFIX} CACHE INTERNAL "") -set(CMAKE_GCOV ${CROSS_COMPILE}-gcov${CMAKE_EXECUTABLE_SUFFIX} CACHE INTERNAL "") - -set(CMAKE_C_FLAGS "${APP_C_FLAGS} -Wno-psabi" CACHE INTERNAL "") -set(CMAKE_CXX_FLAGS "${APP_CXX_FLAGS} ${CMAKE_C_FLAGS}" CACHE INTERNAL "") - -set(CMAKE_C_FLAGS_DEBUG "-pg -O0 -g3" CACHE INTERNAL "") -set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE INTERNAL "") -set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}" CACHE INTERNAL "") -set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}" CACHE INTERNAL "") - -set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) -set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) -set(CMAKE_BUILD_WITH_INSTALL_RPATH ON) -set(CMAKE_FIND_ROOT_PATH /tmp) # dummy place to override the paths for cross compiling locally - -set(CMAKE_SYSTEM_NAME Linux) -set(CMAKE_SYSTEM_PROCESSOR arm) -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Map=${CMAKE_BINARY_DIR}/fcs.map") diff --git a/toolchain/freertos_aarch64/toolchain.cmake b/toolchain/freertos_aarch64/toolchain.cmake index a10af36..66bcf96 100644 --- a/toolchain/freertos_aarch64/toolchain.cmake +++ b/toolchain/freertos_aarch64/toolchain.cmake @@ -1,26 +1,8 @@ # SPDX-License-Identifier: MIT-0 # Copyright (C) 2025 Altera -# Set the cross-compiler prefix for aarch64 architecture -set(CROSS_COMPILE aarch64-none-elf) - -# Enable shared library building -set(SHARED_LIB ON) - -# Check if CMAKE_TOOLCHAIN_FILE is not already defined -if (NOT DEFINED CMAKE_TOOLCHAIN_FILE) - # Set the default toolchain to the cross-compiler GCC - set(DEFAULT_TOOLCHAIN ${CROSS_COMPILE}-gcc) - - # If TOOLCHAIN is not defined, use the default toolchain - if (NOT DEFINED TOOLCHAIN) - message(STATUS "'TOOLCHAIN' is not defined. Using '${DEFAULT_TOOLCHAIN}'") - set(TOOLCHAIN ${DEFAULT_TOOLCHAIN}) - endif () - - # Set the CMAKE_TOOLCHAIN_FILE to the path of the toolchain file - set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_LIST_DIR}/${TOOLCHAIN}.cmake) - -endif () - +if(NOT DEFINED FREERTOS_TOOLCHAIN) + message(FATAL_ERROR "not building inside inside FreeRTOS") +endif() +set(SHARED_LIB OFF) set(OS freertos) From abeabc0a8d6d1b152d1c821ddd29d427d32ca874 Mon Sep 17 00:00:00 2001 From: "kevin.suresh" Date: Thu, 7 Aug 2025 12:35:01 +0530 Subject: [PATCH 3/3] Cmake: multiple changes - Add thirdparty as linux only build - Remove static build of libfdt - Remove redundant cmake commands and macros from FreeRTOS files --- CMakeLists.txt | 2 +- third_party/CMakeLists.txt | 22 +++++-------- toolchain/freertos_aarch64/CMakeLists.txt | 31 +------------------ .../freertos_aarch64/include/CMakeLists.txt | 5 --- .../include/libfcs_osal_types.h | 5 --- 5 files changed, 9 insertions(+), 56 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 59b31d7..f569ce7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -59,11 +59,11 @@ write_basic_package_version_file(FCS.cmake VERSION ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion) -add_subdirectory(third_party) add_subdirectory(include) add_subdirectory(lib) if(${ARCH} STREQUAL linux_aarch64) + add_subdirectory(third_party) add_subdirectory(app) endif() diff --git a/third_party/CMakeLists.txt b/third_party/CMakeLists.txt index 2baf037..8f45fc3 100644 --- a/third_party/CMakeLists.txt +++ b/third_party/CMakeLists.txt @@ -25,7 +25,6 @@ if(FDT_LIBRARY STREQUAL FDT_LIBRARY-NOTFOUND) set(LIBFDT_BUILD_COMMAND CC=${CROSS_COMPILE}-gcc make -C ../libfdt libfdt > /dev/null) set(LIBFDT_INSTALL_COMMAND mkdir -p ${LIBFDT_INSTALL_DIR} && cp ../libfdt/libfdt/libfdt.so ${LIBFDT_INSTALL_DIR}/ && - cp ../libfdt/libfdt/libfdt.a ${LIBFDT_INSTALL_DIR}/ && cp ../libfdt/libfdt/libfdt.h ${LIBFDT_INSTALL_DIR} && cp ../libfdt/libfdt/libfdt_env.h ${LIBFDT_INSTALL_DIR} && cp ../libfdt/libfdt/fdt.h ${LIBFDT_INSTALL_DIR}) @@ -38,25 +37,18 @@ if(FDT_LIBRARY STREQUAL FDT_LIBRARY-NOTFOUND) CONFIGURE_COMMAND ${LIBFDT_CONFIGURE_COMMAND} # Command to configure the project BUILD_COMMAND ${LIBFDT_BUILD_COMMAND} # Command to build the project INSTALL_COMMAND ${LIBFDT_INSTALL_COMMAND} # Command to install the project - BUILD_BYPRODUCTS ${LIBFDT_INSTALL_DIR}/libfdt.a ${LIBFDT_INSTALL_DIR}/libfdt.so + BUILD_BYPRODUCTS ${LIBFDT_INSTALL_DIR}/libfdt.so ) + # Add libfdt and libkcapi dependency for fcs add_dependencies(FCS libfdt) # link fdt library with FCS - if(LIBRARY_TYPE STREQUAL STATIC) - target_link_libraries( - FCS - PUBLIC - ${LIBFDT_INSTALL_DIR}/libfdt.a - ) - else() - target_link_libraries( - FCS - PUBLIC - ${LIBFDT_INSTALL_DIR}/libfdt.so - ) - endif() + target_link_libraries( + FCS + PUBLIC + ${LIBFDT_INSTALL_DIR}/libfdt.so + ) target_include_directories(FCS PRIVATE "${LIBFDT_INSTALL_DIR}") diff --git a/toolchain/freertos_aarch64/CMakeLists.txt b/toolchain/freertos_aarch64/CMakeLists.txt index f6273fb..51cc910 100644 --- a/toolchain/freertos_aarch64/CMakeLists.txt +++ b/toolchain/freertos_aarch64/CMakeLists.txt @@ -3,34 +3,5 @@ cmake_minimum_required(VERSION 3.20) -# Set output directories for different types of build artifacts -set_target_properties(FCS PROPERTIES - ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" # Directory for static libraries - LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" # Directory for shared libraries - RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" # Directory for executables -) - -# Set compile options for the FCS target -target_compile_options(FCS PRIVATE - -Wall # Enable all warnings - -Wextra # Enable extra warnings - -Wformat - -Wno-unused-parameter - -Wformat-security - -D_FORTIFY_SOURCE=2 - -march=armv8-a - -mtune=cortex-a55 - -mstrict-align - -g -) - -target_include_directories(FCS - PUBLIC - ${PROJECT_SOURCE_DIR}/../FreeRTOS/Fat-Fs/portable/common/ - ${PROJECT_SOURCE_DIR}/../FreeRTOS/Fat-Fs/include/ - ${PROJECT_SOURCE_DIR}/../osal/freertos/ - ${FREERTOS_CONFIG_HEADER_PATH} - ${driver_include_dirs} - ${RTOS_INCLUDES} - ) add_subdirectory(include) + diff --git a/toolchain/freertos_aarch64/include/CMakeLists.txt b/toolchain/freertos_aarch64/include/CMakeLists.txt index c1f1f63..9696045 100644 --- a/toolchain/freertos_aarch64/include/CMakeLists.txt +++ b/toolchain/freertos_aarch64/include/CMakeLists.txt @@ -3,8 +3,3 @@ target_include_directories(FCS PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}") -target_sources(FCS PUBLIC -FILE_SET public_headers -TYPE HEADERS -BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} -FILES ${CMAKE_CURRENT_SOURCE_DIR}/libfcs_osal_types.h) diff --git a/toolchain/freertos_aarch64/include/libfcs_osal_types.h b/toolchain/freertos_aarch64/include/libfcs_osal_types.h index 3633c78..6a82716 100644 --- a/toolchain/freertos_aarch64/include/libfcs_osal_types.h +++ b/toolchain/freertos_aarch64/include/libfcs_osal_types.h @@ -19,18 +19,14 @@ extern "C" { #include #include "osal.h" -#define FCS_GENERIC_ERR 0xff #define FCS_OSAL_UUID_SIZE (16U) -#define FCS_OSAL_MAX_RESP_STATUS_SIZE (4U) #define FCS_AES_CRYPT_BLOCK_SIZE (16U) -#define FCS_CIPHER_NAME_MAX_SIZE (32U) #define FCS_AES_BLOCK_MODE_ECB 0 #define FCS_AES_BLOCK_MODE_CBC 1 #define FCS_AES_BLOCK_MODE_CTR 2 #define FCS_AES_BLOCK_MODE_GCM 3 #define FCS_AES_BLOCK_MODE_GHASH 4 -#define FCS_MAX_AES_CRYPT_MODE 5 #define FCS_AES_GCM_MAX_AAD_SIZE 65535 #define FCS_AES_GCM_TAG_SIZE 3 @@ -45,7 +41,6 @@ extern "C" { #define FCS_ECC_CURVE_NIST_P384 2 #define FCS_ECC_CURVE_BRAINPOOL_P256 3 #define FCS_ECC_CURVE_BRAINPOOL_P384 4 -#define FCS_ECC_CURVE_MASK 0x4 #define FCS_ECDH_P256_PUBKEY_LEN 64 #define FCS_ECDH_P384_PUBKEY_LEN 96