mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-03-25 16:43:28 +00:00
compile_gatt+att_db+att_db_util: make Client Characteristic Configuration readable without authentication but require permissions for write
This commit is contained in:
parent
3721458b9d
commit
eb6072adf6
@ -536,8 +536,10 @@ static uint16_t handle_read_by_type_request2(att_connection_t * att_connection,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// check security requirements
|
// check security requirements
|
||||||
error_code = att_validate_security(att_connection, &it);
|
if ((it.flags & ATT_DB_FLAGS_READ_WITHOUT_AUTHENTICATION) == 0){
|
||||||
if (error_code) break;
|
error_code = att_validate_security(att_connection, &it);
|
||||||
|
if (error_code) break;
|
||||||
|
}
|
||||||
|
|
||||||
att_update_value_len(&it, att_connection->con_handle);
|
att_update_value_len(&it, att_connection->con_handle);
|
||||||
|
|
||||||
@ -621,9 +623,11 @@ static uint16_t handle_read_request2(att_connection_t * att_connection, uint8_t
|
|||||||
}
|
}
|
||||||
|
|
||||||
// check security requirements
|
// check security requirements
|
||||||
uint8_t error_code = att_validate_security(att_connection, &it);
|
if ((it.flags & ATT_DB_FLAGS_READ_WITHOUT_AUTHENTICATION) == 0){
|
||||||
if (error_code) {
|
uint8_t error_code = att_validate_security(att_connection, &it);
|
||||||
return setup_error(response_buffer, request_type, handle, error_code);
|
if (error_code) {
|
||||||
|
return setup_error(response_buffer, request_type, handle, error_code);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
att_update_value_len(&it, att_connection->con_handle);
|
att_update_value_len(&it, att_connection->con_handle);
|
||||||
@ -667,9 +671,11 @@ static uint16_t handle_read_blob_request2(att_connection_t * att_connection, uin
|
|||||||
}
|
}
|
||||||
|
|
||||||
// check security requirements
|
// check security requirements
|
||||||
uint8_t error_code = att_validate_security(att_connection, &it);
|
if ((it.flags & ATT_DB_FLAGS_READ_WITHOUT_AUTHENTICATION) == 0){
|
||||||
if (error_code) {
|
uint8_t error_code = att_validate_security(att_connection, &it);
|
||||||
return setup_error(response_buffer, request_type, handle, error_code);
|
if (error_code) {
|
||||||
|
return setup_error(response_buffer, request_type, handle, error_code);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
att_update_value_len(&it, att_connection->con_handle);
|
att_update_value_len(&it, att_connection->con_handle);
|
||||||
@ -736,9 +742,10 @@ static uint16_t handle_read_multiple_request2(att_connection_t * att_connection,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// check security requirements
|
// check security requirements
|
||||||
error_code = att_validate_security(att_connection, &it);
|
if ((it.flags & ATT_DB_FLAGS_READ_WITHOUT_AUTHENTICATION) == 0){
|
||||||
if (error_code) break;
|
error_code = att_validate_security(att_connection, &it);
|
||||||
|
if (error_code) break;
|
||||||
|
}
|
||||||
att_update_value_len(&it, att_connection->con_handle);
|
att_update_value_len(&it, att_connection->con_handle);
|
||||||
|
|
||||||
// limit data
|
// limit data
|
||||||
|
@ -154,18 +154,26 @@ void att_db_util_add_service_uuid128(uint8_t * uuid128){
|
|||||||
att_db_util_add_attribute_uuid16(GATT_PRIMARY_SERVICE_UUID, ATT_PROPERTY_READ, buffer, 16);
|
att_db_util_add_attribute_uuid16(GATT_PRIMARY_SERVICE_UUID, ATT_PROPERTY_READ, buffer, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void att_db_util_add_client_characteristic_configuration(uint16_t properties){
|
||||||
|
uint8_t buffer[2];
|
||||||
|
// keep authentication flags
|
||||||
|
uint16_t flags = (properties & 0x1ff00) | ATT_DB_FLAGS_READ_WITHOUT_AUTHENTICATION | ATT_PROPERTY_READ | ATT_PROPERTY_WRITE | ATT_PROPERTY_DYNAMIC;
|
||||||
|
little_endian_store_16(buffer, 0, 0);
|
||||||
|
att_db_util_add_attribute_uuid16(GATT_CLIENT_CHARACTERISTICS_CONFIGURATION, flags, buffer, 2);
|
||||||
|
}
|
||||||
|
|
||||||
uint16_t att_db_util_add_characteristic_uuid16(uint16_t uuid16, uint16_t properties, uint8_t * data, uint16_t data_len){
|
uint16_t att_db_util_add_characteristic_uuid16(uint16_t uuid16, uint16_t properties, uint8_t * data, uint16_t data_len){
|
||||||
uint8_t buffer[5];
|
uint8_t buffer[5];
|
||||||
buffer[0] = properties;
|
buffer[0] = properties;
|
||||||
little_endian_store_16(buffer, 1, att_db_next_handle + 1);
|
little_endian_store_16(buffer, 1, att_db_next_handle + 1);
|
||||||
little_endian_store_16(buffer, 3, uuid16);
|
little_endian_store_16(buffer, 3, uuid16);
|
||||||
att_db_util_add_attribute_uuid16(GATT_CHARACTERISTICS_UUID, ATT_PROPERTY_READ, buffer, sizeof(buffer));
|
att_db_util_add_attribute_uuid16(GATT_CHARACTERISTICS_UUID, ATT_PROPERTY_READ, buffer, sizeof(buffer));
|
||||||
|
// drop Broadcast, Notify, Indicate - not used for flags
|
||||||
|
uint16_t value_flags = properties & 0x1ffce;
|
||||||
uint16_t value_handle = att_db_next_handle;
|
uint16_t value_handle = att_db_next_handle;
|
||||||
att_db_util_add_attribute_uuid16(uuid16, properties, data, data_len);
|
att_db_util_add_attribute_uuid16(uuid16, value_flags, data, data_len);
|
||||||
if (properties & (ATT_PROPERTY_NOTIFY | ATT_PROPERTY_INDICATE)){
|
if (properties & (ATT_PROPERTY_NOTIFY | ATT_PROPERTY_INDICATE)){
|
||||||
uint16_t flags = ATT_PROPERTY_READ | ATT_PROPERTY_WRITE | ATT_PROPERTY_DYNAMIC;
|
att_db_util_add_client_characteristic_configuration(properties);
|
||||||
little_endian_store_16(buffer, 0, 0);
|
|
||||||
att_db_util_add_attribute_uuid16(GATT_CLIENT_CHARACTERISTICS_CONFIGURATION, flags, buffer, 2);
|
|
||||||
}
|
}
|
||||||
return value_handle;
|
return value_handle;
|
||||||
}
|
}
|
||||||
@ -176,12 +184,12 @@ uint16_t att_db_util_add_characteristic_uuid128(uint8_t * uuid128, uint16_t prop
|
|||||||
little_endian_store_16(buffer, 1, att_db_next_handle + 1);
|
little_endian_store_16(buffer, 1, att_db_next_handle + 1);
|
||||||
reverse_128(uuid128, &buffer[3]);
|
reverse_128(uuid128, &buffer[3]);
|
||||||
att_db_util_add_attribute_uuid16(GATT_CHARACTERISTICS_UUID, ATT_PROPERTY_READ, buffer, sizeof(buffer));
|
att_db_util_add_attribute_uuid16(GATT_CHARACTERISTICS_UUID, ATT_PROPERTY_READ, buffer, sizeof(buffer));
|
||||||
|
// drop Broadcast, Notify, Indicate - not used for flags
|
||||||
|
uint16_t value_flags = properties & 0x1ffce;
|
||||||
uint16_t value_handle = att_db_next_handle;
|
uint16_t value_handle = att_db_next_handle;
|
||||||
att_db_util_add_attribute_uuid128(uuid128, properties, data, data_len);
|
att_db_util_add_attribute_uuid128(uuid128, value_flags, data, data_len);
|
||||||
if (properties & (ATT_PROPERTY_NOTIFY | ATT_PROPERTY_INDICATE)){
|
if (properties & (ATT_PROPERTY_NOTIFY | ATT_PROPERTY_INDICATE)){
|
||||||
uint16_t flags = ATT_PROPERTY_READ | ATT_PROPERTY_WRITE | ATT_PROPERTY_DYNAMIC;
|
att_db_util_add_client_characteristic_configuration(properties);
|
||||||
little_endian_store_16(buffer, 0, 0);
|
|
||||||
att_db_util_add_attribute_uuid16(GATT_CLIENT_CHARACTERISTICS_CONFIGURATION, flags, buffer, 2);
|
|
||||||
}
|
}
|
||||||
return value_handle;
|
return value_handle;
|
||||||
}
|
}
|
||||||
|
@ -293,6 +293,12 @@ typedef uint8_t sm_key_t[16];
|
|||||||
#define GATT_WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION 0X81
|
#define GATT_WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION 0X81
|
||||||
#define GATT_GET_MTU 0x82
|
#define GATT_GET_MTU 0x82
|
||||||
|
|
||||||
|
// ATT
|
||||||
|
|
||||||
|
// ..
|
||||||
|
// Internal properties reuse some GATT Characteristic Properties fields
|
||||||
|
#define ATT_DB_FLAGS_READ_WITHOUT_AUTHENTICATION 0x0001
|
||||||
|
|
||||||
|
|
||||||
// EVENTS
|
// EVENTS
|
||||||
|
|
||||||
|
@ -48,6 +48,7 @@ assigned_uuids = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
property_flags = {
|
property_flags = {
|
||||||
|
# GATT Characteristic Properties
|
||||||
'BROADCAST' : 0x01,
|
'BROADCAST' : 0x01,
|
||||||
'READ' : 0x02,
|
'READ' : 0x02,
|
||||||
'WRITE_WITHOUT_RESPONSE' : 0x04,
|
'WRITE_WITHOUT_RESPONSE' : 0x04,
|
||||||
@ -57,23 +58,30 @@ property_flags = {
|
|||||||
'AUTHENTICATED_SIGNED_WRITE' : 0x40,
|
'AUTHENTICATED_SIGNED_WRITE' : 0x40,
|
||||||
'EXTENDED_PROPERTIES' : 0x80,
|
'EXTENDED_PROPERTIES' : 0x80,
|
||||||
# custom BTstack extension
|
# custom BTstack extension
|
||||||
'DYNAMIC': 0x100,
|
'DYNAMIC': 0x100,
|
||||||
'LONG_UUID': 0x200,
|
'LONG_UUID': 0x200,
|
||||||
'AUTHENTICATION_REQUIRED': 0x400,
|
'AUTHENTICATION_REQUIRED': 0x400,
|
||||||
'AUTHORIZATION_REQUIRED': 0x800,
|
'AUTHORIZATION_REQUIRED': 0x800,
|
||||||
'ENCRYPTION_KEY_SIZE_7': 0x6000,
|
'ENCRYPTION_KEY_SIZE_7': 0x6000,
|
||||||
'ENCRYPTION_KEY_SIZE_8': 0x7000,
|
'ENCRYPTION_KEY_SIZE_8': 0x7000,
|
||||||
'ENCRYPTION_KEY_SIZE_9': 0x8000,
|
'ENCRYPTION_KEY_SIZE_9': 0x8000,
|
||||||
'ENCRYPTION_KEY_SIZE_10': 0x9000,
|
'ENCRYPTION_KEY_SIZE_10': 0x9000,
|
||||||
'ENCRYPTION_KEY_SIZE_11': 0xa000,
|
'ENCRYPTION_KEY_SIZE_11': 0xa000,
|
||||||
'ENCRYPTION_KEY_SIZE_12': 0xb000,
|
'ENCRYPTION_KEY_SIZE_12': 0xb000,
|
||||||
'ENCRYPTION_KEY_SIZE_13': 0xc000,
|
'ENCRYPTION_KEY_SIZE_13': 0xc000,
|
||||||
'ENCRYPTION_KEY_SIZE_14': 0xd000,
|
'ENCRYPTION_KEY_SIZE_14': 0xd000,
|
||||||
'ENCRYPTION_KEY_SIZE_15': 0xe000,
|
'ENCRYPTION_KEY_SIZE_15': 0xe000,
|
||||||
'ENCRYPTION_KEY_SIZE_16': 0xf000,
|
'ENCRYPTION_KEY_SIZE_16': 0xf000,
|
||||||
|
|
||||||
# only used by gatt compiler >= 0xffff
|
# only used by gatt compiler >= 0xffff
|
||||||
# Extended Properties
|
# Extended Properties
|
||||||
'RELIABLE_WRITE': 0x10000,
|
'RELIABLE_WRITE': 0x10000,
|
||||||
|
|
||||||
|
# Broadcast, Notify, Indicate, Extended Properties are only used to describe a GATT Characteristic, but are free to use with att_db
|
||||||
|
'READ_WITHOUT_AUTHENTICATION': 0x0001,
|
||||||
|
# 0x10
|
||||||
|
# 0x20
|
||||||
|
# 0x80
|
||||||
}
|
}
|
||||||
|
|
||||||
btstack_root = ''
|
btstack_root = ''
|
||||||
@ -314,9 +322,11 @@ def parseCharacteristic(fout, parts):
|
|||||||
|
|
||||||
write_indent(fout)
|
write_indent(fout)
|
||||||
fout.write('// 0x%04x VALUE-%s-'"'%s'"'\n' % (handle, '-'.join(parts[1:3]),value))
|
fout.write('// 0x%04x VALUE-%s-'"'%s'"'\n' % (handle, '-'.join(parts[1:3]),value))
|
||||||
|
# drop Broadcast, Notify, Indicate - not used for flags
|
||||||
|
value_properties = properties & 0x1ffce
|
||||||
write_indent(fout)
|
write_indent(fout)
|
||||||
write_16(fout, size)
|
write_16(fout, size)
|
||||||
write_16(fout, properties)
|
write_16(fout, value_properties)
|
||||||
write_16(fout, handle)
|
write_16(fout, handle)
|
||||||
write_uuid(uuid)
|
write_uuid(uuid)
|
||||||
if is_string(value):
|
if is_string(value):
|
||||||
@ -329,12 +339,14 @@ def parseCharacteristic(fout, parts):
|
|||||||
handle = handle + 1
|
handle = handle + 1
|
||||||
|
|
||||||
if add_client_characteristic_configuration(properties):
|
if add_client_characteristic_configuration(properties):
|
||||||
|
# replace GATT Characterstic Properties with READ|WRITE|READ_WITHOUT_AUTHENTICATION|DYNAMIC
|
||||||
|
ccc_properties = (properties & 0x1ff00) | property_flags['READ_WITHOUT_AUTHENTICATION'] | property_flags['READ'] | property_flags['WRITE'] | property_flags['DYNAMIC'];
|
||||||
size = 2 + 2 + 2 + 2 + 2
|
size = 2 + 2 + 2 + 2 + 2
|
||||||
write_indent(fout)
|
write_indent(fout)
|
||||||
fout.write('// 0x%04x CLIENT_CHARACTERISTIC_CONFIGURATION\n' % (handle))
|
fout.write('// 0x%04x CLIENT_CHARACTERISTIC_CONFIGURATION\n' % (handle))
|
||||||
write_indent(fout)
|
write_indent(fout)
|
||||||
write_16(fout, size)
|
write_16(fout, size)
|
||||||
write_16(fout, property_flags['READ'] | property_flags['WRITE'] | property_flags['DYNAMIC'])
|
write_16(fout, ccc_properties)
|
||||||
write_16(fout, handle)
|
write_16(fout, handle)
|
||||||
write_16(fout, 0x2902)
|
write_16(fout, 0x2902)
|
||||||
write_16(fout, 0)
|
write_16(fout, 0)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user