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