16ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/****************************************************************************** 26ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 36ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Copyright (C) 2008-2012 Broadcom Corporation 46ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 56ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Licensed under the Apache License, Version 2.0 (the "License"); 66ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * you may not use this file except in compliance with the License. 76ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * You may obtain a copy of the License at: 86ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 96ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * http://www.apache.org/licenses/LICENSE-2.0 106ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 116ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Unless required by applicable law or agreed to in writing, software 126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * distributed under the License is distributed on an "AS IS" BASIS, 136ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * See the License for the specific language governing permissions and 156ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * limitations under the License. 166ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 176ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/ 186ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 196ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/****************************************************************************** 206ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 216ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * This file contains the implementation of the SMP interface used by 226ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * applications that can run over an SMP. 236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 246ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/ 25e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include <string.h> 26e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 27e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bt_target.h" 28e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if SMP_INCLUDED == TRUE 29e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach #include "smp_int.h" 30e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach #include "smp_api.h" 31e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach #include "l2cdefs.h" 32e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach #include "l2c_int.h" 33e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach #include "btm_int.h" 34e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach #include "hcimsgs.h" 35e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 36e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach #include "btu.h" 37e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 38e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 39e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 40e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 41e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function SMP_Init 42e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 43e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function initializes the SMP unit. 44e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 45e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 46e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 47e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 48e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid SMP_Init(void) 49e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 50e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 51e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach SMP_TRACE_EVENT0 ("SMP_Init"); 52e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&smp_cb, 0, sizeof(tSMP_CB)); 53e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 54e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if defined(SMP_INITIAL_TRACE_LEVEL) 55e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach smp_cb.trace_level = SMP_INITIAL_TRACE_LEVEL; 56e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else 57e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach smp_cb.trace_level = BT_TRACE_LEVEL_NONE; /* No traces */ 58e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 59e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 606ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach smp_l2cap_if_init(); 61e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 62e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 63e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 64e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 65e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 66e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function SMP_SetTraceLevel 67e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 68e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function sets the trace level for SMP. If called with 69e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** a value of 0xFF, it simply returns the current trace level. 70e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 71e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Input Parameters: 72e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** level: The level to set the GATT tracing to: 73e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 0xff-returns the current setting. 74e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 0-turns off tracing. 75e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** >= 1-Errors. 76e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** >= 2-Warnings. 77e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** >= 3-APIs. 78e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** >= 4-Events. 79e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** >= 5-Debug. 80e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 81e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns The new or current trace level 82e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 83e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 84e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachSMP_API extern UINT8 SMP_SetTraceLevel (UINT8 new_level) 85e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 86e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (new_level != 0xFF) 87e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach smp_cb.trace_level = new_level; 88e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 89e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return(smp_cb.trace_level); 90e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 91e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 92e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 93e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 94e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 95e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function SMP_Register 96e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 97e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function register for the SMP services callback. 98e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 99e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 102e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachBOOLEAN SMP_Register (tSMP_CALLBACK *p_cback) 103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach SMP_TRACE_EVENT1 ("SMP_Register state=%d", smp_cb.state); 105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (smp_cb.p_callback != NULL) 107e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 108e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach SMP_TRACE_ERROR0 ("SMP_Register: duplicate registration, overwrite it"); 109e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach smp_cb.p_callback = p_cback; 111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 112e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return(TRUE); 113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 115e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function SMP_Pair 119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1206ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description This function call to perform a SMP pairing with peer device. 121e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Device support one SMP pairing at one time. 122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters bd_addr - peer device bd address. 124e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None 126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 128e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtSMP_STATUS SMP_Pair (BD_ADDR bd_addr) 129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tSMP_CB *p_cb = &smp_cb; 131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 status = SMP_PAIR_INTERNAL_ERR; 132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 133e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_EVENT2 ("SMP_Pair state=%d flag=0x%x ", p_cb->state, p_cb->flags); 134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_cb->state != SMP_ST_IDLE || p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD) 135e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* pending security on going, reject this one */ 137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return SMP_BUSY; 138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 141e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_cb->flags = SMP_PAIR_FLAGS_WE_STARTED_DD; 142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 1436ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach memcpy (p_cb->pairing_bda, bd_addr, BD_ADDR_LEN); 144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!L2CA_ConnectFixedChnl (L2CAP_SMP_CID, bd_addr)) 146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach SMP_TRACE_ERROR0("SMP_Pair: L2C connect fixed channel failed."); 148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); 149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return status; 150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return SMP_STARTED; 153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 157e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function SMP_PairCancel 160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1616ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description This function call to cancel a SMP pairing with peer device. 162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 163e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters bd_addr - peer device bd address. 164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns TRUE - Pairining is cancelled 166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 168e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachBOOLEAN SMP_PairCancel (BD_ADDR bd_addr) 169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 170e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tSMP_CB *p_cb = &smp_cb; 171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 err_code = SMP_PAIR_FAIL_UNKNOWN; 172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BOOLEAN status = FALSE; 173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_EVENT2 ("SMP_CancelPair state=%d flag=0x%x ", p_cb->state, p_cb->flags); 1756ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if ( (p_cb->state != SMP_ST_IDLE) && 176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (!memcmp (p_cb->pairing_bda, bd_addr, BD_ADDR_LEN)) ) 177e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_cb->is_pair_cancel = TRUE; 179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach SMP_TRACE_DEBUG0("Cancel Pairing: set fail reason Unknown"); 180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &err_code); 181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = TRUE; 182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return status; 185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function SMP_SecurityGrant 189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is called to grant security process. 191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters bd_addr - peer device bd address. 1936ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** res - result of the operation SMP_SUCCESS if success. 1946ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Otherwise, SMP_REPEATED_ATTEMPTS is too many attempts. 195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None 197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 199e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid SMP_SecurityGrant(BD_ADDR bd_addr, UINT8 res) 200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach SMP_TRACE_EVENT0 ("SMP_SecurityGrant "); 202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (smp_cb.state != SMP_ST_WAIT_APP_RSP || 203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach smp_cb.cb_evt != SMP_SEC_REQUEST_EVT || 204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcmp (smp_cb.pairing_bda, bd_addr, BD_ADDR_LEN)) 205e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2076ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach smp_sm_event(&smp_cb, SMP_API_SEC_GRANT_EVT, &res); 208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function SMP_PasskeyReply 213e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 214e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is called after Security Manager submitted 215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** passkey request to the application. 216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 217e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters: bd_addr - Address of the device for which passkey was requested 2186ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** res - result of the operation SMP_SUCCESS if success 219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** passkey - numeric value in the range of 220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** BTM_MIN_PASSKEY_VAL(0) - BTM_MAX_PASSKEY_VAL(999999(0xF423F)). 221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 223e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid SMP_PasskeyReply (BD_ADDR bd_addr, UINT8 res, UINT32 passkey) 224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tSMP_CB *p_cb = & smp_cb; 226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 failure = SMP_PASSKEY_ENTRY_FAIL; 227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_SEC_DEV_REC *p_dev_rec; 228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach SMP_TRACE_EVENT2 ("SMP_PasskeyReply: Key: %d Result:%d", 230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach passkey, res); 231e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* If timeout already expired or has been canceled, ignore the reply */ 233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_cb->cb_evt != SMP_PASSKEY_REQ_EVT) 234e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach SMP_TRACE_WARNING1 ("SMP_PasskeyReply() - Wrong State: %d", p_cb->state); 236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 238e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (memcmp (bd_addr, p_cb->pairing_bda, BD_ADDR_LEN) != 0) 240e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach SMP_TRACE_ERROR0 ("SMP_PasskeyReply() - Wrong BD Addr"); 242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 243e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL) 246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach SMP_TRACE_ERROR0 ("SMP_PasskeyReply() - no dev CB"); 248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 250e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 251e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (passkey > BTM_MAX_PASSKEY_VAL || res != SMP_SUCCESS) 253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 254e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach SMP_TRACE_WARNING1 ("SMP_PasskeyReply() - Wrong key len: %d or passkey entry fail", passkey); 255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* send pairing failure */ 256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure); 257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 259e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach smp_convert_string_to_tk(p_cb->tk, passkey); 262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 266e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 267e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 268e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function SMP_OobDataReply 270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is called to provide the OOB data for 272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** SMP in response to SMP_OOB_REQ_EVT 273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters: bd_addr - Address of the peer device 2756ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** res - result of the operation SMP_SUCCESS if success 276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** p_data - simple pairing Randomizer C. 277e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 279e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid SMP_OobDataReply(BD_ADDR bd_addr, tSMP_STATUS res, UINT8 len, UINT8 *p_data) 280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tSMP_CB *p_cb = & smp_cb; 282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 failure = SMP_OOB_FAIL; 283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tSMP_KEY key; 284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 285e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach SMP_TRACE_EVENT2 ("SMP_OobDataReply State: %d res:%d", 286e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach smp_cb.state, res); 287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 288e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* If timeout already expired or has been canceled, ignore the reply */ 289e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_cb->state != SMP_ST_WAIT_APP_RSP || p_cb->cb_evt != SMP_OOB_REQ_EVT) 290e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (res != SMP_SUCCESS || len == 0 || !p_data) 293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 294e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure); 295e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (len > BT_OCTET16_LEN) 299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach len = BT_OCTET16_LEN; 300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(p_cb->tk, p_data, len); 302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach key.key_type = SMP_KEY_TYPE_TK; 304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach key.p_data = p_cb->tk; 305e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 306e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach smp_sm_event(&smp_cb, SMP_KEY_READY_EVT, &key); 307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function SMP_Encrypt 313e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is called to encrypt the data with the specified 315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** key 3166ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 317e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters: key - Pointer to key key[0] conatins the MSB 318e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** key_len - key length 319e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** plain_text - Pointer to data to be encrypted 320e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** plain_text[0] conatins the MSB 321e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** pt_len - plain text length 322e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** p_out - output of the encrypted texts 3236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 3246ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Returns Boolean - request is successful 325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 3266ef101187774e30ddba6b46bbedef549a42196adAndre EisenbachBOOLEAN SMP_Encrypt (UINT8 *key, UINT8 key_len, 3276ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach UINT8 *plain_text, UINT8 pt_len, 328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tSMP_ENC *p_out) 329e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BOOLEAN status=FALSE; 332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach status = smp_encrypt_data(key, key_len, plain_text, pt_len, p_out); 333e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return status; 334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif /* SMP_INCLUDED */ 336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 337e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 338