13deb3ec6SMatthias Ringwald /* 23deb3ec6SMatthias Ringwald * Copyright (C) 2014 BlueKitchen GmbH 33deb3ec6SMatthias Ringwald * 43deb3ec6SMatthias Ringwald * Redistribution and use in source and binary forms, with or without 53deb3ec6SMatthias Ringwald * modification, are permitted provided that the following conditions 63deb3ec6SMatthias Ringwald * are met: 73deb3ec6SMatthias Ringwald * 83deb3ec6SMatthias Ringwald * 1. Redistributions of source code must retain the above copyright 93deb3ec6SMatthias Ringwald * notice, this list of conditions and the following disclaimer. 103deb3ec6SMatthias Ringwald * 2. Redistributions in binary form must reproduce the above copyright 113deb3ec6SMatthias Ringwald * notice, this list of conditions and the following disclaimer in the 123deb3ec6SMatthias Ringwald * documentation and/or other materials provided with the distribution. 133deb3ec6SMatthias Ringwald * 3. Neither the name of the copyright holders nor the names of 143deb3ec6SMatthias Ringwald * contributors may be used to endorse or promote products derived 153deb3ec6SMatthias Ringwald * from this software without specific prior written permission. 163deb3ec6SMatthias Ringwald * 4. Any redistribution, use, or modification is done solely for 173deb3ec6SMatthias Ringwald * personal benefit and not for any commercial purpose or for 183deb3ec6SMatthias Ringwald * monetary gain. 193deb3ec6SMatthias Ringwald * 203deb3ec6SMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 213deb3ec6SMatthias Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 223deb3ec6SMatthias Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 233deb3ec6SMatthias Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS 243deb3ec6SMatthias Ringwald * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 253deb3ec6SMatthias Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 263deb3ec6SMatthias Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 273deb3ec6SMatthias Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 283deb3ec6SMatthias Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 293deb3ec6SMatthias Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 303deb3ec6SMatthias Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 313deb3ec6SMatthias Ringwald * SUCH DAMAGE. 323deb3ec6SMatthias Ringwald * 333deb3ec6SMatthias Ringwald * Please inquire about commercial licensing options at 343deb3ec6SMatthias Ringwald * [email protected] 353deb3ec6SMatthias Ringwald * 363deb3ec6SMatthias Ringwald */ 373deb3ec6SMatthias Ringwald 383deb3ec6SMatthias Ringwald #ifndef __LE_DEVICE_DB_H 393deb3ec6SMatthias Ringwald #define __LE_DEVICE_DB_H 403deb3ec6SMatthias Ringwald 41eb886013SMatthias Ringwald #include "btstack_util.h" 423deb3ec6SMatthias Ringwald 433deb3ec6SMatthias Ringwald #if defined __cplusplus 443deb3ec6SMatthias Ringwald extern "C" { 453deb3ec6SMatthias Ringwald #endif 463deb3ec6SMatthias Ringwald 473deb3ec6SMatthias Ringwald /** 483deb3ec6SMatthias Ringwald 493deb3ec6SMatthias Ringwald LE Device DB for pure LE Peripherals is only required for signed writes 503deb3ec6SMatthias Ringwald 513deb3ec6SMatthias Ringwald Per bonded device, it can store 523deb3ec6SMatthias Ringwald - it stores the Identity Resolving Key (IRK) and its address to resolve private addresses 533deb3ec6SMatthias Ringwald - it stores the LTK + EDIV, RAND. EDIV + RAND allow a LE Perihperal to reconstruct the LTK 543deb3ec6SMatthias Ringwald - it stores the Connection Signature Resolving Key (CSRK) and the last used counter. 553deb3ec6SMatthias Ringwald The CSRK is used to generate the signatur on the remote device and is needed to verify the signature itself 563deb3ec6SMatthias Ringwald The Counter is necessary to prevent reply attacks 573deb3ec6SMatthias Ringwald 583deb3ec6SMatthias Ringwald */ 593deb3ec6SMatthias Ringwald 603deb3ec6SMatthias Ringwald 613deb3ec6SMatthias Ringwald // LE Device db interface 623deb3ec6SMatthias Ringwald 633deb3ec6SMatthias Ringwald /* API_START */ 643deb3ec6SMatthias Ringwald 653deb3ec6SMatthias Ringwald /** 663deb3ec6SMatthias Ringwald * @brief init 673deb3ec6SMatthias Ringwald */ 683deb3ec6SMatthias Ringwald void le_device_db_init(void); 693deb3ec6SMatthias Ringwald 70*f33ad81dSMatthias Ringwald 71*f33ad81dSMatthias Ringwald /** 72*f33ad81dSMatthias Ringwald * @brief sets local bd addr. allows for db per Bluetooth controller 73*f33ad81dSMatthias Ringwald * @param bd_addr 74*f33ad81dSMatthias Ringwald */ 75*f33ad81dSMatthias Ringwald void le_device_db_set_local_bd_addr(bd_addr_t bd_addr); 76*f33ad81dSMatthias Ringwald 773deb3ec6SMatthias Ringwald /** 783deb3ec6SMatthias Ringwald * @brief add device to db 793deb3ec6SMatthias Ringwald * @param addr_type, address of the device 803deb3ec6SMatthias Ringwald * @param irk of the device 813deb3ec6SMatthias Ringwald * @returns index if successful, -1 otherwise 823deb3ec6SMatthias Ringwald */ 833deb3ec6SMatthias Ringwald int le_device_db_add(int addr_type, bd_addr_t addr, sm_key_t irk); 843deb3ec6SMatthias Ringwald 853deb3ec6SMatthias Ringwald /** 863deb3ec6SMatthias Ringwald * @brief get number of devices in db for enumeration 873deb3ec6SMatthias Ringwald * @returns number of device in db 883deb3ec6SMatthias Ringwald */ 893deb3ec6SMatthias Ringwald int le_device_db_count(void); 903deb3ec6SMatthias Ringwald 913deb3ec6SMatthias Ringwald /** 923deb3ec6SMatthias Ringwald * @brief get device information: addr type and address needed to identify device 933deb3ec6SMatthias Ringwald * @param index 943deb3ec6SMatthias Ringwald * @param addr_type, address of the device as output 953deb3ec6SMatthias Ringwald * @param irk of the device 963deb3ec6SMatthias Ringwald */ 973deb3ec6SMatthias Ringwald void le_device_db_info(int index, int * addr_type, bd_addr_t addr, sm_key_t irk); 983deb3ec6SMatthias Ringwald 993deb3ec6SMatthias Ringwald 1003deb3ec6SMatthias Ringwald /** 1013deb3ec6SMatthias Ringwald * @brief set remote encryption info 1023deb3ec6SMatthias Ringwald * @brief index 1033deb3ec6SMatthias Ringwald * @brief ediv 1043deb3ec6SMatthias Ringwald * @brief rand 1053deb3ec6SMatthias Ringwald * @brief ltk 1063deb3ec6SMatthias Ringwald * @brief key size 1073deb3ec6SMatthias Ringwald * @brief authenticated 1083deb3ec6SMatthias Ringwald * @brief authorized 1093deb3ec6SMatthias Ringwald */ 1103deb3ec6SMatthias Ringwald void le_device_db_encryption_set(int index, uint16_t ediv, uint8_t rand[8], sm_key_t ltk, int key_size, int authenticated, int authorized); 1113deb3ec6SMatthias Ringwald 1123deb3ec6SMatthias Ringwald /** 1133deb3ec6SMatthias Ringwald * @brief get remote encryption info 1143deb3ec6SMatthias Ringwald * @brief index 1153deb3ec6SMatthias Ringwald * @brief ediv 1163deb3ec6SMatthias Ringwald * @brief rand 1173deb3ec6SMatthias Ringwald * @brief ltk 1183deb3ec6SMatthias Ringwald * @brief key size 1193deb3ec6SMatthias Ringwald * @brief authenticated 1203deb3ec6SMatthias Ringwald * @brief authorized 1213deb3ec6SMatthias Ringwald */ 1223deb3ec6SMatthias Ringwald void le_device_db_encryption_get(int index, uint16_t * ediv, uint8_t rand[8], sm_key_t ltk, int * key_size, int * authenticated, int * authorized); 1233deb3ec6SMatthias Ringwald 1243deb3ec6SMatthias Ringwald /** 1253deb3ec6SMatthias Ringwald * @brief set local signing key for this device 1263deb3ec6SMatthias Ringwald * @param index 1273deb3ec6SMatthias Ringwald * @param signing key as input 1283deb3ec6SMatthias Ringwald */ 1293deb3ec6SMatthias Ringwald void le_device_db_local_csrk_set(int index, sm_key_t csrk); 1303deb3ec6SMatthias Ringwald 1313deb3ec6SMatthias Ringwald /** 1323deb3ec6SMatthias Ringwald * @brief get local signing key for this device 1333deb3ec6SMatthias Ringwald * @param index 1343deb3ec6SMatthias Ringwald * @param signing key as output 1353deb3ec6SMatthias Ringwald */ 1363deb3ec6SMatthias Ringwald void le_device_db_local_csrk_get(int index, sm_key_t csrk); 1373deb3ec6SMatthias Ringwald 1383deb3ec6SMatthias Ringwald /** 1393deb3ec6SMatthias Ringwald * @brief set remote signing key for this device 1403deb3ec6SMatthias Ringwald * @param index 1413deb3ec6SMatthias Ringwald * @param signing key as input 1423deb3ec6SMatthias Ringwald */ 1433deb3ec6SMatthias Ringwald void le_device_db_remote_csrk_set(int index, sm_key_t csrk); 1443deb3ec6SMatthias Ringwald 1453deb3ec6SMatthias Ringwald /** 1463deb3ec6SMatthias Ringwald * @brief get remote signing key for this device 1473deb3ec6SMatthias Ringwald * @param index 1483deb3ec6SMatthias Ringwald * @param signing key as output 1493deb3ec6SMatthias Ringwald */ 1503deb3ec6SMatthias Ringwald void le_device_db_remote_csrk_get(int index, sm_key_t csrk); 1513deb3ec6SMatthias Ringwald 1523deb3ec6SMatthias Ringwald /** 1533deb3ec6SMatthias Ringwald * @brief query last used/seen signing counter 1543deb3ec6SMatthias Ringwald * @param index 1553deb3ec6SMatthias Ringwald * @returns next expected counter, 0 after devices was added 1563deb3ec6SMatthias Ringwald */ 1573deb3ec6SMatthias Ringwald uint32_t le_device_db_remote_counter_get(int index); 1583deb3ec6SMatthias Ringwald 1593deb3ec6SMatthias Ringwald /** 1603deb3ec6SMatthias Ringwald * @brief update signing counter 1613deb3ec6SMatthias Ringwald * @param index 1623deb3ec6SMatthias Ringwald * @param counter to store 1633deb3ec6SMatthias Ringwald */ 1643deb3ec6SMatthias Ringwald void le_device_db_remote_counter_set(int index, uint32_t counter); 1653deb3ec6SMatthias Ringwald 1663deb3ec6SMatthias Ringwald /** 1673deb3ec6SMatthias Ringwald * @brief query last used/seen signing counter 1683deb3ec6SMatthias Ringwald * @param index 1693deb3ec6SMatthias Ringwald * @returns next expected counter, 0 after devices was added 1703deb3ec6SMatthias Ringwald */ 1713deb3ec6SMatthias Ringwald uint32_t le_device_db_local_counter_get(int index); 1723deb3ec6SMatthias Ringwald 1733deb3ec6SMatthias Ringwald /** 1743deb3ec6SMatthias Ringwald * @brief update signing counter 1753deb3ec6SMatthias Ringwald * @param index 1763deb3ec6SMatthias Ringwald * @param counter to store 1773deb3ec6SMatthias Ringwald */ 1783deb3ec6SMatthias Ringwald void le_device_db_local_counter_set(int index, uint32_t counter); 1793deb3ec6SMatthias Ringwald 1803deb3ec6SMatthias Ringwald /** 1813deb3ec6SMatthias Ringwald * @brief free device 1823deb3ec6SMatthias Ringwald * @param index 1833deb3ec6SMatthias Ringwald */ 1843deb3ec6SMatthias Ringwald void le_device_db_remove(int index); 1853deb3ec6SMatthias Ringwald 1863deb3ec6SMatthias Ringwald void le_device_db_dump(void); 1873deb3ec6SMatthias Ringwald 1883deb3ec6SMatthias Ringwald /* API_END */ 1893deb3ec6SMatthias Ringwald 1903deb3ec6SMatthias Ringwald #if defined __cplusplus 1913deb3ec6SMatthias Ringwald } 1923deb3ec6SMatthias Ringwald #endif 1933deb3ec6SMatthias Ringwald 1943deb3ec6SMatthias Ringwald #endif // __LE_DEVICE_DB_H 195