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