mesh: validate appkey index for access messages

This commit is contained in:
Matthias Ringwald 2019-06-12 17:08:36 +02:00
parent ae26178409
commit cbc8da7c60
2 changed files with 32 additions and 2 deletions

View File

@ -223,6 +223,17 @@ uint16_t mesh_pdu_netkey_index(mesh_pdu_t * pdu){
} }
} }
uint16_t mesh_pdu_appkey_index(mesh_pdu_t * pdu){
switch (pdu->pdu_type){
case MESH_PDU_TYPE_TRANSPORT:
return ((mesh_transport_pdu_t*) pdu)->appkey_index;
case MESH_PDU_TYPE_NETWORK:
return ((mesh_network_pdu_t *) pdu)->appkey_index;
default:
return 0;
}
}
uint16_t mesh_pdu_len(mesh_pdu_t * pdu){ uint16_t mesh_pdu_len(mesh_pdu_t * pdu){
switch (pdu->pdu_type){ switch (pdu->pdu_type){
case MESH_PDU_TYPE_TRANSPORT: case MESH_PDU_TYPE_TRANSPORT:
@ -556,6 +567,13 @@ static const mesh_operation_t * mesh_model_lookup_operation(mesh_model_t * model
return NULL; return NULL;
} }
static int mesh_access_validate_appkey_index(mesh_model_t * model, uint16_t appkey_index){
// DeviceKey is valid for all models
if (appkey_index == MESH_DEVICE_KEY_INDEX) return 1;
// check if AppKey that is bound to this particular model
return mesh_model_contains_appkey(model, appkey_index);
}
static void mesh_access_message_process_handler(mesh_pdu_t * pdu){ static void mesh_access_message_process_handler(mesh_pdu_t * pdu){
// get opcode and size // get opcode and size
uint32_t opcode = 0; uint32_t opcode = 0;
@ -580,9 +598,8 @@ static void mesh_access_message_process_handler(mesh_pdu_t * pdu){
break; break;
} }
// TODO: check if used AppKey is bound to particular model
uint16_t dst = mesh_pdu_dst(pdu); uint16_t dst = mesh_pdu_dst(pdu);
uint16_t appkey_index = mesh_pdu_appkey_index(pdu);
if (mesh_network_address_unicast(dst)){ if (mesh_network_address_unicast(dst)){
// loookup element by unicast address // loookup element by unicast address
mesh_element_t * element = mesh_element_for_unicast_address(dst); mesh_element_t * element = mesh_element_for_unicast_address(dst);
@ -595,6 +612,7 @@ static void mesh_access_message_process_handler(mesh_pdu_t * pdu){
// find opcode in table // find opcode in table
const mesh_operation_t * operation = mesh_model_lookup_operation(model, pdu); const mesh_operation_t * operation = mesh_model_lookup_operation(model, pdu);
if (operation == NULL) break; if (operation == NULL) break;
if (mesh_access_validate_appkey_index(model, appkey_index) == 0) break;
operation->handler(model, pdu); operation->handler(model, pdu);
return; return;
} }
@ -613,6 +631,7 @@ static void mesh_access_message_process_handler(mesh_pdu_t * pdu){
// find opcode in table // find opcode in table
const mesh_operation_t * operation = mesh_model_lookup_operation(model, pdu); const mesh_operation_t * operation = mesh_model_lookup_operation(model, pdu);
if (operation == NULL) break; if (operation == NULL) break;
if (mesh_access_validate_appkey_index(model, appkey_index) == 0) break;
operation->handler(model, pdu); operation->handler(model, pdu);
return; return;
} }
@ -795,3 +814,12 @@ void mesh_model_unbind_appkey(mesh_model_t * mesh_model, uint16_t appkey_index){
} }
} }
int mesh_model_contains_appkey(mesh_model_t * mesh_model, uint16_t appkey_index){
uint16_t i;
for (i=0;i<MAX_NR_MESH_APPKEYS_PER_MODEL;i++){
if (mesh_model->appkey_indices[i] == appkey_index) return 1;
}
return 0;
}

View File

@ -194,6 +194,7 @@ mesh_model_t * mesh_access_model_for_address_and_model_identifier(uint16_t eleme
uint16_t mesh_pdu_src(mesh_pdu_t * pdu); uint16_t mesh_pdu_src(mesh_pdu_t * pdu);
uint16_t mesh_pdu_dst(mesh_pdu_t * pdu); uint16_t mesh_pdu_dst(mesh_pdu_t * pdu);
uint16_t mesh_pdu_netkey_index(mesh_pdu_t * pdu); uint16_t mesh_pdu_netkey_index(mesh_pdu_t * pdu);
uint16_t mesh_pdu_appkey_index(mesh_pdu_t * pdu);
uint16_t mesh_pdu_len(mesh_pdu_t * pdu); uint16_t mesh_pdu_len(mesh_pdu_t * pdu);
uint8_t * mesh_pdu_data(mesh_pdu_t * pdu); uint8_t * mesh_pdu_data(mesh_pdu_t * pdu);
@ -213,6 +214,7 @@ void mesh_delete_appkey_lists(void);
void mesh_model_reset_appkeys(mesh_model_t * mesh_model); void mesh_model_reset_appkeys(mesh_model_t * mesh_model);
uint8_t mesh_model_bind_appkey(mesh_model_t * mesh_model, uint16_t appkey_index); uint8_t mesh_model_bind_appkey(mesh_model_t * mesh_model, uint16_t appkey_index);
void mesh_model_unbind_appkey(mesh_model_t * mesh_model, uint16_t appkey_index); void mesh_model_unbind_appkey(mesh_model_t * mesh_model, uint16_t appkey_index);
int mesh_model_contains_appkey(mesh_model_t * mesh_model, uint16_t appkey_index);
// Mesh Access Parser // Mesh Access Parser
int mesh_access_pdu_get_opcode(mesh_pdu_t * pdu, uint32_t * opcode, uint16_t * opcode_size); int mesh_access_pdu_get_opcode(mesh_pdu_t * pdu, uint32_t * opcode, uint16_t * opcode_size);