1 /*
2  * Copyright (c) 2018-2022 mcumgr authors
3  * Copyright (c) 2022 Laird Connectivity
4  * Copyright (c) 2022 Nordic Semiconductor ASA
5  *
6  * SPDX-License-Identifier: Apache-2.0
7  */
8 
9 #ifndef H_MGMT_MCUMGR_GRP_FS_MGMT_CHKSUM_
10 #define H_MGMT_MCUMGR_GRP_FS_MGMT_CHKSUM_
11 
12 #include <zephyr/kernel.h>
13 #include <zephyr/fs/fs.h>
14 
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18 
19 /** @typedef fs_mgmt_hash_checksum_handler_fn
20  * @brief Function that gets called to generate a hash or checksum.
21  *
22  * @param file		Opened file context
23  * @param output	Output buffer for hash/checksum
24  * @param out_len	Updated with size of input data
25  * @param len		Maximum length of data to perform hash/checksum on
26  *
27  * @return 0 on success, negative error code on failure.
28  */
29 typedef int (*fs_mgmt_hash_checksum_handler_fn)(struct fs_file_t *file, uint8_t *output,
30 						size_t *out_len, size_t len);
31 
32 /**
33  * @brief A collection of handlers for an entire hash/checksum group.
34  */
35 struct fs_mgmt_hash_checksum_group {
36 	/** Entry list node. */
37 	sys_snode_t node;
38 
39 	/** Array of handlers; one entry per name. */
40 	const char *group_name;
41 
42 	/** Byte string or numerical output. */
43 	bool byte_string;
44 
45 	/** Size (in bytes) of output. */
46 	uint8_t output_size;
47 
48 	/** Hash/checksum function pointer. */
49 	fs_mgmt_hash_checksum_handler_fn function;
50 };
51 
52 /** @typedef fs_mgmt_hash_checksum_list_cb
53  * @brief Function that gets called with hash/checksum details
54  *
55  * @param group         Details about a supported hash/checksum
56  * @param user_data     User-supplied value to calling function
57  */
58 typedef void (*fs_mgmt_hash_checksum_list_cb)(const struct fs_mgmt_hash_checksum_group *group,
59 					      void *user_data);
60 
61 /**
62  * @brief Registers a full hash/checksum group.
63  *
64  * @param group The group to register.
65  */
66 void fs_mgmt_hash_checksum_register_group(struct fs_mgmt_hash_checksum_group *group);
67 
68 /**
69  * @brief Unregisters a full hash/checksum group.
70  *
71  * @param group The group to register.
72  */
73 void fs_mgmt_hash_checksum_unregister_group(struct fs_mgmt_hash_checksum_group *group);
74 
75 /**
76  * @brief Finds a registered hash/checksum handler.
77  *
78  * @param name	The name of the hash/checksum group to find.
79  *
80  * @return	The requested hash/checksum handler on success;
81  *		NULL on failure.
82  */
83 const struct fs_mgmt_hash_checksum_group *fs_mgmt_hash_checksum_find_handler(const char *name);
84 
85 /**
86  * @brief Runs a callback with all supported hash/checksum types.
87  *
88  * @param cb		The callback function to call with each hash/checksum type.
89  * @param user_data	Data to pass back with the callback function.
90  */
91 void fs_mgmt_hash_checksum_find_handlers(fs_mgmt_hash_checksum_list_cb cb, void *user_data);
92 
93 #ifdef __cplusplus
94 }
95 #endif
96 
97 #endif /* ifndef H_MGMT_MCUMGR_GRP_FS_MGMT_CHKSUM_ */
98