15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2008-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * This file contains the implementation of the SMP interface used by 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * applications that can run over an SMP. 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 285cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_INCLUDED == TRUE 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "smp_int.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "smp_api.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "l2cdefs.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "l2c_int.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "btm_int.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "hcimsgs.h" 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "btu.h" 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function SMP_Init 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function initializes the SMP unit. 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid SMP_Init(void) 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_EVENT ("SMP_Init"); 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&smp_cb, 0, sizeof(tSMP_CB)); 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(SMP_INITIAL_TRACE_LEVEL) 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_cb.trace_level = SMP_INITIAL_TRACE_LEVEL; 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_cb.trace_level = BT_TRACE_LEVEL_NONE; /* No traces */ 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_l2cap_if_init(); 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function SMP_SetTraceLevel 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sets the trace level for SMP. If called with 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** a value of 0xFF, it simply returns the current trace level. 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Input Parameters: 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** level: The level to set the GATT tracing to: 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 0xff-returns the current setting. 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 0-turns off tracing. 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 1-Errors. 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 2-Warnings. 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 3-APIs. 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 4-Events. 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 5-Debug. 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns The new or current trace level 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectSMP_API extern UINT8 SMP_SetTraceLevel (UINT8 new_level) 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (new_level != 0xFF) 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_cb.trace_level = new_level; 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(smp_cb.trace_level); 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function SMP_Register 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function register for the SMP services callback. 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SMP_Register (tSMP_CALLBACK *p_cback) 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 105b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_EVENT ("SMP_Register state=%d", smp_cb.state); 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (smp_cb.p_callback != NULL) 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 109b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_ERROR ("SMP_Register: duplicate registration, overwrite it"); 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_cb.p_callback = p_cback; 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function SMP_Pair 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function call to perform a SMP pairing with peer device. 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Device support one SMP pairing at one time. 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters bd_addr - peer device bd address. 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttSMP_STATUS SMP_Pair (BD_ADDR bd_addr) 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_CB *p_cb = &smp_cb; 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 status = SMP_PAIR_INTERNAL_ERR; 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13483c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_EVENT ("SMP_Pair state=%d flag=0x%x ", p_cb->state, p_cb->flags); 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->state != SMP_ST_IDLE || p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD) 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* pending security on going, reject this one */ 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return SMP_BUSY; 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->flags = SMP_PAIR_FLAGS_WE_STARTED_DD; 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_cb->pairing_bda, bd_addr, BD_ADDR_LEN); 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!L2CA_ConnectFixedChnl (L2CAP_SMP_CID, bd_addr)) 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 148b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_ERROR("SMP_Pair: L2C connect fixed channel failed."); 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return SMP_STARTED; 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function SMP_PairCancel 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function call to cancel a SMP pairing with peer device. 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters bd_addr - peer device bd address. 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE - Pairining is cancelled 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SMP_PairCancel (BD_ADDR bd_addr) 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_CB *p_cb = &smp_cb; 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 err_code = SMP_PAIR_FAIL_UNKNOWN; 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN status = FALSE; 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17583c5256f1951db020d81412e1d595d7a37962f3eSharvil Nanavati BTM_TRACE_EVENT ("SMP_CancelPair state=%d flag=0x%x ", p_cb->state, p_cb->flags); 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_cb->state != SMP_ST_IDLE) && 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (!memcmp (p_cb->pairing_bda, bd_addr, BD_ADDR_LEN)) ) 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->is_pair_cancel = TRUE; 180b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG("Cancel Pairing: set fail reason Unknown"); 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &err_code); 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = TRUE; 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function SMP_SecurityGrant 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to grant security process. 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters bd_addr - peer device bd address. 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** res - result of the operation SMP_SUCCESS if success. 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Otherwise, SMP_REPEATED_ATTEMPTS is too many attempts. 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid SMP_SecurityGrant(BD_ADDR bd_addr, UINT8 res) 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 202b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_EVENT ("SMP_SecurityGrant "); 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (smp_cb.state != SMP_ST_WAIT_APP_RSP || 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_cb.cb_evt != SMP_SEC_REQUEST_EVT || 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcmp (smp_cb.pairing_bda, bd_addr, BD_ADDR_LEN)) 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 208503a55007c7fa7769e3e03cb8d7858e32dec7ba4Zhihai Xu /* clear the SMP_SEC_REQUEST_EVT event after get grant */ 209503a55007c7fa7769e3e03cb8d7858e32dec7ba4Zhihai Xu /* avoid generate duplicate pair request */ 210503a55007c7fa7769e3e03cb8d7858e32dec7ba4Zhihai Xu smp_cb.cb_evt = 0; 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(&smp_cb, SMP_API_SEC_GRANT_EVT, &res); 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function SMP_PasskeyReply 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called after Security Manager submitted 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** passkey request to the application. 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the device for which passkey was requested 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** res - result of the operation SMP_SUCCESS if success 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** passkey - numeric value in the range of 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_MIN_PASSKEY_VAL(0) - BTM_MAX_PASSKEY_VAL(999999(0xF423F)). 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid SMP_PasskeyReply (BD_ADDR bd_addr, UINT8 res, UINT32 passkey) 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_CB *p_cb = & smp_cb; 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 failure = SMP_PASSKEY_ENTRY_FAIL; 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 233b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_EVENT ("SMP_PasskeyReply: Key: %d Result:%d", 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project passkey, res); 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If timeout already expired or has been canceled, ignore the reply */ 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->cb_evt != SMP_PASSKEY_REQ_EVT) 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 239b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_WARNING ("SMP_PasskeyReply() - Wrong State: %d", p_cb->state); 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (memcmp (bd_addr, p_cb->pairing_bda, BD_ADDR_LEN) != 0) 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 245b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_ERROR ("SMP_PasskeyReply() - Wrong BD Addr"); 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL) 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 251b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_ERROR ("SMP_PasskeyReply() - no dev CB"); 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (passkey > BTM_MAX_PASSKEY_VAL || res != SMP_SUCCESS) 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 258b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_WARNING ("SMP_PasskeyReply() - Wrong key len: %d or passkey entry fail", passkey); 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send pairing failure */ 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure); 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_convert_string_to_tk(p_cb->tk, passkey); 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function SMP_OobDataReply 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to provide the OOB data for 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** SMP in response to SMP_OOB_REQ_EVT 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** res - result of the operation SMP_SUCCESS if success 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_data - simple pairing Randomizer C. 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid SMP_OobDataReply(BD_ADDR bd_addr, tSMP_STATUS res, UINT8 len, UINT8 *p_data) 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_CB *p_cb = & smp_cb; 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 failure = SMP_OOB_FAIL; 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_KEY key; 2885cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(bd_addr); 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 290b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_EVENT ("SMP_OobDataReply State: %d res:%d", 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_cb.state, res); 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If timeout already expired or has been canceled, ignore the reply */ 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->state != SMP_ST_WAIT_APP_RSP || p_cb->cb_evt != SMP_OOB_REQ_EVT) 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (res != SMP_SUCCESS || len == 0 || !p_data) 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure); 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (len > BT_OCTET16_LEN) 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len = BT_OCTET16_LEN; 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_cb->tk, p_data, len); 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.key_type = SMP_KEY_TYPE_TK; 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.p_data = p_cb->tk; 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(&smp_cb, SMP_KEY_READY_EVT, &key); 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function SMP_Encrypt 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to encrypt the data with the specified 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** key 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: key - Pointer to key key[0] conatins the MSB 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** key_len - key length 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** plain_text - Pointer to data to be encrypted 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** plain_text[0] conatins the MSB 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** pt_len - plain text length 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_out - output of the encrypted texts 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Boolean - request is successful 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SMP_Encrypt (UINT8 *key, UINT8 key_len, 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *plain_text, UINT8 pt_len, 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC *p_out) 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN status=FALSE; 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = smp_encrypt_data(key, key_len, plain_text, pt_len, p_out); 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* SMP_INCLUDED */ 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 343