/***************************************************************************//** * @file * @brief Representation of Application Properties ******************************************************************************* * # License * Copyright 2021 Silicon Laboratories Inc. www.silabs.com ******************************************************************************* * * The licensor of this software is Silicon Laboratories Inc. Your use of this * software is governed by the terms of Silicon Labs Master Software License * Agreement (MSLA) available at * www.silabs.com/about-us/legal/master-software-license-agreement. This * software is distributed to you in Source Code format and is governed by the * sections of the MSLA applicable to Source Code. * ******************************************************************************/ #ifndef APPLICATION_PROPERTIES_H #define APPLICATION_PROPERTIES_H #include /***************************************************************************//** * @addtogroup Interface * @{ * @addtogroup ApplicationProperties Application Properties * @brief Properties of the application that can be accessed by the bootloader * @details * Applications must contain an @ref ApplicationProperties_t struct declaring * the application version and capabilities, and so on. The metadata contained * in this struct will be extracted from the application by the Simplicity * Commander tool and placed in the GBL upgrade file. If this struct is not * in the application image, it will be added to the GBL file by the * Simplicity Commander. * * The struct is also used to declare whether the application image is signed * and what type of signature is used. If no @ref ApplicationProperties_t * struct is present, the bootloader will assume that the application image * is signed using @ref APPLICATION_SIGNATURE_ECDSA_P256. * * To ensure that the bootloader can easily locate the ApplicationProperties_t * struct, if not already done by the linker, Simplicity Commander will modify * word 13 of the application to insert a pointer to the * ApplicationProperties_t struct. * @{ ******************************************************************************/ /// Magic value declaring the existence of an ApplicationProperties_t struct #define APPLICATION_PROPERTIES_MAGIC { \ 0x13, 0xb7, 0x79, 0xfa, \ 0xc9, 0x25, 0xdd, 0xb7, \ 0xad, 0xf3, 0xcf, 0xe0, \ 0xf1, 0xb6, 0x14, 0xb8 \ } /// Byte-reversed version of ::APPLICATION_PROPERTIES_MAGIC #define APPLICATION_PROPERTIES_REVERSED { \ 0xb8, 0x14, 0xb6, 0xf1, \ 0xe0, 0xcf, 0xf3, 0xad, \ 0xb7, 0xdd, 0x25, 0xc9, \ 0xfa, 0x79, 0xb7, 0x13 \ } /// Major version number of the AppliationProperties_t struct #define APPLICATION_PROPERTIES_VERSION_MAJOR (1UL) /// Minor version number of the AppliationProperties_t struct #define APPLICATION_PROPERTIES_VERSION_MINOR (2UL) /// Version number of the ApplicationCertificate_t struct #define APPLICATION_CERTIFICATE_VERSION (1UL) /// The application is not signed #define APPLICATION_SIGNATURE_NONE (0UL) /// @brief The SHA-256 digest of the application is signed using ECDSA with the /// NIST P-256 curve. #define APPLICATION_SIGNATURE_ECDSA_P256 (1UL << 0UL) /// @brief The application is not signed, but has a CRC-32 checksum #define APPLICATION_SIGNATURE_CRC32 (1UL << 1UL) /// The application contains a Zigbee wireless stack #define APPLICATION_TYPE_ZIGBEE (1UL << 0UL) /// The application contains a Thread wireless stack #define APPLICATION_TYPE_THREAD (1UL << 1UL) /// The application contains a Flex wireless stack #define APPLICATION_TYPE_FLEX (1UL << 2UL) /// The application contains a Bluetooth wireless stack #define APPLICATION_TYPE_BLUETOOTH (1UL << 3UL) /// The application is an MCU application #define APPLICATION_TYPE_MCU (1UL << 4UL) /// The application contains a Bluetooth application #define APPLICATION_TYPE_BLUETOOTH_APP (1UL << 5UL) /// The application contains a bootloader #define APPLICATION_TYPE_BOOTLOADER (1UL << 6UL) /// The application contains a Zwave wireless stack #define APPLICATION_TYPE_ZWAVE (1UL << 7UL) /// Application Data typedef struct ApplicationData { /// @brief Bitfield representing type of application, e.g., /// @ref APPLICATION_TYPE_ZIGBEE uint32_t type; /// Version number for this application uint32_t version; /// Capabilities of this application uint32_t capabilities; /// Unique ID (UUID or GUID) for the product this application is built for uint8_t productId[16]; } ApplicationData_t; /// Application Certificate typedef struct ApplicationCertificate { /// Version of the certificate structure uint8_t structVersion; /// Reserved flags uint8_t flags[3]; /// Public key uint8_t key[64]; /// The version number of this certificate uint32_t version; /// Signature of the certificate uint8_t signature[64]; } ApplicationCertificate_t; /// Application Properties struct typedef struct { /// @brief Magic value indicating this is an ApplicationProperties_t struct. /// Must equal @ref APPLICATION_PROPERTIES_MAGIC uint8_t magic[16]; /// Version number of this struct uint32_t structVersion; /// Type of signature this application is signed with uint32_t signatureType; /// Location of the signature. Typically points to the end of the application uint32_t signatureLocation; /// Information about the application ApplicationData_t app; /// Pointer to information about the certificate ApplicationCertificate_t *cert; /// Pointer to Long Token Data Section uint8_t *longTokenSectionAddress; /// Parser Decryption Key const uint8_t decryptKey[16]; } ApplicationProperties_t; /** @} (end addtogroup ApplicationProperties) */ /** @} (end addtogroup Interface) */ /// Application Properties major version shift value #define APPLICATION_PROPERTIES_VERSION_MAJOR_SHIFT (0U) /// Application Properties minor version shift value #define APPLICATION_PROPERTIES_VERSION_MINOR_SHIFT (8U) /// Application Properties major version mask #define APPLICATION_PROPERTIES_VERSION_MAJOR_MASK (0x000000FFU) /// Application Properties minor version mask #define APPLICATION_PROPERTIES_VERSION_MINOR_MASK (0xFFFFFF00U) /// Version number of the AppliationProperties_t struct #define APPLICATION_PROPERTIES_VERSION ((APPLICATION_PROPERTIES_VERSION_MINOR \ << APPLICATION_PROPERTIES_VERSION_MINOR_SHIFT) \ | (APPLICATION_PROPERTIES_VERSION_MAJOR \ << APPLICATION_PROPERTIES_VERSION_MAJOR_SHIFT)) #if (APPLICATION_PROPERTIES_VERSION_MAJOR \ > (APPLICATION_PROPERTIES_VERSION_MAJOR_MASK >> APPLICATION_PROPERTIES_VERSION_MAJOR_SHIFT)) || (APPLICATION_PROPERTIES_VERSION_MINOR \ > (APPLICATION_PROPERTIES_VERSION_MINOR_MASK >> APPLICATION_PROPERTIES_VERSION_MINOR_SHIFT)) #error "Invalid application properties version" #endif #endif // APPLICATION_PROPERTIES_H