diff --git a/lib/atca_config.h.in b/lib/atca_config.h.in index f14e9b7d..7b1439d6 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 diff --git a/third_party/hal/zephyr/hal_zephyr.c b/third_party/hal/zephyr/hal_zephyr.c index 2b0031f3..d10e9d15 100644 --- a/third_party/hal/zephyr/hal_zephyr.c +++ b/third_party/hal/zephyr/hal_zephyr.c @@ -4,9 +4,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include "hal/atca_hal.h" #include +#include "hal/atca_hal.h" + #ifndef ATCA_MUTEX_TIMEOUT #define ATCA_MUTEX_TIMEOUT K_FOREVER #endif @@ -19,7 +20,7 @@ * @{ */ -#if !defined(ATCA_PLATFORM_MALLOC) +#if !defined(ATCA_PLATFORM_MALLOC) void* hal_malloc(size_t size) { return k_malloc(size); diff --git a/third_party/hal/zephyr/hal_zephyr_i2c.c b/third_party/hal/zephyr/hal_zephyr_i2c.c index f11b1f76..522277d8 100644 --- a/third_party/hal/zephyr/hal_zephyr_i2c.c +++ b/third_party/hal/zephyr/hal_zephyr_i2c.c @@ -4,9 +4,9 @@ * SPDX-License-Identifier: Apache-2.0 */ - #include -#include "atca_platform.h" + +#include "atca_config.h" #include "hal/atca_hal.h" /** \defgroup hal_ Hardware abstraction layer (hal_) @@ -18,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) @@ -47,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_CONTROLLER | 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; } @@ -72,7 +72,7 @@ static ATCA_STATUS hal_zephyr_i2c_configure( ATCA_STATUS hal_i2c_init(ATCAIface iface, ATCAIfaceCfg* cfg) { ATCA_STATUS status = ATCA_BAD_PARAM; - + if (iface && cfg && cfg->cfg_data) { if (!iface->hal_data) @@ -107,53 +107,33 @@ ATCA_STATUS hal_i2c_post_init(ATCAIface iface) * \param[in] iface instance * \param[in] word_address device transaction type * \param[in] txdata pointer to space to bytes to send - * \param[in] txlength number of bytes to send + * \param[in] txlength number of bytes to send * (txdata length excludes word address) * \return ATCA_SUCCESS on success, otherwise an error code. */ 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); - uint8_t device_address = 0xFFu; - uint8_t* tmp_buf = NULL; if (!zdev) { return ATCA_BAD_PARAM; } -#ifdef ATCA_ENABLE_DEPRECATED - device_address = ATCA_IFACECFG_VALUE(iface->mIfaceCFG, atcai2c.slave_address); -#else - device_address = ATCA_IFACECFG_VALUE(iface->mIfaceCFG, atcai2c.address); -#endif - - //! Add 1 byte for word address - if (INT_MAX > txlength) - { + if (word_address > 0) { + buffer[0] = word_address; + memcpy(&(buffer[1]), txdata, txlength); txlength += 1; } - if (NULL == (tmp_buf = hal_malloc((size_t)txlength))) - { - return ATCA_ALLOC_FAILURE; - } - - tmp_buf[0] = word_address; - - if ((NULL != txdata) && (1 < txlength)) - { - (void)memcpy(&tmp_buf[1], txdata, (size_t)(txlength - 1)); - } - - if (i2c_write(zdev, tmp_buf, txlength, (device_address >> 0x1))) - { - hal_free(tmp_buf); + if (i2c_write(zdev, word_address > 0 ? buffer : txdata, txlength, address) != 0) { return ATCA_TX_FAIL; } - hal_free(tmp_buf); return ATCA_SUCCESS; } @@ -173,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 00000000..6bcb2baf --- /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 00000000..b6c4bdbb --- /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 00000000..ace3e165 --- /dev/null +++ b/zephyr/module.yml @@ -0,0 +1,4 @@ +name: cryptoauthlib +build: + cmake: zephyr + kconfig: zephyr/Kconfig