Skip to content

Commit 6dfe267

Browse files
committed
Support stm32h5 TrustZone build via CMake
1 parent 472cab6 commit 6dfe267

6 files changed

Lines changed: 232 additions & 13 deletions

File tree

CMakeLists.txt

Lines changed: 76 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,65 @@ if(ARCH STREQUAL "ARM")
659659
set(WOLFBOOT_ORIGIN ${ARCH_FLASH_OFFSET})
660660
endif()
661661

662+
if(${WOLFBOOT_TARGET} STREQUAL "stm32h5")
663+
set(ARCH_FLASH_OFFSET 0x08000000)
664+
if(TZEN)
665+
set(WOLFBOOT_ORIGIN 0x0C000000)
666+
else()
667+
set(WOLFBOOT_ORIGIN ${ARCH_FLASH_OFFSET})
668+
endif()
669+
endif()
670+
671+
if(${WOLFBOOT_TARGET} STREQUAL "stm32l5")
672+
set(ARCH_FLASH_OFFSET 0x08000000)
673+
if(TZEN)
674+
set(WOLFBOOT_ORIGIN 0x0C000000)
675+
else()
676+
set(WOLFBOOT_ORIGIN ${ARCH_FLASH_OFFSET})
677+
endif()
678+
endif()
679+
680+
# TrustZone support for Cortex-M33 targets
681+
if(TZEN)
682+
list(APPEND WOLFBOOT_DEFS TZEN)
683+
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "cortex-m33")
684+
list(APPEND WOLFBOOT_COMPILE_OPTIONS -mcmse)
685+
list(APPEND WOLFBOOT_LINK_OPTIONS -mcmse)
686+
endif()
687+
688+
# wolfCrypt TrustZone secure mode
689+
if(WOLFCRYPT_TZ)
690+
list(APPEND WOLFBOOT_DEFS WOLFCRYPT_SECURE_MODE)
691+
list(APPEND WOLFBOOT_SOURCES src/wc_callable.c)
692+
list(APPEND WOLFBOOT_LINK_OPTIONS
693+
-Wl,--cmse-implib
694+
-Wl,--out-implib=${CMAKE_CURRENT_BINARY_DIR}/wc_secure_calls.o)
695+
696+
# PKCS11 TrustZone interface
697+
if(WOLFCRYPT_TZ_PKCS11)
698+
if(WOLFCRYPT_TZ_PSA)
699+
message(FATAL_ERROR "WOLFCRYPT_TZ_PKCS11 and WOLFCRYPT_TZ_PSA are mutually exclusive")
700+
endif()
701+
702+
list(APPEND WOLFBOOT_DEFS
703+
SECURE_PKCS11
704+
WOLFSSL_PKCS11_RW_TOKENS
705+
WP11_HASH_PIN_COST=3)
706+
list(APPEND WOLFBOOT_DEFS "CK_CALLABLE=__attribute__\\(\\(cmse_nonsecure_entry\\)\\)")
707+
708+
list(APPEND WOLFBOOT_INCLUDE_DIRS ${WOLFBOOT_ROOT}/lib/wolfPKCS11)
709+
710+
list(APPEND WOLFBOOT_SOURCES
711+
src/pkcs11_store.c
712+
src/pkcs11_callable.c
713+
lib/wolfPKCS11/src/crypto.c
714+
lib/wolfPKCS11/src/internal.c
715+
lib/wolfPKCS11/src/slot.c
716+
lib/wolfPKCS11/src/wolfpkcs11.c)
717+
endif()
718+
endif()
719+
endif()
720+
662721
endif()
663722

664723
if(ARCH STREQUAL "AARCH64")
@@ -1054,8 +1113,17 @@ add_library(user_settings INTERFACE)
10541113
target_compile_definitions(user_settings INTERFACE ${USER_SETTINGS} ${SIGN_OPTIONS})
10551114

10561115
add_library(wolfboothal)
1116+
1117+
# TrustZone HAL sources for STM32 targets
1118+
set(WOLFBOOT_TZ_HAL_SOURCES "")
1119+
if(TZEN)
1120+
if(${WOLFBOOT_TARGET} MATCHES "^stm32")
1121+
set(WOLFBOOT_TZ_HAL_SOURCES hal/stm32_tz.c)
1122+
endif()
1123+
endif()
1124+
10571125
target_sources(wolfboothal PRIVATE include/hal.h hal/${WOLFBOOT_TARGET}.c ${WOLFBOOT_FLASH_SOURCES}
1058-
${PARTITION_SOURCE})
1126+
${PARTITION_SOURCE} ${WOLFBOOT_TZ_HAL_SOURCES})
10591127

10601128

10611129
#---------------------------------------------------------------------------------------------
@@ -1352,11 +1420,14 @@ set(WOLFBOOT_VERSION
13521420
${WOLFBOOT_VERSION}
13531421
CACHE INTERNAL "")
13541422

1423+
set(WOLFBOOT_DEFS_PUBLIC ${WOLFBOOT_DEFS})
1424+
list(REMOVE_ITEM WOLFBOOT_DEFS_PUBLIC __WOLFBOOT)
1425+
13551426
# generate target.h
13561427
configure_file(include/target.h.in ${CMAKE_CURRENT_BINARY_DIR}/target.h @ONLY)
13571428

13581429
add_library(target INTERFACE)
1359-
target_compile_definitions(target INTERFACE ${WOLFBOOT_DEFS})
1430+
target_compile_definitions(target INTERFACE ${WOLFBOOT_DEFS_PUBLIC})
13601431
target_include_directories(target BEFORE INTERFACE
13611432
${CMAKE_CURRENT_BINARY_DIR}
13621433
${CMAKE_CURRENT_SOURCE_DIR}/lib/wolfssl)
@@ -1401,8 +1472,9 @@ endif()
14011472
# generate libwolfboot
14021473
add_library(wolfboot)
14031474
target_sources(wolfboot PRIVATE src/libwolfboot.c ${WOLFBOOT_FLASH_SOURCES})
1404-
target_compile_definitions(wolfboot PUBLIC ${WOLFBOOT_DEFS})
1405-
target_compile_options(wolfboot PUBLIC ${EXTRA_COMPILE_OPTIONS})
1475+
target_compile_definitions(wolfboot PUBLIC ${WOLFBOOT_DEFS_PUBLIC})
1476+
target_compile_definitions(wolfboot PRIVATE __WOLFBOOT)
1477+
target_compile_options(wolfboot PUBLIC ${WOLFBOOT_COMPILE_OPTIONS} ${EXTRA_COMPILE_OPTIONS})
14061478
target_include_directories(wolfboot PUBLIC ${WOLFBOOT_INCLUDE_DIRS})
14071479
target_link_libraries(wolfboot wolfboothal target ${WOLFSSL_TGT})
14081480

CMakePresets.json

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,6 @@
292292
"generator": "Ninja",
293293
"binaryDir": "${sourceDir}/build-stm32h5",
294294
"cacheVariables": {
295-
"BUILD_TEST_APPS": "OFF",
296295
"ARCH": "ARM",
297296
"TZEN": "ON",
298297
"WOLFBOOT_TARGET": "stm32h5",
@@ -309,7 +308,7 @@
309308
"WOLFBOOT_VERSION": "ON",
310309
"V": "OFF",
311310
"SPMATH": "ON",
312-
"RAM_CODE": "OFF",
311+
"RAM_CODE": "ON",
313312
"DUALBANK_SWAP": "OFF",
314313
"WOLFBOOT_PARTITION_SIZE": "0xA0000",
315314
"WOLFBOOT_SECTOR_SIZE": "0x2000",
@@ -318,12 +317,14 @@
318317
"WOLFBOOT_NSC_ADDRESS": "0x0C05C000",
319318
"WOLFBOOT_NSC_SIZE": "0x4000",
320319
"WOLFBOOT_PARTITION_BOOT_ADDRESS": "0x08060000",
321-
"WOLFBOOT_PARTITION_UPDATE_ADDRESS": "0x08100000",
322-
"WOLFBOOT_PARTITION_SWAP_ADDRESS": "0x081A0000",
320+
"WOLFBOOT_PARTITION_UPDATE_ADDRESS": "0x0C100000",
321+
"WOLFBOOT_PARTITION_SWAP_ADDRESS": "0x0C1A0000",
323322
"FLAGS_HOME": "OFF",
324323
"DISABLE_BACKUP": "OFF",
325324
"IMAGE_HEADER_SIZE": "1024",
326-
"ARMORED": "ON"
325+
"ARMORED": "ON",
326+
"WOLFCRYPT_TZ": "ON",
327+
"WOLFCRYPT_TZ_PKCS11": "ON"
327328
}
328329
},
329330
{

cmake/toolchain_arm-none-eabi.cmake

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ endif()
4747
if(WOLFBOOT_TARGET STREQUAL "stm32l0")
4848
set(CMAKE_SYSTEM_PROCESSOR cortex-m0)
4949
set(MCPU_FLAGS "-mcpu=cortex-m0 -mthumb -mlittle-endian -mthumb-interwork ")
50-
elseif(WOLFBOOT_TARGET STREQUAL "stm32u5")
50+
elseif(WOLFBOOT_TARGET STREQUAL "stm32u5" OR WOLFBOOT_TARGET STREQUAL "stm32h5" OR
51+
WOLFBOOT_TARGET STREQUAL "stm32l5")
5152
set(CMAKE_SYSTEM_PROCESSOR cortex-m33)
5253
set(MCPU_FLAGS "-mcpu=cortex-m33 -mthumb -mlittle-endian -mthumb-interwork -Ihal -DCORTEX_M33")
5354
elseif(WOLFBOOT_TARGET STREQUAL "stm32h7")

cmake/wolfboot.cmake

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,15 @@ function(gen_wolfboot_platform_target PLATFORM_NAME LINKER_SCRIPT_TARGET)
5151
target_link_libraries(wolfboot_${PLATFORM_NAME} wolfcrypt target wolfboot
5252
${LINKER_SCRIPT_TARGET})
5353

54+
# TrustZone import library (generated by the linker via --out-implib)
55+
if(TZEN AND WOLFCRYPT_TZ)
56+
set(_wcs_implib "${CMAKE_BINARY_DIR}/wc_secure_calls.o")
57+
add_custom_command(TARGET wolfboot_${PLATFORM_NAME} POST_BUILD
58+
BYPRODUCTS "${_wcs_implib}"
59+
COMMAND ${CMAKE_COMMAND} -E true
60+
)
61+
endif()
62+
5463
# link with public key if signing is enabled
5564
if(NOT SIGN STREQUAL "NONE")
5665
target_link_libraries(wolfboot_${PLATFORM_NAME} public_key)
@@ -87,7 +96,8 @@ function(gen_wolfboot_signed_image TARGET)
8796
add_custom_command(
8897
OUTPUT ${TARGET}_v${VERSION}_signed.bin
8998
DEPENDS ${INPUT_IMAGE} ${WOLFBOOT_SIGNING_PRIVATE_KEY} ${SIGN_TOOL}
90-
COMMAND ${SIGN_TOOL} ${KEYTOOL_OPTIONS} ${INPUT_IMAGE} ${WOLFBOOT_SIGNING_PRIVATE_KEY} ${VERSION}
99+
COMMAND ${CMAKE_COMMAND} -E env IMAGE_HEADER_SIZE=${IMAGE_HEADER_SIZE}
100+
${SIGN_TOOL} ${KEYTOOL_OPTIONS} ${INPUT_IMAGE} ${WOLFBOOT_SIGNING_PRIVATE_KEY} ${VERSION}
91101
COMMENT "Signing ${TARGET}"
92102
)
93103

lib/CMakeLists.txt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,36 @@ if(NOT WOLFBOOT_SMALL_STACK AND WOLFBOOT_TARGET STREQUAL "unit_test")
174174
list(REMOVE_DUPLICATES WOLFCRYPT_SOURCES)
175175
endif()
176176

177+
if(WOLFCRYPT_TZ_PKCS11)
178+
list(APPEND WOLFCRYPT_SOURCES
179+
wolfssl/wolfcrypt/src/asn.c
180+
wolfssl/wolfcrypt/src/memory.c
181+
wolfssl/wolfcrypt/src/random.c
182+
wolfssl/wolfcrypt/src/pwdbased.c
183+
wolfssl/wolfcrypt/src/hmac.c
184+
wolfssl/wolfcrypt/src/dh.c)
185+
186+
if(NOT ENCRYPT_WITH_AES128 AND NOT ENCRYPT_WITH_AES256)
187+
list(APPEND WOLFCRYPT_SOURCES wolfssl/wolfcrypt/src/aes.c)
188+
endif()
189+
190+
set(_sign "${SIGN}")
191+
set(_sign2 "${SIGN_SECONDARY}")
192+
193+
if(NOT _sign MATCHES "RSA" AND NOT _sign2 MATCHES "RSA")
194+
list(APPEND WOLFCRYPT_SOURCES ${RSA_EXTRA_SOURCES} wolfssl/wolfcrypt/src/rsa.c)
195+
endif()
196+
197+
if(NOT _sign MATCHES "ECC" AND NOT _sign2 MATCHES "ECC")
198+
list(APPEND WOLFCRYPT_SOURCES wolfssl/wolfcrypt/src/ecc.c)
199+
endif()
200+
201+
if(NOT _sign MATCHES "ECC" AND NOT _sign2 MATCHES "ECC" AND
202+
NOT _sign MATCHES "RSA" AND NOT _sign2 MATCHES "RSA")
203+
list(APPEND WOLFCRYPT_SOURCES ${MATH_SOURCES})
204+
endif()
205+
endif()
206+
177207
# Include SHA256 module because it's implicitly needed by RSA
178208
list(APPEND WOLFCRYPT_SOURCES wolfssl/wolfcrypt/src/sha256.c)
179209

test-app/CMakeLists.txt

Lines changed: 107 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,18 @@ if("${WOLFBOOT_TARGET}" STREQUAL "stm32h7")
5353
set(APP_LSCRIPT_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/ARM-stm32h7.ld)
5454
elseif("${WOLFBOOT_TARGET}" STREQUAL "stm32u5")
5555
set(APP_LSCRIPT_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/ARM-stm32u5.ld)
56+
elseif("${WOLFBOOT_TARGET}" STREQUAL "stm32h5")
57+
if(TZEN)
58+
set(APP_LSCRIPT_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/ARM-stm32h5-ns.ld)
59+
else()
60+
set(APP_LSCRIPT_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/ARM-stm32h5.ld)
61+
endif()
62+
elseif("${WOLFBOOT_TARGET}" STREQUAL "stm32l5")
63+
if(TZEN)
64+
set(APP_LSCRIPT_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/ARM-stm32l5-ns.ld)
65+
else()
66+
set(APP_LSCRIPT_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/ARM-stm32l5.ld)
67+
endif()
5668
else()
5769
set(APP_LSCRIPT_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/${ARCH}.ld)
5870
endif()
@@ -110,15 +122,108 @@ if(BUILD_TEST_APPS)
110122

111123
target_sources(image PRIVATE ${APP_SOURCES})
112124

125+
# stm32h5-specific sources
126+
if("${WOLFBOOT_TARGET}" STREQUAL "stm32h5")
127+
target_sources(image PRIVATE
128+
../hal/uart/uart_drv_stm32h5.c
129+
../src/keystore.c
130+
)
131+
target_compile_definitions(image PRIVATE
132+
APP_HAS_SYSTICK
133+
RAMFUNCTION=__attribute__\(\(used,section\(".ramcode"\),long_call\)\)
134+
)
135+
target_compile_options(image PRIVATE
136+
-ffunction-sections -fdata-sections -fno-common -mlong-calls
137+
)
138+
if(TZEN)
139+
target_sources(image PRIVATE
140+
wcs/wolfcrypt_secure.c
141+
)
142+
if(WOLFCRYPT_TZ)
143+
target_sources(image PRIVATE
144+
../lib/wolfssl/wolfcrypt/src/logging.c
145+
../lib/wolfssl/wolfcrypt/test/test.c
146+
../lib/wolfssl/wolfcrypt/benchmark/benchmark.c
147+
)
148+
endif()
149+
endif()
150+
endif()
151+
152+
# stm32l5-specific sources
153+
if("${WOLFBOOT_TARGET}" STREQUAL "stm32l5")
154+
target_sources(image PRIVATE
155+
../hal/uart/uart_drv_stm32l5.c
156+
)
157+
target_compile_options(image PRIVATE
158+
-ffunction-sections -fdata-sections -fno-common
159+
)
160+
endif()
161+
113162
target_include_directories(image PRIVATE
114163
../
115164
../include
116165
${CMAKE_CURRENT_BINARY_DIR})
117166

118-
target_link_libraries(image wolfboot target)
167+
if(TZEN)
168+
target_include_directories(image PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/wcs)
169+
endif()
170+
171+
if(WOLFCRYPT_TZ_PKCS11)
172+
target_include_directories(image PRIVATE ../lib/wolfPKCS11)
173+
endif()
174+
175+
# For TrustZone builds, avoid linking the bootloader lib (it defines NSC stubs).
176+
if(TZEN AND WOLFCRYPT_TZ)
177+
target_sources(image PRIVATE ../src/libwolfboot.c)
178+
target_link_libraries(image PRIVATE wolfboothal target)
179+
else()
180+
target_link_libraries(image PRIVATE wolfboot wolfboothal public_key target)
181+
endif()
182+
183+
# For TrustZone builds, the test app is a non-secure application
184+
if(TZEN AND WOLFCRYPT_TZ)
185+
list(APPEND TEST_APP_COMPILE_DEFINITIONS NONSECURE_APP WOLFBOOT_SECURE_CALLS)
186+
add_dependencies(image wolfboot_${PLATFORM_NAME})
187+
target_link_libraries(image PRIVATE ${CMAKE_BINARY_DIR}/wc_secure_calls.o)
188+
endif()
189+
190+
if(WOLFCRYPT_TZ_PKCS11)
191+
list(APPEND TEST_APP_COMPILE_DEFINITIONS WOLFBOOT_PKCS11_APP SECURE_PKCS11)
192+
target_sources(image PRIVATE
193+
wcs/pkcs11_stub.c
194+
wcs/pkcs11_test_ecc.c
195+
../lib/wolfssl/wolfcrypt/src/ecc.c
196+
../lib/wolfssl/wolfcrypt/src/rsa.c
197+
../lib/wolfssl/wolfcrypt/src/asn.c
198+
../lib/wolfssl/wolfcrypt/src/aes.c
199+
../lib/wolfssl/wolfcrypt/src/hmac.c
200+
../lib/wolfssl/wolfcrypt/src/pwdbased.c
201+
../lib/wolfssl/wolfcrypt/src/hash.c
202+
../lib/wolfssl/wolfcrypt/src/sha256.c
203+
../lib/wolfssl/wolfcrypt/src/sha512.c
204+
../lib/wolfssl/wolfcrypt/src/sha3.c
205+
../lib/wolfssl/wolfcrypt/src/integer.c
206+
../lib/wolfssl/wolfcrypt/src/tfm.c
207+
../lib/wolfssl/wolfcrypt/src/sp_c32.c
208+
../lib/wolfssl/wolfcrypt/src/sp_int.c
209+
../lib/wolfssl/wolfcrypt/src/cryptocb.c
210+
../lib/wolfssl/wolfcrypt/src/wc_pkcs11.c
211+
../lib/wolfssl/wolfcrypt/src/memory.c
212+
../lib/wolfssl/wolfcrypt/src/wolfmath.c
213+
../lib/wolfssl/wolfcrypt/src/dh.c
214+
../lib/wolfssl/wolfcrypt/src/random.c
215+
../lib/wolfssl/wolfcrypt/src/coding.c
216+
../lib/wolfssl/wolfcrypt/src/wc_encrypt.c
217+
../lib/wolfssl/wolfcrypt/src/wc_port.c
218+
)
219+
if(SPMATH AND NOT NO_ASM)
220+
list(APPEND TEST_APP_COMPILE_DEFINITIONS WOLFSSL_HAVE_SP_RSA WOLFSSL_HAVE_SP_ECC WOLFSSL_SP_ARM_CORTEX_M_ASM)
221+
target_sources(image PRIVATE ../lib/wolfssl/wolfcrypt/src/sp_cortexm.c)
222+
endif()
223+
endif()
119224

120225
target_compile_definitions(image PRIVATE TARGET_${WOLFBOOT_TARGET}
121-
${TEST_APP_COMPILE_DEFINITIONS} ${WOLFBOOT_DEFS})
226+
${TEST_APP_COMPILE_DEFINITIONS} ${WOLFBOOT_DEFS_PUBLIC})
122227

123228
target_compile_options(image PRIVATE -Wall -Wstack-usage=1024 -ffreestanding -Wno-unused -fomit-frame-pointer
124229
-nostartfiles)

0 commit comments

Comments
 (0)