From d3016cf212c4c2cfb12e967ced0822708e50ebd5 Mon Sep 17 00:00:00 2001 From: Federico Di Gregorio Date: Thu, 22 May 2025 11:02:32 +0200 Subject: [PATCH 1/2] Added ability to work as a Zephyr module Note that right now the only supported transport is I2C. --- third_party/hal/zephyr/hal_zephyr.c | 5 +- third_party/hal/zephyr/hal_zephyr_i2c.c | 29 ++++--- zephyr/CMakeLists.txt | 109 ++++++++++++++++++++++++ zephyr/Kconfig | 41 +++++++++ zephyr/module.yml | 4 + 5 files changed, 175 insertions(+), 13 deletions(-) create mode 100644 zephyr/CMakeLists.txt create mode 100644 zephyr/Kconfig create mode 100644 zephyr/module.yml diff --git a/third_party/hal/zephyr/hal_zephyr.c b/third_party/hal/zephyr/hal_zephyr.c index 66f8d0ec3..59627e51f 100644 --- a/third_party/hal/zephyr/hal_zephyr.c +++ b/third_party/hal/zephyr/hal_zephyr.c @@ -6,8 +6,7 @@ #include "hal/atca_hal.h" -#include -#include +#include #ifndef ATCA_MUTEX_TIMEOUT @@ -69,7 +68,7 @@ void hal_delay_ms(uint32_t delay) } -ATCA_STATUS hal_create_mutex(void ** ppMutex, char* pName) +ATCA_STATUS hal_create_mutex(void ** ppMutex, const char* pName) { (void)pName; diff --git a/third_party/hal/zephyr/hal_zephyr_i2c.c b/third_party/hal/zephyr/hal_zephyr_i2c.c index f7877aa3a..a40c89838 100644 --- a/third_party/hal/zephyr/hal_zephyr_i2c.c +++ b/third_party/hal/zephyr/hal_zephyr_i2c.c @@ -4,8 +4,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include +#include +#include "atca_config.h" #include "hal/atca_hal.h" /** \defgroup hal_ Hardware abstraction layer (hal_) @@ -17,9 +18,9 @@ /** \brief The function return pre defined macro value for corrsponding i2c speed - * + * * \param[in] speed As input, i2c clock speed in HZ - * + * * \return Zephyr I2C speed constant */ static uint32_t hal_zephyr_i2c_convert_speed(const uint32_t speed) @@ -46,9 +47,9 @@ static ATCA_STATUS hal_zephyr_i2c_configure( const uint32_t speed /**< baud rate (typically 100000 or 400000) */ ) { - uint32_t i2c_cfg = I2C_MODE_MASTER | I2C_SPEED_SET(hal_zephyr_i2c_convert_speed(speed)); + uint32_t i2c_cfg = I2C_MODE_CONTROLLER | I2C_SPEED_SET(hal_zephyr_i2c_convert_speed(speed)); - if (i2c_configure(zdev, i2c_cfg)) + if (i2c_configure(zdev, i2c_cfg)) { return ATCA_GEN_FAIL; } @@ -111,19 +112,28 @@ ATCA_STATUS hal_i2c_post_init(ATCAIface iface) * \return ATCA_SUCCESS on success, otherwise an error code. */ -ATCA_STATUS hal_i2c_send(ATCAIface iface, uint8_t address, uint8_t *txdata, int txlength) +ATCA_STATUS hal_i2c_send(ATCAIface iface, uint8_t word_address, uint8_t *txdata, int txlength) { + uint8_t buffer[txlength + 1]; + uint8_t address = iface->mIfaceCFG->atcai2c.address >> 1; + struct device * zdev = (struct device *)atgetifacehaldat(iface); - if (!zdev || (0 == txlength) || (NULL == txdata)) + if (word_address > 0) { + buffer[0] = word_address; + memcpy(&(buffer[1]), txdata, txlength); + txlength += 1; + } + + if (!zdev) { return ATCA_BAD_PARAM; } - if (i2c_write(zdev, txdata, txlength, (address >> 0x1))) + if (i2c_write(zdev, word_address > 0 ? buffer : txdata, txlength, address)) { return ATCA_TX_FAIL; } - + return ATCA_SUCCESS; } @@ -143,7 +153,6 @@ ATCA_STATUS hal_i2c_receive(ATCAIface iface, uint8_t address, uint8_t *rxdata, u { return ATCA_BAD_PARAM; } - if (i2c_read(zdev, rxdata, *rxlength, (address >> 0x1))) { return ATCA_RX_FAIL; diff --git a/zephyr/CMakeLists.txt b/zephyr/CMakeLists.txt new file mode 100644 index 000000000..6bcb2bafd --- /dev/null +++ b/zephyr/CMakeLists.txt @@ -0,0 +1,109 @@ +if(CONFIG_CRYPTOAUTHLIB) + + # set(ATCACERT_COMPCERT_EN "") + # set(ATCACERT_FULLSTOREDCERT_EN "") + # set(HAS_MALLOC "ON") + # set(HAS_FREE "ON") + set(ATCA_USE_ATCAB_FUNCTIONS "ON") + + if(CONFIG_CRYPTOAUTHLIB_HAL_I2C) + set(ATCA_HAL_I2C "ON") + endif() + + if(CONFIG_CRYPTOAUTHLIB_NO_POLL) + set(ATCA_NO_POLL "ON") + endif() + + if(CONFIG_CRYPTOAUTHLIB_NO_HEAP) + set(ATCA_NO_HEAP "ON") + else() + #set(ATCA_PLATFORM_MALLOC "malloc") + #set(ATCA_PLATFORM_FREE "free") + endif() + + if(CONFIG_CRYPTOAUTHLIB_POST_DELAY_MSEC) + set(ATCA_POST_DELAY_MSEC "${CONFIG_CRYPTOAUTHLIB_POST_DELAY_MSEC}") + else() + set(ATCA_POST_DELAY_MSEC "25") + endif() + + if(CONFIG_CRYPTOAUTHLIB_ATECC608A_SUPPORT) + set(ATCA_ATECC608_SUPPORT "ON") + set(ATCA_ATECC608A_SUPPORT "ON") + endif() + + if(CONFIG_CRYPTOAUTHLIB_ATECC608B_SUPPORT) + set(ATCA_ATECC608_SUPPORT "ON") + endif() + + configure_file( + "${CMAKE_CURRENT_LIST_DIR}/../lib/atca_config.h.in" + "${CMAKE_CURRENT_BINARY_DIR}/include/atca_config.h") + file(COPY + "${CMAKE_CURRENT_BINARY_DIR}/include/atca_config.h" + DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/include/cryptoauthlib") + + file(GLOB LIB_SRC "${CMAKE_CURRENT_LIST_DIR}/../lib/*.c") + file(GLOB ATCACERT_SRC "${CMAKE_CURRENT_LIST_DIR}/../lib/atcacert/*.c") + file(GLOB CALIB_SRC "${CMAKE_CURRENT_LIST_DIR}/../lib/calib/*.c") + file(GLOB CRYPTO_SRC "${CMAKE_CURRENT_LIST_DIR}/../lib/crypto/*.c") + file(GLOB CRYPTO_HASHES_SRC "${CMAKE_CURRENT_LIST_DIR}/../lib/crypto/hashes/*.c") + + include_directories("${CMAKE_CURRENT_LIST_DIR}/../lib") + include_directories("${CMAKE_CURRENT_LIST_DIR}/../lib/atcacert") + include_directories("${CMAKE_CURRENT_LIST_DIR}/../lib/calib") + include_directories("${CMAKE_CURRENT_LIST_DIR}/../lib/crypto") + include_directories("${CMAKE_CURRENT_LIST_DIR}/../lib/crypto/hashes") + include_directories("${CMAKE_CURRENT_BINARY_DIR}/include") + + # Copy header files and add some prefixes to make sure everything + # is aligned to Zephyr external modules policy. + + function(replace_include_prefix FILE PREFIX) + file(READ ${FILE} SRC) + string(REPLACE "#include \"${PREFIX}" "#include \"cryptoauthlib/${PREFIX}" DST "${SRC}") + file(WRITE ${FILE} "${DST}") + endfunction() + + file(GLOB LIB_H "${CMAKE_CURRENT_LIST_DIR}/../lib/*.h") + file(GLOB ATCACERT_H "${CMAKE_CURRENT_LIST_DIR}/../lib/atcacert/*.h") + file(GLOB CALIB_H "${CMAKE_CURRENT_LIST_DIR}/../lib/calib/*.h") + file(GLOB CRYPTO_H "${CMAKE_CURRENT_LIST_DIR}/../lib/crypto/*.h") + file(GLOB CRYPTO_HASHES_H "${CMAKE_CURRENT_LIST_DIR}/../lib/crypto/hashes/*.h") + file(GLOB HAL_H "${CMAKE_CURRENT_LIST_DIR}/../lib/hal/atca_hal.h") + + file(COPY ${LIB_H} DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/include/cryptoauthlib") + file(COPY ${ATCACERT_H} DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/include/cryptoauthlib/atcacert") + file(COPY ${CALIB_H} DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/include/cryptoauthlib/calib") + file(COPY ${CRYPTO_H} DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/include/cryptoauthlib/crypto") + file(COPY ${CRYPTO_HASHES_H} DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/include/cryptoauthlib/crypto/hashes") + file(COPY ${HAL_H} DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/include/cryptoauthlib/hal") + + replace_include_prefix("${CMAKE_CURRENT_BINARY_DIR}/include/cryptoauthlib/atca_helpers.h" "") + replace_include_prefix("${CMAKE_CURRENT_BINARY_DIR}/include/cryptoauthlib/atca_basic.h" "") + replace_include_prefix("${CMAKE_CURRENT_BINARY_DIR}/include/cryptoauthlib/hal/atca_hal.h" "") + replace_include_prefix("${CMAKE_CURRENT_BINARY_DIR}/include/cryptoauthlib/calib/calib_config_check.h" "") + replace_include_prefix("${CMAKE_CURRENT_BINARY_DIR}/include/cryptoauthlib/calib/calib_device.h" "atca") + replace_include_prefix("${CMAKE_CURRENT_BINARY_DIR}/include/cryptoauthlib/calib/calib_execution.h" "atca") + replace_include_prefix("${CMAKE_CURRENT_BINARY_DIR}/include/cryptoauthlib/calib/calib_packet.h" "atca") + replace_include_prefix("${CMAKE_CURRENT_BINARY_DIR}/include/cryptoauthlib/crypto/atca_crypto_sw.h" "") + replace_include_prefix("${CMAKE_CURRENT_BINARY_DIR}/include/cryptoauthlib/crypto/crypto_sw_config_check.h" "atca") + replace_include_prefix("${CMAKE_CURRENT_BINARY_DIR}/include/cryptoauthlib/crypto/crypto_hw_config_check.h" "") + replace_include_prefix("${CMAKE_CURRENT_BINARY_DIR}/include/cryptoauthlib/crypto/atca_crypto_hw_aes.h" "cryptoauthlib") + + zephyr_include_directories("${CMAKE_CURRENT_BINARY_DIR}/include") + + zephyr_library() + zephyr_library_sources( + "${LIB_SRC}" + "${CALIB_SRC}" + "${CRYPTO_SRC}" + "${CRYPTO_HASHES_SRC}" + "${CMAKE_CURRENT_LIST_DIR}/../lib/hal/atca_hal.c" + "${CMAKE_CURRENT_LIST_DIR}/../third_party/hal/zephyr/hal_zephyr.c" + ) + zephyr_library_sources_ifdef( + CONFIG_CRYPTOAUTHLIB_HAL_I2C + "${CMAKE_CURRENT_LIST_DIR}/../third_party/hal/zephyr/hal_zephyr_i2c.c") + +endif() diff --git a/zephyr/Kconfig b/zephyr/Kconfig new file mode 100644 index 000000000..b6c4bdbb3 --- /dev/null +++ b/zephyr/Kconfig @@ -0,0 +1,41 @@ +# Copyright (c) 2025 DNDG srl +# SPDX-License-Identifier: Apache-2.0 + +config CRYPTOAUTHLIB + bool "Support library for Microchip secure elements" + help + This library implements the APIs required to communicate with Microchip + devices supported by the Crypto Authentication library. Currently only + devices of the following families over I2C are supported: ATECC608A + and ATECC608B. + +if CRYPTOAUTHLIB + + choice CRYPTOAUTHLIB_HAL_CHOICE + prompt "HAL type" + help + Select the HAL type to compile + + config CRYPTOAUTHLIB_HAL_I2C + bool "HAL I2C" + select I2C + + endchoice + + config CRYPTOAUTHLIB_NO_POLL + bool "Do not use polling to get device responses" + default n + + config CRYPTOAUTHLIB_NO_HEAP + bool "Do not use dynamic allocation functions" + default n + + config CRYPTOAUTHLIB_ATECC608A_SUPPORT + bool "Include support for ATECC608A device" + default n + + config CRYPTOAUTHLIB_ATECC608B_SUPPORT + bool "Include support for ATECC608B device" + default n + +endif diff --git a/zephyr/module.yml b/zephyr/module.yml new file mode 100644 index 000000000..ace3e165e --- /dev/null +++ b/zephyr/module.yml @@ -0,0 +1,4 @@ +name: cryptoauthlib +build: + cmake: zephyr + kconfig: zephyr/Kconfig From d2fd99d438ef2dfe97924b31ae5a610f6ce0f43b Mon Sep 17 00:00:00 2001 From: Federico Di Gregorio Date: Wed, 10 Jun 2026 17:15:28 +0200 Subject: [PATCH 2/2] removed warnings related to ATCA_TA_SUPPORT redefinition --- lib/atca_config.h.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/atca_config.h.in b/lib/atca_config.h.in index f14e9b7d3..7b1439d64 100644 --- a/lib/atca_config.h.in +++ b/lib/atca_config.h.in @@ -25,7 +25,7 @@ #cmakedefine ATCA_SHA105_SUPPORT /* Linked device support library */ -#cmakedefine01 ATCA_TA_SUPPORT +#cmakedefine ATCA_TA_SUPPORT /** Device Override - Library Assumes ATECC608B support in checks */ #cmakedefine ATCA_ATECC608A_SUPPORT @@ -112,7 +112,7 @@ selected plus however additional slots one would like */ /** Atcacert module configurations */ #cmakedefine01 ATCACERT_COMPCERT_EN -#cmakedefine01 ATCACERT_FULLSTOREDCERT_EN +#cmakedefine01 ATCACERT_FULLSTOREDCERT_EN /** Enable ATCACERT Full Certificate Integration */ #cmakedefine01 ATCACERT_INTEGRATION_EN