This adds support to set different permissions to CCCD so security can be checked when enabling notification which conforms to: BLUETOOTH CORE SPECIFICATION Version 5.1 | Vol 3, Part G page 2360: '3.3.3.3 Client Characteristic Configuration Authentication and authorization may be required by the server to write the configuration descriptor.' In addition to that also ensure that notification are not re-enabled until the proper security level is reached to conform to the following statement: '10.3.1.1 Handling of GATT indications and notifications A client “requests” a server to send indications and notifications by appropriately configuring the server via a Client Characteristic Configuration Descriptor. Since the configuration is persistent across a disconnection and reconnection, security requirements must be checked against the configuration upon a reconnection before sending indications or notifications. When a server reconnects to a client to send an indication or notification for which security is required, the server shall initiate or request encryption with the client prior to sending an indication or notification. If the client does not have an LTK indicating that the client has lost the bond, enabling encryption will fail.' Fixes #17983 Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
82 lines
1.9 KiB
C
82 lines
1.9 KiB
C
/** @file
|
|
* @brief HRS Service sample
|
|
*/
|
|
|
|
/*
|
|
* Copyright (c) 2016 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <zephyr/types.h>
|
|
#include <stddef.h>
|
|
#include <string.h>
|
|
#include <errno.h>
|
|
#include <zephyr.h>
|
|
#include <init.h>
|
|
|
|
#include <bluetooth/bluetooth.h>
|
|
#include <bluetooth/hci.h>
|
|
#include <bluetooth/conn.h>
|
|
#include <bluetooth/uuid.h>
|
|
#include <bluetooth/gatt.h>
|
|
|
|
#define LOG_LEVEL CONFIG_BT_GATT_HRS_LOG_LEVEL
|
|
#include <logging/log.h>
|
|
LOG_MODULE_REGISTER(hrs);
|
|
|
|
static u8_t hrs_blsc;
|
|
|
|
static void hrmc_ccc_cfg_changed(const struct bt_gatt_attr *attr, u16_t value)
|
|
{
|
|
ARG_UNUSED(attr);
|
|
|
|
bool notif_enabled = (value == BT_GATT_CCC_NOTIFY);
|
|
|
|
LOG_INF("HRS notifications %s", notif_enabled ? "enabled" : "disabled");
|
|
}
|
|
|
|
static ssize_t read_blsc(struct bt_conn *conn, const struct bt_gatt_attr *attr,
|
|
void *buf, u16_t len, u16_t offset)
|
|
{
|
|
return bt_gatt_attr_read(conn, attr, buf, len, offset, &hrs_blsc,
|
|
sizeof(hrs_blsc));
|
|
}
|
|
|
|
/* Heart Rate Service Declaration */
|
|
BT_GATT_SERVICE_DEFINE(hrs_svc,
|
|
BT_GATT_PRIMARY_SERVICE(BT_UUID_HRS),
|
|
BT_GATT_CHARACTERISTIC(BT_UUID_HRS_MEASUREMENT, BT_GATT_CHRC_NOTIFY,
|
|
BT_GATT_PERM_NONE, NULL, NULL, NULL),
|
|
BT_GATT_CCC(hrmc_ccc_cfg_changed,
|
|
BT_GATT_PERM_READ | BT_GATT_PERM_WRITE),
|
|
BT_GATT_CHARACTERISTIC(BT_UUID_HRS_BODY_SENSOR, BT_GATT_CHRC_READ,
|
|
BT_GATT_PERM_READ, read_blsc, NULL, NULL),
|
|
BT_GATT_CHARACTERISTIC(BT_UUID_HRS_CONTROL_POINT, BT_GATT_CHRC_WRITE,
|
|
BT_GATT_PERM_NONE, NULL, NULL, NULL),
|
|
);
|
|
|
|
static int hrs_init(struct device *dev)
|
|
{
|
|
ARG_UNUSED(dev);
|
|
|
|
hrs_blsc = 0x01;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int bt_gatt_hrs_notify(u16_t heartrate)
|
|
{
|
|
int rc;
|
|
static u8_t hrm[2];
|
|
|
|
hrm[0] = 0x06; /* uint8, sensor contact */
|
|
hrm[1] = heartrate;
|
|
|
|
rc = bt_gatt_notify(NULL, &hrs_svc.attrs[1], &hrm, sizeof(hrm));
|
|
|
|
return rc == -ENOTCONN ? 0 : rc;
|
|
}
|
|
|
|
SYS_INIT(hrs_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY);
|