1 /*
2  * Copyright (c) 2021 Nordic Semiconductor ASA
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 /**
8  * @file
9  * @defgroup bt_mesh_dfu_metadata Bluetooth Mesh Device Firmware Update (DFU) metadata
10  * @ingroup bt_mesh_dfu
11  * @{
12  * @brief Common types and functions for the Bluetooth Mesh DFU metadata.
13  */
14 
15 #ifndef ZEPHYR_INCLUDE_BLUETOOTH_MESH_DFU_METADATA_H__
16 #define ZEPHYR_INCLUDE_BLUETOOTH_MESH_DFU_METADATA_H__
17 
18 #include <stdint.h>
19 
20 #include <sys/types.h>
21 
22 #include <zephyr/kernel.h>
23 
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 
28 /** Firmware version. */
29 struct bt_mesh_dfu_metadata_fw_ver {
30 	/** Firmware major version. */
31 	uint8_t major;
32 	/** Firmware minor version. */
33 	uint8_t minor;
34 	/** Firmware revision. */
35 	uint16_t revision;
36 	/** Firmware build number. */
37 	uint32_t build_num;
38 };
39 
40 /** Firmware core type. */
41 enum bt_mesh_dfu_metadata_fw_core_type {
42 	/** Application core. */
43 	BT_MESH_DFU_FW_CORE_TYPE_APP = BIT(0),
44 	/** Network core. */
45 	BT_MESH_DFU_FW_CORE_TYPE_NETWORK = BIT(1),
46 	/** Application-specific BLOB. */
47 	BT_MESH_DFU_FW_CORE_TYPE_APP_SPECIFIC_BLOB = BIT(2),
48 };
49 
50 /** Firmware metadata. */
51 struct bt_mesh_dfu_metadata {
52 	/** New firmware version. */
53 	struct bt_mesh_dfu_metadata_fw_ver fw_ver;
54 	/** New firmware size. */
55 	uint32_t fw_size;
56 	/** New firmware core type. */
57 	enum bt_mesh_dfu_metadata_fw_core_type fw_core_type;
58 	/** Hash of incoming Composition Data. */
59 	uint32_t comp_hash;
60 	/** New number of node elements. */
61 	uint16_t elems;
62 	/** Application-specific data for new firmware. This field is optional. */
63 	uint8_t *user_data;
64 	/** Length of the application-specific field. */
65 	uint32_t user_data_len;
66 };
67 
68 /** @brief Decode a firmware metadata from a network buffer.
69  *
70  *  @param buf Buffer containing a raw metadata to be decoded.
71  *  @param metadata Pointer to a metadata structure to be filled.
72  *
73  *  @return 0 on success, or (negative) error code otherwise.
74  */
75 int bt_mesh_dfu_metadata_decode(struct net_buf_simple *buf,
76 				struct bt_mesh_dfu_metadata *metadata);
77 
78 /** @brief Encode a firmware metadata into a network buffer.
79  *
80  *  @param metadata Firmware metadata to be encoded.
81  *  @param buf Buffer to store the encoded metadata.
82  *
83  *  @return 0 on success, or (negative) error code otherwise.
84  */
85 int bt_mesh_dfu_metadata_encode(const struct bt_mesh_dfu_metadata *metadata,
86 				struct net_buf_simple *buf);
87 
88 /** @brief Compute hash of the Composition Data state.
89  *
90  *  The format of the Composition Data is defined in MshPRTv1.1: 4.2.2.1.
91  *
92  *  @param buf Pointer to buffer holding Composition Data.
93  *  @param key 128-bit key to be used in the hash computation.
94  *  @param hash Pointer to a memory location to which the hash will be stored.
95  *
96  *  @return 0 on success, or (negative) error code otherwise.
97  */
98 int bt_mesh_dfu_metadata_comp_hash_get(struct net_buf_simple *buf, uint8_t *key, uint32_t *hash);
99 
100 /** @brief Compute hash of the Composition Data Page 0 of this device.
101  *
102  *  @param key 128-bit key to be used in the hash computation.
103  *  @param hash Pointer to a memory location to which the hash will be stored.
104  *
105  *  @return 0 on success, or (negative) error code otherwise.
106  */
107 int bt_mesh_dfu_metadata_comp_hash_local_get(uint8_t *key, uint32_t *hash);
108 
109 #ifdef __cplusplus
110 }
111 #endif
112 
113 #endif /* ZEPHYR_INCLUDE_BLUETOOTH_MESH_DFU_METADATA_H__ */
114 
115 /** @} */
116