1 /****************************************************************************** 2 * 3 * Copyright 2009-2012 Broadcom Corporation 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18 #include <stdio.h> 19 #include <stdlib.h> 20 21 #include "bt_utils.h" 22 #include "bta_api.h" 23 #include "bta_dm_ci.h" 24 #include "bta_dm_co.h" 25 #include "bta_sys.h" 26 #include "bte_appl.h" 27 #include "btif_dm.h" 28 #include "btif_storage.h" 29 #include "osi/include/osi.h" 30 31 // tBTE_APPL_CFG.ble_io_cap is set to BTM_IO_CAP_UNKNOWN at structure 32 // initialization since btif_storage isn't ready yet for data to be fetched. 33 // This value is initialized properly during first use by fetching properly 34 // from btif_storage. 35 tBTE_APPL_CFG bte_appl_cfg = { 36 BTA_LE_AUTH_REQ_SC_MITM_BOND, // Authentication requirements 37 BTM_IO_CAP_UNKNOWN, BTM_BLE_INITIATOR_KEY_SIZE, BTM_BLE_RESPONDER_KEY_SIZE, 38 BTM_BLE_MAX_KEY_SIZE}; 39 40 /******************************************************************************* 41 * 42 * Function bta_dm_co_get_compress_memory 43 * 44 * Description This callout function is executed by DM to get memory for 45 compression 46 47 * Parameters id - BTA SYS ID 48 * memory_p - memory return by callout 49 * memory_size - memory size 50 * 51 * Returns true for success, false for fail. 52 * 53 ******************************************************************************/ 54 bool bta_dm_co_get_compress_memory(UNUSED_ATTR tBTA_SYS_ID id, 55 UNUSED_ATTR uint8_t** memory_p, 56 UNUSED_ATTR uint32_t* memory_size) { 57 return true; 58 } 59 60 /******************************************************************************* 61 * 62 * Function bta_dm_co_io_req 63 * 64 * Description This callout function is executed by DM to get IO 65 * capabilities of the local device for the Simple Pairing 66 * process. 67 * 68 * Parameters bd_addr - The peer device 69 * *p_io_cap - The local Input/Output capabilities 70 * *p_oob_data - true, if OOB data is available for the peer 71 * device. 72 * *p_auth_req - true, if MITM protection is required. 73 * 74 * Returns void. 75 * 76 ******************************************************************************/ 77 void bta_dm_co_io_req(UNUSED_ATTR const RawAddress& bd_addr, 78 tBTA_IO_CAP* p_io_cap, tBTA_OOB_DATA* p_oob_data, 79 tBTA_AUTH_REQ* p_auth_req, bool is_orig) { 80 btif_dm_set_oob_for_io_req(p_oob_data); 81 btif_dm_proc_io_req(bd_addr, p_io_cap, p_oob_data, p_auth_req, is_orig); 82 BTIF_TRACE_DEBUG("bta_dm_co_io_req *p_oob_data = %d", *p_oob_data); 83 BTIF_TRACE_DEBUG("bta_dm_co_io_req *p_io_cap = %d", *p_io_cap); 84 BTIF_TRACE_DEBUG("bta_dm_co_io_req *p_auth_req = %d", *p_auth_req); 85 BTIF_TRACE_DEBUG("bta_dm_co_io_req is_orig = %d", is_orig); 86 } 87 88 /******************************************************************************* 89 * 90 * Function bta_dm_co_io_rsp 91 * 92 * Description This callout function is executed by DM to report IO 93 * capabilities of the peer device for the Simple Pairing 94 * process. 95 * 96 * Parameters bd_addr - The peer device 97 * io_cap - The remote Input/Output capabilities 98 * oob_data - true, if OOB data is available for the peer 99 * device. 100 * auth_req - true, if MITM protection is required. 101 * 102 * Returns void. 103 * 104 ******************************************************************************/ 105 void bta_dm_co_io_rsp(const RawAddress& bd_addr, tBTA_IO_CAP io_cap, 106 tBTA_OOB_DATA oob_data, tBTA_AUTH_REQ auth_req) { 107 btif_dm_proc_io_rsp(bd_addr, io_cap, oob_data, auth_req); 108 } 109 110 /******************************************************************************* 111 * 112 * Function bta_dm_co_lk_upgrade 113 * 114 * Description This callout function is executed by DM to check if the 115 * platform wants allow link key upgrade 116 * 117 * Parameters bd_addr - The peer device 118 * *p_upgrade - true, if link key upgrade is desired. 119 * 120 * Returns void. 121 * 122 ******************************************************************************/ 123 void bta_dm_co_lk_upgrade(UNUSED_ATTR const RawAddress& bd_addr, 124 UNUSED_ATTR bool* p_upgrade) {} 125 126 /******************************************************************************* 127 * 128 * Function bta_dm_co_loc_oob 129 * 130 * Description This callout function is executed by DM to report the OOB 131 * data of the local device for the Simple Pairing process 132 * 133 * Parameters valid - true, if the local OOB data is retrieved from LM 134 * c - Simple Pairing Hash C 135 * r - Simple Pairing Randomnizer R 136 * 137 * Returns void. 138 * 139 ******************************************************************************/ 140 void bta_dm_co_loc_oob(bool valid, const Octet16& c, const Octet16& r) { 141 BTIF_TRACE_DEBUG("bta_dm_co_loc_oob, valid = %d", valid); 142 #ifdef BTIF_DM_OOB_TEST 143 btif_dm_proc_loc_oob(valid, c, r); 144 #endif 145 } 146 147 /******************************************************************************* 148 * 149 * Function bta_dm_co_rmt_oob 150 * 151 * Description This callout function is executed by DM to request the OOB 152 * data for the remote device for the Simple Pairing process 153 * Need to call bta_dm_ci_rmt_oob() in response 154 * 155 * Parameters bd_addr - The peer device 156 * 157 * Returns void. 158 * 159 ******************************************************************************/ 160 void bta_dm_co_rmt_oob(const RawAddress& bd_addr) { 161 Octet16 c; 162 Octet16 r; 163 bool result = false; 164 165 #ifdef BTIF_DM_OOB_TEST 166 result = btif_dm_proc_rmt_oob(bd_addr, &c, &r); 167 #endif 168 169 BTIF_TRACE_DEBUG("bta_dm_co_rmt_oob: result=%d", result); 170 bta_dm_ci_rmt_oob(result, bd_addr, c, r); 171 } 172 173 /******************************************************************************* 174 * 175 * Function bta_dm_co_le_io_key_req 176 * 177 * Description This callout function is executed by DM to get BLE key 178 * information 179 * before SMP pairing gets going. 180 * 181 * Parameters bd_addr - The peer device 182 * *p_max_key_size - max key size local device supported. 183 * *p_init_key - initiator keys. 184 * *p_resp_key - responder keys. 185 * 186 * Returns void. 187 * 188 ******************************************************************************/ 189 void bta_dm_co_le_io_key_req(UNUSED_ATTR const RawAddress& bd_addr, 190 uint8_t* p_max_key_size, 191 tBTA_LE_KEY_TYPE* p_init_key, 192 tBTA_LE_KEY_TYPE* p_resp_key) { 193 BTIF_TRACE_ERROR("##################################"); 194 BTIF_TRACE_ERROR("bta_dm_co_le_io_key_req: only setting max size to 16"); 195 BTIF_TRACE_ERROR("##################################"); 196 *p_max_key_size = 16; 197 *p_init_key = *p_resp_key = 198 (BTA_LE_KEY_PENC | BTA_LE_KEY_PID | BTA_LE_KEY_PCSRK | BTA_LE_KEY_LENC | 199 BTA_LE_KEY_LID | BTA_LE_KEY_LCSRK); 200 } 201 202 /******************************************************************************* 203 * 204 * Function bta_dm_co_ble_local_key_reload 205 * 206 * Description This callout function is to load the local BLE keys if 207 * available on the device. 208 * 209 * Parameters none 210 * 211 * Returns void. 212 * 213 ******************************************************************************/ 214 void bta_dm_co_ble_load_local_keys(tBTA_DM_BLE_LOCAL_KEY_MASK* p_key_mask, 215 Octet16* p_er, 216 tBTA_BLE_LOCAL_ID_KEYS* p_id_keys) { 217 BTIF_TRACE_DEBUG("##################################"); 218 BTIF_TRACE_DEBUG( 219 "bta_dm_co_ble_load_local_keys: Load local keys if any are persisted"); 220 BTIF_TRACE_DEBUG("##################################"); 221 btif_dm_get_ble_local_keys(p_key_mask, p_er, p_id_keys); 222 } 223 224 /******************************************************************************* 225 * 226 * Function bta_dm_co_ble_io_req 227 * 228 * Description This callout function is executed by DM to get BLE IO 229 * capabilities before SMP pairing gets going. 230 * 231 * Parameters bd_addr - The peer device 232 * *p_io_cap - The local Input/Output capabilities 233 * *p_oob_data - true, if OOB data is available for the peer 234 * device. 235 * *p_auth_req - Auth request setting (Bonding and MITM 236 * required or not) 237 * *p_max_key_size - max key size local device supported. 238 * *p_init_key - initiator keys. 239 * *p_resp_key - responder keys. 240 * 241 * Returns void. 242 * 243 ******************************************************************************/ 244 void bta_dm_co_ble_io_req(const RawAddress& bd_addr, tBTA_IO_CAP* p_io_cap, 245 tBTA_OOB_DATA* p_oob_data, 246 tBTA_LE_AUTH_REQ* p_auth_req, uint8_t* p_max_key_size, 247 tBTA_LE_KEY_TYPE* p_init_key, 248 tBTA_LE_KEY_TYPE* p_resp_key) { 249 bte_appl_cfg.ble_io_cap = btif_storage_get_local_io_caps_ble(); 250 251 /* Retrieve the properties from file system if possible */ 252 tBTE_APPL_CFG nv_config; 253 if (btif_dm_get_smp_config(&nv_config)) bte_appl_cfg = nv_config; 254 255 /* *p_auth_req by default is false for devices with NoInputNoOutput; true for 256 * other devices. */ 257 258 if (bte_appl_cfg.ble_auth_req) 259 *p_auth_req = bte_appl_cfg.ble_auth_req | 260 (bte_appl_cfg.ble_auth_req & 0x04) | ((*p_auth_req) & 0x04); 261 262 /* if OOB is not supported, this call-out function does not need to do 263 * anything 264 * otherwise, look for the OOB data associated with the address and set 265 * *p_oob_data accordingly. 266 * If the answer can not be obtained right away, 267 * set *p_oob_data to BTA_OOB_UNKNOWN and call bta_dm_ci_io_req() when the 268 * answer is available. 269 */ 270 271 btif_dm_set_oob_for_le_io_req(bd_addr, p_oob_data, p_auth_req); 272 273 if (bte_appl_cfg.ble_io_cap <= 4) *p_io_cap = bte_appl_cfg.ble_io_cap; 274 275 if (bte_appl_cfg.ble_init_key <= BTM_BLE_INITIATOR_KEY_SIZE) 276 *p_init_key = bte_appl_cfg.ble_init_key; 277 278 if (bte_appl_cfg.ble_resp_key <= BTM_BLE_RESPONDER_KEY_SIZE) 279 *p_resp_key = bte_appl_cfg.ble_resp_key; 280 281 if (bte_appl_cfg.ble_max_key_size > 7 && bte_appl_cfg.ble_max_key_size <= 16) 282 *p_max_key_size = bte_appl_cfg.ble_max_key_size; 283 } 284