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