xref: /btstack/src/mesh/mesh_keys.h (revision f4854a5efbe174cdf16fcaf3de7491781eef80ab)
1*f4854a5eSMatthias Ringwald /*
2*f4854a5eSMatthias Ringwald  * Copyright (C) 2018 BlueKitchen GmbH
3*f4854a5eSMatthias Ringwald  *
4*f4854a5eSMatthias Ringwald  * Redistribution and use in source and binary forms, with or without
5*f4854a5eSMatthias Ringwald  * modification, are permitted provided that the following conditions
6*f4854a5eSMatthias Ringwald  * are met:
7*f4854a5eSMatthias Ringwald  *
8*f4854a5eSMatthias Ringwald  * 1. Redistributions of source code must retain the above copyright
9*f4854a5eSMatthias Ringwald  *    notice, this list of conditions and the following disclaimer.
10*f4854a5eSMatthias Ringwald  * 2. Redistributions in binary form must reproduce the above copyright
11*f4854a5eSMatthias Ringwald  *    notice, this list of conditions and the following disclaimer in the
12*f4854a5eSMatthias Ringwald  *    documentation and/or other materials provided with the distribution.
13*f4854a5eSMatthias Ringwald  * 3. Neither the name of the copyright holders nor the names of
14*f4854a5eSMatthias Ringwald  *    contributors may be used to endorse or promote products derived
15*f4854a5eSMatthias Ringwald  *    from this software without specific prior written permission.
16*f4854a5eSMatthias Ringwald  * 4. Any redistribution, use, or modification is done solely for
17*f4854a5eSMatthias Ringwald  *    personal benefit and not for any commercial purpose or for
18*f4854a5eSMatthias Ringwald  *    monetary gain.
19*f4854a5eSMatthias Ringwald  *
20*f4854a5eSMatthias Ringwald  * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
21*f4854a5eSMatthias Ringwald  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22*f4854a5eSMatthias Ringwald  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23*f4854a5eSMatthias Ringwald  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
24*f4854a5eSMatthias Ringwald  * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25*f4854a5eSMatthias Ringwald  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26*f4854a5eSMatthias Ringwald  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
27*f4854a5eSMatthias Ringwald  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28*f4854a5eSMatthias Ringwald  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29*f4854a5eSMatthias Ringwald  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
30*f4854a5eSMatthias Ringwald  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31*f4854a5eSMatthias Ringwald  * SUCH DAMAGE.
32*f4854a5eSMatthias Ringwald  *
33*f4854a5eSMatthias Ringwald  * Please inquire about commercial licensing options at
34*f4854a5eSMatthias Ringwald  * [email protected]
35*f4854a5eSMatthias Ringwald  *
36*f4854a5eSMatthias Ringwald  */
37*f4854a5eSMatthias Ringwald 
38*f4854a5eSMatthias Ringwald #ifndef __MESH_KEYS_H
39*f4854a5eSMatthias Ringwald #define __MESH_KEYS_H
40*f4854a5eSMatthias Ringwald 
41*f4854a5eSMatthias Ringwald #include <stdint.h>
42*f4854a5eSMatthias Ringwald 
43*f4854a5eSMatthias Ringwald #include "btstack_linked_list.h"
44*f4854a5eSMatthias Ringwald 
45*f4854a5eSMatthias Ringwald #include "mesh/adv_bearer.h"
46*f4854a5eSMatthias Ringwald 
47*f4854a5eSMatthias Ringwald #ifdef __cplusplus
48*f4854a5eSMatthias Ringwald extern "C"
49*f4854a5eSMatthias Ringwald {
50*f4854a5eSMatthias Ringwald #endif
51*f4854a5eSMatthias Ringwald 
52*f4854a5eSMatthias Ringwald typedef struct {
53*f4854a5eSMatthias Ringwald     btstack_linked_item_t item;
54*f4854a5eSMatthias Ringwald 
55*f4854a5eSMatthias Ringwald     // internal index [0..MAX_NR_MESH_NETWORK_KEYS-1]
56*f4854a5eSMatthias Ringwald     uint16_t internal_index;
57*f4854a5eSMatthias Ringwald 
58*f4854a5eSMatthias Ringwald     // index into shared global key list
59*f4854a5eSMatthias Ringwald     uint16_t netkey_index;
60*f4854a5eSMatthias Ringwald 
61*f4854a5eSMatthias Ringwald     // internal version - allows for newer-than relation between keys with same netkey_index
62*f4854a5eSMatthias Ringwald     uint8_t version;
63*f4854a5eSMatthias Ringwald 
64*f4854a5eSMatthias Ringwald     // net_key from provisioner or Config Model Client
65*f4854a5eSMatthias Ringwald     uint8_t net_key[16];
66*f4854a5eSMatthias Ringwald 
67*f4854a5eSMatthias Ringwald     // derived data
68*f4854a5eSMatthias Ringwald 
69*f4854a5eSMatthias Ringwald     // k1
70*f4854a5eSMatthias Ringwald     uint8_t identity_key[16];
71*f4854a5eSMatthias Ringwald     uint8_t beacon_key[16];
72*f4854a5eSMatthias Ringwald 
73*f4854a5eSMatthias Ringwald     // k3
74*f4854a5eSMatthias Ringwald     uint8_t network_id[8];
75*f4854a5eSMatthias Ringwald 
76*f4854a5eSMatthias Ringwald     // k2
77*f4854a5eSMatthias Ringwald     uint8_t nid;
78*f4854a5eSMatthias Ringwald     uint8_t encryption_key[16];
79*f4854a5eSMatthias Ringwald     uint8_t privacy_key[16];
80*f4854a5eSMatthias Ringwald 
81*f4854a5eSMatthias Ringwald } mesh_network_key_t;
82*f4854a5eSMatthias Ringwald 
83*f4854a5eSMatthias Ringwald typedef struct {
84*f4854a5eSMatthias Ringwald     btstack_linked_list_iterator_t it;
85*f4854a5eSMatthias Ringwald     mesh_network_key_t * key;
86*f4854a5eSMatthias Ringwald     uint8_t nid;
87*f4854a5eSMatthias Ringwald } mesh_network_key_iterator_t;
88*f4854a5eSMatthias Ringwald 
89*f4854a5eSMatthias Ringwald typedef struct {
90*f4854a5eSMatthias Ringwald     btstack_linked_item_t item;
91*f4854a5eSMatthias Ringwald 
92*f4854a5eSMatthias Ringwald     // internal index [0..MAX_NR_MESH_TRANSPORT_KEYS-1]
93*f4854a5eSMatthias Ringwald     uint16_t internal_index;
94*f4854a5eSMatthias Ringwald 
95*f4854a5eSMatthias Ringwald     // netkey_index of subnet this app key is used with
96*f4854a5eSMatthias Ringwald     uint16_t netkey_index;
97*f4854a5eSMatthias Ringwald 
98*f4854a5eSMatthias Ringwald     // index into shared global app key list
99*f4854a5eSMatthias Ringwald     uint16_t appkey_index;
100*f4854a5eSMatthias Ringwald 
101*f4854a5eSMatthias Ringwald     // app_key
102*f4854a5eSMatthias Ringwald     uint8_t key[16];
103*f4854a5eSMatthias Ringwald 
104*f4854a5eSMatthias Ringwald     // internal version - allows for newer-than relation between keys with same appkey_index
105*f4854a5eSMatthias Ringwald     uint8_t version;
106*f4854a5eSMatthias Ringwald 
107*f4854a5eSMatthias Ringwald     // old key - mark key as 'older' in app key update or startup
108*f4854a5eSMatthias Ringwald     uint8_t old_key;
109*f4854a5eSMatthias Ringwald 
110*f4854a5eSMatthias Ringwald     // application key flag, 0 for device key
111*f4854a5eSMatthias Ringwald     uint8_t akf;
112*f4854a5eSMatthias Ringwald 
113*f4854a5eSMatthias Ringwald     // application key hash id
114*f4854a5eSMatthias Ringwald     uint8_t aid;
115*f4854a5eSMatthias Ringwald 
116*f4854a5eSMatthias Ringwald     // key refresth
117*f4854a5eSMatthias Ringwald     uint8_t key_refresh;
118*f4854a5eSMatthias Ringwald 
119*f4854a5eSMatthias Ringwald } mesh_transport_key_t;
120*f4854a5eSMatthias Ringwald 
121*f4854a5eSMatthias Ringwald typedef struct {
122*f4854a5eSMatthias Ringwald     btstack_linked_list_iterator_t it;
123*f4854a5eSMatthias Ringwald     mesh_transport_key_t * key;
124*f4854a5eSMatthias Ringwald     uint16_t netkey_index;
125*f4854a5eSMatthias Ringwald     uint8_t  akf;
126*f4854a5eSMatthias Ringwald     uint8_t  aid;
127*f4854a5eSMatthias Ringwald } mesh_transport_key_iterator_t;
128*f4854a5eSMatthias Ringwald 
129*f4854a5eSMatthias Ringwald /**
130*f4854a5eSMatthias Ringwald  * @brief Init network key storage
131*f4854a5eSMatthias Ringwald  */
132*f4854a5eSMatthias Ringwald void mesh_network_key_init(void);
133*f4854a5eSMatthias Ringwald 
134*f4854a5eSMatthias Ringwald /**
135*f4854a5eSMatthias Ringwald  * @brief Get internal index of free network key storage entry
136*f4854a5eSMatthias Ringwald  * @note index 0 is reserved for primary network key
137*f4854a5eSMatthias Ringwald  * @returns index or 0u if none found
138*f4854a5eSMatthias Ringwald  */
139*f4854a5eSMatthias Ringwald uint16_t mesh_network_key_get_free_index(void);
140*f4854a5eSMatthias Ringwald 
141*f4854a5eSMatthias Ringwald /**
142*f4854a5eSMatthias Ringwald  * @brief Add network key to list
143*f4854a5eSMatthias Ringwald  * @param network_key
144*f4854a5eSMatthias Ringwald  * @note derivative data k1-k3 need to be already calculated
145*f4854a5eSMatthias Ringwald  */
146*f4854a5eSMatthias Ringwald void mesh_network_key_add(mesh_network_key_t * network_key);
147*f4854a5eSMatthias Ringwald 
148*f4854a5eSMatthias Ringwald /**
149*f4854a5eSMatthias Ringwald  * @brief Remove network key from list
150*f4854a5eSMatthias Ringwald  * @param network_key
151*f4854a5eSMatthias Ringwald  * @return 0 if removed
152*f4854a5eSMatthias Ringwald  * @note key is only removed from list, memory is not released
153*f4854a5eSMatthias Ringwald  */
154*f4854a5eSMatthias Ringwald int mesh_network_key_remove(mesh_network_key_t * network_key);
155*f4854a5eSMatthias Ringwald 
156*f4854a5eSMatthias Ringwald /**
157*f4854a5eSMatthias Ringwald  * @brief Get network_key for netkey_index
158*f4854a5eSMatthias Ringwald  * @param netkey_index
159*f4854a5eSMatthias Ringwald  * @returns mesh_network_key_t or NULL
160*f4854a5eSMatthias Ringwald  */
161*f4854a5eSMatthias Ringwald mesh_network_key_t * mesh_network_key_list_get(uint16_t netkey_index);
162*f4854a5eSMatthias Ringwald 
163*f4854a5eSMatthias Ringwald /**
164*f4854a5eSMatthias Ringwald  * @brief Get number of stored network_keys
165*f4854a5eSMatthias Ringwald  * @returns count
166*f4854a5eSMatthias Ringwald  */
167*f4854a5eSMatthias Ringwald int mesh_network_key_list_count(void);
168*f4854a5eSMatthias Ringwald 
169*f4854a5eSMatthias Ringwald /**
170*f4854a5eSMatthias Ringwald  * @brief Iterate over all network keys
171*f4854a5eSMatthias Ringwald  * @param it
172*f4854a5eSMatthias Ringwald  */
173*f4854a5eSMatthias Ringwald void mesh_network_key_iterator_init(mesh_network_key_iterator_t *it);
174*f4854a5eSMatthias Ringwald 
175*f4854a5eSMatthias Ringwald /**
176*f4854a5eSMatthias Ringwald  * @brief Check if another network_key is available
177*f4854a5eSMatthias Ringwald  * @param it
178*f4854a5eSMatthias Ringwald  * @return
179*f4854a5eSMatthias Ringwald  */
180*f4854a5eSMatthias Ringwald int mesh_network_key_iterator_has_more(mesh_network_key_iterator_t *it);
181*f4854a5eSMatthias Ringwald 
182*f4854a5eSMatthias Ringwald /**
183*f4854a5eSMatthias Ringwald  * @brief Get net network_key
184*f4854a5eSMatthias Ringwald  * @param it
185*f4854a5eSMatthias Ringwald  * @return
186*f4854a5eSMatthias Ringwald  */
187*f4854a5eSMatthias Ringwald mesh_network_key_t * mesh_network_key_iterator_get_next(mesh_network_key_iterator_t *it);
188*f4854a5eSMatthias Ringwald 
189*f4854a5eSMatthias Ringwald /**
190*f4854a5eSMatthias Ringwald  * @brief Iterate over all network keys with a given NID
191*f4854a5eSMatthias Ringwald  * @param it
192*f4854a5eSMatthias Ringwald  * @param nid
193*f4854a5eSMatthias Ringwald  */
194*f4854a5eSMatthias Ringwald void mesh_network_key_nid_iterator_init(mesh_network_key_iterator_t *it, uint8_t nid);
195*f4854a5eSMatthias Ringwald 
196*f4854a5eSMatthias Ringwald /**
197*f4854a5eSMatthias Ringwald  * @brief Check if another network_key with given NID is available
198*f4854a5eSMatthias Ringwald  * @param it
199*f4854a5eSMatthias Ringwald  * @return
200*f4854a5eSMatthias Ringwald  */
201*f4854a5eSMatthias Ringwald int mesh_network_key_nid_iterator_has_more(mesh_network_key_iterator_t *it);
202*f4854a5eSMatthias Ringwald 
203*f4854a5eSMatthias Ringwald /**
204*f4854a5eSMatthias Ringwald  * @brief Get next network_key with given NID
205*f4854a5eSMatthias Ringwald  * @param it
206*f4854a5eSMatthias Ringwald  * @return
207*f4854a5eSMatthias Ringwald  */
208*f4854a5eSMatthias Ringwald mesh_network_key_t * mesh_network_key_nid_iterator_get_next(mesh_network_key_iterator_t *it);
209*f4854a5eSMatthias Ringwald 
210*f4854a5eSMatthias Ringwald /**
211*f4854a5eSMatthias Ringwald  * Transport Keys = Application Keys + Device Key
212*f4854a5eSMatthias Ringwald  */
213*f4854a5eSMatthias Ringwald 
214*f4854a5eSMatthias Ringwald /**
215*f4854a5eSMatthias Ringwald  * @brief Set device key
216*f4854a5eSMatthias Ringwald  * @param device_key
217*f4854a5eSMatthias Ringwald  */
218*f4854a5eSMatthias Ringwald void mesh_transport_set_device_key(const uint8_t * device_key);
219*f4854a5eSMatthias Ringwald 
220*f4854a5eSMatthias Ringwald /**
221*f4854a5eSMatthias Ringwald  * @brief Get internal index of free transport key storage entry
222*f4854a5eSMatthias Ringwald  * @note index 0 is reserved for device key
223*f4854a5eSMatthias Ringwald  * @returns index or 0u if none found
224*f4854a5eSMatthias Ringwald  */
225*f4854a5eSMatthias Ringwald uint16_t mesh_transport_key_get_free_index(void);
226*f4854a5eSMatthias Ringwald 
227*f4854a5eSMatthias Ringwald /**
228*f4854a5eSMatthias Ringwald  * @brief Add application key to list
229*f4854a5eSMatthias Ringwald  * @param application key
230*f4854a5eSMatthias Ringwald  * @note AID needs to be set
231*f4854a5eSMatthias Ringwald  */
232*f4854a5eSMatthias Ringwald void mesh_transport_key_add(mesh_transport_key_t * transport_key);
233*f4854a5eSMatthias Ringwald 
234*f4854a5eSMatthias Ringwald /**
235*f4854a5eSMatthias Ringwald  * @brief Remove application key from list
236*f4854a5eSMatthias Ringwald  * @param application key
237*f4854a5eSMatthias Ringwald  * @return 0 if removed
238*f4854a5eSMatthias Ringwald  * @note key is only removed from list, memory is not released
239*f4854a5eSMatthias Ringwald  */
240*f4854a5eSMatthias Ringwald int mesh_transport_key_remove(mesh_transport_key_t * transport_key);
241*f4854a5eSMatthias Ringwald 
242*f4854a5eSMatthias Ringwald /**
243*f4854a5eSMatthias Ringwald  * Get transport key for appkey_index
244*f4854a5eSMatthias Ringwald  * @param appkey_index
245*f4854a5eSMatthias Ringwald  * @return
246*f4854a5eSMatthias Ringwald  */
247*f4854a5eSMatthias Ringwald mesh_transport_key_t * mesh_transport_key_get(uint16_t appkey_index);
248*f4854a5eSMatthias Ringwald 
249*f4854a5eSMatthias Ringwald /**
250*f4854a5eSMatthias Ringwald  * @brief Iterate over all transport keys (AppKeys) for a given netkey index
251*f4854a5eSMatthias Ringwald  * @param it
252*f4854a5eSMatthias Ringwald  * @param netkey_index
253*f4854a5eSMatthias Ringwald  */
254*f4854a5eSMatthias Ringwald void mesh_transport_key_iterator_init(mesh_transport_key_iterator_t *it, uint16_t netkey_index);
255*f4854a5eSMatthias Ringwald 
256*f4854a5eSMatthias Ringwald /**
257*f4854a5eSMatthias Ringwald  * @brief Check if another transport key (AppKey) is available
258*f4854a5eSMatthias Ringwald  * @param it
259*f4854a5eSMatthias Ringwald  * @return
260*f4854a5eSMatthias Ringwald  */
261*f4854a5eSMatthias Ringwald int mesh_transport_key_iterator_has_more(mesh_transport_key_iterator_t *it);
262*f4854a5eSMatthias Ringwald 
263*f4854a5eSMatthias Ringwald /**
264*f4854a5eSMatthias Ringwald  * @brief Get next transport key (AppKey)
265*f4854a5eSMatthias Ringwald  * @param it
266*f4854a5eSMatthias Ringwald  * @return
267*f4854a5eSMatthias Ringwald  */
268*f4854a5eSMatthias Ringwald mesh_transport_key_t * mesh_transport_key_iterator_get_next(mesh_transport_key_iterator_t *it);
269*f4854a5eSMatthias Ringwald 
270*f4854a5eSMatthias Ringwald /**
271*f4854a5eSMatthias Ringwald  * @brief Transport Key Iterator by AID - init
272*f4854a5eSMatthias Ringwald  * @param it
273*f4854a5eSMatthias Ringwald  * @param netkey_index
274*f4854a5eSMatthias Ringwald  * @param akf
275*f4854a5eSMatthias Ringwald  * @param aid
276*f4854a5eSMatthias Ringwald  */
277*f4854a5eSMatthias Ringwald void mesh_transport_key_aid_iterator_init(mesh_transport_key_iterator_t *it, uint16_t netkey_index, uint8_t akf,
278*f4854a5eSMatthias Ringwald                                           uint8_t aid);
279*f4854a5eSMatthias Ringwald 
280*f4854a5eSMatthias Ringwald /**
281*f4854a5eSMatthias Ringwald  * @brief Transport Key Iterator by AID - has more?
282*f4854a5eSMatthias Ringwald  * @param it
283*f4854a5eSMatthias Ringwald  * @return
284*f4854a5eSMatthias Ringwald  */
285*f4854a5eSMatthias Ringwald int mesh_transport_key_aid_iterator_has_more(mesh_transport_key_iterator_t *it);
286*f4854a5eSMatthias Ringwald 
287*f4854a5eSMatthias Ringwald /**
288*f4854a5eSMatthias Ringwald  * @brief Transport Key Iterator by AID - get next
289*f4854a5eSMatthias Ringwald  * @param it
290*f4854a5eSMatthias Ringwald  * @return transport key
291*f4854a5eSMatthias Ringwald  */
292*f4854a5eSMatthias Ringwald mesh_transport_key_t * mesh_transport_key_aid_iterator_get_next(mesh_transport_key_iterator_t *it);
293*f4854a5eSMatthias Ringwald 
294*f4854a5eSMatthias Ringwald #ifdef __cplusplus
295*f4854a5eSMatthias Ringwald } /* end of extern "C" */
296*f4854a5eSMatthias Ringwald #endif
297*f4854a5eSMatthias Ringwald 
298*f4854a5eSMatthias Ringwald #endif
299