att_db: pass att operation mode read/write to att_validate_security

This commit is contained in:
Matthias Ringwald 2018-03-03 22:28:22 +01:00
parent e22a261227
commit 9d622fde0d

View File

@ -47,6 +47,11 @@
#include "btstack_debug.h"
#include "btstack_util.h"
typedef enum {
ATT_READ,
ATT_WRITE,
} att_operation_t;
// Buetooth Base UUID 00000000-0000-1000-8000-00805F9B34FB in little endian
static const uint8_t bluetooth_base_uuid[] = { 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
@ -276,7 +281,8 @@ static inline uint16_t setup_error_invalid_offset(uint8_t * response_buffer, uin
return setup_error(response_buffer, request, handle, ATT_ERROR_INVALID_OFFSET);
}
static uint8_t att_validate_security(att_connection_t * att_connection, att_iterator_t * it){
static uint8_t att_validate_security(att_connection_t * att_connection, att_operation_t operation, att_iterator_t * it){
UNUSED(operation);
int required_encryption_size = it->flags >> 12;
if (required_encryption_size) required_encryption_size++; // store -1 to fit into 4 bit
log_debug("att_validate_security. flags 0x%04x - req enc size %u, authorized %u, authenticated %u, encryption_key_size %u",
@ -518,7 +524,7 @@ static uint16_t handle_read_by_type_request2(att_connection_t * att_connection,
// check security requirements
if ((it.flags & ATT_DB_FLAGS_READ_WITHOUT_AUTHENTICATION) == 0){
error_code = att_validate_security(att_connection, &it);
error_code = att_validate_security(att_connection, ATT_READ, &it);
if (error_code) break;
}
@ -616,7 +622,7 @@ static uint16_t handle_read_request2(att_connection_t * att_connection, uint8_t
// check security requirements
if ((it.flags & ATT_DB_FLAGS_READ_WITHOUT_AUTHENTICATION) == 0){
uint8_t error_code = att_validate_security(att_connection, &it);
uint8_t error_code = att_validate_security(att_connection, ATT_READ, &it);
if (error_code) {
return setup_error(response_buffer, request_type, handle, error_code);
}
@ -668,7 +674,7 @@ static uint16_t handle_read_blob_request2(att_connection_t * att_connection, uin
// check security requirements
if ((it.flags & ATT_DB_FLAGS_READ_WITHOUT_AUTHENTICATION) == 0){
uint8_t error_code = att_validate_security(att_connection, &it);
uint8_t error_code = att_validate_security(att_connection, ATT_READ, &it);
if (error_code) {
return setup_error(response_buffer, request_type, handle, error_code);
}
@ -748,7 +754,7 @@ static uint16_t handle_read_multiple_request2(att_connection_t * att_connection,
// check security requirements
if ((it.flags & ATT_DB_FLAGS_READ_WITHOUT_AUTHENTICATION) == 0){
error_code = att_validate_security(att_connection, &it);
error_code = att_validate_security(att_connection, ATT_READ, &it);
if (error_code) break;
}
att_update_value_len(&it, att_connection->con_handle);
@ -928,7 +934,7 @@ static uint16_t handle_write_request(att_connection_t * att_connection, uint8_t
return setup_error_write_not_permitted(response_buffer, request_type, handle);
}
// check security requirements
uint8_t error_code = att_validate_security(att_connection, &it);
uint8_t error_code = att_validate_security(att_connection, ATT_WRITE, &it);
if (error_code) {
return setup_error(response_buffer, request_type, handle, error_code);
}
@ -967,7 +973,7 @@ static uint16_t handle_prepare_write_request(att_connection_t * att_connection,
return setup_error_write_not_permitted(response_buffer, request_type, handle);
}
// check security requirements
uint8_t error_code = att_validate_security(att_connection, &it);
uint8_t error_code = att_validate_security(att_connection, ATT_WRITE, &it);
if (error_code) {
return setup_error(response_buffer, request_type, handle, error_code);
}
@ -1045,7 +1051,7 @@ static void handle_write_command(att_connection_t * att_connection, uint8_t * re
if (!ok) return;
if ((it.flags & ATT_PROPERTY_DYNAMIC) == 0) return;
if ((it.flags & ATT_PROPERTY_WRITE_WITHOUT_RESPONSE) == 0) return;
if (att_validate_security(att_connection, &it)) return;
if (att_validate_security(att_connection, ATT_WRITE, &it)) return;
att_persistent_ccc_cache(&it);
(*att_write_callback)(att_connection->con_handle, handle, ATT_TRANSACTION_MODE_NONE, 0, request_buffer + 3, request_len - 3);
}