/** @file * @brief Bluetooth subsystem persistent storage APIs. */ /* * Copyright (c) 2016 Intel Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef __BT_STORAGE_H #define __BT_STORAGE_H /** * @brief Persistent Storage * @defgroup bt_storage Persistent Storage * @ingroup bluetooth * @{ */ #include #include #include #ifdef __cplusplus extern "C" { #endif /** Well known storage keys */ enum { /** Identity Address. * Type: bt_addr_le_t (7 bytes) */ BT_STORAGE_ID_ADDR, /** Local Identity Resolving Key. * Type: uint8_t key[16] */ BT_STORAGE_LOCAL_IRK, /** List of addresses of remote devices. * Type: bt_addr_le_t addrs[n] (length is variable). * * This is only used for reading. Modification of the list happens * implicitly by writing entries for each remote device. This value * is only used with the local storage, i.e. NULL as the target * bt_addr_le_t passed to the read callback. */ BT_STORAGE_ADDRESSES, /** Slave Long Term Key for legacy pairing. * Type: struct bt_storage_ltk */ BT_STORAGE_SLAVE_LTK, /** Long Term Key for legacy pairing. * Type: struct bt_storage_ltk */ BT_STORAGE_LTK, /** Identity Resolving Key * Type: uint8_t key[16] */ BT_STORAGE_IRK, }; /** LTK key flags */ enum { /* Key has been generated with MITM protection */ BT_STORAGE_LTK_AUTHENTICATED = BIT(0), }; struct bt_storage_ltk { uint8_t flags; /* Encryption key size used to generate key */ uint8_t size; uint16_t ediv; uint8_t rand[8]; uint8_t val[16]; }; struct bt_storage { /** Read the value of a key from storage. * * @param addr Remote address or NULL for local storage * @param key BT_STORAGE_* key to read * @param data Memory location to place the data * @param length Maximum number of bytes to read * * @return Number of bytes read or negative error value on * failure. */ ssize_t (*read)(const bt_addr_le_t *addr, uint16_t key, void *data, size_t length); /** Write the value of a key to storage. * * @param addr Remote address or NULL for local storage * @param key BT_STORAGE_* key to write * @param data Memory location of the data * @param length Number of bytes to write * * @return Number of bytes written or negative error value on * failure. */ ssize_t (*write)(const bt_addr_le_t *addr, uint16_t key, const void *data, size_t length); /** Clear all keys for a specific address * * @param addr Remote address, BT_ADDR_LE_ANY for all * remote devices, or NULL for local storage. * * @return 0 on success or negative error value on failure. */ int (*clear)(const bt_addr_le_t *addr); }; /** Register callbacks for storage handling. * * @param storage Callback struct. */ void bt_storage_register(const struct bt_storage *storage); /** Clear all storage keys for a specific address * * @param addr Remote address, NULL for local storage or * BT_ADDR_LE_ANY to clear all remote devices. * * @return 0 on success or negative error value on failure. */ int bt_storage_clear(const bt_addr_le_t *addr); #ifdef __cplusplus } #endif /** * @} */ #endif /* __BT_STORAGE_H */