ble_error_t btle_getLinkSecurity(Gap::Handle_t connectionHandle, SecurityManager::LinkSecurityStatus_t *securityStatusP) { ret_code_t rc; dm_handle_t dmHandle = { .appl_id = applicationInstance, }; if ((rc = dm_handle_get(connectionHandle, &dmHandle)) != NRF_SUCCESS) { if (rc == NRF_ERROR_NOT_FOUND) { return BLE_ERROR_INVALID_PARAM; } else { return BLE_ERROR_UNSPECIFIED; } } if ((rc = dm_security_status_req(&dmHandle, reinterpret_cast<dm_security_status_t *>(securityStatusP))) != NRF_SUCCESS) { switch (rc) { case NRF_ERROR_INVALID_STATE: return BLE_ERROR_INVALID_STATE; case NRF_ERROR_NO_MEM: return BLE_ERROR_NO_MEM; default: return BLE_ERROR_UNSPECIFIED; } } return BLE_ERROR_NONE; }
static void securitySetupCompletedCallback(Gap::Handle_t handle, SecurityManager::SecurityCompletionStatus_t status) { (void) handle; /* -Wunused-param */ dm_handle_t dm_handle = {0,0,0,0}; int ret = dm_handle_get(handle, &dm_handle); if (ret == 0) deviceID = dm_handle.device_id; if (manager) { pairingHandle = handle; manager->pairingComplete(status == SecurityManager::SEC_STATUS_SUCCESS); } }
/**@brief Function for providing peer information to DFU for re-establishing a bonded connection in * DFU mode. * * @param[in] conn_handle Connection handle for the connection requesting DFU mode. */ static void dfu_app_peer_data_set(uint16_t conn_handle) { uint32_t err_code; dm_sec_keyset_t key_set; uint32_t app_context_data = 0; dm_application_context_t app_context; /** [DFU bond sharing] */ err_code = dm_handle_get(conn_handle, &m_dm_handle); if (err_code == NRF_SUCCESS) { err_code = dm_distributed_keys_get(&m_dm_handle, &key_set); if (err_code == NRF_SUCCESS) { APP_ERROR_CHECK(err_code); m_peer_data.addr = key_set.keys_central.p_id_key->id_addr_info; m_peer_data.irk = key_set.keys_central.p_id_key->id_info; m_peer_data.enc_key.enc_info = key_set.keys_periph.enc_key.p_enc_key->enc_info; m_peer_data.enc_key.master_id = key_set.keys_periph.enc_key.p_enc_key->master_id; err_code = dfu_ble_svc_peer_data_set(&m_peer_data); APP_ERROR_CHECK(err_code); app_context_data = (DFU_APP_ATT_TABLE_CHANGED << DFU_APP_ATT_TABLE_POS); app_context.len = sizeof(app_context_data); app_context.p_data = (uint8_t *)&app_context_data; app_context.flags = 0; err_code = dm_application_context_set(&m_dm_handle, &app_context); APP_ERROR_CHECK(err_code); } else { // Keys were not available, thus we have a non-encrypted connection. err_code = dm_peer_addr_get(&m_dm_handle, &m_peer_data.addr); APP_ERROR_CHECK(err_code); err_code = dfu_ble_svc_peer_data_set(&m_peer_data); APP_ERROR_CHECK(err_code); } } /** [DFU bond sharing] */ }
/** * Callback when a BLE SYS_ATTR_MISSING. */ static void bleSysAttrMissingCallback(const GattSysAttrMissingCallbackParams *params) { int complete = 0; deviceID = 255; dm_handle_t dm_handle = {0,0,0,0}; int ret = dm_handle_get(params->connHandle, &dm_handle); if (ret == 0) deviceID = dm_handle.device_id; if(manager->storage != NULL && deviceID < MICROBIT_BLE_MAXIMUM_BONDS) { ManagedString key("bleSysAttrs"); KeyValuePair* bleSysAttrs = manager->storage->get(key); BLESysAttributeStore attribStore; BLESysAttribute attrib; if(bleSysAttrs != NULL) { //restore our sysAttrStore memcpy(&attribStore, bleSysAttrs->value, sizeof(BLESysAttributeStore)); delete bleSysAttrs; attrib = attribStore.sys_attrs[deviceID]; ret = sd_ble_gatts_sys_attr_set(params->connHandle, attrib.sys_attr, sizeof(attrib.sys_attr), BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS); complete = 1; if(ret == 0) ret = sd_ble_gatts_service_changed(params->connHandle, 0x000c, 0xffff); } } if (!complete) sd_ble_gatts_sys_attr_set(params->connHandle, NULL, 0, 0); }