test firmware for BLE Micro V1.3 1. test io, vcc and ble 2. act as a UART to BLE bridge

Dependencies:   BLE_API Buffer mbed

Fork of BLE_LEDBlinker by Bluetooth Low Energy

Committer:
arch
Date:
Tue Dec 08 08:34:22 2015 +0000
Revision:
12:c4090cb58976
Parent:
11:c8cbc4bc2c17
fix USBTX/USBRX pins config

Who changed what in which revision?

UserRevisionLine numberNew contents of line
arch 11:c8cbc4bc2c17 1 /* mbed Microcontroller Library
arch 11:c8cbc4bc2c17 2 * Copyright (c) 2006-2013 ARM Limited
arch 11:c8cbc4bc2c17 3 *
arch 11:c8cbc4bc2c17 4 * Licensed under the Apache License, Version 2.0 (the "License");
arch 11:c8cbc4bc2c17 5 * you may not use this file except in compliance with the License.
arch 11:c8cbc4bc2c17 6 * You may obtain a copy of the License at
arch 11:c8cbc4bc2c17 7 *
arch 11:c8cbc4bc2c17 8 * http://www.apache.org/licenses/LICENSE-2.0
arch 11:c8cbc4bc2c17 9 *
arch 11:c8cbc4bc2c17 10 * Unless required by applicable law or agreed to in writing, software
arch 11:c8cbc4bc2c17 11 * distributed under the License is distributed on an "AS IS" BASIS,
arch 11:c8cbc4bc2c17 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
arch 11:c8cbc4bc2c17 13 * See the License for the specific language governing permissions and
arch 11:c8cbc4bc2c17 14 * limitations under the License.
arch 11:c8cbc4bc2c17 15 */
arch 11:c8cbc4bc2c17 16
arch 11:c8cbc4bc2c17 17 #include "btle.h"
arch 11:c8cbc4bc2c17 18
arch 11:c8cbc4bc2c17 19 #include "nRF5xGap.h"
arch 11:c8cbc4bc2c17 20 #include "nRF5xSecurityManager.h"
arch 11:c8cbc4bc2c17 21
arch 11:c8cbc4bc2c17 22 extern "C" {
arch 11:c8cbc4bc2c17 23 #include "pstorage.h"
arch 11:c8cbc4bc2c17 24 #include "device_manager.h"
arch 11:c8cbc4bc2c17 25 }
arch 11:c8cbc4bc2c17 26
arch 11:c8cbc4bc2c17 27 #include "btle_security.h"
arch 11:c8cbc4bc2c17 28
arch 11:c8cbc4bc2c17 29 static dm_application_instance_t applicationInstance;
arch 11:c8cbc4bc2c17 30 static ret_code_t dm_handler(dm_handle_t const *p_handle, dm_event_t const *p_event, ret_code_t event_result);
arch 11:c8cbc4bc2c17 31
arch 11:c8cbc4bc2c17 32 ble_error_t
arch 11:c8cbc4bc2c17 33 btle_initializeSecurity(bool enableBonding,
arch 11:c8cbc4bc2c17 34 bool requireMITM,
arch 11:c8cbc4bc2c17 35 SecurityManager::SecurityIOCapabilities_t iocaps,
arch 11:c8cbc4bc2c17 36 const SecurityManager::Passkey_t passkey)
arch 11:c8cbc4bc2c17 37 {
arch 11:c8cbc4bc2c17 38 /* guard against multiple initializations */
arch 11:c8cbc4bc2c17 39 static bool initialized = false;
arch 11:c8cbc4bc2c17 40 if (initialized) {
arch 11:c8cbc4bc2c17 41 return BLE_ERROR_NONE;
arch 11:c8cbc4bc2c17 42 }
arch 11:c8cbc4bc2c17 43
arch 11:c8cbc4bc2c17 44 if (pstorage_init() != NRF_SUCCESS) {
arch 11:c8cbc4bc2c17 45 return BLE_ERROR_UNSPECIFIED;
arch 11:c8cbc4bc2c17 46 }
arch 11:c8cbc4bc2c17 47
arch 11:c8cbc4bc2c17 48 ret_code_t rc;
arch 11:c8cbc4bc2c17 49 if (passkey) {
arch 11:c8cbc4bc2c17 50 ble_opt_t opts;
arch 11:c8cbc4bc2c17 51 opts.gap_opt.passkey.p_passkey = const_cast<uint8_t *>(passkey);
arch 11:c8cbc4bc2c17 52 if ((rc = sd_ble_opt_set(BLE_GAP_OPT_PASSKEY, &opts)) != NRF_SUCCESS) {
arch 11:c8cbc4bc2c17 53 switch (rc) {
arch 11:c8cbc4bc2c17 54 case BLE_ERROR_INVALID_CONN_HANDLE:
arch 11:c8cbc4bc2c17 55 case NRF_ERROR_INVALID_ADDR:
arch 11:c8cbc4bc2c17 56 case NRF_ERROR_INVALID_PARAM:
arch 11:c8cbc4bc2c17 57 default:
arch 11:c8cbc4bc2c17 58 return BLE_ERROR_INVALID_PARAM;
arch 11:c8cbc4bc2c17 59 case NRF_ERROR_INVALID_STATE:
arch 11:c8cbc4bc2c17 60 return BLE_ERROR_INVALID_STATE;
arch 11:c8cbc4bc2c17 61 case NRF_ERROR_BUSY:
arch 11:c8cbc4bc2c17 62 return BLE_STACK_BUSY;
arch 11:c8cbc4bc2c17 63 }
arch 11:c8cbc4bc2c17 64 }
arch 11:c8cbc4bc2c17 65 }
arch 11:c8cbc4bc2c17 66
arch 11:c8cbc4bc2c17 67 dm_init_param_t dm_init_param = {
arch 11:c8cbc4bc2c17 68 .clear_persistent_data = false /* Set to true in case the module should clear all persistent data. */
arch 11:c8cbc4bc2c17 69 };
arch 11:c8cbc4bc2c17 70 if (dm_init(&dm_init_param) != NRF_SUCCESS) {
arch 11:c8cbc4bc2c17 71 return BLE_ERROR_UNSPECIFIED;
arch 11:c8cbc4bc2c17 72 }
arch 11:c8cbc4bc2c17 73
arch 11:c8cbc4bc2c17 74 const dm_application_param_t dm_param = {
arch 11:c8cbc4bc2c17 75 .evt_handler = dm_handler,
arch 11:c8cbc4bc2c17 76 .service_type = DM_PROTOCOL_CNTXT_GATT_CLI_ID,
arch 11:c8cbc4bc2c17 77 .sec_param = {
arch 11:c8cbc4bc2c17 78 .bond = enableBonding,/**< Perform bonding. */
arch 11:c8cbc4bc2c17 79 .mitm = requireMITM, /**< Man In The Middle protection required. */
arch 11:c8cbc4bc2c17 80 .io_caps = iocaps, /**< IO capabilities, see @ref BLE_GAP_IO_CAPS. */
arch 11:c8cbc4bc2c17 81 .oob = 0, /**< Out Of Band data available. */
arch 11:c8cbc4bc2c17 82 .min_key_size = 16, /**< Minimum encryption key size in octets between 7 and 16. If 0 then not applicable in this instance. */
arch 11:c8cbc4bc2c17 83 .max_key_size = 16, /**< Maximum encryption key size in octets between min_key_size and 16. */
arch 11:c8cbc4bc2c17 84 .kdist_periph = {
arch 11:c8cbc4bc2c17 85 .enc = 1, /**< Long Term Key and Master Identification. */
arch 11:c8cbc4bc2c17 86 .id = 1, /**< Identity Resolving Key and Identity Address Information. */
arch 11:c8cbc4bc2c17 87 .sign = 1, /**< Connection Signature Resolving Key. */
arch 11:c8cbc4bc2c17 88 }, /**< Key distribution bitmap: keys that the peripheral device will distribute. */
arch 11:c8cbc4bc2c17 89 }
arch 11:c8cbc4bc2c17 90 };
arch 11:c8cbc4bc2c17 91
arch 11:c8cbc4bc2c17 92 if ((rc = dm_register(&applicationInstance, &dm_param)) != NRF_SUCCESS) {
arch 11:c8cbc4bc2c17 93 switch (rc) {
arch 11:c8cbc4bc2c17 94 case NRF_ERROR_INVALID_STATE:
arch 11:c8cbc4bc2c17 95 return BLE_ERROR_INVALID_STATE;
arch 11:c8cbc4bc2c17 96 case NRF_ERROR_NO_MEM:
arch 11:c8cbc4bc2c17 97 return BLE_ERROR_NO_MEM;
arch 11:c8cbc4bc2c17 98 default:
arch 11:c8cbc4bc2c17 99 return BLE_ERROR_UNSPECIFIED;
arch 11:c8cbc4bc2c17 100 }
arch 11:c8cbc4bc2c17 101 }
arch 11:c8cbc4bc2c17 102
arch 11:c8cbc4bc2c17 103 initialized = true;
arch 11:c8cbc4bc2c17 104 return BLE_ERROR_NONE;
arch 11:c8cbc4bc2c17 105 }
arch 11:c8cbc4bc2c17 106
arch 11:c8cbc4bc2c17 107 ble_error_t
arch 11:c8cbc4bc2c17 108 btle_purgeAllBondingState(void)
arch 11:c8cbc4bc2c17 109 {
arch 11:c8cbc4bc2c17 110 ret_code_t rc;
arch 11:c8cbc4bc2c17 111 if ((rc = dm_device_delete_all(&applicationInstance)) == NRF_SUCCESS) {
arch 11:c8cbc4bc2c17 112 return BLE_ERROR_NONE;
arch 11:c8cbc4bc2c17 113 }
arch 11:c8cbc4bc2c17 114
arch 11:c8cbc4bc2c17 115 switch (rc) {
arch 11:c8cbc4bc2c17 116 case NRF_ERROR_INVALID_STATE:
arch 11:c8cbc4bc2c17 117 return BLE_ERROR_INVALID_STATE;
arch 11:c8cbc4bc2c17 118 case NRF_ERROR_NO_MEM:
arch 11:c8cbc4bc2c17 119 return BLE_ERROR_NO_MEM;
arch 11:c8cbc4bc2c17 120 default:
arch 11:c8cbc4bc2c17 121 return BLE_ERROR_UNSPECIFIED;
arch 11:c8cbc4bc2c17 122 }
arch 11:c8cbc4bc2c17 123 }
arch 11:c8cbc4bc2c17 124
arch 11:c8cbc4bc2c17 125 ble_error_t
arch 11:c8cbc4bc2c17 126 btle_getLinkSecurity(Gap::Handle_t connectionHandle, SecurityManager::LinkSecurityStatus_t *securityStatusP)
arch 11:c8cbc4bc2c17 127 {
arch 11:c8cbc4bc2c17 128 ret_code_t rc;
arch 11:c8cbc4bc2c17 129 dm_handle_t dmHandle = {
arch 11:c8cbc4bc2c17 130 .appl_id = applicationInstance,
arch 11:c8cbc4bc2c17 131 };
arch 11:c8cbc4bc2c17 132 if ((rc = dm_handle_get(connectionHandle, &dmHandle)) != NRF_SUCCESS) {
arch 11:c8cbc4bc2c17 133 if (rc == NRF_ERROR_NOT_FOUND) {
arch 11:c8cbc4bc2c17 134 return BLE_ERROR_INVALID_PARAM;
arch 11:c8cbc4bc2c17 135 } else {
arch 11:c8cbc4bc2c17 136 return BLE_ERROR_UNSPECIFIED;
arch 11:c8cbc4bc2c17 137 }
arch 11:c8cbc4bc2c17 138 }
arch 11:c8cbc4bc2c17 139
arch 11:c8cbc4bc2c17 140 if ((rc = dm_security_status_req(&dmHandle, reinterpret_cast<dm_security_status_t *>(securityStatusP))) != NRF_SUCCESS) {
arch 11:c8cbc4bc2c17 141 switch (rc) {
arch 11:c8cbc4bc2c17 142 case NRF_ERROR_INVALID_STATE:
arch 11:c8cbc4bc2c17 143 return BLE_ERROR_INVALID_STATE;
arch 11:c8cbc4bc2c17 144 case NRF_ERROR_NO_MEM:
arch 11:c8cbc4bc2c17 145 return BLE_ERROR_NO_MEM;
arch 11:c8cbc4bc2c17 146 default:
arch 11:c8cbc4bc2c17 147 return BLE_ERROR_UNSPECIFIED;
arch 11:c8cbc4bc2c17 148 }
arch 11:c8cbc4bc2c17 149 }
arch 11:c8cbc4bc2c17 150
arch 11:c8cbc4bc2c17 151 return BLE_ERROR_NONE;
arch 11:c8cbc4bc2c17 152 }
arch 11:c8cbc4bc2c17 153
arch 11:c8cbc4bc2c17 154 ret_code_t
arch 11:c8cbc4bc2c17 155 dm_handler(dm_handle_t const *p_handle, dm_event_t const *p_event, ret_code_t event_result)
arch 11:c8cbc4bc2c17 156 {
arch 11:c8cbc4bc2c17 157 switch (p_event->event_id) {
arch 11:c8cbc4bc2c17 158 case DM_EVT_SECURITY_SETUP: /* started */ {
arch 11:c8cbc4bc2c17 159 const ble_gap_sec_params_t *peerParams = &p_event->event_param.p_gap_param->params.sec_params_request.peer_params;
arch 11:c8cbc4bc2c17 160 nRF5xSecurityManager::getInstance().processSecuritySetupInitiatedEvent(p_event->event_param.p_gap_param->conn_handle,
arch 11:c8cbc4bc2c17 161 peerParams->bond,
arch 11:c8cbc4bc2c17 162 peerParams->mitm,
arch 11:c8cbc4bc2c17 163 (SecurityManager::SecurityIOCapabilities_t)peerParams->io_caps);
arch 11:c8cbc4bc2c17 164 break;
arch 11:c8cbc4bc2c17 165 }
arch 11:c8cbc4bc2c17 166 case DM_EVT_SECURITY_SETUP_COMPLETE:
arch 11:c8cbc4bc2c17 167 nRF5xSecurityManager::getInstance().
arch 11:c8cbc4bc2c17 168 processSecuritySetupCompletedEvent(p_event->event_param.p_gap_param->conn_handle,
arch 11:c8cbc4bc2c17 169 (SecurityManager::SecurityCompletionStatus_t)(p_event->event_param.p_gap_param->params.auth_status.auth_status));
arch 11:c8cbc4bc2c17 170 break;
arch 11:c8cbc4bc2c17 171 case DM_EVT_LINK_SECURED: {
arch 11:c8cbc4bc2c17 172 unsigned securityMode = p_event->event_param.p_gap_param->params.conn_sec_update.conn_sec.sec_mode.sm;
arch 11:c8cbc4bc2c17 173 unsigned level = p_event->event_param.p_gap_param->params.conn_sec_update.conn_sec.sec_mode.lv;
arch 11:c8cbc4bc2c17 174 SecurityManager::SecurityMode_t resolvedSecurityMode = SecurityManager::SECURITY_MODE_NO_ACCESS;
arch 11:c8cbc4bc2c17 175 switch (securityMode) {
arch 11:c8cbc4bc2c17 176 case 1:
arch 11:c8cbc4bc2c17 177 switch (level) {
arch 11:c8cbc4bc2c17 178 case 1:
arch 11:c8cbc4bc2c17 179 resolvedSecurityMode = SecurityManager::SECURITY_MODE_ENCRYPTION_OPEN_LINK;
arch 11:c8cbc4bc2c17 180 break;
arch 11:c8cbc4bc2c17 181 case 2:
arch 11:c8cbc4bc2c17 182 resolvedSecurityMode = SecurityManager::SECURITY_MODE_ENCRYPTION_NO_MITM;
arch 11:c8cbc4bc2c17 183 break;
arch 11:c8cbc4bc2c17 184 case 3:
arch 11:c8cbc4bc2c17 185 resolvedSecurityMode = SecurityManager::SECURITY_MODE_ENCRYPTION_WITH_MITM;
arch 11:c8cbc4bc2c17 186 break;
arch 11:c8cbc4bc2c17 187 }
arch 11:c8cbc4bc2c17 188 break;
arch 11:c8cbc4bc2c17 189 case 2:
arch 11:c8cbc4bc2c17 190 switch (level) {
arch 11:c8cbc4bc2c17 191 case 1:
arch 11:c8cbc4bc2c17 192 resolvedSecurityMode = SecurityManager::SECURITY_MODE_SIGNED_NO_MITM;
arch 11:c8cbc4bc2c17 193 break;
arch 11:c8cbc4bc2c17 194 case 2:
arch 11:c8cbc4bc2c17 195 resolvedSecurityMode = SecurityManager::SECURITY_MODE_SIGNED_WITH_MITM;
arch 11:c8cbc4bc2c17 196 break;
arch 11:c8cbc4bc2c17 197 }
arch 11:c8cbc4bc2c17 198 break;
arch 11:c8cbc4bc2c17 199 }
arch 11:c8cbc4bc2c17 200
arch 11:c8cbc4bc2c17 201 nRF5xSecurityManager::getInstance().processLinkSecuredEvent(p_event->event_param.p_gap_param->conn_handle, resolvedSecurityMode);
arch 11:c8cbc4bc2c17 202 break;
arch 11:c8cbc4bc2c17 203 }
arch 11:c8cbc4bc2c17 204 case DM_EVT_DEVICE_CONTEXT_STORED:
arch 11:c8cbc4bc2c17 205 nRF5xSecurityManager::getInstance().processSecurityContextStoredEvent(p_event->event_param.p_gap_param->conn_handle);
arch 11:c8cbc4bc2c17 206 break;
arch 11:c8cbc4bc2c17 207 default:
arch 11:c8cbc4bc2c17 208 break;
arch 11:c8cbc4bc2c17 209 }
arch 11:c8cbc4bc2c17 210
arch 11:c8cbc4bc2c17 211 return NRF_SUCCESS;
arch 11:c8cbc4bc2c17 212 }