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" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_INCLUDED == TRUE 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "smp_int.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "smp_api.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "l2cdefs.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "l2c_int.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "btm_int.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "hcimsgs.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "btu.h" 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function SMP_Init 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function initializes the SMP unit. 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid SMP_Init(void) 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_EVENT0 ("SMP_Init"); 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&smp_cb, 0, sizeof(tSMP_CB)); 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(SMP_INITIAL_TRACE_LEVEL) 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_cb.trace_level = SMP_INITIAL_TRACE_LEVEL; 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_cb.trace_level = BT_TRACE_LEVEL_NONE; /* No traces */ 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_l2cap_if_init(); 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 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** Function SMP_SetTraceLevel 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function sets the trace level for SMP. If called with 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** a value of 0xFF, it simply returns the current trace level. 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Input Parameters: 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** level: The level to set the GATT tracing to: 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 0xff-returns the current setting. 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 0-turns off tracing. 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 1-Errors. 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 2-Warnings. 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 3-APIs. 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 4-Events. 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 5-Debug. 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns The new or current trace level 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectSMP_API extern UINT8 SMP_SetTraceLevel (UINT8 new_level) 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (new_level != 0xFF) 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_cb.trace_level = new_level; 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(smp_cb.trace_level); 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 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** Function SMP_Register 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function register for the SMP services callback. 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SMP_Register (tSMP_CALLBACK *p_cback) 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_EVENT1 ("SMP_Register state=%d", smp_cb.state); 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (smp_cb.p_callback != NULL) 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_ERROR0 ("SMP_Register: duplicate registration, overwrite it"); 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_cb.p_callback = p_cback; 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 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** Function SMP_Pair 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function call to perform a SMP pairing with peer device. 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Device support one SMP pairing at one time. 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters bd_addr - peer device bd address. 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttSMP_STATUS SMP_Pair (BD_ADDR bd_addr) 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_CB *p_cb = &smp_cb; 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 status = SMP_PAIR_INTERNAL_ERR; 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_EVENT2 ("SMP_Pair state=%d flag=0x%x ", p_cb->state, p_cb->flags); 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->state != SMP_ST_IDLE || p_cb->flags & SMP_PAIR_FLAGS_WE_STARTED_DD) 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* pending security on going, reject this one */ 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return SMP_BUSY; 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->flags = SMP_PAIR_FLAGS_WE_STARTED_DD; 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_cb->pairing_bda, bd_addr, BD_ADDR_LEN); 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!L2CA_ConnectFixedChnl (L2CAP_SMP_CID, bd_addr)) 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_ERROR0("SMP_Pair: L2C connect fixed channel failed."); 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return SMP_STARTED; 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 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** Function SMP_PairCancel 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function call to cancel a SMP pairing with peer device. 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters bd_addr - peer device bd address. 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE - Pairining is cancelled 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SMP_PairCancel (BD_ADDR bd_addr) 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_CB *p_cb = &smp_cb; 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 err_code = SMP_PAIR_FAIL_UNKNOWN; 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN status = FALSE; 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_EVENT2 ("SMP_CancelPair state=%d flag=0x%x ", p_cb->state, p_cb->flags); 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_cb->state != SMP_ST_IDLE) && 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (!memcmp (p_cb->pairing_bda, bd_addr, BD_ADDR_LEN)) ) 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->is_pair_cancel = TRUE; 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0("Cancel Pairing: set fail reason Unknown"); 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &err_code); 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = TRUE; 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function SMP_SecurityGrant 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to grant security process. 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters bd_addr - peer device bd address. 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** res - result of the operation SMP_SUCCESS if success. 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Otherwise, SMP_REPEATED_ATTEMPTS is too many attempts. 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid SMP_SecurityGrant(BD_ADDR bd_addr, UINT8 res) 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_EVENT0 ("SMP_SecurityGrant "); 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (smp_cb.state != SMP_ST_WAIT_APP_RSP || 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_cb.cb_evt != SMP_SEC_REQUEST_EVT || 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcmp (smp_cb.pairing_bda, bd_addr, BD_ADDR_LEN)) 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(&smp_cb, SMP_API_SEC_GRANT_EVT, &res); 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function SMP_PasskeyReply 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called after Security Manager submitted 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** passkey request to the application. 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the device for which passkey was requested 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** res - result of the operation SMP_SUCCESS if success 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** passkey - numeric value in the range of 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_MIN_PASSKEY_VAL(0) - BTM_MAX_PASSKEY_VAL(999999(0xF423F)). 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid SMP_PasskeyReply (BD_ADDR bd_addr, UINT8 res, UINT32 passkey) 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_CB *p_cb = & smp_cb; 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 failure = SMP_PASSKEY_ENTRY_FAIL; 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_EVENT2 ("SMP_PasskeyReply: Key: %d Result:%d", 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project passkey, res); 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If timeout already expired or has been canceled, ignore the reply */ 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->cb_evt != SMP_PASSKEY_REQ_EVT) 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_WARNING1 ("SMP_PasskeyReply() - Wrong State: %d", p_cb->state); 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (memcmp (bd_addr, p_cb->pairing_bda, BD_ADDR_LEN) != 0) 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_ERROR0 ("SMP_PasskeyReply() - Wrong BD Addr"); 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL) 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_ERROR0 ("SMP_PasskeyReply() - no dev CB"); 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (passkey > BTM_MAX_PASSKEY_VAL || res != SMP_SUCCESS) 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_WARNING1 ("SMP_PasskeyReply() - Wrong key len: %d or passkey entry fail", passkey); 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send pairing failure */ 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure); 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_convert_string_to_tk(p_cb->tk, passkey); 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function SMP_OobDataReply 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to provide the OOB data for 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** SMP in response to SMP_OOB_REQ_EVT 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** res - result of the operation SMP_SUCCESS if success 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_data - simple pairing Randomizer C. 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid SMP_OobDataReply(BD_ADDR bd_addr, tSMP_STATUS res, UINT8 len, UINT8 *p_data) 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_CB *p_cb = & smp_cb; 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 failure = SMP_OOB_FAIL; 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_KEY key; 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_EVENT2 ("SMP_OobDataReply State: %d res:%d", 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_cb.state, res); 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If timeout already expired or has been canceled, ignore the reply */ 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->state != SMP_ST_WAIT_APP_RSP || p_cb->cb_evt != SMP_OOB_REQ_EVT) 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (res != SMP_SUCCESS || len == 0 || !p_data) 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure); 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (len > BT_OCTET16_LEN) 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len = BT_OCTET16_LEN; 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_cb->tk, p_data, len); 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.key_type = SMP_KEY_TYPE_TK; 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.p_data = p_cb->tk; 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(&smp_cb, SMP_KEY_READY_EVT, &key); 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function SMP_Encrypt 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to encrypt the data with the specified 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** key 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: key - Pointer to key key[0] conatins the MSB 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** key_len - key length 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** plain_text - Pointer to data to be encrypted 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** plain_text[0] conatins the MSB 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** pt_len - plain text length 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_out - output of the encrypted texts 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Boolean - request is successful 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN SMP_Encrypt (UINT8 *key, UINT8 key_len, 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *plain_text, UINT8 pt_len, 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC *p_out) 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN status=FALSE; 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = smp_encrypt_data(key, key_len, plain_text, pt_len, p_out); 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* SMP_INCLUDED */ 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 338