/** @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 <sys/types.h>

#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>

#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 */
