1 /***************************************************************************//**
2  * @file
3  * @brief Silicon Labs Secure Engine Manager API types
4  *******************************************************************************
5  * # License
6  * <b>Copyright 2020 Silicon Laboratories Inc. www.silabs.com</b>
7  *******************************************************************************
8  *
9  * SPDX-License-Identifier: Zlib
10  *
11  * The licensor of this software is Silicon Laboratories Inc.
12  *
13  * This software is provided 'as-is', without any express or implied
14  * warranty. In no event will the authors be held liable for any damages
15  * arising from the use of this software.
16  *
17  * Permission is granted to anyone to use this software for any purpose,
18  * including commercial applications, and to alter it and redistribute it
19  * freely, subject to the following restrictions:
20  *
21  * 1. The origin of this software must not be misrepresented; you must not
22  *    claim that you wrote the original software. If you use this software
23  *    in a product, an acknowledgment in the product documentation would be
24  *    appreciated but is not required.
25  * 2. Altered source versions must be plainly marked as such, and must not be
26  *    misrepresented as being the original software.
27  * 3. This notice may not be removed or altered from any source distribution.
28  *
29  ******************************************************************************/
30 #ifndef SL_SE_MANAGER_TYPES_H
31 #define SL_SE_MANAGER_TYPES_H
32 
33 #include "sli_se_manager_features.h"
34 
35 #if defined(SLI_MAILBOX_COMMAND_SUPPORTED) || defined(SLI_VSE_MAILBOX_COMMAND_SUPPORTED)
36 
37 /// @addtogroup sl_se_manager
38 /// @{
39 
40 #include "sl_se_manager_defines.h"
41 #include "sli_se_manager_mailbox.h"
42 #include <stdint.h>
43 #include <stdbool.h>
44 #include <stddef.h>
45 
46 #ifdef __cplusplus
47 extern "C" {
48 #endif
49 
50 // -----------------------------------------------------------------------------
51 // Typedefs
52 
53 /// @addtogroup sl_se_manager_util
54 /// @{
55 
56 /// OTP key types
57 typedef enum {
58   SL_SE_KEY_TYPE_IMMUTABLE_BOOT = 0,
59   SL_SE_KEY_TYPE_IMMUTABLE_AUTH,
60 #if defined(SLI_MAILBOX_COMMAND_SUPPORTED)
61   SL_SE_KEY_TYPE_IMMUTABLE_AES_128,
62 #if (_SILICON_LABS_SECURITY_FEATURE == _SILICON_LABS_SECURITY_FEATURE_VAULT)
63   SL_SE_KEY_TYPE_IMMUTABLE_ATTESTATION,
64   SL_SE_KEY_TYPE_IMMUTABLE_SE_ATTESTATION,
65 #endif // _SILICON_LABS_SECURITY_FEATURE_VAULT
66 #endif // SLI_MAILBOX_COMMAND_SUPPORTED
67 } sl_se_device_key_type_t;
68 
69 #if defined(SLI_MAILBOX_COMMAND_SUPPORTED) && (_SILICON_LABS_SECURITY_FEATURE == _SILICON_LABS_SECURITY_FEATURE_VAULT)
70 /// SE tamper signal levels
71 typedef uint8_t sl_se_tamper_level_t;
72 
73 /// SE tamper signals
74 typedef uint32_t sl_se_tamper_signals_t;
75 
76 /// SE tamper filter timeout period
77 typedef uint8_t sl_se_tamper_filter_period_t;
78 
79 /// Number of tamper counts to trigger the filter signal
80 typedef uint8_t sl_se_tamper_filter_threshold_t;
81 #endif // _SILICON_LABS_SECURITY_FEATURE_VAULT
82 
83 /// Certificate size data structure
84 typedef struct {
85   uint32_t batch_id_size;    ///< size in bytes of the Batch certificate
86   uint32_t se_id_size;       ///< size in bytes of the SE ID certificate
87   uint32_t host_id_size;     ///< size in bytes of the Host ID certificate
88 } sl_se_cert_size_type_t;
89 
90 /// SE certificate types
91 typedef uint8_t sl_se_cert_type_t;
92 
93 /// OTP initialization data structure
94 typedef struct {
95   /// Enable secure boot for the host.
96   bool enable_secure_boot;
97   /// Require certificate based secure boot signing.
98   bool verify_secure_boot_certificate;
99   /// Enable anti-rollback for host application upgrades.
100   bool enable_anti_rollback;
101   /// Set flag to enable locking down all flash pages that cover the
102   /// secure-booted image, except the last page if end of signature is not
103   /// page-aligned.
104   bool secure_boot_page_lock_narrow;
105   /// Set flag to enable locking down all flash pages that cover the
106   /// secure-booted image, including the last page if end of signature is not
107   /// page-aligned.
108   bool secure_boot_page_lock_full;
109 #if defined(SLI_MAILBOX_COMMAND_SUPPORTED) && (_SILICON_LABS_SECURITY_FEATURE == _SILICON_LABS_SECURITY_FEATURE_VAULT)
110   /// List of tamper levels to configure for the different tamper sources.
111   sl_se_tamper_level_t tamper_levels[SL_SE_TAMPER_SIGNAL_NUM_SIGNALS];
112   /// Reset period for the tamper filter counter.
113   sl_se_tamper_filter_period_t tamper_filter_period;
114   /// Activation threshold for the tamper filter.
115   sl_se_tamper_filter_threshold_t tamper_filter_threshold;
116   /// Tamper flags.
117   uint8_t tamper_flags;
118   /// Tamper reset halt threshold.
119   uint8_t tamper_reset_threshold;
120 #endif // _SILICON_LABS_SECURITY_FEATURE_VAULT
121 } sl_se_otp_init_t;
122 
123 /// @} (end addtogroup sl_se_manager_util)
124 
125 /// @addtogroup sl_se_manager_core
126 /// @{
127 
128 /***************************************************************************//**
129  * @brief          SE mailbox command context
130  *
131  * @details
132  *   This structure defines the common SE mailbox command context used for
133  *   all SE Manager API functions that execute SE mailbox commands. The
134  *   members of this context structure should be considered internal to the
135  *   SE Manager and should not be read or written directly by the user
136  *   application. For members that are relevant for the user, the user can
137  *   access them via corresponding set and get API functions, e.g.
138  *   sl_se_set_yield().
139  ******************************************************************************/
140 typedef struct sl_se_command_context_t {
141   sli_se_mailbox_command_t  command; ///< SE mailbox command struct
142   bool                      yield;   ///< If true, yield the CPU core while
143                                      ///< waiting for the SE mailbox command
144                                      ///< to complete. If false, busy-wait, by
145                                      ///< polling the SE mailbox response
146                                      ///< register.
147 } sl_se_command_context_t;
148 
149 /// @} (end addtogroup sl_se_manager_core)
150 
151 /// @addtogroup sl_se_manager_util
152 /// @{
153 
154 /// SE Debug lock flags
155 typedef uint32_t sl_se_debug_flags_t;
156 
157 #if defined(SLI_MAILBOX_COMMAND_SUPPORTED)
158 /// Debug lock options
159 typedef struct {
160   /// Non-Secure, Invasive debug access enabled if true. If false, it is not
161   /// possible to debug the non-secure state in a way that is intrusive to
162   /// program execution (DBGLOCK locked).
163   bool non_secure_invasive_debug;
164   /// Non-Secure, Non-Invasive debug access enabled if true. If false, it is
165   /// not possible to debug the non-secure state in a way that is intrusive to
166   /// program execution (NIDLOCK locked).
167   bool non_secure_non_invasive_debug;
168   /// Secure, Invasive debug access enabled if true. If false, it is not
169   /// possible to debug the secure TrustZone state in a way that is intrusive
170   /// to program execution (SPIDLOCK locked).
171   bool secure_invasive_debug;
172   /// Secure, Non-Invasive debug access enabled if true. If false, it is not
173   /// possible to observe the secure TrustZone state using trace.
174   /// (SPNIDLOCK is locked. However if SPIDLOCK is open, SPNIDLOCK will also
175   /// remain open.)
176   bool secure_non_invasive_debug;
177 } sl_se_debug_options_t;
178 #endif
179 
180 /// Debug status
181 typedef struct {
182   /// Whether device erase is enabled
183   bool device_erase_enabled;
184   /// Whether secure debug is enabled with @ref sl_se_enable_secure_debug().
185   bool secure_debug_enabled;
186   /// Whether the debug port has been locked with @ref sl_se_apply_debug_lock().
187   /// This parameter does not indicate if the debug port has been unlocked by
188   /// calling @ref sl_se_open_debug().
189   bool debug_port_lock_applied;
190   /// Current state of the debug port.
191   /// True if locked with @ref sl_se_apply_debug_lock().
192   /// False if new clean, erased or unlocked with @ref sl_se_open_debug().
193   bool debug_port_lock_state;
194   #if defined(SLI_MAILBOX_COMMAND_SUPPORTED)
195   /// Debug option configuration as set by @ref sl_se_set_debug_options().
196   sl_se_debug_options_t options_config;
197   /// Current state of debug options, locked by @ref sl_se_set_debug_options() and
198   /// unlocked by @ref sl_se_open_debug().
199   sl_se_debug_options_t options_state;
200   #endif
201 } sl_se_debug_status_t;
202 
203 /// @} (end addtogroup sl_se_manager_util)
204 
205 #if defined(SLI_MAILBOX_COMMAND_SUPPORTED)
206 
207 /// @addtogroup sl_se_manager_key_handling
208 /// @{
209 
210 /// Supported key types
211 typedef uint32_t sl_se_key_type_t;
212 
213 /// Key storage method. Can have one of @ref SL_SE_KEY_STORAGE_EXTERNAL_PLAINTEXT,
214 /// @ref SL_SE_KEY_STORAGE_EXTERNAL_WRAPPED,
215 /// @ref SL_SE_KEY_STORAGE_INTERNAL_VOLATILE or
216 /// @ref SL_SE_KEY_STORAGE_INTERNAL_IMMUTABLE.
217 typedef uint32_t sl_se_storage_method_t;
218 
219 /// Internal SE key slot
220 typedef uint32_t sl_se_key_slot_t;
221 
222 /// Describes where the key is or should be stored
223 typedef struct {
224   uint8_t* pointer; ///< Pointer to a key buffer.
225   uint32_t size;    ///< Size of buffer.
226 } sl_se_buffer_t;
227 
228 /// Describes the storage location of keys
229 typedef struct {
230   /// Key storage method. Sets meaning of data in location.
231   sl_se_storage_method_t method;
232   /// Describes key storage location. @ref sl_se_buffer_t is used if @ref sl_se_key_storage_t.method is
233   /// @ref SL_SE_KEY_STORAGE_EXTERNAL_PLAINTEXT or
234   /// @ref SL_SE_KEY_STORAGE_EXTERNAL_WRAPPED, while @ref sl_se_key_slot_t is
235   /// used for @ref SL_SE_KEY_STORAGE_INTERNAL_VOLATILE or
236   /// @ref SL_SE_KEY_STORAGE_INTERNAL_IMMUTABLE.
237   union {
238     sl_se_buffer_t buffer;
239     sl_se_key_slot_t slot;
240   } location;
241 } sl_se_key_storage_t;
242 
243 /// Contains a full description of a key used by an SE command.
244 typedef struct {
245   /// Key type
246   sl_se_key_type_t type;
247   /// Key size, applicable if key_type == SYMMETRIC
248   size_t size;
249   /// Flags describing restrictions, permissions and attributes of the key.
250   uint32_t flags;
251   /// Storage location for this key
252   sl_se_key_storage_t storage;
253   /// Optional password for key usage (8 bytes). If no password is provided
254   /// (NULL pointer), any key not stored as plaintext will be stored with a
255   /// password of all-zero bytes.
256   uint8_t* password;
257   /// Pointer to domain descriptor if this key contains an asymmetric key on a
258   /// custom domain The reason for pointing instead of containing is to make
259   /// it possible to have the parameters in ROM.
260   const void* domain;
261 } sl_se_key_descriptor_t;
262 
263 #if (_SILICON_LABS_SECURITY_FEATURE == _SILICON_LABS_SECURITY_FEATURE_VAULT)
264 /// Custom Weierstrass curve structure.
265 typedef struct {
266   /// Domain size in bytes.
267   const size_t size;
268   /// Modulus p (zero-padded from MSB, right-adjusted to extend to 32-bit
269   /// alignment up from domain size)
270   const uint8_t* p;
271   /// Order N (zero-padded from MSB, right-adjusted to extend to 32-bit
272   /// alignment up from domain size)
273   const uint8_t* N;
274   /// Generator X-coordinate  (zero-padded from MSB, right-adjusted to extend
275   /// to 32-bit alignment up from domain size)
276   const uint8_t* Gx;
277   /// Generator Y-coordinate  (zero-padded from MSB, right-adjusted to extend
278   /// to 32-bit alignment up from domain size)
279   const uint8_t* Gy;
280   /// Parameter a  (zero-padded from MSB, right-adjusted to extend to 32-bit
281   /// alignment up from domain size)
282   const uint8_t* a;
283   /// Parameter b  (zero-padded from MSB, right-adjusted to extend to 32-bit
284   /// alignment up from domain size)
285   const uint8_t* b;
286   /// Set if a equals 0
287   bool a_is_zero;
288   /// Set if a equals -3
289   bool a_is_minus_three;
290 } sl_se_custom_weierstrass_prime_domain_t;
291 #endif
292 
293 /// @} (end addtogroup sl_se_manager_key_handling)
294 
295 /// @addtogroup sl_se_manager_util
296 /// @{
297 
298 /// SE challenge storage
299 typedef uint8_t sl_se_challenge_t[SL_SE_CHALLENGE_SIZE];
300 
301 /// SE status
302 typedef struct {
303   /// Boot status code / error code (Bits [7:0]).
304   uint32_t boot_status;
305   /// SE firmware version.
306   uint32_t se_fw_version;
307   /// Host firmware version (if available).
308   uint32_t host_fw_version;
309   /// Debug lock status.
310   sl_se_debug_status_t debug_status;
311   /// Secure boot enabled.
312   bool secure_boot_enabled;
313   /// Active mode enabled.
314   bool active_mode_enabled;
315   /// Recorded tamper status. Reset on status read.
316   uint32_t tamper_status;
317   /// Currently active tamper sources.
318   uint32_t tamper_status_raw;
319 #if defined(_SILICON_LABS_32B_SERIES_3)
320   uint8_t rom_revision;
321   uint8_t otp_patch_sequence;
322 #endif
323 } sl_se_status_t;
324 
325 /// @} (end addtogroup sl_se_manager_util)
326 
327 /// @addtogroup sl_se_manager_cipher
328 /// @{
329 
330 /// Cipher operation types
331 typedef enum {
332   SL_SE_ENCRYPT,
333   SL_SE_DECRYPT
334 } sl_se_cipher_operation_t;
335 
336 /// CMAC streaming context
337 typedef struct {
338   uint8_t                      state[16];       ///< CMAC state
339   uint8_t                      data_in[16];     ///< Unprocessed data
340   uint8_t                      data_out[16];    ///< Last 16 bytes of cipher-text
341   size_t                       length;          ///< Length of all processed and unprocessed data
342 } sl_se_cmac_multipart_context_t;
343 
344 /// CCM streaming context.
345 typedef struct {
346   uint32_t processed_message_length;///< Current length of the encrypted/decrypted data
347   uint32_t total_message_length;    ///< Total length of data to be encrypted/decrypted
348   uint8_t  iv[13];                  ///< Nonce (MAX size is 13 bytes)
349   uint32_t tag_len;                 ///< Tag length
350   sl_se_cipher_operation_t     mode;///< CCM mode (decrypt or encrypt)
351   #if defined(SLI_SE_MAJOR_VERSION_ONE)
352   uint8_t nonce_counter[16];        ///< Counter to keep CTR state
353   uint8_t iv_len;                   ///< Nonce length
354   uint8_t cbc_mac_state[16];        ///< State of authenication/MAC
355   uint8_t final_data[16];           ///< Input data saved for finish operation
356   #else
357   uint8_t  se_ctx[32];              ///< SE encryption state
358   union {
359     uint8_t tagbuf[16];             ///< Tag
360     uint8_t final_data[16];         ///< Input data saved for finish operation
361   } mode_specific_buffer;           ///< Buffer containing Tag and input data saved for finish operation
362   #endif
363   uint8_t final_data_length;        ///< Length of data saved
364 } sl_se_ccm_multipart_context_t;
365 
366 typedef struct {
367   uint64_t len;                     ///< Total length of the encrypted data
368   uint64_t add_len;                 ///< Total length of the additional data
369   #if defined(SLI_SE_MAJOR_VERSION_ONE)
370   uint8_t  tagbuf[16];              ///< Tag
371   uint8_t previous_se_ctx[32];      ///< SE state from previous operation
372   #endif
373   uint8_t se_ctx[32];               ///< SE state
374   uint8_t final_data[16];           ///< Input data saved for finish operation
375   uint8_t final_data_length;        ///< Length of data saved
376   sl_se_cipher_operation_t     mode;///< GCM mode
377   bool    first_operation;          ///< First operation
378 } sl_se_gcm_multipart_context_t;
379 
380 /// @} (end addtogroup sl_se_manager_cipher)
381 
382 /// @addtogroup sl_se_manager_hash
383 /// @{
384 
385 /// Hash algorithms
386 typedef enum {
387   SL_SE_HASH_NONE,      ///< No hash
388   SL_SE_HASH_SHA1,      ///< SHA-1
389   SL_SE_HASH_SHA224,    ///< SHA-224
390   SL_SE_HASH_SHA256,    ///< SHA-256
391 #if (_SILICON_LABS_SECURITY_FEATURE == _SILICON_LABS_SECURITY_FEATURE_VAULT)
392   SL_SE_HASH_SHA384,    ///< SHA-384
393   SL_SE_HASH_SHA512,    ///< SHA-512
394 #endif
395 } sl_se_hash_type_t;
396 
397 /// SHA-1 streaming context.
398 typedef struct {
399   sl_se_hash_type_t      hash_type; ///< Hash streaming context
400   uint32_t total[2];                ///< number of bytes processed
401   uint8_t  state[32];               ///< intermediate digest state
402   uint8_t  buffer[64];              ///< data block being processed
403 } sl_se_sha1_multipart_context_t;
404 
405 /// SHA-224 streaming context.
406 typedef struct {
407   sl_se_hash_type_t      hash_type; ///< Hash streaming context
408   uint32_t total[2];                ///< Number of bytes processed
409   uint8_t  state[32];               ///< Intermediate digest state
410   uint8_t  buffer[64];              ///< Data block being processed
411 } sl_se_sha224_multipart_context_t;
412 
413 /// SHA-256 streaming context.
414 typedef struct {
415   sl_se_hash_type_t      hash_type; ///< Hash streaming context
416   uint32_t total[2];                ///< Number of bytes processed
417   uint8_t  state[32];               ///< Intermediate digest state
418   uint8_t  buffer[64];              ///< Data block being processed
419 } sl_se_sha256_multipart_context_t;
420 
421 #if (_SILICON_LABS_SECURITY_FEATURE == _SILICON_LABS_SECURITY_FEATURE_VAULT)
422 /// SHA-384 streaming context.
423 typedef struct {
424   sl_se_hash_type_t      hash_type; ///< Hash streaming context
425   uint32_t total[4];                ///< Number of bytes processed
426   uint8_t  state[64];               ///< Intermediate digest state
427   uint8_t  buffer[128];             ///< Data block being processed
428 } sl_se_sha384_multipart_context_t;
429 
430 /// SHA-512 streaming context.
431 typedef struct {
432   sl_se_hash_type_t      hash_type; ///< Hash streaming context
433   uint32_t total[4];                ///< Number of bytes processed
434   uint8_t  state[64];               ///< Intermediate digest state
435   uint8_t  buffer[128];             ///< Data block being processed
436 } sl_se_sha512_multipart_context_t;
437 
438 #endif
439 
440 /// @} (end addtogroup sl_se_manager_hash)
441 
442 /// @addtogroup sl_se_manager_key_derivation
443 /// @{
444 
445 /// Roles in the EC J-PAKE exchange
446 typedef enum {
447   SL_SE_ECJPAKE_CLIENT = 0,           ///< Client
448   SL_SE_ECJPAKE_SERVER,               ///< Server
449 } sl_se_ecjpake_role_t;
450 
451 /**************************************************************************//**
452  * EC J-PAKE context structure.
453  *
454  * J-PAKE is a symmetric protocol, except for the identifiers used in
455  * Zero-Knowledge Proofs, and the serialization of the second message
456  * (KeyExchange) as defined by the Thread spec.
457  *
458  * In order to benefit from this symmetry, we choose a different naming
459  * convention from the Thread v1.0 spec. Correspondance is indicated in the
460  * description as a pair C: client name, S: server name
461  *****************************************************************************/
462 typedef struct {
463   sl_se_command_context_t *cmd_ctx;   ///< Pointer to command context object
464   uint32_t curve_flags;               ///< Curve flags to use
465   sl_se_ecjpake_role_t role;          ///< Are we client or server?
466 
467   char pwd[32];                       ///< J-PAKE password
468   size_t pwd_len;                     ///< J-PAKE password length
469 
470   uint8_t r[32];                      ///< Random scalar for exchange
471   uint8_t Xm1[64];                    ///< Our point 1 (round 1)
472   uint8_t Xm2[64];                    ///< Our point 2 (round 1)
473   uint8_t Xp1[64];                    ///< Their point 1 (round 1)
474   uint8_t Xp2[64];                    ///< Their point 2 (round 1)
475   uint8_t Xp[64];                     ///< Their point (round 2)
476 } sl_se_ecjpake_context_t;
477 
478 #if (_SILICON_LABS_SECURITY_FEATURE == _SILICON_LABS_SECURITY_FEATURE_VAULT)
479 /// Typedef sl_se_pbkdf2_prf_type_t to sl_se_hash_type_t in order to maintain
480 /// backward compatibility. Defines for mapping the PRF identifiers to the
481 /// underlying hash enum values exists in sl_se_manager_defines.h.
482 typedef sl_se_hash_type_t sl_se_pbkdf2_prf_type_t;
483 #endif
484 
485 /// @} (end addtogroup sl_se_manager_key_derivation)
486 
487 #if defined(_SILICON_LABS_32B_SERIES_3)
488 
489 /// @addtogroup sl_se_manager_extmem
490 /// @{
491 
492 /// SE Crypto algorithms (ciphers, AEADs, MACs, hashes, etc) used for
493 /// the code region write function.
494 typedef enum {
495   SL_SE_ALG_AES_CTR,               ///< Counter mode AES cipher
496   SL_SE_ALG_SHA_256,               ///< SHA2-256
497 } sl_se_crypto_alg_t;
498 
499 typedef struct {
500   sl_se_cipher_operation_t mode;   ///< encryption or decryption
501   sl_se_key_descriptor_t *key;     ///< Key to be used for encryption or decryption
502   unsigned char *iv;               ///< Initial Vector/Nonce
503   size_t iv_len;                   ///< Initial Vector/Nonce length
504   unsigned char *add;              ///< Additional data
505   size_t add_len;                  ///< Additional data length
506   unsigned char *tag;              ///< Tag
507   size_t tag_len;                  ///< Tag length
508 } sl_se_aead_info_t;
509 
510 typedef struct {
511   sl_se_cipher_operation_t mode;   ///< encryption or decryption
512   sl_se_key_descriptor_t *key;     ///< Key to be used for encryption or decryption
513 } sl_se_cipher_info_t;
514 
515 typedef struct {
516   unsigned char *digest;           ///< Pointer to message digest buffer
517   size_t digest_size;              ///< Size of message digest
518 } sl_se_hash_info_t;
519 
520 typedef union {
521   sl_se_aead_info_t   aead;
522   sl_se_cipher_info_t cipher;
523   sl_se_hash_info_t   hash;
524 } sl_se_crypto_alg_specific_info_t;
525 
526 /// Information associated with cryupto related operations
527 typedef struct {
528   sl_se_crypto_alg_t *alg;         ///< SE Crypto algorithm
529   sl_se_crypto_alg_specific_info_t alg_specific_info;
530 } sl_se_crypto_operation_t;
531 
532 /// Security level of code region
533 typedef enum {
534   SL_SE_CODE_REGION_SECURITY_LEVEL_PLAINTEXT = 0,
535   SL_SE_CODE_REGION_SECURITY_LEVEL_ENC_ONLY,
536   SL_SE_CODE_REGION_SECURITY_LEVEL_ENC_AUTH,
537 } sl_se_code_region_security_level_t;
538 
539 /// Code region configuration
540 typedef struct {
541   unsigned int region_idx;         ///< Index of code region
542   unsigned int region_size;        ///< Size of code region
543   sl_se_code_region_security_level_t security_level;   ///< Security level of region
544   bool bank_swapping_enabled;      ///< Bank swapping enabled (if true)
545   bool locked;                     ///< Region is locked (if true)
546 } sl_code_region_config_t;
547 
548 /// @} (end addtogroup sl_se_manager_extmem)
549 
550 #endif // defined(_SILICON_LABS_32B_SERIES_3)
551 
552 #endif // defined(SLI_MAILBOX_COMMAND_SUPPORTED)
553 
554 #ifdef __cplusplus
555 }
556 #endif
557 
558 /// @} (end addtogroup sl_se_manager)
559 
560 #endif // defined(SLI_MAILBOX_COMMAND_SUPPORTED) || defined(SLI_VSE_MAILBOX_COMMAND_SUPPORTED)
561 
562 #endif // SL_SE_MANAGER_TYPES_H
563