xref: /btstack/src/ble/le_device_db.h (revision 2fca4dad957cd7b88f4657ed51e89c12615dda72)
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
23*2fca4dadSMilanka Ringwald  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN
24*2fca4dadSMilanka Ringwald  * GMBH 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 
38fe5a6c4eSMilanka Ringwald /**
39fe5a6c4eSMilanka Ringwald  * @title Device Database
40fe5a6c4eSMilanka Ringwald  *
41fe5a6c4eSMilanka Ringwald  */
42fe5a6c4eSMilanka Ringwald 
4380e33422SMatthias Ringwald #ifndef LE_DEVICE_DB_H
4480e33422SMatthias Ringwald #define LE_DEVICE_DB_H
453deb3ec6SMatthias Ringwald 
46eb886013SMatthias Ringwald #include "btstack_util.h"
4753be73e8SMatthias Ringwald #include "btstack_config.h"
483deb3ec6SMatthias Ringwald 
493deb3ec6SMatthias Ringwald #if defined __cplusplus
503deb3ec6SMatthias Ringwald extern "C" {
513deb3ec6SMatthias Ringwald #endif
523deb3ec6SMatthias Ringwald 
533deb3ec6SMatthias Ringwald /**
543deb3ec6SMatthias Ringwald 
551f5ff433SMatthias Ringwald 	Note: LE Device DB for pure LE Peripherals is not required if only LE Legacy Pairing without signed writes is used
563deb3ec6SMatthias Ringwald 
571f5ff433SMatthias Ringwald 	Per bonded device:
583deb3ec6SMatthias Ringwald 	- it stores the Identity Resolving Key (IRK) and its address to resolve private addresses
591f5ff433SMatthias Ringwald     - it stores the LTK + EDIV, RAND. EDIV + RAND allows a LE Peripheral to reconstruct the LTK
603deb3ec6SMatthias Ringwald     - it stores the Connection Signature Resolving Key (CSRK) and the last used counter.
613deb3ec6SMatthias Ringwald     	The CSRK is used to generate the signatur on the remote device and is needed to verify the signature itself
623deb3ec6SMatthias Ringwald 		The Counter is necessary to prevent reply attacks
633deb3ec6SMatthias Ringwald 
643deb3ec6SMatthias Ringwald */
653deb3ec6SMatthias Ringwald 
663deb3ec6SMatthias Ringwald 
673deb3ec6SMatthias Ringwald // LE Device db interface
683deb3ec6SMatthias Ringwald 
693deb3ec6SMatthias Ringwald /* API_START */
703deb3ec6SMatthias Ringwald 
713deb3ec6SMatthias Ringwald /**
723deb3ec6SMatthias Ringwald  * @brief init
733deb3ec6SMatthias Ringwald  */
743deb3ec6SMatthias Ringwald void le_device_db_init(void);
753deb3ec6SMatthias Ringwald 
76f33ad81dSMatthias Ringwald 
77f33ad81dSMatthias Ringwald /**
78f33ad81dSMatthias Ringwald  * @brief sets local bd addr. allows for db per Bluetooth controller
79f33ad81dSMatthias Ringwald  * @param bd_addr
80f33ad81dSMatthias Ringwald  */
81f33ad81dSMatthias Ringwald void le_device_db_set_local_bd_addr(bd_addr_t bd_addr);
82f33ad81dSMatthias Ringwald 
833deb3ec6SMatthias Ringwald /**
843deb3ec6SMatthias Ringwald  * @brief add device to db
853deb3ec6SMatthias Ringwald  * @param addr_type, address of the device
863deb3ec6SMatthias Ringwald  * @param irk of the device
876b65794dSMilanka Ringwald  * @return index if successful, -1 otherwise
883deb3ec6SMatthias Ringwald  */
893deb3ec6SMatthias Ringwald int le_device_db_add(int addr_type, bd_addr_t addr, sm_key_t irk);
903deb3ec6SMatthias Ringwald 
913deb3ec6SMatthias Ringwald /**
926fc9dda1SMatthias Ringwald  * @brief get number of devices in db
936b65794dSMilanka Ringwald  * @return number of device in db
943deb3ec6SMatthias Ringwald  */
953deb3ec6SMatthias Ringwald int le_device_db_count(void);
963deb3ec6SMatthias Ringwald 
973deb3ec6SMatthias Ringwald /**
986fc9dda1SMatthias Ringwald  * @brief get max number of devices in db for enumeration
996b65794dSMilanka Ringwald  * @return max number of device in db
1006fc9dda1SMatthias Ringwald  */
1016fc9dda1SMatthias Ringwald int le_device_db_max_count(void);
1026fc9dda1SMatthias Ringwald 
1036fc9dda1SMatthias Ringwald /**
1043deb3ec6SMatthias Ringwald  * @brief get device information: addr type and address needed to identify device
1053deb3ec6SMatthias Ringwald  * @param index
1063deb3ec6SMatthias Ringwald  * @param addr_type, address of the device as output
1073deb3ec6SMatthias Ringwald  * @param irk of the device
1083deb3ec6SMatthias Ringwald  */
1093deb3ec6SMatthias Ringwald void le_device_db_info(int index, int * addr_type, bd_addr_t addr, sm_key_t irk);
1103deb3ec6SMatthias Ringwald 
1113deb3ec6SMatthias Ringwald 
1123deb3ec6SMatthias Ringwald /**
1133deb3ec6SMatthias Ringwald  * @brief set 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
1213dc3a67dSMatthias Ringwald  * @breif secure_connection
1223deb3ec6SMatthias Ringwald  */
1233dc3a67dSMatthias 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, int secure_connection);
1243deb3ec6SMatthias Ringwald 
1253deb3ec6SMatthias Ringwald /**
1263deb3ec6SMatthias Ringwald  * @brief get remote encryption info
1273deb3ec6SMatthias Ringwald  * @brief index
1283deb3ec6SMatthias Ringwald  * @brief ediv
1293deb3ec6SMatthias Ringwald  * @brief rand
1303deb3ec6SMatthias Ringwald  * @brief ltk
1313deb3ec6SMatthias Ringwald  * @brief key size
1323deb3ec6SMatthias Ringwald  * @brief authenticated
1333deb3ec6SMatthias Ringwald  * @brief authorized
1343dc3a67dSMatthias Ringwald  * @breif secure_connection
1353deb3ec6SMatthias Ringwald  */
1363dc3a67dSMatthias 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, int * secure_connection);
1373deb3ec6SMatthias Ringwald 
138eda85fbfSMatthias Ringwald #ifdef ENABLE_LE_SIGNED_WRITE
139eda85fbfSMatthias Ringwald 
1403deb3ec6SMatthias Ringwald /**
1413deb3ec6SMatthias Ringwald  * @brief set local signing key for this device
1423deb3ec6SMatthias Ringwald  * @param index
1433deb3ec6SMatthias Ringwald  * @param signing key as input
1443deb3ec6SMatthias Ringwald  */
1453deb3ec6SMatthias Ringwald void le_device_db_local_csrk_set(int index, sm_key_t csrk);
1463deb3ec6SMatthias Ringwald 
1473deb3ec6SMatthias Ringwald /**
1483deb3ec6SMatthias Ringwald  * @brief get local signing key for this device
1493deb3ec6SMatthias Ringwald  * @param index
1503deb3ec6SMatthias Ringwald  * @param signing key as output
1513deb3ec6SMatthias Ringwald  */
1523deb3ec6SMatthias Ringwald void le_device_db_local_csrk_get(int index, sm_key_t csrk);
1533deb3ec6SMatthias Ringwald 
1543deb3ec6SMatthias Ringwald /**
1553deb3ec6SMatthias Ringwald  * @brief set remote signing key for this device
1563deb3ec6SMatthias Ringwald  * @param index
1573deb3ec6SMatthias Ringwald  * @param signing key as input
1583deb3ec6SMatthias Ringwald  */
1593deb3ec6SMatthias Ringwald void le_device_db_remote_csrk_set(int index, sm_key_t csrk);
1603deb3ec6SMatthias Ringwald 
1613deb3ec6SMatthias Ringwald /**
1623deb3ec6SMatthias Ringwald  * @brief get remote signing key for this device
1633deb3ec6SMatthias Ringwald  * @param index
1643deb3ec6SMatthias Ringwald  * @param signing key as output
1653deb3ec6SMatthias Ringwald  */
1663deb3ec6SMatthias Ringwald void le_device_db_remote_csrk_get(int index, sm_key_t csrk);
1673deb3ec6SMatthias Ringwald 
1683deb3ec6SMatthias Ringwald /**
1693deb3ec6SMatthias Ringwald  * @brief query last used/seen signing counter
1703deb3ec6SMatthias Ringwald  * @param index
1716b65794dSMilanka Ringwald  * @return next expected counter, 0 after devices was added
1723deb3ec6SMatthias Ringwald  */
1733deb3ec6SMatthias Ringwald uint32_t le_device_db_remote_counter_get(int index);
1743deb3ec6SMatthias Ringwald 
1753deb3ec6SMatthias Ringwald /**
1763deb3ec6SMatthias Ringwald  * @brief update signing counter
1773deb3ec6SMatthias Ringwald  * @param index
1783deb3ec6SMatthias Ringwald  * @param counter to store
1793deb3ec6SMatthias Ringwald  */
1803deb3ec6SMatthias Ringwald void le_device_db_remote_counter_set(int index, uint32_t counter);
1813deb3ec6SMatthias Ringwald 
1823deb3ec6SMatthias Ringwald /**
1833deb3ec6SMatthias Ringwald  * @brief query last used/seen signing counter
1843deb3ec6SMatthias Ringwald  * @param index
1856b65794dSMilanka Ringwald  * @return next expected counter, 0 after devices was added
1863deb3ec6SMatthias Ringwald  */
1873deb3ec6SMatthias Ringwald uint32_t le_device_db_local_counter_get(int index);
1883deb3ec6SMatthias Ringwald 
1893deb3ec6SMatthias Ringwald /**
1903deb3ec6SMatthias Ringwald  * @brief update signing counter
1913deb3ec6SMatthias Ringwald  * @param index
1923deb3ec6SMatthias Ringwald  * @param counter to store
1933deb3ec6SMatthias Ringwald  */
1943deb3ec6SMatthias Ringwald void le_device_db_local_counter_set(int index, uint32_t counter);
1953deb3ec6SMatthias Ringwald 
196eda85fbfSMatthias Ringwald #endif
197eda85fbfSMatthias Ringwald 
1983deb3ec6SMatthias Ringwald /**
1993deb3ec6SMatthias Ringwald  * @brief free device
2003deb3ec6SMatthias Ringwald  * @param index
2013deb3ec6SMatthias Ringwald  */
2023deb3ec6SMatthias Ringwald void le_device_db_remove(int index);
2033deb3ec6SMatthias Ringwald 
2043deb3ec6SMatthias Ringwald void le_device_db_dump(void);
2053deb3ec6SMatthias Ringwald 
2063deb3ec6SMatthias Ringwald /* API_END */
2073deb3ec6SMatthias Ringwald 
2083deb3ec6SMatthias Ringwald #if defined __cplusplus
2093deb3ec6SMatthias Ringwald }
2103deb3ec6SMatthias Ringwald #endif
2113deb3ec6SMatthias Ringwald 
21280e33422SMatthias Ringwald #endif // LE_DEVICE_DB_H
213