1#------------------------------------------------------------------------------- 2# Copyright (c) 2020-2022, Arm Limited. All rights reserved. 3# Copyright (c) 2021 STMicroelectronics. All rights reserved. 4# 5# SPDX-License-Identifier: BSD-3-Clause 6# 7#------------------------------------------------------------------------------- 8 9cmake_policy(SET CMP0076 NEW) 10set(CMAKE_CURRENT_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}) 11 12#========================= Platform region defs ===============================# 13 14target_include_directories(platform_region_defs 15 INTERFACE 16 partition 17 include 18 ${CMAKE_CURRENT_SOURCE_DIR}/boards 19) 20 21target_compile_definitions(platform_region_defs 22 INTERFACE 23 $<$<OR:$<BOOL:${TEST_NS}>,$<BOOL:${TEST_S}>>:FLASH_LAYOUT_FOR_TEST> 24) 25 26#========================= Platform common defs ===============================# 27target_add_scatter_file(tfm_s 28 $<$<AND:$<VERSION_LESS:${TFM_ISOLATION_LEVEL},3>,$<C_COMPILER_ID:ARMClang>>:${CMAKE_CURRENT_SOURCE_DIR}/Device/Source/armclang/tfm_common_s.sct> 29 $<$<AND:$<VERSION_LESS:${TFM_ISOLATION_LEVEL},3>,$<C_COMPILER_ID:GNU>>:${CMAKE_CURRENT_SOURCE_DIR}/Device/Source/gcc/tfm_common_s.ld> 30 $<$<AND:$<VERSION_LESS:${TFM_ISOLATION_LEVEL},3>,$<C_COMPILER_ID:IAR>>:${CMAKE_CURRENT_SOURCE_DIR}/Device/Source/iar/tfm_common_s.icf> 31 $<$<AND:$<VERSION_EQUAL:${TFM_ISOLATION_LEVEL},3>,$<C_COMPILER_ID:ARMClang>>:${CMAKE_BINARY_DIR}/generated/platform/ext/common/armclang/tfm_isolation_l3.sct> 32 $<$<AND:$<VERSION_EQUAL:${TFM_ISOLATION_LEVEL},3>,$<C_COMPILER_ID:GNU>>:${CMAKE_BINARY_DIR}/generated/platform/ext/common/gcc/tfm_isolation_l3.ld> 33) 34 35 36if(BL2) 37 target_add_scatter_file(bl2 38 $<$<C_COMPILER_ID:GNU>:${STM_COMMON_DIR}/hal/template/gcc/bl2.ld> 39 $<$<C_COMPILER_ID:ARMClang>:${STM_COMMON_DIR}/hal/template/armclang/bl2.sct> 40 $<$<C_COMPILER_ID:IAR>:${STM_COMMON_DIR}/hal/template/iar/bl2.icf> 41 ) 42endif() 43 44#========================= Platform Secure ====================================# 45 46target_include_directories(platform_s 47 PUBLIC 48 ${CMAKE_CURRENT_SOURCE_DIR} 49 ${STM_COMMON_DIR}/hal/Native_Driver 50 ${STM_COMMON_DIR}/hal/CMSIS_Driver 51 ${CMAKE_CURRENT_SOURCE_DIR}/Device/Include 52 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Inc 53 ${CMAKE_CURRENT_SOURCE_DIR}/secure 54 ${MBEDCRYPTO_PATH}/library 55 ${CMAKE_SOURCE_DIR}/include 56) 57 58target_sources(platform_s 59 PRIVATE 60 ${CMAKE_CURRENT_SOURCE_DIR}/secure/system_stm32u5xx.c 61 ${STM_COMMON_DIR}/hal/Native_Driver/mpu_armv8m_drv.c 62 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal.c 63 ${CMAKE_CURRENT_SOURCE_DIR}/secure/low_level_device.c 64 ${STM_COMMON_DIR}/hal/CMSIS_Driver/low_level_flash.c 65 ${STM_COMMON_DIR}/hal/CMSIS_Driver/low_level_com.c 66 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal.c 67 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_flash.c 68 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_flash_ex.c 69 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_dma.c 70 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_dma_ex.c 71 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_pwr.c 72 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_pwr_ex.c 73 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_gpio.c 74 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_uart.c 75 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_uart_ex.c 76 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_rcc.c 77 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_rcc_ex.c 78 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_gtzc.c 79 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_cortex.c 80 $<$<BOOL:${TFM_PARTITION_PLATFORM}>:${CMAKE_CURRENT_SOURCE_DIR}/secure/tfm_platform_system.c> 81 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_rng.c 82 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_rng_ex.c 83 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_ospi.c 84 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_ll_dlyb.c 85 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_rtc.c 86 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_rtc_ex.c 87 $<$<STREQUAL:"${TFM_FIH_PROFILE}","HIGH">:${PLATFORM_DIR}/ext/common/template/tfm_fih_rng.c> 88 PUBLIC 89 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_hash.c 90 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_hash_ex.c 91 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_pka.c 92 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_cryp.c 93 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_cryp_ex.c 94 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_i2c.c 95 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_i2c_ex.c 96 ${STM_COMMON_DIR}/hal/Native_Driver/low_level_rng.c 97 ${STM_COMMON_DIR}/hal/Native_Driver/nv_counters.c 98) 99 100target_compile_options(platform_s 101 PUBLIC 102 ${COMPILER_CMSE_FLAG} 103) 104 105# GNU ld and IAR does not deal well with strong functions in static libraries 106# overriding weak functions in object files. For this reason, files with strong 107# functions are linked as an object file. This issue does not affect armclang, 108# but the fix is compatible. 109target_sources(tfm_s 110 PRIVATE 111 ${STM_COMMON_DIR}/hal/Native_Driver/tick.c 112) 113 114#========================= Platform Non-Secure ================================# 115 116# Install linker scripts 117install(FILES 118 ${STM_COMMON_DIR}/hal/template/iar/appli_ns.icf 119 ${STM_COMMON_DIR}/hal/template/gcc/appli_ns.ld 120 ${STM_COMMON_DIR}/hal/template/armclang/appli_ns.sct 121 DESTINATION ${INSTALL_PLATFORM_NS_DIR}/linker_scripts 122) 123 124install(DIRECTORY 125 ${CMAKE_CURRENT_SOURCE_DIR}/Device/Include 126 DESTINATION ${INSTALL_PLATFORM_NS_DIR}/Device 127) 128 129install(FILES 130 ${PLATFORM_DIR}/ext/common/test_interrupt.h 131 ${PLATFORM_DIR}/ext/driver/Driver_USART.h 132 ${PLATFORM_DIR}/ext/driver/Driver_Common.h 133 ${PLATFORM_DIR}/include/tfm_plat_defs.h 134 DESTINATION ${INSTALL_PLATFORM_NS_DIR}/include 135) 136 137install(DIRECTORY 138 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Inc 139 DESTINATION ${INSTALL_PLATFORM_NS_DIR}/hal 140) 141 142install(FILES 143 ${STM_COMMON_DIR}/hal/CMSIS_Driver/low_level_com.c 144 DESTINATION ${INSTALL_PLATFORM_NS_DIR}/CMSIS_Driver 145) 146install(FILES 147 ${CMAKE_CURRENT_SOURCE_DIR}/Device/Source/Templates/system_stm32u5xx.c 148 DESTINATION ${INSTALL_PLATFORM_NS_DIR}/Device/Source/ 149) 150 151install(FILES 152 ${CMAKE_CURRENT_SOURCE_DIR}/boards/cmsis.h 153 ${CMAKE_CURRENT_SOURCE_DIR}/boards/target_cfg.h 154 ${CMAKE_CURRENT_SOURCE_DIR}/boards/tfm_peripherals_def.h 155 DESTINATION ${INSTALL_PLATFORM_NS_DIR}/include 156) 157 158 159install(FILES 160 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal.c 161 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_dma.c 162 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_dma_ex.c 163 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_pwr.c 164 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_pwr_ex.c 165 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_rcc.c 166 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_gpio.c 167 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_uart.c 168 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_uart_ex.c 169 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_cortex.c 170 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_rcc_ex.c 171 DESTINATION ${INSTALL_PLATFORM_NS_DIR}/hal/Src 172) 173 174#========================= Platform BL2 =======================================# 175 176if(BL2) 177 target_include_directories(platform_bl2 178 PUBLIC 179 ${CMAKE_CURRENT_SOURCE_DIR} 180 ${STM_COMMON_DIR}/hal/Native_Driver 181 ${STM_COMMON_DIR}/hal/CMSIS_Driver 182 ${CMAKE_CURRENT_SOURCE_DIR}/Device/Include 183 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Inc 184 ${MCUBOOT_PATH}/boot/bootutil/include 185 $<TARGET_PROPERTY:bl2,BINARY_DIR>/ext/mcuboot 186 ${CMAKE_SOURCE_DIR}/bl2/ext/mcuboot/include 187 ${CMAKE_CURRENT_SOURCE_DIR}/bl2 188 ${CMAKE_SOURCE_DIR}/interface/include 189 ) 190 191 target_sources(platform_bl2 192 PRIVATE 193 ${CMAKE_CURRENT_SOURCE_DIR}/Device/Source/Templates/system_stm32u5xx.c 194 ${CMAKE_CURRENT_SOURCE_DIR}/bl2/boot_hal_bl2.c 195 ${STM_COMMON_DIR}/hal/Native_Driver/mpu_armv8m_drv.c 196 ${CMAKE_CURRENT_SOURCE_DIR}/bl2/low_level_security.c 197 ${CMAKE_CURRENT_SOURCE_DIR}/bl2/low_level_device.c 198 ${STM_COMMON_DIR}/hal/CMSIS_Driver/low_level_flash.c 199 ${STM_COMMON_DIR}/hal/CMSIS_Driver/low_level_com.c 200 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal.c 201 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_flash.c 202 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_flash_ex.c 203 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_pwr_ex.c 204 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_dma.c 205 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_dma_ex.c 206 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_pwr.c 207 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_rcc.c 208 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_rcc_ex.c 209 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_cortex.c 210 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_gpio.c 211 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_uart.c 212 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_uart_ex.c 213 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_gtzc.c 214 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_hash.c 215 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_hash_ex.c 216 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_pka.c 217 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_cryp.c 218 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_cryp_ex.c 219 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_rng.c 220 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_rng_ex.c 221 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_rtc.c 222 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_rtc_ex.c 223 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_icache.c 224 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_hal_ospi.c 225 ${CMAKE_CURRENT_SOURCE_DIR}/hal/Src/stm32u5xx_ll_dlyb.c 226 ${STM_COMMON_DIR}/hal/Native_Driver/low_level_rng.c 227 ${STM_COMMON_DIR}/hal/provision/otp_provision.c 228 ${STM_COMMON_DIR}/hal/Native_Driver/nv_counters.c 229 ${STM_COMMON_DIR}/hal/provision/nvm_init.c 230 ${STM_COMMON_DIR}/hal/provision/nvmcnt_init.c 231 ) 232 233 target_compile_options(platform_bl2 234 PUBLIC 235 ${COMPILER_CMSE_FLAG} 236 ) 237 238 # GNU ld and IAR does not deal well with strong functions in static libraries 239 # overriding weak functions in object files. For this reason, files with strong 240 # functions are linked as an object file. This issue does not affect armclang, 241 # but the fix is compatible. 242 target_sources(bl2 243 PRIVATE 244 ${STM_COMMON_DIR}/hal/Native_Driver/tick.c 245 ${CMAKE_CURRENT_SOURCE_DIR}/bl2/stm32u5xx_hal_msp.c 246 ) 247 248 # Required because Mbed TLS PSA crypto headers require the configuration to be 249 # available when including the header itself 250 target_link_libraries(platform_bl2 251 PUBLIC 252 bl2_mbedcrypto_config 253 ) 254 255endif() 256 257#========================= tfm_spm ============================================# 258 259target_sources(tfm_spm 260 PRIVATE 261 ${CMAKE_CURRENT_SOURCE_DIR}/secure/target_cfg.c 262 ${CMAKE_CURRENT_SOURCE_DIR}/secure/tfm_hal_isolation.c 263 ${CMAKE_CURRENT_SOURCE_DIR}/secure/tfm_hal_platform.c 264) 265 266install(FILES 267 ${STM_COMMON_DIR}/scripts/stm_tool.py 268 ${STM_COMMON_DIR}/scripts/bin2hex.py 269 ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../bl2/ext/mcuboot/scripts/macro_parser.py 270 DESTINATION ${CMAKE_INSTALL_PREFIX}/scripts ) 271 272if (${CMAKE_C_COMPILER_ID} STREQUAL GNU) 273 set(PREPROCESSOR_FILE ${STM_COMMON_DIR}/scripts/gcc/preprocess.sh) 274elseif (${CMAKE_C_COMPILER_ID} STREQUAL ARMClang) 275 set(PREPROCESSOR_FILE ${STM_COMMON_DIR}/scripts/armclang/preprocess.sh) 276else() 277 set(PREPROCESSOR_FILE ${STM_COMMON_DIR}/scripts/iar/preprocess.sh) 278endif() 279 280install(FILES ${STM_COMMON_DIR}/scripts/regression.sh 281 ${PREPROCESSOR_FILE} 282 ${STM_COMMON_DIR}/scripts/TFM_UPDATE.sh 283 ${STM_COMMON_DIR}/scripts/TFM_BIN2HEX.sh 284 ${STM_COMMON_DIR}/scripts/postbuild.sh 285 PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ 286 DESTINATION ${CMAKE_INSTALL_PREFIX} ) 287 288if (${TEST_S} OR ${TEST_NS}) 289 #the define FLASH_LAYOUT_FOR_TEST 290 #increase SECURE and NON SECURE IMAGE and modify the content of low_level_device.c from BL2 (low_level_flash.c) 291 set(FLAGS_FOR_BL2_PREPROCESSING 292 "#define FLASH_LAYOUT_FOR_TEST\n" 293 "#define BL2\n" 294 "#define MCUBOOT_IMAGE_NUMBER 2\n" 295 "#define MCUBOOT_OVERWRITE_ONLY\n" 296 ) 297 add_definitions("-DFLASH_LAYOUT_FOR_TEST") 298else() 299 set(FLAGS_FOR_BL2_PREPROCESSING 300 "#define BL2\n" 301 "#define MCUBOOT_IMAGE_NUMBER 2\n" 302 "#define MCUBOOT_OVERWRITE_ONLY\n" 303 ) 304endif() 305 306set(CONTENT_FOR_BL2_PREPROCESSING 307 "#include \"flash_layout.h\"\n\n" 308 "enum bl2_image_attributes {\n" 309 "\tRE_IMAGE_FLASH_ADDRESS_SECURE = (FLASH_BASE_ADDRESS+FLASH_AREA_0_OFFSET),\n" 310 "\tRE_IMAGE_FLASH_ADDRESS_NON_SECURE = (FLASH_BASE_ADDRESS+FLASH_AREA_1_OFFSET),\n" 311 "\tRE_BL2_BIN_ADDRESS = (FLASH_BASE_ADDRESS+FLASH_AREA_BL2_BIN_OFFSET),\n" 312 "\tRE_BL2_NVMCNT_ADDRESS = (FLASH_BASE_ADDRESS+FLASH_BL2_NVCNT_AREA_OFFSET),\n" 313 "\tRE_BL2_PROVISION_ADDRESS = (FLASH_BASE_ADDRESS+FLASH_AREA_OTP_OFFSET),\n" 314 "\tRE_BL2_BOOT_ADDRESS = (FLASH_BASE_ADDRESS+FLASH_AREA_BL2_OFFSET),\n" 315 "\tRE_BL2_WRP_START = (FLASH_AREA_BL2_OFFSET),\n" 316 "\tRE_BL2_WRP_END = (FLASH_AREA_BL2_NOHDP_OFFSET+FLASH_AREA_BL2_NOHDP_SIZE-0x1),\n" 317 "\tRE_BL2_HDP_END = (FLASH_AREA_BL2_NOHDP_OFFSET-0x1),\n" 318 "#if defined(EXTERNAL_FLASH)\n" 319 "\tRE_IMAGE_FLASH_SECURE_UPDATE = (OSPI_FLASH_BASE_ADDRESS+FLASH_AREA_2_OFFSET),\n" 320 "\tRE_IMAGE_FLASH_NON_SECURE_UPDATE = (OSPI_FLASH_BASE_ADDRESS+FLASH_AREA_3_OFFSET),\n" 321 "\tRE_IMAGE_FLASH_UNUSED = (FLASH_BASE_ADDRESS+FLASH_AREA_1_OFFSET+FLASH_AREA_1_SIZE),\n" 322 "#else\n" 323 "\tRE_IMAGE_FLASH_SECURE_UPDATE = (FLASH_BASE_ADDRESS+FLASH_AREA_2_OFFSET),\n" 324 "\tRE_IMAGE_FLASH_NON_SECURE_UPDATE = (FLASH_BASE_ADDRESS+FLASH_AREA_3_OFFSET),\n" 325 "\tRE_IMAGE_FLASH_UNUSED = (FLASH_BASE_ADDRESS+FLASH_AREA_3_OFFSET+FLASH_AREA_3_SIZE),\n" 326 "#endif\n" 327 "\tRE_IMAGE_FLASH_SCRATCH = (FLASH_BASE_ADDRESS+FLASH_AREA_SCRATCH_OFFSET),\n" 328 "\tRE_IMAGE_FLASH_NV_COUNTERS = (FLASH_BASE_ADDRESS+FLASH_NV_COUNTERS_AREA_OFFSET),\n" 329 "\tRE_IMAGE_FLASH_NV_PS = (FLASH_BASE_ADDRESS+FLASH_PS_AREA_OFFSET),\n" 330 "\tRE_IMAGE_FLASH_NV_ITS = (FLASH_BASE_ADDRESS+FLASH_ITS_AREA_OFFSET),\n" 331) 332if(MCUBOOT_ENC_IMAGES) 333 set(CONTENT_ENCRYPTED 334 "\tRE_IMAGE_ENCRYPTED = 0x01\n}\;" 335 ) 336else() 337 set(CONTENT_ENCRYPTED 338 "\tRE_IMAGE_ENCRYPTED = 0x0\n}\;" 339 ) 340endif() 341 342string(CONCAT BL2_PREPROCESSING ${FLAGS_FOR_BL2_PREPROCESSING} 343 ${CONTENT_FOR_BL2_PREPROCESSING} 344 ${CONTENT_ENCRYPTED}) 345