mirror of https://github.com/ARMmbed/mbed-os.git
parent
f8c28fcbe7
commit
a034bf875e
|
|
@ -528,6 +528,7 @@ struct att_security_requirement_t : SafeEnum<att_security_requirement_t, uint8_t
|
|||
*/
|
||||
NONE,
|
||||
|
||||
#if BLE_FEATURE_SECURITY
|
||||
/**
|
||||
* The operation requires security and there's no requirement towards
|
||||
* peer authentication.
|
||||
|
|
@ -553,6 +554,7 @@ struct att_security_requirement_t : SafeEnum<att_security_requirement_t, uint8_t
|
|||
*/
|
||||
AUTHENTICATED,
|
||||
|
||||
#if BLE_FEATURE_SECURE_CONNECTIONS
|
||||
/**
|
||||
* The operation require encryption with an authenticated peer that
|
||||
* paired using secure connection pairing.
|
||||
|
|
@ -561,6 +563,8 @@ struct att_security_requirement_t : SafeEnum<att_security_requirement_t, uint8_t
|
|||
* security is achieved with link encryption.
|
||||
*/
|
||||
SC_AUTHENTICATED
|
||||
#endif // BLE_FEATURE_SECURE_CONNECTIONS
|
||||
#endif // BLE_FEATURE_SECURITY
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -637,7 +641,7 @@ struct phy_t : SafeEnum<phy_t, uint8_t> {
|
|||
* @note This physical transport was available since Bluetooth 4.0
|
||||
*/
|
||||
LE_1M = 1,
|
||||
|
||||
#if BLE_FEATURE_PHY_MANAGEMENT
|
||||
/**
|
||||
* 2Mbit/s LE.
|
||||
*
|
||||
|
|
@ -671,6 +675,7 @@ struct phy_t : SafeEnum<phy_t, uint8_t> {
|
|||
* @note This transport has been introduced with the Bluetooth 5.
|
||||
*/
|
||||
LE_CODED
|
||||
#endif // BLE_FEATURE_PHY_MANAGEMENT
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -717,8 +722,10 @@ public:
|
|||
_value()
|
||||
{
|
||||
set_1m(phy_1m);
|
||||
#if BLE_FEATURE_PHY_MANAGEMENT
|
||||
set_2m(phy_2m);
|
||||
set_coded(phy_coded);
|
||||
#endif // BLE_FEATURE_PHY_MANAGEMENT
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -732,12 +739,14 @@ public:
|
|||
case phy_t::LE_1M:
|
||||
set_1m(true);
|
||||
break;
|
||||
#if BLE_FEATURE_PHY_MANAGEMENT
|
||||
case phy_t::LE_2M:
|
||||
set_2m(true);
|
||||
break;
|
||||
case phy_t::LE_CODED:
|
||||
set_coded(true);
|
||||
break;
|
||||
#endif // BLE_FEATURE_PHY_MANAGEMENT
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -752,6 +761,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
#if BLE_FEATURE_PHY_MANAGEMENT
|
||||
/** Prefer 2M PHY. */
|
||||
void set_2m(bool enabled = true) {
|
||||
if (enabled) {
|
||||
|
|
@ -769,6 +779,7 @@ public:
|
|||
_value &= ~PHY_SET_CODED;
|
||||
}
|
||||
}
|
||||
#endif // BLE_FEATURE_PHY_MANAGEMENT
|
||||
|
||||
bool get_1m() const {
|
||||
return (_value & PHY_SET_1M);
|
||||
|
|
|
|||
|
|
@ -1414,6 +1414,7 @@ public:
|
|||
_valueAttribute.allowWrite(isWritable(_properties));
|
||||
_valueAttribute.allowRead(isReadable(_properties));
|
||||
|
||||
#if BLE_FEATURE_SECURITY
|
||||
// signed writes requires at least an unauthenticated CSRK or an
|
||||
// unauthenticated ltk if the link is encrypted.
|
||||
if (_properties & BLE_GATT_CHAR_PROPERTIES_AUTHENTICATED_SIGNED_WRITES) {
|
||||
|
|
@ -1421,6 +1422,7 @@ public:
|
|||
SecurityRequirement_t::UNAUTHENTICATED
|
||||
);
|
||||
}
|
||||
#endif // BLE_FEATURE_SECURITY
|
||||
}
|
||||
|
||||
public:
|
||||
|
|
@ -1500,11 +1502,13 @@ public:
|
|||
*/
|
||||
void setWriteSecurityRequirement(SecurityRequirement_t security)
|
||||
{
|
||||
#if BLE_FEATURE_SECURITY
|
||||
MBED_ASSERT(
|
||||
((_properties & BLE_GATT_CHAR_PROPERTIES_AUTHENTICATED_SIGNED_WRITES) &&
|
||||
((security == SecurityRequirement_t::NONE) ||
|
||||
(security == SecurityRequirement_t::SC_AUTHENTICATED))) == false
|
||||
);
|
||||
#endif // BLE_FEATURE_SECURITY
|
||||
_valueAttribute.setWriteSecurityRequirement(security);
|
||||
}
|
||||
|
||||
|
|
@ -1758,7 +1762,7 @@ public:
|
|||
case SecurityRequirement_t::NONE:
|
||||
MBED_ASSERT(needs_signing == false);
|
||||
return SecurityManager::SECURITY_MODE_ENCRYPTION_OPEN_LINK;
|
||||
|
||||
#if BLE_FEATURE_SECURITY
|
||||
case SecurityRequirement_t::UNAUTHENTICATED:
|
||||
return (needs_signing) ?
|
||||
SecurityManager::SECURITY_MODE_SIGNED_NO_MITM :
|
||||
|
|
@ -1768,11 +1772,13 @@ public:
|
|||
return (needs_signing) ?
|
||||
SecurityManager::SECURITY_MODE_SIGNED_WITH_MITM :
|
||||
SecurityManager::SECURITY_MODE_ENCRYPTION_WITH_MITM;
|
||||
|
||||
#if BLE_FEATURE_SECURE_CONNECTIONS
|
||||
case SecurityRequirement_t::SC_AUTHENTICATED:
|
||||
MBED_ASSERT(needs_signing == false);
|
||||
// fallback to encryption with MITM
|
||||
return SecurityManager::SECURITY_MODE_ENCRYPTION_WITH_MITM;
|
||||
#endif // BLE_FEATURE_SECURE_CONNECTIONS
|
||||
#endif // BLE_FEATURE_SECURITY
|
||||
default:
|
||||
MBED_ASSERT(false);
|
||||
return SecurityManager::SECURITY_MODE_NO_ACCESS;
|
||||
|
|
@ -1851,15 +1857,19 @@ private:
|
|||
// assuming access is managed by property and orthogonal to
|
||||
// security mode ...
|
||||
return SecurityRequirement_t::NONE;
|
||||
|
||||
#if BLE_FEATURE_SECURITY
|
||||
case SecurityManager::SECURITY_MODE_ENCRYPTION_NO_MITM:
|
||||
#if BLE_FEATURE_SIGNING
|
||||
case SecurityManager::SECURITY_MODE_SIGNED_NO_MITM:
|
||||
#endif
|
||||
return SecurityRequirement_t::UNAUTHENTICATED;
|
||||
|
||||
case SecurityManager::SECURITY_MODE_ENCRYPTION_WITH_MITM:
|
||||
#if BLE_FEATURE_SIGNING
|
||||
case SecurityManager::SECURITY_MODE_SIGNED_WITH_MITM:
|
||||
#endif
|
||||
return SecurityRequirement_t::AUTHENTICATED;
|
||||
|
||||
#endif // BLE_FEATURE_SECURITY
|
||||
default:
|
||||
// should not happens; makes the compiler happy.
|
||||
return SecurityRequirement_t::NONE;
|
||||
|
|
|
|||
|
|
@ -121,9 +121,13 @@ namespace ble {
|
|||
class ConnectionParameters {
|
||||
enum {
|
||||
LE_1M_INDEX = 0,
|
||||
#if BLE_FEATURE_PHY_MANAGEMENT
|
||||
LE_2M_INDEX = 1,
|
||||
LE_CODED_INDEX = 2,
|
||||
MAX_PARAM_PHYS = 3
|
||||
#else
|
||||
MAX_PARAM_PHYS = 1
|
||||
#endif // BLE_FEATURE_PHY_MANAGEMENT
|
||||
};
|
||||
|
||||
public:
|
||||
|
|
@ -208,6 +212,7 @@ public:
|
|||
return *this;
|
||||
}
|
||||
|
||||
#if BLE_FEATURE_PHY_MANAGEMENT
|
||||
/**
|
||||
* Enable or disable PHYs.
|
||||
*
|
||||
|
|
@ -251,6 +256,7 @@ public:
|
|||
return *this;
|
||||
}
|
||||
|
||||
#endif // BLE_FEATURE_PHY_MANAGEMENT
|
||||
/* getters */
|
||||
|
||||
/**
|
||||
|
|
@ -270,9 +276,11 @@ public:
|
|||
uint8_t getNumberOfEnabledPhys() const
|
||||
{
|
||||
return (
|
||||
_enabledPhy[LE_1M_INDEX] * 1 +
|
||||
_enabledPhy[LE_2M_INDEX] * 1 +
|
||||
_enabledPhy[LE_CODED_INDEX] * 1
|
||||
_enabledPhy[LE_1M_INDEX] * 1
|
||||
#if BLE_FEATURE_PHY_MANAGEMENT
|
||||
+ _enabledPhy[LE_2M_INDEX] * 1
|
||||
+ _enabledPhy[LE_CODED_INDEX] * 1
|
||||
#endif // BLE_FEATURE_PHY_MANAGEMENT
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -309,14 +317,19 @@ public:
|
|||
|
||||
phy_set_t getPhySet() const
|
||||
{
|
||||
#if BLE_FEATURE_PHY_MANAGEMENT
|
||||
phy_set_t set(
|
||||
_enabledPhy[LE_1M_INDEX],
|
||||
_enabledPhy[LE_2M_INDEX],
|
||||
_enabledPhy[LE_CODED_INDEX]
|
||||
);
|
||||
return set;
|
||||
#else
|
||||
return phy_set_t::PHY_SET_1M;
|
||||
#endif // BLE_FEATURE_PHY_MANAGEMENT
|
||||
}
|
||||
|
||||
|
||||
/* These return pointers to arrays of settings valid only across the number of active PHYs */
|
||||
|
||||
const uint16_t *getScanIntervalArray() const
|
||||
|
|
@ -364,6 +377,7 @@ public:
|
|||
private:
|
||||
uint8_t getFirstEnabledIndex() const
|
||||
{
|
||||
#if BLE_FEATURE_PHY_MANAGEMENT
|
||||
if (_enabledPhy[LE_1M_INDEX]) {
|
||||
return LE_1M_INDEX;
|
||||
} else if (_enabledPhy[LE_2M_INDEX]) {
|
||||
|
|
@ -374,6 +388,7 @@ private:
|
|||
/* This should never happen; it means you were trying to start a connection with a blank set
|
||||
* of parameters - you need to enable at least one PHY */
|
||||
MBED_ASSERT("Trying to use connection parameters without any PHY defined.");
|
||||
#endif // BLE_FEATURE_PHY_MANAGEMENT
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -387,6 +402,7 @@ private:
|
|||
{
|
||||
uint8_t index = phyToIndex(phy);
|
||||
|
||||
#if BLE_FEATURE_PHY_MANAGEMENT
|
||||
bool was_swapped = isSwapped();
|
||||
|
||||
_enabledPhy[index] = enable;
|
||||
|
|
@ -401,6 +417,7 @@ private:
|
|||
/* To keep the data contiguous, coded params are in place of the missing 2M params */
|
||||
index = LE_2M_INDEX;
|
||||
}
|
||||
#endif // BLE_FEATURE_PHY_MANAGEMENT
|
||||
|
||||
return index;
|
||||
}
|
||||
|
|
@ -412,20 +429,23 @@ private:
|
|||
case phy_t::LE_1M:
|
||||
index = LE_1M_INDEX;
|
||||
break;
|
||||
#if BLE_FEATURE_PHY_MANAGEMENT
|
||||
case phy_t::LE_2M:
|
||||
index = LE_2M_INDEX;
|
||||
break;
|
||||
case phy_t::LE_CODED:
|
||||
index = LE_CODED_INDEX;
|
||||
break;
|
||||
#endif // BLE_FEATURE_PHY_MANAGEMENT
|
||||
default:
|
||||
index = MAX_PARAM_PHYS;
|
||||
index = LE_1M_INDEX;
|
||||
MBED_ASSERT("Illegal PHY");
|
||||
break;
|
||||
}
|
||||
return index;
|
||||
}
|
||||
|
||||
#if BLE_FEATURE_PHY_MANAGEMENT
|
||||
bool isSwapped() const
|
||||
{
|
||||
return (
|
||||
|
|
@ -437,6 +457,7 @@ private:
|
|||
|
||||
/** Handle the swapping of 2M and CODED so that the array is ready for the pal call. */
|
||||
void swapCodedAnd2M();
|
||||
#endif // BLE_FEATURE_PHY_MANAGEMENT
|
||||
|
||||
private:
|
||||
initiator_filter_policy_t _filterPolicy;
|
||||
|
|
|
|||
|
|
@ -133,9 +133,12 @@ public:
|
|||
phy_configuration_t conf(scan_interval, scan_window, active_scanning);
|
||||
if (phy == phy_t::LE_1M) {
|
||||
phy_1m_configuration = conf;
|
||||
} else if (phy == phy_t::LE_CODED) {
|
||||
}
|
||||
#if BLE_FEATURE_PHY_MANAGEMENT
|
||||
else if (phy == phy_t::LE_CODED) {
|
||||
phy_coded_configuration = conf;
|
||||
}
|
||||
#endif // BLE_FEATURE_PHY_MANAGEMENT
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -182,6 +185,7 @@ public:
|
|||
#endif // BLE_FEATURE_WHITELIST
|
||||
}
|
||||
|
||||
#if BLE_FEATURE_PHY_MANAGEMENT
|
||||
/**
|
||||
* Enable or disable PHYs that should be used during scanning.
|
||||
* @param enable_1m True to enable the 1M phy and false to disable it.
|
||||
|
|
@ -194,6 +198,7 @@ public:
|
|||
phys.set_coded(enable_coded);
|
||||
return *this;
|
||||
}
|
||||
#endif // BLE_FEATURE_PHY_MANAGEMENT
|
||||
|
||||
/**
|
||||
* Get the PHYs to use during scanning.
|
||||
|
|
@ -231,6 +236,7 @@ public:
|
|||
return phy_1m_configuration;
|
||||
}
|
||||
|
||||
#if BLE_FEATURE_PHY_MANAGEMENT
|
||||
/**
|
||||
* Set the coded PHY scan configuration.
|
||||
* @param interval The scan interval to use.
|
||||
|
|
@ -250,6 +256,7 @@ public:
|
|||
);
|
||||
return *this;
|
||||
}
|
||||
#endif // BLE_FEATURE_PHY_MANAGEMENT
|
||||
|
||||
/**
|
||||
* Get the coded PHY scan configuration.
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@
|
|||
namespace ble {
|
||||
namespace pal {
|
||||
|
||||
#if BLE_FEATURE_SIGNING
|
||||
/**
|
||||
* Implemented by classes that are reacting to signing events.
|
||||
*/
|
||||
|
|
@ -92,6 +93,8 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
#endif // BLE_FEATURE_SIGNING
|
||||
|
||||
} // namespace pal
|
||||
} // namespace ble
|
||||
|
||||
|
|
|
|||
|
|
@ -100,6 +100,7 @@ ConnectionParameters &ConnectionParameters::setConnectionParameters(
|
|||
return *this;
|
||||
}
|
||||
|
||||
#if BLE_FEATURE_PHY_MANAGEMENT
|
||||
/** Handle the swapping of 2M and CODED so that the array is ready for the pal call. */
|
||||
void ConnectionParameters::swapCodedAnd2M()
|
||||
{
|
||||
|
|
@ -130,5 +131,6 @@ void ConnectionParameters::swapCodedAnd2M()
|
|||
_minEventLength[LE_CODED_INDEX] = minEventLength;
|
||||
_maxEventLength[LE_CODED_INDEX] = maxEventLength;
|
||||
}
|
||||
#endif // BLE_FEATURE_PHY_MANAGEMENT
|
||||
|
||||
} // namespace ble
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
#include "BLERoles.h"
|
||||
|
||||
#if BLE_FEATURE_GATT_SERVER
|
||||
#if BLE_ROLE_BROADCASTER
|
||||
|
||||
#ifdef TARGET_NRF51822 /* DFU only supported on nrf51 platforms */
|
||||
|
||||
|
|
@ -47,4 +48,5 @@ DFUService::ResetPrepare_t DFUService::handoverCallback = NULL;
|
|||
|
||||
#endif /* #ifdef TARGET_NRF51822 */
|
||||
|
||||
#endif // BLE_ROLE_BROADCASTER
|
||||
#endif // BLE_FEATURE_GATT_SERVER
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
#include "BLERoles.h"
|
||||
|
||||
#if BLE_FEATURE_GATT_SERVER
|
||||
#if BLE_ROLE_BROADCASTER
|
||||
|
||||
#include "ble/services/UARTService.h"
|
||||
|
||||
|
|
@ -44,4 +45,5 @@ const uint8_t UARTServiceRXCharacteristicUUID[UUID::LENGTH_OF_LONG_UUID] = {
|
|||
0xE0, 0xA9, 0xE5, 0x0E, 0x24, 0xDC, 0xCA, 0x9E,
|
||||
};
|
||||
|
||||
#endif // BLE_ROLE_BROADCASTER
|
||||
#endif // BLE_FEATURE_GATT_SERVER
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
#include "BLERoles.h"
|
||||
|
||||
#if BLE_FEATURE_GATT_SERVER
|
||||
#if BLE_ROLE_BROADCASTER
|
||||
|
||||
#include "ble/services/URIBeaconConfigService.h"
|
||||
|
||||
|
|
@ -38,4 +39,5 @@ const uint8_t UUID_RESET_CHAR[UUID::LENGTH_OF_LONG_UUID] = UUID_URI_B
|
|||
|
||||
const uint8_t BEACON_UUID[sizeof(UUID::ShortUUIDBytes_t)] = {0xD8, 0xFE};
|
||||
|
||||
#endif // BLE_ROLE_BROADCASTER
|
||||
#endif // BLE_FEATURE_GATT_SERVER
|
||||
|
|
|
|||
|
|
@ -229,7 +229,9 @@ private:
|
|||
static void att_cb(const attEvt_t *pEvt);
|
||||
static uint8_t atts_read_cb(dmConnId_t connId, uint16_t handle, uint8_t operation, uint16_t offset, attsAttr_t *pAttr);
|
||||
static uint8_t atts_write_cb(dmConnId_t connId, uint16_t handle, uint8_t operation, uint16_t offset, uint16_t len, uint8_t *pValue, attsAttr_t *pAttr);
|
||||
#if BLE_FEATURE_SECURITY
|
||||
static uint8_t atts_auth_cb(dmConnId_t connId, uint8_t permit, uint16_t handle);
|
||||
#endif // BLE_FEATURE_SECURITY
|
||||
void add_generic_access_service();
|
||||
void add_generic_attribute_service();
|
||||
void* alloc_block(size_t block_size);
|
||||
|
|
|
|||
|
|
@ -241,13 +241,19 @@ bool GattServer::is_characteristic_valid(GattCharacteristic *characteristic) {
|
|||
return false;
|
||||
}
|
||||
|
||||
#if BLE_FEATURE_SIGNING
|
||||
// check for invalid permissions
|
||||
if ((properties == SIGNED_WRITE_PROPERTY) &&
|
||||
(characteristic->getWriteSecurityRequirement() == att_security_requirement_t::NONE ||
|
||||
characteristic->getWriteSecurityRequirement() == att_security_requirement_t::SC_AUTHENTICATED)
|
||||
(characteristic->getWriteSecurityRequirement() == att_security_requirement_t::NONE
|
||||
#if BLE_FEATURE_SECURE_CONNECTIONS
|
||||
|| characteristic->getWriteSecurityRequirement() == att_security_requirement_t::SC_AUTHENTICATED
|
||||
|
||||
#endif // BLE_FEATURE_SECURE_CONNECTIONS
|
||||
)
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
#endif // BLE_FEATURE_SIGNING
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
@ -324,6 +330,7 @@ ble_error_t GattServer::insert_characteristic_value_attribute(
|
|||
switch (characteristic->getReadSecurityRequirement().value()) {
|
||||
case att_security_requirement_t::NONE:
|
||||
break;
|
||||
#if BLE_FEATURE_SECURITY
|
||||
case att_security_requirement_t::UNAUTHENTICATED:
|
||||
attribute_it->permissions |= ATTS_PERMIT_READ_ENC;
|
||||
break;
|
||||
|
|
@ -332,6 +339,7 @@ ble_error_t GattServer::insert_characteristic_value_attribute(
|
|||
ATTS_PERMIT_READ_ENC |
|
||||
ATTS_PERMIT_READ_AUTH;
|
||||
break;
|
||||
#if BLE_FEATURE_SECURE_CONNECTIONS
|
||||
case att_security_requirement_t::SC_AUTHENTICATED:
|
||||
// Note: check done in the cordio stack doesn't cover LESC
|
||||
// so this one is done in attsAuthorCback
|
||||
|
|
@ -340,6 +348,8 @@ ble_error_t GattServer::insert_characteristic_value_attribute(
|
|||
ATTS_PERMIT_READ_AUTH |
|
||||
ATTS_PERMIT_READ_AUTHORIZ;
|
||||
break;
|
||||
#endif // BLE_FEATURE_SECURE_CONNECTIONS
|
||||
#endif // BLE_FEATURE_SECURITY
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -349,6 +359,7 @@ ble_error_t GattServer::insert_characteristic_value_attribute(
|
|||
switch (characteristic->getWriteSecurityRequirement().value()) {
|
||||
case att_security_requirement_t::NONE:
|
||||
break;
|
||||
#if BLE_FEATURE_SECURITY
|
||||
case att_security_requirement_t::UNAUTHENTICATED:
|
||||
attribute_it->permissions |= ATTS_PERMIT_WRITE_ENC;
|
||||
break;
|
||||
|
|
@ -357,6 +368,7 @@ ble_error_t GattServer::insert_characteristic_value_attribute(
|
|||
ATTS_PERMIT_WRITE_ENC |
|
||||
ATTS_PERMIT_WRITE_AUTH;
|
||||
break;
|
||||
#if BLE_FEATURE_SECURE_CONNECTIONS
|
||||
case att_security_requirement_t::SC_AUTHENTICATED:
|
||||
// Note: check done in the cordio stack doesn't cover LESC
|
||||
// so this one is done in attsAuthorCback
|
||||
|
|
@ -365,6 +377,8 @@ ble_error_t GattServer::insert_characteristic_value_attribute(
|
|||
ATTS_PERMIT_WRITE_AUTH |
|
||||
ATTS_PERMIT_WRITE_AUTHORIZ;
|
||||
break;
|
||||
#endif // BLE_FEATURE_SECURE_CONNECTIONS
|
||||
#endif // BLE_FEATURE_SECURITY
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -456,6 +470,7 @@ ble_error_t GattServer::insert_descriptor(
|
|||
switch (descriptor->getReadSecurityRequirement().value()) {
|
||||
case att_security_requirement_t::NONE:
|
||||
break;
|
||||
#if BLE_FEATURE_SECURITY
|
||||
case att_security_requirement_t::UNAUTHENTICATED:
|
||||
attribute_it->permissions |= ATTS_PERMIT_READ_ENC;
|
||||
break;
|
||||
|
|
@ -464,6 +479,7 @@ ble_error_t GattServer::insert_descriptor(
|
|||
ATTS_PERMIT_READ_ENC |
|
||||
ATTS_PERMIT_READ_AUTH;
|
||||
break;
|
||||
#if BLE_FEATURE_SECURE_CONNECTIONS
|
||||
case att_security_requirement_t::SC_AUTHENTICATED:
|
||||
// Note: check done in the cordio stack doesn't cover LESC
|
||||
// so this one is done in attsAuthorCback
|
||||
|
|
@ -472,6 +488,8 @@ ble_error_t GattServer::insert_descriptor(
|
|||
ATTS_PERMIT_READ_AUTH |
|
||||
ATTS_PERMIT_READ_AUTHORIZ;
|
||||
break;
|
||||
#endif // BLE_FEATURE_SECURE_CONNECTIONS
|
||||
#endif // BLE_FEATURE_SECURITY
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -481,6 +499,7 @@ ble_error_t GattServer::insert_descriptor(
|
|||
switch (descriptor->getWriteSecurityRequirement().value()) {
|
||||
case att_security_requirement_t::NONE:
|
||||
break;
|
||||
#if BLE_FEATURE_SECURITY
|
||||
case att_security_requirement_t::UNAUTHENTICATED:
|
||||
attribute_it->permissions |= ATTS_PERMIT_WRITE_ENC;
|
||||
break;
|
||||
|
|
@ -489,6 +508,7 @@ ble_error_t GattServer::insert_descriptor(
|
|||
ATTS_PERMIT_WRITE_ENC |
|
||||
ATTS_PERMIT_WRITE_AUTH;
|
||||
break;
|
||||
#if BLE_FEATURE_SECURE_CONNECTIONS
|
||||
case att_security_requirement_t::SC_AUTHENTICATED:
|
||||
// Note: check done in the cordio stack doesn't cover LESC
|
||||
// so this one is done in attsAuthorCback
|
||||
|
|
@ -497,6 +517,8 @@ ble_error_t GattServer::insert_descriptor(
|
|||
ATTS_PERMIT_WRITE_AUTH |
|
||||
ATTS_PERMIT_WRITE_AUTHORIZ;
|
||||
break;
|
||||
#endif // BLE_FEATURE_SECURE_CONNECTIONS
|
||||
#endif // BLE_FEATURE_SECURITY
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -988,6 +1010,7 @@ uint8_t GattServer::atts_write_cb(
|
|||
return ATT_SUCCESS;
|
||||
}
|
||||
|
||||
#if BLE_FEATURE_SECURITY
|
||||
uint8_t GattServer::atts_auth_cb(dmConnId_t connId, uint8_t permit, uint16_t handle)
|
||||
{
|
||||
// this CB is triggered when read or write of an attribute (either a value
|
||||
|
|
@ -1006,6 +1029,7 @@ uint8_t GattServer::atts_auth_cb(dmConnId_t connId, uint8_t permit, uint16_t han
|
|||
|
||||
return ATT_SUCCESS;
|
||||
}
|
||||
#endif // BLE_FEATURE_SECURITY
|
||||
|
||||
void GattServer::add_generic_access_service()
|
||||
{
|
||||
|
|
@ -1254,14 +1278,17 @@ bool GattServer::is_update_authorized(
|
|||
return true;
|
||||
}
|
||||
|
||||
#if BLE_FEATURE_SECURITY
|
||||
SecurityManager& security_manager = BLE::deviceInstance().getSecurityManager();
|
||||
link_encryption_t encryption(link_encryption_t::NOT_ENCRYPTED);
|
||||
ble_error_t err = security_manager.getLinkEncryption(connection, &encryption);
|
||||
if (err) {
|
||||
return false;
|
||||
}
|
||||
#endif // BLE_FEATURE_SECURITY
|
||||
|
||||
switch (sec_req.value()) {
|
||||
#if BLE_FEATURE_SECURITY
|
||||
case att_security_requirement_t::UNAUTHENTICATED:
|
||||
if (encryption < link_encryption_t::ENCRYPTED) {
|
||||
return false;
|
||||
|
|
@ -1273,13 +1300,14 @@ bool GattServer::is_update_authorized(
|
|||
return false;
|
||||
}
|
||||
return true;
|
||||
|
||||
#if BLE_FEATURE_SECURE_CONNECTIONS
|
||||
case att_security_requirement_t::SC_AUTHENTICATED:
|
||||
if (encryption != link_encryption_t::ENCRYPTED_WITH_SC_AND_MITM) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
||||
#endif // BLE_FEATURE_SECURE_CONNECTIONS
|
||||
#endif // BLE_FEATURE_SECURITY
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue